r836 - in schooltool/branches/upstream/current: . benchmark bin doc images schooltool-skel schooltool-skel/bin schooltool-skel/etc schooltool-skel/log schooltool-skel/var scripts src src/schoolbell src/schoolbell/app src/schoolbell/calendar src/schoolbell/relationship src/schooltool src/schooltool/app src/schooltool/app/browser src/schooltool/app/browser/ftests src/schooltool/app/browser/ftests/images src/schooltool/app/browser/resources src/schooltool/app/browser/resources/calwidget src/schooltool/app/browser/templates src/schooltool/app/browser/tests src/schooltool/app/rest src/schooltool/app/rest/ftests src/schooltool/app/rest/templates src/schooltool/app/rest/tests src/schooltool/app/tests src/schooltool/attendance src/schooltool/attendance/browser src/schooltool/attendance/browser/ftests src/schooltool/attendance/browser/templates src/schooltool/attendance/browser/tests src/schooltool/attendance/tests src/schooltool/calendar src/schooltool/calendar/tests src/schooltool/calendar/tests/Europe src/schooltool/commendation src/schooltool/course src/schooltool/course/browser src/schooltool/course/browser/templates src/schooltool/course/help src/schooltool/course/rest src/schooltool/course/tests src/schooltool/dashboard src/schooltool/db-conversion-tests src/schooltool/demographics src/schooltool/demographics/browser src/schooltool/devmode src/schooltool/generations src/schooltool/generations/tests src/schooltool/gradebook src/schooltool/gradebook/browser src/schooltool/gradebook/tests src/schooltool/group src/schooltool/group/browser src/schooltool/group/help src/schooltool/group/rest src/schooltool/group/tests src/schooltool/help src/schooltool/level src/schooltool/level/browser src/schooltool/level/rest src/schooltool/level/rest/tests src/schooltool/level/tests src/schooltool/locales src/schooltool/locales/af src/schooltool/locales/af/LC_MESSAGES src/schooltool/locales/am src/schooltool/locales/am/LC_MESSAGES src/schooltool/locales/an src/schooltool/locales/an/LC_MESSAGES src/schooltool/locales/ar src/schooltool/locales/ar/LC_MESSAGES src/schooltool/locales/bn src/schooltool/locales/bn/LC_MESSAGES src/schooltool/locales/ca src/schooltool/locales/ca/LC_MESSAGES src/schooltool/locales/cs src/schooltool/locales/cs/LC_MESSAGES src/schooltool/locales/da src/schooltool/locales/da/LC_MESSAGES src/schooltool/locales/de src/schooltool/locales/de/LC_MESSAGES src/schooltool/locales/de_CH src/schooltool/locales/de_CH/LC_MESSAGES src/schooltool/locales/de_DE src/schooltool/locales/de_DE/LC_MESSAGES src/schooltool/locales/el src/schooltool/locales/el/LC_MESSAGES src/schooltool/locales/en src/schooltool/locales/en/LC_MESSAGES src/schooltool/locales/en_AU src/schooltool/locales/en_AU/LC_MESSAGES src/schooltool/locales/en_GB src/schooltool/locales/en_GB/LC_MESSAGES src/schooltool/locales/en_US src/schooltool/locales/en_US/LC_MESSAGES src/schooltool/locales/es src/schooltool/locales/es/LC_MESSAGES src/schooltool/locales/es_CL src/schooltool/locales/es_CL/LC_MESSAGES src/schooltool/locales/es_ES src/schooltool/locales/es_ES/LC_MESSAGES src/schooltool/locales/es_MX src/schooltool/locales/es_MX/LC_MESSAGES src/schooltool/locales/es_PE src/schooltool/locales/es_PE/LC_MESSAGES src/schooltool/locales/es_US src/schooltool/locales/es_US/LC_MESSAGES src/schooltool/locales/et src/schooltool/locales/et/LC_MESSAGES src/schooltool/locales/eu src/schooltool/locales/eu/LC_MESSAGES src/schooltool/locales/fa src/schooltool/locales/fa/LC_MESSAGES src/schooltool/locales/fi src/schooltool/locales/fi/LC_MESSAGES src/schooltool/locales/fr src/schooltool/locales/fr/LC_MESSAGES src/schooltool/locales/fr_BE src/schooltool/locales/fr_BE/LC_MESSAGES src/schooltool/locales/fr_CA src/schooltool/locales/fr_CA/LC_MESSAGES src/schooltool/locales/fr_FR src/schooltool/locales/fr_FR/LC_MESSAGES src/schooltool/locales/gl src/schooltool/locales/gl/LC_MESSAGES src/schooltool/locales/he src/schooltool/locales/he/LC_MESSAGES src/schooltool/locales/hi src/schooltool/locales/hi/LC_MESSAGES src/schooltool/locales/hu src/schooltool/locales/hu/LC_MESSAGES src/schooltool/locales/id src/schooltool/locales/id/LC_MESSAGES src/schooltool/locales/is src/schooltool/locales/is/LC_MESSAGES src/schooltool/locales/it src/schooltool/locales/it/LC_MESSAGES src/schooltool/locales/ja src/schooltool/locales/ja/LC_MESSAGES src/schooltool/locales/ka src/schooltool/locales/ka/LC_MESSAGES src/schooltool/locales/ko src/schooltool/locales/ko/LC_MESSAGES src/schooltool/locales/lt src/schooltool/locales/lt/LC_MESSAGES src/schooltool/locales/lv src/schooltool/locales/lv/LC_MESSAGES src/schooltool/locales/ml src/schooltool/locales/ml/LC_MESSAGES src/schooltool/locales/ms src/schooltool/locales/ms/LC_MESSAGES src/schooltool/locales/nb src/schooltool/locales/nb/LC_MESSAGES src/schooltool/locales/ne src/schooltool/locales/ne/LC_MESSAGES src/schooltool/locales/nl src/schooltool/locales/nl/LC_MESSAGES src/schooltool/locales/nl_NL src/schooltool/locales/nl_NL/LC_MESSAGES src/schooltool/locales/nn src/schooltool/locales/nn/LC_MESSAGES src/schooltool/locales/no src/schooltool/locales/no/LC_MESSAGES src/schooltool/locales/pa src/schooltool/locales/pa/LC_MESSAGES src/schooltool/locales/pl src/schooltool/locales/pl/LC_MESSAGES src/schooltool/locales/pt src/schooltool/locales/pt/LC_MESSAGES src/schooltool/locales/pt_BR src/schooltool/locales/pt_BR/LC_MESSAGES src/schooltool/locales/pt_PT src/schooltool/locales/pt_PT/LC_MESSAGES src/schooltool/locales/ro src/schooltool/locales/ro/LC_MESSAGES src/schooltool/locales/ru src/schooltool/locales/ru/LC_MESSAGES src/schooltool/locales/sk src/schooltool/locales/sk/LC_MESSAGES src/schooltool/locales/sq src/schooltool/locales/sq/LC_MESSAGES src/schooltool/locales/sr src/schooltool/locales/sr/LC_MESSAGES src/schooltool/locales/st src/schooltool/locales/st/LC_MESSAGES src/schooltool/locales/sv src/schooltool/locales/sv/LC_MESSAGES src/schooltool/locales/ta src/schooltool/locales/ta/LC_MESSAGES src/schooltool/locales/tl src/schooltool/locales/tl/LC_MESSAGES src/schooltool/locales/tr src/schooltool/locales/tr/LC_MESSAGES src/schooltool/locales/uk src/schooltool/locales/uk/LC_MESSAGES src/schooltool/locales/vi src/schooltool/locales/vi/LC_MESSAGES src/schooltool/locales/yi src/schooltool/locales/yi/LC_MESSAGES src/schooltool/locales/zh_CN src/schooltool/locales/zh_CN/LC_MESSAGES src/schooltool/note src/schooltool/person src/schooltool/person/browser src/schooltool/person/help src/schooltool/person/rest src/schooltool/person/tests src/schooltool/relationship src/schooltool/relationship/tests src/schooltool/requirement src/schooltool/requirement/browser src/schooltool/resource src/schooltool/resource/browser src/schooltool/resource/rest src/schooltool/resource/tests src/schooltool/restclient src/schooltool/restclient/examples src/schooltool/restclient/ftests src/schooltool/restclient/tests src/schooltool/sampledata src/schooltool/sampledata/ftests src/schooltool/sampledata/tests src/schooltool/sbapp src/schooltool/sbapp/browser src/schooltool/sbapp/browser/ftests src/schooltool/sbapp/browser/resources src/schooltool/sbapp/browser/templates src/schooltool/sbapp/browser/tests src/schooltool/sbapp/generations src/schooltool/sbapp/rest src/schooltool/sbapp/rest/ftests src/schooltool/sbapp/rest/tests src/schooltool/sbapp/tests src/schooltool/securitypolicy src/schooltool/securitypolicy/browser src/schooltool/securitypolicy/browser/ftests src/schooltool/securitypolicy/browser/templates src/schooltool/securitypolicy/browser/tests src/schooltool/securitypolicy/tests src/schooltool/setup src/schooltool/setupdata src/schooltool/setupdata/tests src/schooltool/skin src/schooltool/skin/resources src/schooltool/skin/templates src/schooltool/skin/tests src/schooltool/table src/schooltool/table/templates src/schooltool/table/tests src/schooltool/term src/schooltool/term/browser src/schooltool/term/rest src/schooltool/term/tests src/schooltool/testing src/schooltool/tests src/schooltool/timetable src/schooltool/timetable/browser src/schooltool/timetable/browser/ftests src/schooltool/timetable/browser/templates src/schooltool/timetable/browser/tests src/schooltool/timetable/rest src/schooltool/timetable/rest/ftests src/schooltool/timetable/rest/templates src/schooltool/timetable/rest/tests src/schooltool/timetable/tests src/schooltool/traverser src/schooltool/utility src/schooltool/utility/ftests src/schooltool/widget src/schooltool.egg-info testsupport utilities

Brian Sutherland jinty-guest at alioth.debian.org
Sat May 5 18:54:36 UTC 2007


Author: jinty-guest
Date: 2007-05-05 18:51:38 +0000 (Sat, 05 May 2007)
New Revision: 836

Added:
   schooltool/branches/upstream/current/Makefile
   schooltool/branches/upstream/current/PKG-INFO
   schooltool/branches/upstream/current/benchmark/
   schooltool/branches/upstream/current/benchmark/acl.py
   schooltool/branches/upstream/current/benchmark/benchmark.py
   schooltool/branches/upstream/current/benchmark/manyrecurrent.py
   schooltool/branches/upstream/current/benchmark/nonrecurrent.py
   schooltool/branches/upstream/current/benchmark/recurrent.py
   schooltool/branches/upstream/current/benchmark/sampledata.py
   schooltool/branches/upstream/current/bin/
   schooltool/branches/upstream/current/bin/coverage_reports.py
   schooltool/branches/upstream/current/bin/mkschooltoolinst
   schooltool/branches/upstream/current/bin/remove-stale-bytecode.py
   schooltool/branches/upstream/current/bin/rest-client.py
   schooltool/branches/upstream/current/bin/runfdoctests.py
   schooltool/branches/upstream/current/doc/
   schooltool/branches/upstream/current/doc/ISSUES.txt
   schooltool/branches/upstream/current/doc/building-with-mingw.txt
   schooltool/branches/upstream/current/doc/restive-interface.txt
   schooltool/branches/upstream/current/doc/schooltool-security.xls
   schooltool/branches/upstream/current/doc/wfmc-workflows.txt
   schooltool/branches/upstream/current/i18nextract.py
   schooltool/branches/upstream/current/images/
   schooltool/branches/upstream/current/images/schooltool_zebra.xcf
   schooltool/branches/upstream/current/schoolbell-server.py
   schooltool/branches/upstream/current/schoolbell-site.zcml
   schooltool/branches/upstream/current/schoolbell.conf.in
   schooltool/branches/upstream/current/schooltool-server.py
   schooltool/branches/upstream/current/schooltool-skel/
   schooltool/branches/upstream/current/schooltool-skel/bin/
   schooltool/branches/upstream/current/schooltool-skel/bin/schooltool.in
   schooltool/branches/upstream/current/schooltool-skel/bin/test.in
   schooltool/branches/upstream/current/schooltool-skel/etc/
   schooltool/branches/upstream/current/schooltool-skel/etc/ftesting.zcml
   schooltool/branches/upstream/current/schooltool-skel/etc/schooltool.conf.in
   schooltool/branches/upstream/current/schooltool-skel/etc/site.zcml
   schooltool/branches/upstream/current/schooltool-skel/log/
   schooltool/branches/upstream/current/schooltool-skel/log/README.txt
   schooltool/branches/upstream/current/schooltool-skel/var/
   schooltool/branches/upstream/current/schooltool-skel/var/README.txt
   schooltool/branches/upstream/current/schooltool.conf.in
   schooltool/branches/upstream/current/scripts/
   schooltool/branches/upstream/current/scripts/manage-schooltool
   schooltool/branches/upstream/current/scripts/schooltool
   schooltool/branches/upstream/current/scripts/schooltool-rest-client
   schooltool/branches/upstream/current/setup.py
   schooltool/branches/upstream/current/src/
   schooltool/branches/upstream/current/src/schoolbell/
   schooltool/branches/upstream/current/src/schoolbell/__init__.py
   schooltool/branches/upstream/current/src/schoolbell/app/
   schooltool/branches/upstream/current/src/schoolbell/app/__init__.py
   schooltool/branches/upstream/current/src/schoolbell/app/app.py
   schooltool/branches/upstream/current/src/schoolbell/app/cal.py
   schooltool/branches/upstream/current/src/schoolbell/app/interfaces.py
   schooltool/branches/upstream/current/src/schoolbell/app/notes.py
   schooltool/branches/upstream/current/src/schoolbell/app/security.py
   schooltool/branches/upstream/current/src/schoolbell/calendar/
   schooltool/branches/upstream/current/src/schoolbell/calendar/__init__.py
   schooltool/branches/upstream/current/src/schoolbell/calendar/recurrent.py
   schooltool/branches/upstream/current/src/schoolbell/relationship/
   schooltool/branches/upstream/current/src/schoolbell/relationship/__init__.py
   schooltool/branches/upstream/current/src/schoolbell/relationship/relationship.py
   schooltool/branches/upstream/current/src/schoolbell/relationship/uri.py
   schooltool/branches/upstream/current/src/schooltool.egg-info/
   schooltool/branches/upstream/current/src/schooltool.egg-info/PKG-INFO
   schooltool/branches/upstream/current/src/schooltool.egg-info/SOURCES.txt
   schooltool/branches/upstream/current/src/schooltool.egg-info/dependency_links.txt
   schooltool/branches/upstream/current/src/schooltool.egg-info/requires.txt
   schooltool/branches/upstream/current/src/schooltool.egg-info/top_level.txt
   schooltool/branches/upstream/current/src/schooltool/
   schooltool/branches/upstream/current/src/schooltool/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/
   schooltool/branches/upstream/current/src/schooltool/app/README.txt
   schooltool/branches/upstream/current/src/schooltool/app/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/app.py
   schooltool/branches/upstream/current/src/schooltool/app/booking.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/
   schooltool/branches/upstream/current/src/schooltool/app/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/app.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/cal.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/app/browser/csvimport.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/README.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/app.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/brokenview-ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-recurrence.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-security.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/composite-timetables.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/deletion.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/errors.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1-tiny.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1.dot
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2-tiny.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2.dot
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3-tiny.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3.dot
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4-tiny.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4.dot
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5-tiny.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5.dot
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6-tiny.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6.dot
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard.dot
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/update-images.sh
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/login.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/membership.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/navigation.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/personinstructor.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/schedule-single-student.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/section-booking.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/setup.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/system-objects.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema-wizard.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/undead-calendar-overlays.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/overlay.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/pdfcal.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/README.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/calendar.css
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/calendar.js
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/icon.gif
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/day.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/month.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/week.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/resources/year.png
   schooltool/branches/upstream/current/src/schooltool/app/browser/skin.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates.txt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/application_preferences.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_atom.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_daily.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_monthly.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_weekly.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_yearly.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_macros.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_overlay.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_selection.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/css_viewlet.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/edit_relationships.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_add.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_booking.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_info_viewlet.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/index.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/javascript_viewlet.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/login.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/recevent_delete.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/templates/timetables-csvimport.pt
   schooltool/branches/upstream/current/src/schooltool/app/browser/testing.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_app.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_browser.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_cal.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_csvimport.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_overlay.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_pdfcal.py
   schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_skin.py
   schooltool/branches/upstream/current/src/schooltool/app/cal.py
   schooltool/branches/upstream/current/src/schooltool/app/config-schema.xml
   schooltool/branches/upstream/current/src/schooltool/app/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/app/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/app/main.py
   schooltool/branches/upstream/current/src/schooltool/app/membership.py
   schooltool/branches/upstream/current/src/schooltool/app/overlay.py
   schooltool/branches/upstream/current/src/schooltool/app/relationships.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/
   schooltool/branches/upstream/current/src/schooltool/app/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/app.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/app/rest/errors.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/
   schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/app.txt
   schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/errors.txt
   schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/relationships.txt
   schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/system-objects.txt
   schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/relationships.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/templates/
   schooltool/branches/upstream/current/src/schooltool/app/rest/templates/acl.pt
   schooltool/branches/upstream/current/src/schooltool/app/rest/templates/aoc.pt
   schooltool/branches/upstream/current/src/schooltool/app/rest/templates/app.pt
   schooltool/branches/upstream/current/src/schooltool/app/rest/templates/link.pt
   schooltool/branches/upstream/current/src/schooltool/app/rest/templates/relationships.pt
   schooltool/branches/upstream/current/src/schooltool/app/rest/testing.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/tests/
   schooltool/branches/upstream/current/src/schooltool/app/rest/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_app.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_errors.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_relationships.py
   schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_rest.py
   schooltool/branches/upstream/current/src/schooltool/app/security.py
   schooltool/branches/upstream/current/src/schooltool/app/security.txt
   schooltool/branches/upstream/current/src/schooltool/app/security.zcml
   schooltool/branches/upstream/current/src/schooltool/app/tests/
   schooltool/branches/upstream/current/src/schooltool/app/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/app/tests/empty.conf
   schooltool/branches/upstream/current/src/schooltool/app/tests/sample.conf
   schooltool/branches/upstream/current/src/schooltool/app/tests/test_app.py
   schooltool/branches/upstream/current/src/schooltool/app/tests/test_booking.py
   schooltool/branches/upstream/current/src/schooltool/app/tests/test_cal.py
   schooltool/branches/upstream/current/src/schooltool/app/tests/test_main.py
   schooltool/branches/upstream/current/src/schooltool/app/tests/test_overlay.py
   schooltool/branches/upstream/current/src/schooltool/app/tests/test_relationships.py
   schooltool/branches/upstream/current/src/schooltool/app/tests/test_security.py
   schooltool/branches/upstream/current/src/schooltool/attendance/
   schooltool/branches/upstream/current/src/schooltool/attendance/README.txt
   schooltool/branches/upstream/current/src/schooltool/attendance/__init__.py
   schooltool/branches/upstream/current/src/schooltool/attendance/attendance-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/attendance/attendance.py
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.css
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.py
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/attendance-forms.txt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/student-attendance.txt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/workflow.txt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/sparkline.py
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/attendance_preferences.pt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanel.pt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanelViewlet.pt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/no_section_meeting.pt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/real_time.pt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/retro.pt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/student-attendance.pt
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_attendance.py
   schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_sparkline.py
   schooltool/branches/upstream/current/src/schooltool/attendance/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/attendance/explanation.xpdl
   schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.py
   schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/attendance/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/attendance/sampledata.py
   schooltool/branches/upstream/current/src/schooltool/attendance/sparkline.py
   schooltool/branches/upstream/current/src/schooltool/attendance/tests/
   schooltool/branches/upstream/current/src/schooltool/attendance/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_attendance.py
   schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sampledata.py
   schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sparkline.py
   schooltool/branches/upstream/current/src/schooltool/calendar/
   schooltool/branches/upstream/current/src/schooltool/calendar/README.txt
   schooltool/branches/upstream/current/src/schooltool/calendar/__init__.py
   schooltool/branches/upstream/current/src/schooltool/calendar/browser.py
   schooltool/branches/upstream/current/src/schooltool/calendar/generate_vcal_dict.py
   schooltool/branches/upstream/current/src/schooltool/calendar/icalendar.py
   schooltool/branches/upstream/current/src/schooltool/calendar/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/calendar/mixins.py
   schooltool/branches/upstream/current/src/schooltool/calendar/recurrent.py
   schooltool/branches/upstream/current/src/schooltool/calendar/simple.py
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/Amsterdam.ics
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/Vilnius.ics
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/sample.ics
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_generate_vcal_dict.py
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_icalendar.py
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_recurrent.py
   schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_schooltool.py
   schooltool/branches/upstream/current/src/schooltool/calendar/timezones.txt
   schooltool/branches/upstream/current/src/schooltool/calendar/utils.py
   schooltool/branches/upstream/current/src/schooltool/calendar/vcal_dict.py
   schooltool/branches/upstream/current/src/schooltool/calendar/vzic.patch
   schooltool/branches/upstream/current/src/schooltool/client.py
   schooltool/branches/upstream/current/src/schooltool/commendation/
   schooltool/branches/upstream/current/src/schooltool/commendation/BasicComponent.txt
   schooltool/branches/upstream/current/src/schooltool/commendation/PythonIntegration.txt
   schooltool/branches/upstream/current/src/schooltool/commendation/README.txt
   schooltool/branches/upstream/current/src/schooltool/commendation/SystemIntegration.txt
   schooltool/branches/upstream/current/src/schooltool/commendation/Viewing.txt
   schooltool/branches/upstream/current/src/schooltool/commendation/__init__.py
   schooltool/branches/upstream/current/src/schooltool/commendation/browser.py
   schooltool/branches/upstream/current/src/schooltool/commendation/commendation-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/commendation/commendation.pt
   schooltool/branches/upstream/current/src/schooltool/commendation/commendation.py
   schooltool/branches/upstream/current/src/schooltool/commendation/commendation_add.pt
   schooltool/branches/upstream/current/src/schooltool/commendation/commendations.pt
   schooltool/branches/upstream/current/src/schooltool/commendation/commendations_overview.pt
   schooltool/branches/upstream/current/src/schooltool/commendation/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/commendation/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/commendation/ftests.py
   schooltool/branches/upstream/current/src/schooltool/commendation/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/commendation/tests.py
   schooltool/branches/upstream/current/src/schooltool/common.py
   schooltool/branches/upstream/current/src/schooltool/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/course/
   schooltool/branches/upstream/current/src/schooltool/course/__init__.py
   schooltool/branches/upstream/current/src/schooltool/course/booking.py
   schooltool/branches/upstream/current/src/schooltool/course/browser/
   schooltool/branches/upstream/current/src/schooltool/course/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/course/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/course/browser/course.py
   schooltool/branches/upstream/current/src/schooltool/course/browser/csvimport.py
   schooltool/branches/upstream/current/src/schooltool/course/browser/section.py
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course-csvimport.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course_container.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/coursesviewlet.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/edit_relationships.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_add.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_container.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_edit.pt
   schooltool/branches/upstream/current/src/schooltool/course/browser/tests.py
   schooltool/branches/upstream/current/src/schooltool/course/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/course/course-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/course/course.py
   schooltool/branches/upstream/current/src/schooltool/course/help/
   schooltool/branches/upstream/current/src/schooltool/course/help/__init__.py
   schooltool/branches/upstream/current/src/schooltool/course/help/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/course/help/course_container.pt
   schooltool/branches/upstream/current/src/schooltool/course/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/course/rest/
   schooltool/branches/upstream/current/src/schooltool/course/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/course/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/course/rest/course.pt
   schooltool/branches/upstream/current/src/schooltool/course/rest/course.py
   schooltool/branches/upstream/current/src/schooltool/course/rest/section.pt
   schooltool/branches/upstream/current/src/schooltool/course/rest/section.py
   schooltool/branches/upstream/current/src/schooltool/course/rest/tests.py
   schooltool/branches/upstream/current/src/schooltool/course/sampledata.py
   schooltool/branches/upstream/current/src/schooltool/course/section.py
   schooltool/branches/upstream/current/src/schooltool/course/security.zcml
   schooltool/branches/upstream/current/src/schooltool/course/tests/
   schooltool/branches/upstream/current/src/schooltool/course/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/course/tests/test_course.py
   schooltool/branches/upstream/current/src/schooltool/course/tests/test_sampledata.py
   schooltool/branches/upstream/current/src/schooltool/dashboard/
   schooltool/branches/upstream/current/src/schooltool/dashboard/__init__.py
   schooltool/branches/upstream/current/src/schooltool/dashboard/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/dashboard/dashContent.pt
   schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.pt
   schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.py
   schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard_manager.pt
   schooltool/branches/upstream/current/src/schooltool/dashboard/dashboardpage.pt
   schooltool/branches/upstream/current/src/schooltool/dashboard/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/dashboard/school.pt
   schooltool/branches/upstream/current/src/schooltool/dashboard/sections.pt
   schooltool/branches/upstream/current/src/schooltool/dashboard/term.pt
   schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/
   schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.10
   schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.10-0.11.4
   schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.11.4
   schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-2006.0-alpha1
   schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/setup.py
   schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/test_migration_from.py
   schooltool/branches/upstream/current/src/schooltool/demographics/
   schooltool/branches/upstream/current/src/schooltool/demographics/README.txt
   schooltool/branches/upstream/current/src/schooltool/demographics/__init__.py
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics.txt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics_macros.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/display_form.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/edit_form.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftests.py
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/menu_macros.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/nameinfo_view.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/person_add.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/personform.py
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_edit.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_view.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/search.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.pt
   schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.py
   schooltool/branches/upstream/current/src/schooltool/demographics/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/demographics/demographics-overrides.zcml
   schooltool/branches/upstream/current/src/schooltool/demographics/event_titles.txt
   schooltool/branches/upstream/current/src/schooltool/demographics/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/demographics/overrides.zcml
   schooltool/branches/upstream/current/src/schooltool/demographics/person.py
   schooltool/branches/upstream/current/src/schooltool/demographics/sampledata.py
   schooltool/branches/upstream/current/src/schooltool/demographics/tests.py
   schooltool/branches/upstream/current/src/schooltool/demographics/utility.py
   schooltool/branches/upstream/current/src/schooltool/devmode/
   schooltool/branches/upstream/current/src/schooltool/devmode/__init__.py
   schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.css
   schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.py
   schooltool/branches/upstream/current/src/schooltool/devmode/box-bottom.png
   schooltool/branches/upstream/current/src/schooltool/devmode/code_menu.pt
   schooltool/branches/upstream/current/src/schooltool/devmode/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/devmode/devmode-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/devmode/devmode-ftesting-overrides.zcml
   schooltool/branches/upstream/current/src/schooltool/devmode/devmode-overrides.zcml
   schooltool/branches/upstream/current/src/schooltool/devmode/devmode.css
   schooltool/branches/upstream/current/src/schooltool/devmode/devmode.pt
   schooltool/branches/upstream/current/src/schooltool/devmode/devmode.py
   schooltool/branches/upstream/current/src/schooltool/devmode/devmode.txt
   schooltool/branches/upstream/current/src/schooltool/devmode/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/devmode/ftests.py
   schooltool/branches/upstream/current/src/schooltool/devmode/harrow.png
   schooltool/branches/upstream/current/src/schooltool/devmode/introspector.css
   schooltool/branches/upstream/current/src/schooltool/devmode/modules.pt
   schooltool/branches/upstream/current/src/schooltool/devmode/overrides.zcml
   schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.pt
   schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.py
   schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.txt
   schooltool/branches/upstream/current/src/schooltool/devmode/restdoc_macros.pt
   schooltool/branches/upstream/current/src/schooltool/devmode/restmenu.pt
   schooltool/branches/upstream/current/src/schooltool/devmode/skin.py
   schooltool/branches/upstream/current/src/schooltool/devmode/switch.js
   schooltool/branches/upstream/current/src/schooltool/devmode/tests.py
   schooltool/branches/upstream/current/src/schooltool/devmode/varrow.png
   schooltool/branches/upstream/current/src/schooltool/generations/
   schooltool/branches/upstream/current/src/schooltool/generations/__init__.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve1.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve10.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve11.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve12.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve13.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve14.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve15.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve16.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve17.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve18.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve19.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve2.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve20.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve21.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve22.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve23.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve3.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve4.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve5.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve6.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve7.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve8.py
   schooltool/branches/upstream/current/src/schooltool/generations/evolve9.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/
   schooltool/branches/upstream/current/src/schooltool/generations/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve1.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve10.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve11.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve12.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve14.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve15.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve16.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve17.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve18.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve19.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve20.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve21.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve22.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve23.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve6.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve7.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve8.py
   schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve9.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/
   schooltool/branches/upstream/current/src/schooltool/gradebook/README.txt
   schooltool/branches/upstream/current/src/schooltool/gradebook/__init__.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/activity.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/README.txt
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activities_overview.pt
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activity.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/categories.pt
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/category.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftests.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade.pt
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_activity.pt
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_student.pt
   schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_overview.pt
   schooltool/branches/upstream/current/src/schooltool/gradebook/category.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/statistic.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/tests/
   schooltool/branches/upstream/current/src/schooltool/gradebook/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/gradebook/tests/test_gradebook.py
   schooltool/branches/upstream/current/src/schooltool/group/
   schooltool/branches/upstream/current/src/schooltool/group/__init__.py
   schooltool/branches/upstream/current/src/schooltool/group/browser/
   schooltool/branches/upstream/current/src/schooltool/group/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/group/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/group/browser/csvimport.py
   schooltool/branches/upstream/current/src/schooltool/group/browser/group-csvimport.pt
   schooltool/branches/upstream/current/src/schooltool/group/browser/group.pt
   schooltool/branches/upstream/current/src/schooltool/group/browser/group.py
   schooltool/branches/upstream/current/src/schooltool/group/browser/groupsviewlet.pt
   schooltool/branches/upstream/current/src/schooltool/group/browser/tests.py
   schooltool/branches/upstream/current/src/schooltool/group/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/group/group.py
   schooltool/branches/upstream/current/src/schooltool/group/help/
   schooltool/branches/upstream/current/src/schooltool/group/help/__init__.py
   schooltool/branches/upstream/current/src/schooltool/group/help/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/group/help/group_container.pt
   schooltool/branches/upstream/current/src/schooltool/group/help/group_container.stx
   schooltool/branches/upstream/current/src/schooltool/group/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/group/rest/
   schooltool/branches/upstream/current/src/schooltool/group/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/group/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/group/rest/group.pt
   schooltool/branches/upstream/current/src/schooltool/group/rest/group.py
   schooltool/branches/upstream/current/src/schooltool/group/rest/tests.py
   schooltool/branches/upstream/current/src/schooltool/group/sampledata.py
   schooltool/branches/upstream/current/src/schooltool/group/security.zcml
   schooltool/branches/upstream/current/src/schooltool/group/tests/
   schooltool/branches/upstream/current/src/schooltool/group/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/group/tests/test_group.py
   schooltool/branches/upstream/current/src/schooltool/group/tests/test_sampledata.py
   schooltool/branches/upstream/current/src/schooltool/help/
   schooltool/branches/upstream/current/src/schooltool/help/README.txt
   schooltool/branches/upstream/current/src/schooltool/help/__init__.py
   schooltool/branches/upstream/current/src/schooltool/help/browser.py
   schooltool/branches/upstream/current/src/schooltool/help/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/help/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/help/ftests.py
   schooltool/branches/upstream/current/src/schooltool/help/help-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/help/help-meta.zcml
   schooltool/branches/upstream/current/src/schooltool/help/help.css
   schooltool/branches/upstream/current/src/schooltool/help/help.txt
   schooltool/branches/upstream/current/src/schooltool/help/helplink.pt
   schooltool/branches/upstream/current/src/schooltool/help/helptopic.pt
   schooltool/branches/upstream/current/src/schooltool/help/integration.txt
   schooltool/branches/upstream/current/src/schooltool/help/meta.zcml
   schooltool/branches/upstream/current/src/schooltool/help/tests.py
   schooltool/branches/upstream/current/src/schooltool/level/
   schooltool/branches/upstream/current/src/schooltool/level/README.txt
   schooltool/branches/upstream/current/src/schooltool/level/__init__.py
   schooltool/branches/upstream/current/src/schooltool/level/browser/
   schooltool/branches/upstream/current/src/schooltool/level/browser/README.txt
   schooltool/branches/upstream/current/src/schooltool/level/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/level/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/level/browser/disconnectedlevelerror_info.pt
   schooltool/branches/upstream/current/src/schooltool/level/browser/ftests.py
   schooltool/branches/upstream/current/src/schooltool/level/browser/level.pt
   schooltool/branches/upstream/current/src/schooltool/level/browser/level.py
   schooltool/branches/upstream/current/src/schooltool/level/browser/level.txt
   schooltool/branches/upstream/current/src/schooltool/level/browser/level_validation.pt
   schooltool/branches/upstream/current/src/schooltool/level/browser/levellooperror_info.pt
   schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.pt
   schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.py
   schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.txt
   schooltool/branches/upstream/current/src/schooltool/level/browser/record.pt
   schooltool/branches/upstream/current/src/schooltool/level/browser/record.py
   schooltool/branches/upstream/current/src/schooltool/level/browser/record.txt
   schooltool/branches/upstream/current/src/schooltool/level/browser/tests.py
   schooltool/branches/upstream/current/src/schooltool/level/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/level/ftesting.py
   schooltool/branches/upstream/current/src/schooltool/level/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/level/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/level/level-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/level/level.py
   schooltool/branches/upstream/current/src/schooltool/level/promotion.py
   schooltool/branches/upstream/current/src/schooltool/level/promotion.xpdl
   schooltool/branches/upstream/current/src/schooltool/level/record.py
   schooltool/branches/upstream/current/src/schooltool/level/rest/
   schooltool/branches/upstream/current/src/schooltool/level/rest/README.txt
   schooltool/branches/upstream/current/src/schooltool/level/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/level/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/level/rest/ftests.py
   schooltool/branches/upstream/current/src/schooltool/level/rest/history.pt
   schooltool/branches/upstream/current/src/schooltool/level/rest/level.pt
   schooltool/branches/upstream/current/src/schooltool/level/rest/level.py
   schooltool/branches/upstream/current/src/schooltool/level/rest/record.py
   schooltool/branches/upstream/current/src/schooltool/level/rest/selectinitiallevel.pt
   schooltool/branches/upstream/current/src/schooltool/level/rest/setleveloutcome.pt
   schooltool/branches/upstream/current/src/schooltool/level/rest/tests/
   schooltool/branches/upstream/current/src/schooltool/level/rest/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_level.py
   schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_record.py
   schooltool/branches/upstream/current/src/schooltool/level/sampledata.py
   schooltool/branches/upstream/current/src/schooltool/level/testing.py
   schooltool/branches/upstream/current/src/schooltool/level/tests/
   schooltool/branches/upstream/current/src/schooltool/level/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/level/tests/test_level.py
   schooltool/branches/upstream/current/src/schooltool/level/tests/test_sampledata.py
   schooltool/branches/upstream/current/src/schooltool/locales/
   schooltool/branches/upstream/current/src/schooltool/locales/__init__.py
   schooltool/branches/upstream/current/src/schooltool/locales/af/
   schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/am/
   schooltool/branches/upstream/current/src/schooltool/locales/am/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/am/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/an/
   schooltool/branches/upstream/current/src/schooltool/locales/an/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/an/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ar/
   schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/bn/
   schooltool/branches/upstream/current/src/schooltool/locales/bn/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/bn/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ca/
   schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/cs/
   schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/da/
   schooltool/branches/upstream/current/src/schooltool/locales/da/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/da/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/de/
   schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/de_CH/
   schooltool/branches/upstream/current/src/schooltool/locales/de_CH/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/de_CH/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/de_DE/
   schooltool/branches/upstream/current/src/schooltool/locales/de_DE/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/de_DE/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/el/
   schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/en/
   schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/en_AU/
   schooltool/branches/upstream/current/src/schooltool/locales/en_AU/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/en_AU/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/en_GB/
   schooltool/branches/upstream/current/src/schooltool/locales/en_GB/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/en_GB/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/en_US/
   schooltool/branches/upstream/current/src/schooltool/locales/en_US/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/en_US/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/es/
   schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/es_CL/
   schooltool/branches/upstream/current/src/schooltool/locales/es_CL/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/es_CL/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/es_ES/
   schooltool/branches/upstream/current/src/schooltool/locales/es_ES/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/es_ES/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/es_MX/
   schooltool/branches/upstream/current/src/schooltool/locales/es_MX/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/es_MX/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/es_PE/
   schooltool/branches/upstream/current/src/schooltool/locales/es_PE/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/es_PE/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/es_US/
   schooltool/branches/upstream/current/src/schooltool/locales/es_US/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/es_US/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/et/
   schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/eu/
   schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/fa/
   schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/fi/
   schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/fr/
   schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/fr_BE/
   schooltool/branches/upstream/current/src/schooltool/locales/fr_BE/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/fr_BE/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/fr_CA/
   schooltool/branches/upstream/current/src/schooltool/locales/fr_CA/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/fr_CA/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/fr_FR/
   schooltool/branches/upstream/current/src/schooltool/locales/fr_FR/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/fr_FR/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/gl/
   schooltool/branches/upstream/current/src/schooltool/locales/gl/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/gl/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/he/
   schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/hi/
   schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/hu/
   schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/id/
   schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/is/
   schooltool/branches/upstream/current/src/schooltool/locales/is/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/is/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/it/
   schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/ja/
   schooltool/branches/upstream/current/src/schooltool/locales/ja/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ja/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/ka/
   schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/ko/
   schooltool/branches/upstream/current/src/schooltool/locales/ko/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ko/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/lt/
   schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/lv/
   schooltool/branches/upstream/current/src/schooltool/locales/lv/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/lv/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ml/
   schooltool/branches/upstream/current/src/schooltool/locales/ml/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ml/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ms/
   schooltool/branches/upstream/current/src/schooltool/locales/ms/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ms/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/nb/
   schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/ne/
   schooltool/branches/upstream/current/src/schooltool/locales/ne/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ne/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/nl/
   schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/nl_NL/
   schooltool/branches/upstream/current/src/schooltool/locales/nl_NL/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/nl_NL/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/nn/
   schooltool/branches/upstream/current/src/schooltool/locales/nn/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/nn/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/no/
   schooltool/branches/upstream/current/src/schooltool/locales/no/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/no/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/pa/
   schooltool/branches/upstream/current/src/schooltool/locales/pa/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/pa/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/pl/
   schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/pt/
   schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/
   schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/pt_PT/
   schooltool/branches/upstream/current/src/schooltool/locales/pt_PT/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/pt_PT/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ro/
   schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/ru/
   schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/sk/
   schooltool/branches/upstream/current/src/schooltool/locales/sk/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/sk/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/sq/
   schooltool/branches/upstream/current/src/schooltool/locales/sq/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/sq/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/sr/
   schooltool/branches/upstream/current/src/schooltool/locales/sr/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/sr/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/st/
   schooltool/branches/upstream/current/src/schooltool/locales/st/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/st/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/sv/
   schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/ta/
   schooltool/branches/upstream/current/src/schooltool/locales/ta/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/ta/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/tl/
   schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/tr/
   schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/uk/
   schooltool/branches/upstream/current/src/schooltool/locales/uk/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/uk/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/vi/
   schooltool/branches/upstream/current/src/schooltool/locales/vi/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/vi/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/yi/
   schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/
   schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/
   schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/schoolbell.po
   schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/schooltool.po
   schooltool/branches/upstream/current/src/schooltool/note/
   schooltool/branches/upstream/current/src/schooltool/note/__init__.py
   schooltool/branches/upstream/current/src/schooltool/note/browser.py
   schooltool/branches/upstream/current/src/schooltool/note/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/note/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/note/ftests.py
   schooltool/branches/upstream/current/src/schooltool/note/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/note/note-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/note/note.py
   schooltool/branches/upstream/current/src/schooltool/note/note_add.pt
   schooltool/branches/upstream/current/src/schooltool/note/notes.pt
   schooltool/branches/upstream/current/src/schooltool/note/notes_browser.txt
   schooltool/branches/upstream/current/src/schooltool/note/notes_rest.txt
   schooltool/branches/upstream/current/src/schooltool/note/rest.py
   schooltool/branches/upstream/current/src/schooltool/note/rest_notes.pt
   schooltool/branches/upstream/current/src/schooltool/note/tests.py
   schooltool/branches/upstream/current/src/schooltool/person/
   schooltool/branches/upstream/current/src/schooltool/person/__init__.py
   schooltool/branches/upstream/current/src/schooltool/person/browser/
   schooltool/branches/upstream/current/src/schooltool/person/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/person/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/person/browser/container_contents.rst
   schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.py
   schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.txt
   schooltool/branches/upstream/current/src/schooltool/person/browser/ftests.py
   schooltool/branches/upstream/current/src/schooltool/person/browser/password.txt
   schooltool/branches/upstream/current/src/schooltool/person/browser/person-csvimport.pt
   schooltool/branches/upstream/current/src/schooltool/person/browser/person.pt
   schooltool/branches/upstream/current/src/schooltool/person/browser/person.py
   schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.pt
   schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.txt
   schooltool/branches/upstream/current/src/schooltool/person/browser/person_container_delete.pt
   schooltool/branches/upstream/current/src/schooltool/person/browser/person_edit.pt
   schooltool/branches/upstream/current/src/schooltool/person/browser/person_filter.pt
   schooltool/branches/upstream/current/src/schooltool/person/browser/person_preferences.pt
   schooltool/branches/upstream/current/src/schooltool/person/browser/tests.py
   schooltool/branches/upstream/current/src/schooltool/person/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/person/help/
   schooltool/branches/upstream/current/src/schooltool/person/help/__init__.py
   schooltool/branches/upstream/current/src/schooltool/person/help/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/person/help/person_container.pt
   schooltool/branches/upstream/current/src/schooltool/person/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/person/person.py
   schooltool/branches/upstream/current/src/schooltool/person/preference.py
   schooltool/branches/upstream/current/src/schooltool/person/rest/
   schooltool/branches/upstream/current/src/schooltool/person/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/person/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/person/rest/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/person/rest/person-preferences.pt
   schooltool/branches/upstream/current/src/schooltool/person/rest/person.pt
   schooltool/branches/upstream/current/src/schooltool/person/rest/person.py
   schooltool/branches/upstream/current/src/schooltool/person/rest/preference.py
   schooltool/branches/upstream/current/src/schooltool/person/rest/tests.py
   schooltool/branches/upstream/current/src/schooltool/person/security.zcml
   schooltool/branches/upstream/current/src/schooltool/person/tests/
   schooltool/branches/upstream/current/src/schooltool/person/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/person/tests/test_person.py
   schooltool/branches/upstream/current/src/schooltool/person/utility.py
   schooltool/branches/upstream/current/src/schooltool/relationship/
   schooltool/branches/upstream/current/src/schooltool/relationship/README.txt
   schooltool/branches/upstream/current/src/schooltool/relationship/__init__.py
   schooltool/branches/upstream/current/src/schooltool/relationship/annotatable.py
   schooltool/branches/upstream/current/src/schooltool/relationship/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/relationship/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/relationship/objectevents.py
   schooltool/branches/upstream/current/src/schooltool/relationship/relationship.py
   schooltool/branches/upstream/current/src/schooltool/relationship/tests/
   schooltool/branches/upstream/current/src/schooltool/relationship/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_annotatable.py
   schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_objectevents.py
   schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_relationship.py
   schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_uri.py
   schooltool/branches/upstream/current/src/schooltool/relationship/uri.py
   schooltool/branches/upstream/current/src/schooltool/requirement/
   schooltool/branches/upstream/current/src/schooltool/requirement/README.txt
   schooltool/branches/upstream/current/src/schooltool/requirement/__init__.py
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/README.txt
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftests.py
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.pt
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.py
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.py
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.txt
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystemwidget.pt
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/subthread.pt
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/tests.py
   schooltool/branches/upstream/current/src/schooltool/requirement/browser/treenode.pt
   schooltool/branches/upstream/current/src/schooltool/requirement/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/requirement/evaluation.py
   schooltool/branches/upstream/current/src/schooltool/requirement/grades.txt
   schooltool/branches/upstream/current/src/schooltool/requirement/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/requirement/requirement-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/requirement/requirement.py
   schooltool/branches/upstream/current/src/schooltool/requirement/scoresystem.py
   schooltool/branches/upstream/current/src/schooltool/requirement/security.py
   schooltool/branches/upstream/current/src/schooltool/requirement/security.zcml
   schooltool/branches/upstream/current/src/schooltool/requirement/testing.py
   schooltool/branches/upstream/current/src/schooltool/requirement/tests.py
   schooltool/branches/upstream/current/src/schooltool/resource/
   schooltool/branches/upstream/current/src/schooltool/resource/__init__.py
   schooltool/branches/upstream/current/src/schooltool/resource/booking.py
   schooltool/branches/upstream/current/src/schooltool/resource/browser/
   schooltool/branches/upstream/current/src/schooltool/resource/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/resource/browser/booking.py
   schooltool/branches/upstream/current/src/schooltool/resource/browser/cal-booking.txt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/resource/browser/container_delete.pt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/csvimport.py
   schooltool/branches/upstream/current/src/schooltool/resource/browser/event_booking_viewlet.pt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/event_edit_booking_viewlet.pt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/ftests.py
   schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-booking.txt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-csvimport.pt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.pt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.py
   schooltool/branches/upstream/current/src/schooltool/resource/browser/resource_filter.pt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/resourcecontainer.pt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/resources.txt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/security.txt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/subtype_widget.pt
   schooltool/branches/upstream/current/src/schooltool/resource/browser/tests.py
   schooltool/branches/upstream/current/src/schooltool/resource/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/resource/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/resource/resource.py
   schooltool/branches/upstream/current/src/schooltool/resource/rest/
   schooltool/branches/upstream/current/src/schooltool/resource/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/resource/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.pt
   schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.py
   schooltool/branches/upstream/current/src/schooltool/resource/rest/tests.py
   schooltool/branches/upstream/current/src/schooltool/resource/sampledata.py
   schooltool/branches/upstream/current/src/schooltool/resource/security.zcml
   schooltool/branches/upstream/current/src/schooltool/resource/tests/
   schooltool/branches/upstream/current/src/schooltool/resource/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/resource/tests/test_resource.py
   schooltool/branches/upstream/current/src/schooltool/resource/tests/test_sampledata.py
   schooltool/branches/upstream/current/src/schooltool/resource/types.py
   schooltool/branches/upstream/current/src/schooltool/restclient/
   schooltool/branches/upstream/current/src/schooltool/restclient/README.txt
   schooltool/branches/upstream/current/src/schooltool/restclient/__init__.py
   schooltool/branches/upstream/current/src/schooltool/restclient/examples/
   schooltool/branches/upstream/current/src/schooltool/restclient/examples/export.py
   schooltool/branches/upstream/current/src/schooltool/restclient/examples/groups.csv
   schooltool/branches/upstream/current/src/schooltool/restclient/examples/import.py
   schooltool/branches/upstream/current/src/schooltool/restclient/examples/persons.csv
   schooltool/branches/upstream/current/src/schooltool/restclient/ftests/
   schooltool/branches/upstream/current/src/schooltool/restclient/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/restclient/ftests/face.txt
   schooltool/branches/upstream/current/src/schooltool/restclient/ftests/test_restclient.py
   schooltool/branches/upstream/current/src/schooltool/restclient/restclient.py
   schooltool/branches/upstream/current/src/schooltool/restclient/tests/
   schooltool/branches/upstream/current/src/schooltool/restclient/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/restclient/tests/test_restclient.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/
   schooltool/branches/upstream/current/src/schooltool/sampledata/README.txt
   schooltool/branches/upstream/current/src/schooltool/sampledata/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/browser.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/sampledata/first_names.txt
   schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/
   schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/sampledata.txt
   schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/generator.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/last_names.txt
   schooltool/branches/upstream/current/src/schooltool/sampledata/name.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/sampledata.pt
   schooltool/branches/upstream/current/src/schooltool/sampledata/tests/
   schooltool/branches/upstream/current/src/schooltool/sampledata/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_browser.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_generator.py
   schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_name.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/
   schooltool/branches/upstream/current/src/schooltool/sbapp/README.txt
   schooltool/branches/upstream/current/src/schooltool/sbapp/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/cal.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/csvimport.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/app.txt
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/resources/
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/resources/schoolbell.png
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/skin.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/calendar_overlay.pt
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/generic_macros.pt
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/index.pt
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/navigation.pt
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/person.pt
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_cal.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_skin.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve1.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve2.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve3.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve4.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve5.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve6.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve7.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve8.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/main.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/app.txt
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_app.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_rest.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/tests/
   schooltool/branches/upstream/current/src/schooltool/sbapp/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/sbapp/tests/empty.conf
   schooltool/branches/upstream/current/src/schooltool/sbapp/tests/sample.conf
   schooltool/branches/upstream/current/src/schooltool/sbapp/tests/test_main.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/README.txt
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/__init__.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/helpers.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/policy_table.txt
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control.pt
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control_viewlet.pt
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/test_views.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/views.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/crowds.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/customisation.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/meta.zcml
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/metaconfigure.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/metadirectives.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/policy.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_crowds.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_customisation.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_metaconfigure.py
   schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_policy.py
   schooltool/branches/upstream/current/src/schooltool/setup/
   schooltool/branches/upstream/current/src/schooltool/setup/__init__.py
   schooltool/branches/upstream/current/src/schooltool/setup/mkschooltoolinst.py
   schooltool/branches/upstream/current/src/schooltool/setupdata/
   schooltool/branches/upstream/current/src/schooltool/setupdata/README.txt
   schooltool/branches/upstream/current/src/schooltool/setupdata/__init__.py
   schooltool/branches/upstream/current/src/schooltool/setupdata/browser.py
   schooltool/branches/upstream/current/src/schooltool/setupdata/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/setupdata/generator.py
   schooltool/branches/upstream/current/src/schooltool/setupdata/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/setupdata/setupdata.pt
   schooltool/branches/upstream/current/src/schooltool/setupdata/tests/
   schooltool/branches/upstream/current/src/schooltool/setupdata/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_browser.py
   schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_generator.py
   schooltool/branches/upstream/current/src/schooltool/skin/
   schooltool/branches/upstream/current/src/schooltool/skin/__init__.py
   schooltool/branches/upstream/current/src/schooltool/skin/breadcrumbs.py
   schooltool/branches/upstream/current/src/schooltool/skin/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/skin/containers.py
   schooltool/branches/upstream/current/src/schooltool/skin/dateformatter.py
   schooltool/branches/upstream/current/src/schooltool/skin/error.py
   schooltool/branches/upstream/current/src/schooltool/skin/form.py
   schooltool/branches/upstream/current/src/schooltool/skin/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/skin/macros.py
   schooltool/branches/upstream/current/src/schooltool/skin/meta.zcml
   schooltool/branches/upstream/current/src/schooltool/skin/resources/
   schooltool/branches/upstream/current/src/schooltool/skin/resources/delete.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/editor_config.js
   schooltool/branches/upstream/current/src/schooltool/skin/resources/favicon.ico
   schooltool/branches/upstream/current/src/schooltool/skin/resources/icon.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/layout.css
   schooltool/branches/upstream/current/src/schooltool/skin/resources/logo.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/next.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/note-body-l.gif
   schooltool/branches/upstream/current/src/schooltool/skin/resources/note-body-r.gif
   schooltool/branches/upstream/current/src/schooltool/skin/resources/note-head-l.gif
   schooltool/branches/upstream/current/src/schooltool/skin/resources/note-head-r.gif
   schooltool/branches/upstream/current/src/schooltool/skin/resources/previous.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/printer.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-body-l.gif
   schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-body-r.gif
   schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-head-l.gif
   schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-head-r.gif
   schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.css
   schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.js
   schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/sidebar-background-top.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/sidebar-background.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/toolbar-background-hover.png
   schooltool/branches/upstream/current/src/schooltool/skin/resources/toolbar-background.png
   schooltool/branches/upstream/current/src/schooltool/skin/skin.py
   schooltool/branches/upstream/current/src/schooltool/skin/templates/
   schooltool/branches/upstream/current/src/schooltool/skin/templates/actions.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsViewlet.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsbar.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/container.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/container_delete.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/edit_form.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/error.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/filter.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/formlib_macros.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/generic_macros.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/language_selector.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/menuBarViewlet.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/menubar.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/navigation.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/navigationViewlet.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/notfound.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/onlinehelp_macros.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_add.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_edit.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/table_container.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/unauthorized.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/view_macros.pt
   schooltool/branches/upstream/current/src/schooltool/skin/templates/widget_macros.pt
   schooltool/branches/upstream/current/src/schooltool/skin/tests/
   schooltool/branches/upstream/current/src/schooltool/skin/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/skin/tests/test_breadcrumbs.py
   schooltool/branches/upstream/current/src/schooltool/skin/tests/test_containers.py
   schooltool/branches/upstream/current/src/schooltool/skin/tests/test_dateformatter.py
   schooltool/branches/upstream/current/src/schooltool/skin/tests/test_error.py
   schooltool/branches/upstream/current/src/schooltool/skin/tests/test_skin.py
   schooltool/branches/upstream/current/src/schooltool/table/
   schooltool/branches/upstream/current/src/schooltool/table/__init__.py
   schooltool/branches/upstream/current/src/schooltool/table/batch.py
   schooltool/branches/upstream/current/src/schooltool/table/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/table/table.py
   schooltool/branches/upstream/current/src/schooltool/table/templates/
   schooltool/branches/upstream/current/src/schooltool/table/templates/batch.pt
   schooltool/branches/upstream/current/src/schooltool/table/templates/filter.pt
   schooltool/branches/upstream/current/src/schooltool/table/tests/
   schooltool/branches/upstream/current/src/schooltool/table/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/table/tests/test_table.py
   schooltool/branches/upstream/current/src/schooltool/term/
   schooltool/branches/upstream/current/src/schooltool/term/README.txt
   schooltool/branches/upstream/current/src/schooltool/term/__init__.py
   schooltool/branches/upstream/current/src/schooltool/term/browser/
   schooltool/branches/upstream/current/src/schooltool/term/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/term/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/term/browser/emergency.py
   schooltool/branches/upstream/current/src/schooltool/term/browser/emergency2.pt
   schooltool/branches/upstream/current/src/schooltool/term/browser/emergency_select.pt
   schooltool/branches/upstream/current/src/schooltool/term/browser/emergencydays.txt
   schooltool/branches/upstream/current/src/schooltool/term/browser/term-container-delete.pt
   schooltool/branches/upstream/current/src/schooltool/term/browser/term.pt
   schooltool/branches/upstream/current/src/schooltool/term/browser/term.py
   schooltool/branches/upstream/current/src/schooltool/term/browser/term_add_edit.pt
   schooltool/branches/upstream/current/src/schooltool/term/browser/termrenderer.txt
   schooltool/branches/upstream/current/src/schooltool/term/browser/tests.py
   schooltool/branches/upstream/current/src/schooltool/term/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/term/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/term/rest/
   schooltool/branches/upstream/current/src/schooltool/term/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/term/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/term/rest/term.py
   schooltool/branches/upstream/current/src/schooltool/term/rest/tests.py
   schooltool/branches/upstream/current/src/schooltool/term/sampledata.py
   schooltool/branches/upstream/current/src/schooltool/term/term-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/term/term.py
   schooltool/branches/upstream/current/src/schooltool/term/tests/
   schooltool/branches/upstream/current/src/schooltool/term/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/term/tests/test_sampledata.py
   schooltool/branches/upstream/current/src/schooltool/term/tests/test_term.py
   schooltool/branches/upstream/current/src/schooltool/testing/
   schooltool/branches/upstream/current/src/schooltool/testing/README.txt
   schooltool/branches/upstream/current/src/schooltool/testing/__init__.py
   schooltool/branches/upstream/current/src/schooltool/testing/analyze.py
   schooltool/branches/upstream/current/src/schooltool/testing/functional.py
   schooltool/branches/upstream/current/src/schooltool/testing/registry.py
   schooltool/branches/upstream/current/src/schooltool/testing/setup.py
   schooltool/branches/upstream/current/src/schooltool/testing/tests.py
   schooltool/branches/upstream/current/src/schooltool/testing/util.py
   schooltool/branches/upstream/current/src/schooltool/tests/
   schooltool/branches/upstream/current/src/schooltool/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/tests/test_client.py
   schooltool/branches/upstream/current/src/schooltool/tests/test_common.py
   schooltool/branches/upstream/current/src/schooltool/tests/test_xmlparsing.py
   schooltool/branches/upstream/current/src/schooltool/timetable/
   schooltool/branches/upstream/current/src/schooltool/timetable/README.txt
   schooltool/branches/upstream/current/src/schooltool/timetable/__init__.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/event.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetable-events.txt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetabling.txt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/schema.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/advancedtts.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/person-timetable-setup.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/schooltt-delete.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/section-timetable-setup.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/simpletts.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_change.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_select.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable-schema-container.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_event_edit.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_list.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetableschema.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_choice.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_form.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/specialdays.txt
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_schema.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_timetable.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_ttwizard.py
   schooltool/branches/upstream/current/src/schooltool/timetable/browser/ttwizard.py
   schooltool/branches/upstream/current/src/schooltool/timetable/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.py
   schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.zcml
   schooltool/branches/upstream/current/src/schooltool/timetable/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/timetable/model.py
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/__init__.py
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/configure.zcml
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/composite-timetables.txt
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/test_all.py
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/timetabling.txt
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/schema.py
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable_schema.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetables.pt
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_rest.py
   schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_schema.py
   schooltool/branches/upstream/current/src/schooltool/timetable/sampledata.py
   schooltool/branches/upstream/current/src/schooltool/timetable/schema.py
   schooltool/branches/upstream/current/src/schooltool/timetable/source.py
   schooltool/branches/upstream/current/src/schooltool/timetable/term.py
   schooltool/branches/upstream/current/src/schooltool/timetable/tests/
   schooltool/branches/upstream/current/src/schooltool/timetable/tests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_model.py
   schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_sampledata.py
   schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_schema.py
   schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_source.py
   schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_timetable.py
   schooltool/branches/upstream/current/src/schooltool/timetable/timetable-configure.zcml
   schooltool/branches/upstream/current/src/schooltool/traverser/
   schooltool/branches/upstream/current/src/schooltool/traverser/README.txt
   schooltool/branches/upstream/current/src/schooltool/traverser/__init__.py
   schooltool/branches/upstream/current/src/schooltool/traverser/browser.py
   schooltool/branches/upstream/current/src/schooltool/traverser/interfaces.py
   schooltool/branches/upstream/current/src/schooltool/traverser/tests.py
   schooltool/branches/upstream/current/src/schooltool/traverser/traverser.py
   schooltool/branches/upstream/current/src/schooltool/utility/
   schooltool/branches/upstream/current/src/schooltool/utility/__init__.py
   schooltool/branches/upstream/current/src/schooltool/utility/ftests/
   schooltool/branches/upstream/current/src/schooltool/utility/ftests/__init__.py
   schooltool/branches/upstream/current/src/schooltool/utility/ftests/test_utility.py
   schooltool/branches/upstream/current/src/schooltool/utility/utility.py
   schooltool/branches/upstream/current/src/schooltool/version.txt
   schooltool/branches/upstream/current/src/schooltool/widget/
   schooltool/branches/upstream/current/src/schooltool/widget/__init__.py
   schooltool/branches/upstream/current/src/schooltool/widget/password.py
   schooltool/branches/upstream/current/src/schooltool/xmlparsing.py
   schooltool/branches/upstream/current/src/trace.py
   schooltool/branches/upstream/current/test.py
   schooltool/branches/upstream/current/testsupport/
   schooltool/branches/upstream/current/testsupport/README.txt
   schooltool/branches/upstream/current/testsupport/__init__.py
   schooltool/branches/upstream/current/testsupport/checks.py
   schooltool/branches/upstream/current/utilities/
   schooltool/branches/upstream/current/utilities/README.txt
   schooltool/branches/upstream/current/utilities/gpl.py
   schooltool/branches/upstream/current/utilities/xpathgrep.py
Removed:
   schooltool/branches/upstream/current/Dependencies/
   schooltool/branches/upstream/current/MANIFEST
   schooltool/branches/upstream/current/Makefile.in
   schooltool/branches/upstream/current/SchoolTool/
   schooltool/branches/upstream/current/Support/
   schooltool/branches/upstream/current/configure
   schooltool/branches/upstream/current/install.py
Modified:
   schooltool/branches/upstream/current/README.txt
   schooltool/branches/upstream/current/setup.cfg
Log:
[svn-upgrade] Integrating new upstream version, schooltool (2006.999-2007-alpha1-svn-r6947)

Deleted: schooltool/branches/upstream/current/MANIFEST
===================================================================
--- schooltool/branches/upstream/current/MANIFEST	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/MANIFEST	2007-05-05 18:51:38 UTC (rev 836)
@@ -1,1174 +0,0 @@
-MANIFEST
-Support/MANIFEST
-Support/ZConfig/tests/test_cfgimports.py
-Support/ZConfig/tests/test_cmdline.py
-Support/ZConfig/tests/test_subst.py
-Support/ZConfig/tests/support.py
-Support/ZConfig/tests/test_datatypes.py
-Support/ZConfig/tests/test_schema.py
-Support/ZConfig/tests/__init__.py
-Support/ZConfig/tests/test_config.py
-Support/ZConfig/tests/test_cookbook.py
-Support/ZConfig/tests/test_loader.py
-Support/ZConfig/tests/runtests.bat
-Support/ZConfig/tests/runtests.py
-Support/ZConfig/tests/input/inner.conf
-Support/ZConfig/tests/input/outer.conf
-Support/ZConfig/tests/input/simplesections.xml
-Support/ZConfig/tests/input/library.xml
-Support/ZConfig/tests/input/base-keytype1.xml
-Support/ZConfig/tests/input/base-keytype2.xml
-Support/ZConfig/tests/input/include.conf
-Support/ZConfig/tests/input/base-datatype1.xml
-Support/ZConfig/tests/input/base-datatype2.xml
-Support/ZConfig/tests/input/simplesections.conf
-Support/ZConfig/tests/input/simple.xml
-Support/ZConfig/tests/input/base.xml
-Support/ZConfig/tests/input/simple.conf
-Support/ZConfig/tests/input/logger.xml
-Support/ZConfig/tests/library/__init__.py
-Support/ZConfig/tests/library/README.txt
-Support/ZConfig/tests/library/widget/component.xml
-Support/ZConfig/tests/library/widget/extra.xml
-Support/ZConfig/tests/library/widget/__init__.py
-Support/ZConfig/tests/library/thing/component.xml
-Support/ZConfig/tests/library/thing/__init__.py
-Support/ZConfig/tests/library/thing/extras/extras.xml
-Support/ZConfig/matcher.py
-Support/ZConfig/url.py
-Support/ZConfig/datatypes.py
-Support/ZConfig/schema.py
-Support/ZConfig/__init__.py
-Support/ZConfig/cmdline.py
-Support/ZConfig/substitution.py
-Support/ZConfig/components/__init__.py
-Support/ZConfig/components/logger/component.xml
-Support/ZConfig/components/logger/handlers.xml
-Support/ZConfig/components/logger/loghandler.py
-Support/ZConfig/components/logger/eventlog.xml
-Support/ZConfig/components/logger/abstract.xml
-Support/ZConfig/components/logger/datatypes.py
-Support/ZConfig/components/logger/__init__.py
-Support/ZConfig/components/logger/base-logger.xml
-Support/ZConfig/components/logger/logger.py
-Support/ZConfig/components/logger/handlers.py
-Support/ZConfig/components/logger/factory.py
-Support/ZConfig/components/logger/logger.xml
-Support/ZConfig/components/logger/tests/test_logger.py
-Support/ZConfig/components/logger/tests/__init__.py
-Support/ZConfig/components/basic/component.xml
-Support/ZConfig/components/basic/mapping.py
-Support/ZConfig/components/basic/__init__.py
-Support/ZConfig/components/basic/mapping.xml
-Support/ZConfig/components/basic/tests/test_mapping.py
-Support/ZConfig/components/basic/tests/__init__.py
-Support/ZConfig/scripts/zconfig
-Support/ZConfig/scripts/zconfig_schema2html
-Support/ZConfig/cfgparser.py
-Support/ZConfig/info.py
-Support/ZConfig/loader.py
-Support/zpkgsetup/install_headers.py
-Support/zpkgsetup/build_headers.py
-Support/zpkgsetup/package.py
-Support/zpkgsetup/install_lib.py
-Support/zpkgsetup/__init__.py
-Support/zpkgsetup/build.py
-Support/zpkgsetup/utils.py
-Support/zpkgsetup/setup.py
-Support/zpkgsetup/publication.py
-Support/zpkgsetup/package.xml
-Support/zpkgsetup/dist.py
-Support/zpkgsetup/build_py.py
-Support/zpkgsetup/loggingapi.py
-Support/zpkgsetup/cfgparser.py
-Support/zpkgsetup/build_ext.py
-Support/zpkgsetup/PUBLICATION.cfg
-Support/zpkgsetup/urlutils.py
-Support/zpkgsetup/module.xml
-Support/zpkgsetup/tests/test_publication.py
-Support/zpkgsetup/tests/test_package.py
-Support/zpkgsetup/tests/support.py
-Support/zpkgsetup/tests/__init__.py
-Support/zpkgsetup/tests/test_setup.py
-Support/zpkgsetup/tests/tempfileapi.py
-Support/zpkgsetup/tests/test_dist.py
-Support/zpkgsetup/tests/test_urlutils.py
-Support/zpkgsetup/tests/test_build_py.py
-Support/zpkgsetup/tests/runtests.py
-Support/zpkgsetup/tests/input/SETUP.cfg
-Support/zpkgsetup/tests/input/foo.c
-Support/zpkgsetup/tests/input/package/__init__.py
-Support/zpkgsetup/tests/input/package/datadir/justdata.py
-Support/zpkgsetup/tests/input2/Dependencies/module-collection-0.0.0/MODULE.cfg
-Support/zpkgsetup/tests/input2/Modules/module.py
-Support/zpkgsetup/tests/input2/collection/DEPENDENCIES.cfg
-Support/README.txt
-Support/setup.py
-GPL.txt
-README.txt
-SchoolTool/DEPENDENCIES.cfg
-SchoolTool/schooltooltest
-SchoolTool/PUBLICATION.cfg
-SchoolTool/SETUP.cfg
-SchoolTool/GPL.txt
-SchoolTool/README.txt
-SchoolTool/bin/mkschooltoolinst
-SchoolTool/schooltool-skel/log/README.txt
-SchoolTool/schooltool-skel/bin/test.in
-SchoolTool/schooltool-skel/bin/schooltool-server.in
-SchoolTool/schooltool-skel/var/README.txt
-SchoolTool/schooltool-skel/etc/ftesting.zcml
-SchoolTool/schooltool-skel/etc/site.zcml
-SchoolTool/schooltool-skel/etc/schooltool.conf.in
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/DEPENDENCIES.cfg
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/__init__.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/app/__init__.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/app/notes.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/app/security.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/app/cal.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/app/app.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/app/interfaces.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/relationship/relationship.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/relationship/__init__.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/relationship/uri.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/calendar/recurrent.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/schoolbell/calendar/__init__.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schoolbell-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/configure.zcml
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/version.txt
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/xmlparsing.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/tests/test_xmlparsing.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/tests/test_client.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/tests/__init__.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/tests/test_common.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/__init__.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/common.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/client.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/schooltool.pot
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/schoolbell.pot
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ms/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/uk/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/yi/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/yi/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/es_CL/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fa/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fa/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ja/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fi/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fi/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fr_FR/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/nb/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/nb/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/bn/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ne/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fr/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fr/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/nl/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/nl/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/en_GB/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fr_CA/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/nn/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/no/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/vi/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ro/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ro/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ca/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ca/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ru/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ru/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/pt_PT/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ka/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ka/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/es_PE/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/de_CH/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/gl/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/cs/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/cs/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ko/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/sk/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/sq/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/sr/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/da/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/st/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/sv/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/sv/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/de/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/de/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/he/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/he/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/es_ES/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/pa/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/hi/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/hi/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/de_DE/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/nl_NL/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ta/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/pt_BR/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/pt_BR/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/pl/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/pl/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/es_MX/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/hu/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/hu/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/es_US/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/tl/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/tl/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/lt/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/lt/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/lv/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/pt/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/pt/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/tr/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/tr/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/af/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/af/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/en_AU/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/id/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/id/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/am/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/an/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/el/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/el/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/zh_CN/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/zh_CN/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/en/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/en/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ar/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ar/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/es/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/es/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/ml/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/et/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/et/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/en_US/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/eu/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/eu/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/is/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/it/LC_MESSAGES/schooltool.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/it/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/locales/fr_BE/LC_MESSAGES/schoolbell.po
-Dependencies/schooltool-SchoolTool-2006.0-beta1/schooltool/DEPENDENCIES.cfg
-Dependencies/schooltool-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/introspector.css
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/code_menu.pt
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/restdoc.txt
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/restdoc_macros.pt
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/DEPENDENCIES.cfg
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/restmenu.pt
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/harrow.png
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/configure.zcml
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/restdoc.pt
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/apidoc.py
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/apidoc.css
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/__init__.py
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/modules.pt
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/tests.py
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/devmode-overrides.zcml
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/overrides.zcml
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/restdoc.py
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/skin.py
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/SETUP.cfg
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/ftests.py
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/devmode.txt
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/varrow.png
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/devmode.pt
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/devmode-configure.zcml
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/devmode.py
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/devmode.css
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/switch.js
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/schooltool.devmode/box-bottom.png
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.devmode-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/config-schema.xml
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/membership.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/DEPENDENCIES.cfg
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/configure.zcml
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/security.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/cal.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/__init__.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/SETUP.cfg
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/security.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/interfaces.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/booking.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/app.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/overlay.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/relationships.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/main.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/README.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/security.zcml
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/configure.zcml
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/pdfcal.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/testing.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/interfaces.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/__init__.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/cal.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/app.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/overlay.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/csvimport.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/skin.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/tests/test_csvimport.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/tests/test_pdfcal.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/tests/test_cal.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/tests/__init__.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/tests/test_app.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/tests/test_overlay.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/tests/test_browser.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/tests/test_skin.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/cal-security.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/deletion.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/brokenview-ftesting.zcml
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/personinstructor.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/ttschema-wizard.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/login.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/__init__.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/timetable-events.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/ttschema.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/setup.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/system-objects.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/undead-calendar-overlays.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/errors.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/app.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/test_all.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/cal-recurrence.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/cal-booking.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/help.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/notes.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/cal.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/composite-timetables.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/section-booking.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/membership.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/README.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/navigation.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/schedule-single-student.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/timetabling.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-1-tiny.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-1.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-2.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-3.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-1.dot
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-4.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-2.dot
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-5.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-3.dot
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard.dot
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-4.dot
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-6.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-5.dot
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-6.dot
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/update-images.sh
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-2-tiny.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-3-tiny.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-4-tiny.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-5-tiny.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/ftests/images/ttschema-wizard-6-tiny.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/resources/month.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/resources/day.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/resources/year.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/resources/week.png
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/resources/calwidget/calendar.css
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/resources/calwidget/calendar.js
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/resources/calwidget/README.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/resources/calwidget/icon.gif
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/javascript_viewlet.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/recevent_delete.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/container_delete.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/cal_atom.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/index.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/login.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/calendar_overlay.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/cal_monthly.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/timetables-csvimport.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/calendar_macros.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/cal_daily.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/event.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/calendar_selection.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/cal_weekly.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/cal_yearly.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/css_viewlet.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/application_preferences.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/event_booking.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/event_booking_viewlet.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/event_add.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/edit_relationships.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/browser/templates/event_info_viewlet.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/test_overlay.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/empty.conf
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/sample.conf
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/test_cal.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/__init__.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/test_app.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/test_security.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/test_main.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/test_relationships.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/tests/test_booking.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/configure.zcml
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/errors.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/testing.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/interfaces.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/__init__.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/app.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/relationships.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/tests/test_errors.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/tests/test_rest.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/tests/__init__.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/tests/test_app.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/tests/test_relationships.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/composite-timetables.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/relationships.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/__init__.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/notes.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/system-objects.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/errors.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/timetabling.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/app.txt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/ftests/test_all.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/templates/link.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/templates/acl.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/templates/app.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/templates/aoc.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/schooltool.app/rest/templates/relationships.pt
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.app-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/DEPENDENCIES.cfg
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/registry.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/__init__.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/util.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/analyze.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/test.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/setup.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/tests.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/functional.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/schooltool.testing/README.txt
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.testing-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/security.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/tests.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/requirement-configure.zcml
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/grades.txt
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/DEPENDENCIES.cfg
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/configure.zcml
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/__init__.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/requirement.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/evaluation.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/SETUP.cfg
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/testing.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/scoresystem.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/interfaces.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/security.zcml
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/README.txt
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/requirement.pt
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/ftests.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/configure.zcml
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/subthread.pt
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/requirement.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/__init__.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/scoresystemwidget.pt
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/scoresystem.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/treenode.pt
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/tests.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/README.txt
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/schooltool.requirement/browser/scoresystem.txt
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.requirement-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/DEPENDENCIES.cfg
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/configure.zcml
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/batching-ftesting.zcml
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/__init__.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/macros.pt
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/batch.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/browser.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/interfaces.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/README.txt
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/SETUP.cfg
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/tests/test_batch.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/tests/__init__.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/tests/test_browser.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/ftests/multibatching.txt
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/ftests/configure.zcml
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/ftests/__init__.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/ftests/batching.txt
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/ftests/test_all.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/ftests/sample/__init__.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/ftests/sample/multiview.pt
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/schooltool.batching/ftests/sample/view.pt
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.batching-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/sampledata.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/DEPENDENCIES.cfg
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/configure.zcml
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/__init__.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/interfaces.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/security.zcml
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/resource.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/tests/test_sampledata.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/tests/__init__.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/tests/test_resource.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/browser/configure.zcml
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/browser/__init__.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/browser/resource.pt
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/browser/tests.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/browser/csvimport.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/browser/resource.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/browser/resource-csvimport.pt
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/rest/configure.zcml
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/rest/__init__.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/rest/resource.pt
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/rest/tests.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/schooltool.resource/rest/resource.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.resource-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/DEPENDENCIES.cfg
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/configure.zcml
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/preference.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/__init__.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/interfaces.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/utility.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/security.zcml
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/person.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/tests/test_person.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/tests/__init__.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/csvimport.txt
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/ftests.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/password.txt
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/person-csvimport.pt
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/configure.zcml
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/__init__.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/tests.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/csvimport.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/container_contents.rst
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/person_preferences.pt
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/person_add.txt
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/person.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/browser/person_container_delete.pt
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/rest/configure.zcml
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/rest/preference.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/rest/__init__.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/rest/person.pt
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/rest/tests.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/rest/person-preferences.pt
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/rest/interfaces.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/schooltool.person/rest/person.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.person-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.widget-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.widget-SchoolTool-2006.0-beta1/schooltool.widget/__init__.py
-Dependencies/schooltool.widget-SchoolTool-2006.0-beta1/schooltool.widget/password.py
-Dependencies/schooltool.widget-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.widget-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/configure.zcml
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/__init__.py
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/browser.py
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/interfaces.py
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/README.txt
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/setupdata.pt
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/generator.py
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/tests/test_browser.py
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/tests/__init__.py
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/schooltool.setupdata/tests/test_generator.py
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.setupdata-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.setup-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.setup-SchoolTool-2006.0-beta1/schooltool.setup/mkschooltoolinst.py
-Dependencies/schooltool.setup-SchoolTool-2006.0-beta1/schooltool.setup/DEPENDENCIES.cfg
-Dependencies/schooltool.setup-SchoolTool-2006.0-beta1/schooltool.setup/__init__.py
-Dependencies/schooltool.setup-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.setup-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/test_sampledata.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/sampledata.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/event_titles.txt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/DEPENDENCIES.cfg
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/configure.zcml
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/__init__.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/interfaces.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/utility.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/README.txt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/person.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/schooldata_view.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/personform.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/demographics.txt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/configure.zcml
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/__init__.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/search.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/menu_macros.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/edit_form.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/table.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/demographics_macros.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/ftests.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/person_add.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/schooldata_edit.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/nameinfo_view.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/table.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/schooltool.demographics/browser/display_form.pt
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.demographics-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/metadirectives.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/metaconfigure.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/configure.zcml
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/__init__.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/policy.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/crowds.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/customisation.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/interfaces.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/meta.zcml
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/README.txt
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/tests/test_policy.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/tests/__init__.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/tests/test_crowds.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/tests/test_customisation.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/tests/test_metaconfigure.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/__init__.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/views.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/configure.zcml
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/tests/test_views.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/tests/__init__.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/ftests/policy_table.txt
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/ftests/__init__.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/ftests/helpers.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/ftests/test_all.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/templates/access_control_viewlet.pt
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/schooltool.securitypolicy/browser/templates/access_control.pt
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.securitypolicy-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/gradebook-configure.zcml
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/activity.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/DEPENDENCIES.cfg
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/category.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/gradebook.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/configure.zcml
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/__init__.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/interfaces.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/README.txt
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/SETUP.cfg
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/statistic.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/tests/test_gradebook.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/tests/__init__.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/configure.zcml
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/ftests.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/activity.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/gradebook_grade.pt
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/category.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/gradebook.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/gradebook_grade_student.pt
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/gradebook_overview.pt
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/__init__.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/categories.pt
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/README.txt
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/gradebook_grade_activity.pt
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/schooltool.gradebook/browser/activities_overview.pt
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.gradebook-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/metadirectives.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/metaconfigure.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/DEPENDENCIES.cfg
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/configure.zcml
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/__init__.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/interfaces.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/meta.zcml
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/vocabulary.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/browser/metadirectives.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/browser/metaconfigure.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/browser/optionstorage.pt
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/browser/configure.zcml
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/browser/__init__.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/browser/meta.zcml
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/browser/widgets.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/optionstorage/browser/optiondict.pt
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/setup.py
-Dependencies/optionstorage-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/sampledata.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/booking.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/course-configure.zcml
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/DEPENDENCIES.cfg
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/configure.zcml
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/__init__.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/course.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/interfaces.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/section.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/security.zcml
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/SETUP.cfg
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/tests/test_sampledata.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/tests/__init__.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/tests/test_course.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/tests/test_booking.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/configure.zcml
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/__init__.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/course.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/tests.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/section.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/csvimport.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/section_edit.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/course.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/section.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/course_container.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/coursesviewlet.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/course-csvimport.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/edit_relationships.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/section_container.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/browser/templates/section_add.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/rest/configure.zcml
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/rest/course.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/rest/__init__.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/rest/section.pt
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/rest/course.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/rest/tests.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/schooltool.course/rest/section.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.course-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/DEPENDENCIES.cfg
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve8.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve9.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/__init__.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve10.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve11.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve12.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve13.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve14.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve15.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve16.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve17.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve18.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve1.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve2.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve3.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve4.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve5.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve6.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/evolve7.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve18.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve9.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/__init__.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve1.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve10.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve11.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve12.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve14.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve15.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve6.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve16.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve7.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve17.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/schooltool.generations/tests/test_evolve8.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.generations-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/breadcrumbs.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/error.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/configure.zcml
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/__init__.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/form.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/interfaces.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/macros.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/skin.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/table.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/tests/test_breadcrumbs.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/tests/test_error.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/tests/__init__.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/tests/test_skin.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/delete.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/logo.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/private-note-head-r.gif
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/layout.css
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/next.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/toolbar-background-hover.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/note-body-l.gif
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/favicon.ico
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/previous.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/schooltool.js
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/note-head-l.gif
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/icon.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/toolbar-background.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/note-body-r.gif
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/private-note-body-l.gif
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/printer.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/note-head-r.gif
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/schooltool.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/private-note-head-l.gif
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/sidebar-background.png
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/private-note-body-r.gif
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/resources/schooltool.css
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/formlib_macros.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/simple_edit.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/navigationViewlet.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/navigation.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/actionsViewlet.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/actions.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/simple_add.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/edit_form.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/view_macros.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/generic_macros.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/unauthorized.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/container.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/table.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/widget_macros.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/error.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/table_macros.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/schooltool.skin/templates/notfound.pt
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.skin-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/annotatable.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/objectevents.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/DEPENDENCIES.cfg
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/configure.zcml
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/__init__.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/uri.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/relationship.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/interfaces.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/README.txt
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/tests/test_objectevents.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/tests/test_uri.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/tests/__init__.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/tests/test_relationship.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/schooltool.relationship/tests/test_annotatable.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.relationship-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/__init__.py
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/help.css
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/help-configure.zcml
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/help-meta.zcml
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/DEPENDENCIES.cfg
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/configure.zcml
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/helplink.pt
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/helptopic.pt
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/tests.py
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/browser.py
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/meta.zcml
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/README.txt
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/schooltool.help/SETUP.cfg
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.help-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/DEPENDENCIES.cfg
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/vcal_dict.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/recurrent.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/simple.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/interfaces.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/__init__.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/utils.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/icalendar.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/generate_vcal_dict.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/vzic.patch
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/browser.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/timezones.txt
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/README.txt
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/mixins.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/tests/test_recurrent.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/tests/__init__.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/tests/test_icalendar.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/tests/test_generate_vcal_dict.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/tests/test_schooltool.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/tests/sample.ics
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/tests/Europe/Amsterdam.ics
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/schooltool.calendar/tests/Europe/Vilnius.ics
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.calendar-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/level-configure.zcml
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/DEPENDENCIES.cfg
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/configure.zcml
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/__init__.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/promotion.xpdl
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/level.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/SETUP.cfg
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/sampledata.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/testing.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/record.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/interfaces.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/README.txt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/promotion.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/configure.zcml
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/level.txt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/promotion.txt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/__init__.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/level.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/tests.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/record.txt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/level.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/ftests.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/record.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/record.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/disconnectedlevelerror_info.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/level_validation.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/promotion.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/README.txt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/levellooperror_info.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/browser/promotion.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/tests/test_sampledata.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/tests/__init__.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/tests/test_level.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/configure.zcml
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/ftests.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/history.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/setleveloutcome.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/README.txt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/level.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/selectinitiallevel.pt
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/record.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/__init__.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/level.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/tests/test_record.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/tests/__init__.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/schooltool.level/rest/tests/test_level.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.level-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/sampledata.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/DEPENDENCIES.cfg
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/configure.zcml
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/__init__.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/model.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/schema.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/source.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/interfaces.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/timetable-configure.zcml
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/README.txt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/SETUP.cfg
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/term.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/tests/test_sampledata.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/tests/__init__.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/tests/test_model.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/tests/test_schema.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/tests/test_source.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/tests/test_timetable.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/configure.zcml
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/ttwizard.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/__init__.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/schema.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/tests/test_timetable.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/tests/specialdays.txt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/tests/__init__.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/tests/test_schema.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/tests/test_ttwizard.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/ttwizard_slottimes.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/schooltt-delete.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/advancedtts.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/timetable_list.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/timetable.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/ttwizard.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/simpletts.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/section-timetable-setup.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/timetable-schema-container.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/person-timetable-setup.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/ttwizard_homeroom.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/specialday_select.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/ttwizard_choice.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/specialday_change.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/ttwizard_period_order1.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/timetableschema.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/ttwizard_period_order2.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/browser/templates/ttwizard_form.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/configure.zcml
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/__init__.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/schema.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/tests/test_schema.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/tests/test_rest.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/tests/__init__.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/templates/timetables.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/templates/timetable.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/schooltool.timetable/rest/templates/timetable_schema.pt
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.timetable-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/schooltool.traverser/DEPENDENCIES.cfg
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/schooltool.traverser/traverser.py
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/schooltool.traverser/__init__.py
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/schooltool.traverser/tests.py
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/schooltool.traverser/browser.py
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/schooltool.traverser/interfaces.py
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/schooltool.traverser/README.txt
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.traverser-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/DEPENDENCIES.cfg
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/note_add.pt
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/__init__.py
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/rest.py
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/note-configure.zcml
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/configure.zcml
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/rest_notes.pt
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/browser.py
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/tests.py
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/interfaces.py
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/notes.pt
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/note.py
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/schooltool.note/SETUP.cfg
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.note-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/publication.xpdl
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/process.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/xpdl.txt
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/__init__.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/tests.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/interfaces.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/README.txt
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/xpdl.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/attributeintegration.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/adapter/integration.txt
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/adapter/__init__.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/adapter/tests.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/zope.wfmc/adapter/integration.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/setup.py
-Dependencies/zope.wfmc-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/last_names.txt
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/configure.zcml
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/__init__.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/name.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/first_names.txt
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/browser.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/interfaces.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/README.txt
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/generator.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/sampledata.pt
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/tests/test_browser.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/tests/__init__.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/tests/test_name.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/tests/test_generator.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/ftests/sampledata.txt
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/ftests/__init__.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/schooltool.sampledata/ftests/test_all.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.sampledata-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/sampledata.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/group.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/DEPENDENCIES.cfg
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/configure.zcml
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/__init__.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/interfaces.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/security.zcml
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/tests/test_sampledata.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/tests/test_group.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/tests/__init__.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/browser/group-csvimport.pt
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/browser/groupsviewlet.pt
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/browser/__init__.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/browser/group.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/browser/configure.zcml
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/browser/tests.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/browser/csvimport.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/browser/group.pt
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/rest/__init__.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/rest/group.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/rest/configure.zcml
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/rest/tests.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/schooltool.group/rest/group.pt
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.group-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/metaconfigure.py
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/publication.xpdl
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/zcml.txt
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/configure.zcml
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/__init__.py
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/xpdl2zcml.py
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/tests.py
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/meta.zcml
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/SETUP.cfg
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/zope.app.wfmc/zope.app.wfmc-configure.zcml
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/setup.py
-Dependencies/zope.app.wfmc-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.utility-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.utility-SchoolTool-2006.0-beta1/schooltool.utility/__init__.py
-Dependencies/schooltool.utility-SchoolTool-2006.0-beta1/schooltool.utility/utility.py
-Dependencies/schooltool.utility-SchoolTool-2006.0-beta1/schooltool.utility/ftests/test_utility.py
-Dependencies/schooltool.utility-SchoolTool-2006.0-beta1/schooltool.utility/ftests/__init__.py
-Dependencies/schooltool.utility-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.utility-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/sampledata.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/sparkline.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/DEPENDENCIES.cfg
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/configure.zcml
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/__init__.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/explanation.xpdl
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/interfaces.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/attendance-configure.zcml
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/README.txt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/attendance.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/SETUP.cfg
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/tests/test_sampledata.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/tests/__init__.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/tests/test_attendance.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/tests/test_sparkline.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/configure.zcml
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/sparkline.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/attendance.css
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/__init__.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/attendance.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/tests/__init__.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/tests/test_attendance.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/tests/test_sparkline.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/ftests/__init__.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/ftests/student-attendance.txt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/ftests/attendance-forms.txt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/ftests/workflow.txt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/ftests/test_all.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/templates/controlpanel.pt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/templates/real_time.pt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/templates/retro.pt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/templates/controlpanelViewlet.pt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/templates/section-attendance-viewlet.pt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/templates/attendance_preferences.pt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/templates/no_section_meeting.pt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/schooltool.attendance/browser/templates/student-attendance.pt
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.attendance-SchoolTool-2006.0-beta1/setup.cfg
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/MANIFEST
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/sampledata.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/daterange.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/term-configure.zcml
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/DEPENDENCIES.cfg
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/configure.zcml
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/__init__.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/interfaces.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/README.txt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/SETUP.cfg
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/term.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/tests/test_sampledata.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/tests/__init__.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/tests/test_term.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/term-container-delete.pt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/emergency_select.pt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/emergency2.pt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/configure.zcml
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/emergency.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/__init__.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/term_add_edit.pt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/term-container.pt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/term.pt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/tests.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/termrenderer.txt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/emergencydays.txt
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/browser/term.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/rest/configure.zcml
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/rest/__init__.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/rest/tests.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/schooltool.term/rest/term.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/setup.py
-Dependencies/schooltool.term-SchoolTool-2006.0-beta1/setup.cfg
-install.py
-configure
-Makefile.in
-setup.cfg

Added: schooltool/branches/upstream/current/Makefile
===================================================================
--- schooltool/branches/upstream/current/Makefile	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/Makefile	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,189 @@
+#!/usr/bin/make
+#
+# Makefile for SchoolTool
+#
+# $Id: Makefile 6933 2007-05-04 10:16:56Z jinty $
+
+PYTHON=python
+TRANSLATION_DOMAINS=schoolbell schooltool
+TESTFLAGS=-v
+LOCALES=src/schooltool/locales/
+PYTHONPATH:=$(PYTHONPATH):src:eggs
+SETUPFLAGS=
+
+.PHONY: all
+all: build
+
+.PHONY: build
+build: 
+	test -d eggs || mkdir eggs
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) setup.py develop -S eggs --install-dir eggs
+	$(PYTHON) bin/remove-stale-bytecode.py
+
+.PHONY: clean
+clean:
+	find . \( -path './src/*.mo' -o -name '*.o' \
+	         -o -name '*.py[co]' \) -exec rm -f {} \;
+	rm -rf build
+
+.PHONY: cleandb
+cleandb:
+	rm -f schooltool-skel/var/Data.fs*
+
+.PHONY: realclean
+realclean: clean cleandb
+	find . \( -name '*.so' -o -name '*.pyd' \) -exec rm -f {} \;
+	rm -f *.csv tags ID *.log
+	rm -f scripts/import-sampleschool
+	rm -rf dist
+	rm -rf eggs
+
+.PHONY: test
+test: build
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) test.py $(TESTFLAGS) -u schooltool
+
+.PHONY: testall
+testall: build
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) test.py $(TESTFLAGS) 
+
+.PHONY: ftest
+ftest: build
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) test.py $(TESTFLAGS) -f --at-level 2 schooltool 
+
+.PHONY: run
+run: build
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) schooltool-server.py
+
+.PHONY: coverage
+coverage: build
+	rm -rf coverage
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) test.py $(TESTFLAGS) --coverage=coverage schooltool
+.PHONY: coverage-reports-html
+coverage-reports-html:
+	rm -rf coverage/reports
+	mkdir coverage/reports
+	$(PYTHON) bin/coverage_reports.py coverage coverage/reports
+	ln -s schooltool.html coverage/reports/index.html
+
+.PHONY: coverage-report
+coverage-report:
+	@cd coverage && ls schooltool* | grep -v tests | xargs grep -c '^>>>>>>' | grep -v ':0$$'
+
+.PHONY: coverage-report-list
+coverage-report-list:
+	@cd coverage && ls schooltool* | grep -v tests | xargs grep -l '^>>>>>>'
+
+.PHONY: edit-coverage-reports
+edit-coverage-reports:
+	@cd coverage && $(EDITOR) `ls schooltool* | grep -v tests | xargs grep -l '^>>>>>>'`
+
+.PHONY: vi-coverage-reports
+vi-coverage-reports:
+	@cd coverage && vi '+/^>>>>>>/' `ls schooltool* | grep -v tests | xargs grep -l '^>>>>>>'`
+
+.PHONY: dist
+dist: realclean extract-translations update-translations
+	$(PYTHON) setup.py register sdist bdist_eg
+
+.PHONY: dist/md5sum
+dist/md5sum: dist
+	# TODO: this can probably be a non _phony_ rue
+	md5sum dist/schooltool*.tgz > dist/md5sum
+	gpg --clearsign dist/md5sum
+	mv dist/md5sum.asc dist/md5sum
+
+
+.PHONY: signtar
+signtar: dist/md5sum
+	md5sum dist/schooltool*.tgz > dist/md5sum
+	gpg --clearsign dist/md5sum
+	mv dist/md5sum.asc dist/md5sum
+
+.PHONY: extract-translations
+extract-translations: build
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) i18nextract.py --domain=schooltool --zcml=`pwd`/schooltool-skel/etc/site.zcml
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) i18nextract.py --domain=schoolbell --zcml=`pwd`/schoolbell-site.zcml
+	PYTHONPATH=$(PYTHONPATH) $(PYTHON) i18nextract.py --domain=schooltool.commendation --zcml=`pwd`/src/schooltool/commendation/ftesting.zcml
+
+.PHONY: update-translations
+update-translations:
+	set -e; \
+	for domain in $(TRANSLATION_DOMAINS); do \
+	    for f in $(LOCALES)/*/LC_MESSAGES/$${domain}.po; do \
+		msgmerge -qU $$f $(LOCALES)/$${domain}.pot ;\
+		msgfmt -o $${f%.po}.mo $$f;\
+	    done;\
+	done
+
+#
+# Makefile rules for importing and exporting translations to rosetta:
+#
+# To create a translation templates (schooltool.pot, schoolbell.pot) for
+# uploading to rosetta:
+#
+# 	1. run 'make extract-translations'
+# 	2. upload the src/schooltool/locales/{schoolbell,schooltool}.pot files
+# 	   to rosetta.
+#
+# To create tarballs suitable for uploading to rosetta:
+#
+# 	The following command will create tarballs in the current directory of
+# 	the form {schooltool,schoolbell}-translations.tar.gz. These should be
+# 	suitable for uploading to rosetta.
+#
+# 	$ make translation-tarballs
+# 	
+# 	WARNING: Only do this if you are _sure_ you want to. you risk
+# 	overwiting translations that have been changed in rosetta. Normally it
+# 	is only necessary to upload *.pot files.
+#
+# To import translations from rosetta:
+#
+#	1. get a clean checkout of schooltool
+# 	2. download the tarballs of exportd PO files from rosetta and rename
+# 	   them to rosetta-schooltool.tar.gz and rosetta-schoolbell.tar.gz
+# 	3. run 'make update-rosetta-translations'
+# 	4. use svn to add and commit any new/changed translations
+#
+
+
+.PHONY:create-translation-tarball
+create-translation-tarball:
+	#extract-translations update-translations
+	[ ! -e translations.tmp ] || \
+	    { echo ERROR: cowardly refusing to continue because translations.tmp exists; exit 1; }
+	mkdir translations.tmp
+	cp $(LOCALES)/$(DOMAIN).pot translations.tmp/template.pot
+	dir=`pwd` && cd $(LOCALES) && \
+	    find * -maxdepth 0 -type d \
+	    -exec cp {}/LC_MESSAGES/$(DOMAIN).po $${dir}/translations.tmp/{}.po \;
+	cd translations.tmp && tar -czf ../$(DOMAIN)-translations.tar.gz *
+	rm -rf translations.tmp
+
+.PHONY: translation-tarballs
+translation-tarballs: extract-translations update-translations
+	$(MAKE) DOMAIN=schooltool create-translation-tarball
+	$(MAKE) DOMAIN=schoolbell create-translation-tarball
+
+.PHONY: extract-rosetta-tarball
+extract-rosetta-tarball:
+	[ -e rosetta-$(DOMAIN).tar.gz ]
+	[ ! -e translations.tmp ] || \
+	    { echo ERROR: cowardly refusing to continue because translations.tmp exists; exit 1; }
+	mkdir translations.tmp
+	cd translations.tmp && tar -xzf ../rosetta-$(DOMAIN).tar.gz && mv */* .
+	set -e; for file in translations.tmp/*.po; do \
+	    dir=$(LOCALES)/`basename $${file} .po`/LC_MESSAGES; \
+	    [ -x $${dir} ] || mkdir -p $${dir}; \
+	    cp $${file} $${dir}/$(DOMAIN).po; \
+	    echo Updating $${dir}/$(DOMAIN).po; \
+	done
+	rm -rf translations.tmp
+
+.PHONY: update-rosetta-translations
+update-rosetta-translations:
+	[ ! -e rosetta-schooltool.tar.gz ] || $(MAKE) DOMAIN=schooltool extract-rosetta-tarball
+	[ ! -e rosetta-schoolbell.tar.gz ] || $(MAKE) DOMAIN=schoolbell extract-rosetta-tarball
+	$(MAKE) PYTHON=$(PYTHON) extract-translations update-translations
+	# remove .po~ and .mo files so they are not accidentally committed
+	find $(LOCALES) \( -name '*.po~' -o -name '*.mo' \) -exec rm -f {} \;


Property changes on: schooltool/branches/upstream/current/Makefile
___________________________________________________________________
Name: svn:eol-style
   + native

Deleted: schooltool/branches/upstream/current/Makefile.in
===================================================================
--- schooltool/branches/upstream/current/Makefile.in	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/Makefile.in	2007-05-05 18:51:38 UTC (rev 836)
@@ -1,27 +0,0 @@
-# Makefile.in for schooltool.app 2006.0-beta1
-#
-# This makefile provides two interesting targets:
-#
-#     build    build the software
-#     install  install the software
-
-default: build
-
-PYTHON=@PYTHON@
-TESTOPTS=-v
-
-prefix=@prefix@
-
-.PHONY: build
-
-build:
-	$(PYTHON) install.py -q build
-
-# The "install" target skips the distutils build step since that's
-# handled via the dependency on the build target.
-#
-install: build
-	$(PYTHON) install.py -q install --skip-build --home "$(prefix)"
-
-check test: build
-	$(PYTHON) test.py $(TESTOPTS)

Added: schooltool/branches/upstream/current/PKG-INFO
===================================================================
--- schooltool/branches/upstream/current/PKG-INFO	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/PKG-INFO	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+Metadata-Version: 1.0
+Name: schooltool
+Version: 2006.999-2007-alpha1-svn-r6947
+Summary: A common information systems platform for school administration.
+Home-page: http://www.schooltool.org
+Author: SchoolTool development team
+Author-email: schooltool-dev at schooltool.org
+License: GPL
+Description: 
+        SchoolTool is an open source school management information system.  It is
+        a distributed client/server system.  The SchoolTool server presents two
+        interfaces to clients:
+        
+        - a traditional web application interface, usable with an ordinary browser.
+        
+        - HTTP-based programming interface suitable for fat clients, adhering to
+        the Representational State Transfer (REST) architectural style (see
+        http://rest.blueoxen.net/).
+        
+        The web application interface is the primary one.  The RESTive interface is
+        there for potential interoperability with other systems and fat clients to
+        perform data entry that is inconvenient to do via the web application
+        interface.
+        
+        Any modern web browser is suitable for the web application interface.  The
+        interface degrades gracefully, so a browser that does not support CSS or
+        Javascript will be usable, although perhaps not very nice or convenient.
+Platform: any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Zope
+Classifier: Topic :: Education
+Classifier: Topic :: Office/Business :: Scheduling

Modified: schooltool/branches/upstream/current/README.txt
===================================================================
--- schooltool/branches/upstream/current/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -56,6 +56,8 @@
 - libxml2 Python bindings (http://xmlsoft.org/).  Windows users can find
   binaries here:  http://users.skynet.be/sbi/libxml-python/
 
+- libicu-dev: International Components for Unicode libraries (http://icu.sourceforge.net/download/)
+
 - the Python Imaging Library (PIL) (http://www.pythonware.com/products/pil/)
 
 - (usually included) Zope 3.2 (http://www.zope.org/Products/Zope3)
@@ -110,7 +112,7 @@
 
 Then you can start the server:
 
-$ ./bin/schooltool-server
+$ ./bin/schooltool
 
 
 Building SchoolTool from a subversion checkout

Added: schooltool/branches/upstream/current/benchmark/acl.py
===================================================================
--- schooltool/branches/upstream/current/benchmark/acl.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/benchmark/acl.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,94 @@
+#!/usr/bin/python
+"""
+Benchmark the ACL view.
+"""
+
+import random
+import urllib
+
+from benchmark import *
+
+import transaction
+import schooltool.app # dead chicken to avoid circular import
+from schooltool.person.person import Person
+from schooltool.group.group import Group
+
+
+def setup_benchmark():
+    """Create an SB application and populate with users and groups."""
+    setup = load_ftesting_zcml()
+    r = http(r"""
+         POST /@@contents.html HTTP/1.1
+         Authorization: Basic mgr:mgrpw
+         Content-Type: application/x-www-form-urlencoded
+
+         type_name=BrowserAdd__schooltool.app.app.SchoolToolApplication&new_value=frogpond
+    """)
+    assert r.getStatus() == 303
+
+    app = setup.getRootFolder()['frogpond']
+    create_random_users_and_groups(app)
+    transaction.commit()
+
+    r = http(r"""
+        GET /frogpond/persons HTTP/1.1
+        Authorization: Basic mgr:mgrpw
+    """)
+    assert r.getStatus() == 200
+
+
+def create_random_users_and_groups(app, count=100, seed=42):
+    """Create some randomly named users and groups."""
+    rng = random.Random(seed)
+    groups = []
+    for i in range(count):
+        group = Group('title%s' % i)
+        groups.append(group)
+        app['groups']['title%s' % i] = group
+    for i in range(count):
+        person = Person('username%s' % i, 'title%s' % i)
+        name = person.username
+        app['persons'][name] = person
+        for j in range(10):
+            try:
+                person.groups.add(rng.choice(groups))
+            except:
+                pass
+
+
+def do_benchmark_render():
+    """Benchmark the ACL view."""
+    r = http(r"""
+         GET /frogpond/acl.html HTTP/1.1
+         Authorization: Basic mgr:mgrpw
+    """)
+    assert r.getStatus() == 200
+
+
+def do_benchmark_update(n_users_in_form=10):
+    """Benchmark the ACL view."""
+    form = {'UPDATE_SUBMIT': 'Set'}
+    for n in range(n_users_in_form):
+        form['marker-sb.person.username%d' % n] = '1'
+        form['sb.person.username%d' % n] = ['schoolbell.view',
+                                            'schoolbell.edit']
+    formdata = urllib.urlencode(form)
+    r = http(r"""
+         POST /frogpond/acl.html HTTP/1.1
+         Authorization: Basic mgr:mgrpw
+         Content-Type: application/x-www-form-urlencoded
+
+         %s
+    """ % formdata)
+    assert r.getStatus() == 303
+
+
+def main():
+    print "ZCML took %.3f seconds." % measure(load_ftesting_zcml)
+    print "Setup took %.3f seconds." % measure(setup_benchmark)
+    benchmark("ACL view render", do_benchmark_render)
+    benchmark("ACL view update", do_benchmark_update)
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/benchmark/acl.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/benchmark/benchmark.py
===================================================================
--- schooltool/branches/upstream/current/benchmark/benchmark.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/benchmark/benchmark.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,69 @@
+"""
+Utilities for SchoolTool's benchmarks.
+
+Use with care (plays with sys.path).
+"""
+
+import sys
+import os
+import time
+import textwrap
+
+basedir = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
+sys.path.insert(0, os.path.join(basedir, 'src'))
+sys.path.insert(0, os.path.join(basedir, 'Zope3', 'src'))
+
+from zope.app.testing.functional import FunctionalTestSetup
+from zope.app.testing.functional import HTTPCaller
+from schooltool.testing.functional import find_ftesting_zcml
+
+
+def measure(fn):
+    """Measure the running time of `fn` in seconds (very crudely)."""
+    # Yes, I know that we're supposed to use the timeit module here, but its
+    # API is inconvenient, and we do not need a lot of precision here.
+    t0 = time.clock()
+    fn()
+    return time.clock() - t0
+
+
+def mean(seq):
+    """Compute the mean of a sequence."""
+    return sum(seq) / len(seq)
+
+
+def stddev(seq):
+    """Compute the standard deviation of a sequence."""
+    avg = mean(seq)
+    variance = sum((x - avg) ** 2 for x in seq) / len(seq)
+    return variance ** 0.5
+
+
+def benchmark(title, fn, count=5):
+    """Benchmark a function."""
+    print title
+    print "  warmup: %.3f seconds" % measure(fn)
+    times = []
+    for n in range(count):
+        time = measure(fn)
+        print "  %.3f seconds" % time
+        times.append(time)
+    # Note: do not pay much attention to the statistical significance of these
+    # values -- see the timeit module documentation.
+    print ("    min = %.3f, max = %.3f, mean = %.3f, stddev = %.3f"
+           % (min(times), max(times), mean(times), stddev(times)))
+
+
+def http(indented_request_string, http_caller=HTTPCaller()):
+    """Dedent the request string and perform the HTTP request."""
+    rq = textwrap.dedent(indented_request_string).strip()
+    return http_caller(rq, handle_errors=False)
+
+
+def load_ftesting_zcml():
+    """Load ZCML.
+
+    First call is expensive, subsequent calls are virtually free.
+    """
+    return FunctionalTestSetup(find_ftesting_zcml())
+


Property changes on: schooltool/branches/upstream/current/benchmark/benchmark.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/benchmark/manyrecurrent.py
===================================================================
--- schooltool/branches/upstream/current/benchmark/manyrecurrent.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/benchmark/manyrecurrent.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+"""
+Benchmark for calendar views when there are many recurrent events.
+"""
+
+import random
+from datetime import datetime, timedelta
+
+from benchmark import *
+
+import transaction
+
+from schooltool.app.cal import CalendarEvent
+from schooltool.person.person import Person
+from schooltool.group.group import Group
+from schooltool.calendar.recurrent import DailyRecurrenceRule
+from schooltool.app.interfaces import ISchoolToolCalendar
+
+
+def setup_benchmark():
+    setup = load_ftesting_zcml()
+    r = http("""POST /@@contents.html HTTP/1.1
+Authorization: Basic mgr:mgrpw
+Content-Length: 81
+Content-Type: application/x-www-form-urlencoded
+
+type_name=BrowserAdd__schooltool.app.app.SchoolToolApplication&new_value=frogpond""")
+    assert r.getStatus() == 303
+
+    app = setup.getRootFolder()['frogpond']
+    create_random_recurrent_events(app)
+    transaction.commit()
+
+    r = http(r"""GET /frogpond/persons HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def create_random_recurrent_events(app, count=100, seed=42):
+    """Create a user with many recurrent events in his calendar.
+
+    The user's username will be 'manager', and his calendar will have
+    a given number of random recurring events in the year 2005.
+    """
+    rng = random.Random(seed)
+    person = Person('manager', 'Manager')
+    app['persons']['manager'] = person
+
+    year = 2005
+    months = range(1, 13)
+    days = range(1, 29)
+    hours = range(24)
+    minutes = range(60)
+    durations = range(15, 180)
+
+    for i in range(count):
+        dtstart = datetime(2005, rng.choice(months), rng.choice(days),
+                           rng.choice(hours), rng.choice(minutes))
+        duration = timedelta(minutes=rng.choice(durations))
+        event = CalendarEvent(dtstart, duration, 'Lorem ipsum %d' % i,
+                              recurrence=DailyRecurrenceRule(), location='Booha',
+                              allday=False, description='Some words.')
+        ISchoolToolCalendar(person).addEvent(event)
+
+
+def daily_view():
+    """Benchmark the DailyCalendarView."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005-05-06 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def weekly_view():
+    """Benchmark the WeeklyCalendarView."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005-w20 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def monthly_view():
+    """Benchmark the MonthlyCalendarView."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005-06 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def yearly_view():
+    """Benchmark the YearlyCalendarView."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def main():
+    print "ZCML took %.3f seconds." % measure(load_ftesting_zcml)
+    print "Setup took %.3f seconds." % measure(setup_benchmark)
+    benchmark("Daily calendar view with many recurrent events", daily_view)
+    benchmark("Weekly calendar view with many recurrent events", weekly_view)
+    benchmark("Monthly calendar view with many recurrent events", monthly_view)
+    benchmark("Yearly calendar view with many recurrent events", yearly_view)
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/benchmark/manyrecurrent.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/benchmark/nonrecurrent.py
===================================================================
--- schooltool/branches/upstream/current/benchmark/nonrecurrent.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/benchmark/nonrecurrent.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,108 @@
+#!/usr/bin/python
+"""
+Benchmark for calendar views when there are many nonrecurrent events.
+"""
+
+import random
+from datetime import datetime, timedelta
+
+from benchmark import *
+
+import transaction
+
+from schooltool.app.cal import CalendarEvent
+from schooltool.person.person import Person
+from schooltool.group.group import Group
+from schooltool.app.interfaces import ISchoolToolCalendar
+
+
+def setup_benchmark():
+    setup = load_ftesting_zcml()
+    r = http("""POST /@@contents.html HTTP/1.1
+Authorization: Basic mgr:mgrpw
+Content-Length: 81
+Content-Type: application/x-www-form-urlencoded
+
+type_name=BrowserAdd__schooltool.app.app.SchoolToolApplication&new_value=frogpond""")
+    assert r.getStatus() == 303
+
+    app = setup.getRootFolder()['frogpond']
+    create_random_events(app)
+    transaction.commit()
+
+    r = http(r"""GET /frogpond/persons HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def create_random_events(app, count=5000, seed=42):
+    """Create a user with many nonrecurrent events in his calendar.
+
+    The user's username will be 'manager', and his calendar will have
+    a given number of random nonrecurring events in the year 2005.
+    """
+    rng = random.Random(seed)
+    person = Person('manager', 'Manager')
+    app['persons']['manager'] = person
+
+    year = 2005
+    months = range(1, 13)
+    days = range(1, 29)
+    hours = range(24)
+    minutes = range(60)
+    durations = range(15, 180)
+
+    for i in range(count):
+        dtstart = datetime(2005, rng.choice(months), rng.choice(days),
+                           rng.choice(hours), rng.choice(minutes))
+        duration = timedelta(minutes=rng.choice(durations))
+        event = CalendarEvent(dtstart, duration, 'Lorem ipsum %d' % i,
+                              recurrence=None, location='Booha',
+                              allday=False, description='Some words.')
+        ISchoolToolCalendar(person).addEvent(event)
+
+
+def daily_view():
+    """Benchmark the DailyCalendarView."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005-05-06 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def weekly_view():
+    """Benchmark the WeeklyCalendarView."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005-w20 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def monthly_view():
+    """Benchmark the MonthlyCalendarView."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005-06 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def yearly_view():
+    """Benchmark the YearlyCalendarView."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def main():
+    print "ZCML took %.3f seconds." % measure(load_ftesting_zcml)
+    print "Setup took %.3f seconds." % measure(setup_benchmark)
+    benchmark("Daily calendar view with many simple events", daily_view)
+    benchmark("Weekly calendar view with many simple events", weekly_view)
+    benchmark("Monthly calendar view with many simple events", monthly_view)
+    benchmark("Yearly calendar view with many simple events", yearly_view)
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/benchmark/nonrecurrent.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/benchmark/recurrent.py
===================================================================
--- schooltool/branches/upstream/current/benchmark/recurrent.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/benchmark/recurrent.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,117 @@
+#!/usr/bin/python
+"""
+Benchmark the daily calendar view with some long lasting recurrent events.
+"""
+
+from datetime import datetime, timedelta
+
+from benchmark import *
+
+import transaction
+from schooltool.app.cal import CalendarEvent
+from schooltool.person.person import Person
+from schooltool.group.group import Group
+from schooltool.calendar.recurrent import DailyRecurrenceRule
+from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+from schooltool.calendar.recurrent import MonthlyRecurrenceRule
+from schooltool.calendar.recurrent import YearlyRecurrenceRule
+from schooltool.app.interfaces import ISchoolToolCalendar
+
+
+def setup_benchmark():
+    setup = load_ftesting_zcml()
+    r = http("""POST /@@contents.html HTTP/1.1
+Authorization: Basic mgr:mgrpw
+Content-Length: 81
+Content-Type: application/x-www-form-urlencoded
+
+type_name=BrowserAdd__schooltool.app.app.SchoolToolApplication&new_value=frogpond""")
+    assert r.getStatus() == 303
+
+    app = setup.getRootFolder()['frogpond']
+    create_user_and_recurrent_events(app)
+    transaction.commit()
+
+    r = http(r"""GET /frogpond/persons HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def create_user_and_recurrent_events(app):
+    """Create a user with some recurrent events in his calendar.
+
+    The user's username will be 'manager', and his calendar will have
+    exactly four events, recurring daily, weekly, monthly, and yearly
+    respectively.  All these events start on the same day.
+    """
+    person = Person('manager', 'Manager')
+    app['persons']['manager'] = person
+    calendar = ISchoolToolCalendar(person)
+
+    recurrence = DailyRecurrenceRule()
+    daily_event = CalendarEvent(datetime(2005, 1, 1, 10, 0),
+                                timedelta(60),
+                                'Daily Event',
+                                recurrence=recurrence)
+    calendar.addEvent(daily_event)
+
+    recurrence = WeeklyRecurrenceRule(weekdays=(0, 1, 2, 3, 4, 5, 6))
+    weekly_event = CalendarEvent(datetime(2005, 1, 1, 11, 0),
+                                timedelta(60),
+                                'Weekly event',
+                                recurrence=recurrence)
+    calendar.addEvent(weekly_event)
+
+    recurrence = MonthlyRecurrenceRule()
+    monthly_event = CalendarEvent(datetime(2005, 1, 1, 12, 0),
+                                  timedelta(60),
+                                  'Monthly event',
+                                  recurrence=recurrence)
+    calendar.addEvent(monthly_event)
+
+    recurrence = YearlyRecurrenceRule()
+    yearly_event = CalendarEvent(datetime(2005, 1, 1, 13, 0),
+                                 timedelta(60),
+                                 'Yearly event',
+                                 recurrence=recurrence)
+    calendar.addEvent(yearly_event)
+
+
+def daily_view_start_date():
+    """Render the DailyCalendarView on the starting date."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2005-01-01 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def daily_view_in_a_year():
+    """Render the DailyCalendarView a year after the starting date."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2006-01-01 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def daily_view_in_ten_years():
+    """Render the DailyCalendarView ten years after the starting date."""
+    r = http(r"""GET /frogpond/persons/manager/calendar/2015-01-01 HTTP/1.1
+Authorization: Basic mgr:mgrpw
+""")
+    assert r.getStatus() == 200
+
+
+def main():
+    print "ZCML took %.3f seconds." % measure(load_ftesting_zcml)
+    print "Setup took %.3f seconds." % measure(setup_benchmark)
+    benchmark("Daily calendar view on the start date.",
+              daily_view_start_date)
+    benchmark("Daily calendar view a year after the start date.",
+              daily_view_in_a_year)
+    benchmark("Daily calendar view ten years after the start date.",
+              daily_view_in_ten_years)
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/benchmark/recurrent.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/benchmark/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/benchmark/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/benchmark/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,41 @@
+#!/usr/bin/python
+"""
+Benchmark the sample data generator.
+"""
+
+from datetime import datetime, timedelta
+
+from benchmark import *
+
+import transaction
+
+
+def setup_benchmark():
+    setup = load_ftesting_zcml()
+    r = http("""POST /@@contents.html HTTP/1.1
+Authorization: Basic mgr:mgrpw
+Content-Length: 81
+Content-Type: application/x-www-form-urlencoded
+
+type_name=BrowserAdd__schooltool.app.app.SchoolToolApplication&new_value=frogpond""")
+    assert r.getStatus() == 303
+
+    do_generate_sampledata()
+
+
+def do_generate_sampledata():
+    """Benchmark the sample data generator."""
+    r = http(r"""
+         GET /frogpond/@@sampledata.html?seed=SchoolTool&SUBMIT= HTTP/1.1
+         Authorization: Basic mgr:mgrpw
+    """)
+    assert r.getStatus() == 200
+
+
+def main():
+    print "ZCML took %.3f seconds." % measure(load_ftesting_zcml)
+    print "Setup took %.3f seconds." % measure(setup_benchmark)
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/benchmark/sampledata.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/bin/coverage_reports.py
===================================================================
--- schooltool/branches/upstream/current/bin/coverage_reports.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/bin/coverage_reports.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,331 @@
+#!/usr/bin/env python
+"""
+Convert SchoolTool's unit test coverage reports to HTML.
+
+Usage: coverage_reports.py [report-directory [output-directory]]
+
+Locates plain-text coverage reports (files named dotted.package.name.cover) in
+the report directory and produces HTML reports in the output directory.  The
+format of plain-text coverage reports is as follows: the file name is a dotted
+Python module name with a .cover suffix (e.g. schooltool.app.__init__.cover).
+Each line corresponds to the source file line with a 7 character wide prefix.
+The prefix is one of
+
+  '       ' if a line is not an executable code line
+  '  NNN: ' where NNN is the number of times this line was executed
+  '>>>>>> ' if this line was never executed
+
+You can produce such files with the SchoolTool test runner by specifying
+--coverage on the command line.  Usually you will use the supplied makefile
+and type 'make coverage'.  The makefile also contains a rule to create
+the necessary directory for HTML reports and generate them.  The full
+invocation to produce HTML coverage reports is thus
+
+  make coverage coverage-reports-html
+
+"""
+
+import sys
+import os
+import datetime
+import cgi
+
+
+class CoverageNode(dict):
+    """Tree node.
+
+    Leaf nodes have no children (items() == []) and correspond to Python
+    modules.  Branches correspond to Python packages.  Child nodes are
+    accessible via the Python mapping protocol, as you would normally use
+    a dict.  Item keys are non-qualified module names.
+    """
+
+    def __str__(self):
+        covered, total = self.coverage
+        uncovered = total - covered
+        return '%s%% covered (%s of %s lines uncovered)' % \
+               (self.percent, uncovered, total)
+
+    @property
+    def percent(self):
+        """Compute the coverage percentage."""
+        covered, total = self.coverage
+        if total != 0:
+            return int(100 * covered / total)
+        else:
+            return 100
+
+    @property
+    def coverage(self):
+        """Return (number_of_lines_covered, number_of_executable_lines).
+
+        Computes the numbers recursively for the first time and caches the
+        result.
+        """
+        if not hasattr(self, '_total'): # first-time computation
+            self._covered = self._total = 0
+            for substats in self.values():
+                covered_more, total_more = substats.coverage
+                self._covered += covered_more
+                self._total += total_more
+        return self._covered, self._total
+
+    @property
+    def uncovered(self):
+        """Compute the number of uncovered code lines."""
+        covered, total = self.coverage
+        return total - covered
+
+
+def parse_file(filename):
+    """Parse a plain-text coverage report and return (covered, total)."""
+    covered = 0
+    total = 0
+    for line in file(filename):
+        if line.startswith(' '*7) or len(line) < 7:
+            continue
+        total += 1
+        if not line.startswith('>>>>>>'):
+            covered += 1
+    return (covered, total)
+
+
+def get_file_list(path, filter_fn=None):
+    """Return a list of files in a directory.
+
+    If you can specify a predicate (a callable), only file names matching it
+    will be returned.
+    """
+    return filter(filter_fn, os.listdir(path))
+
+
+def filename_to_list(filename):
+    """Return a list of package/module names from a filename.
+
+    One example is worth a thousand descriptions:
+
+        >>> filename_to_list('schooltool.app.__init__.cover')
+        ['schooltool', 'app', '__init__']
+
+    """
+    return filename.split('.')[:-1]
+
+
+def get_tree_node(tree, index):
+    """Return a tree node for a given path.
+
+    The path is a sequence of child node names.
+
+    Creates intermediate and leaf nodes if necessary.
+    """
+    node = tree
+    for i in index:
+        node = node.setdefault(i, CoverageNode())
+    return node
+
+
+def create_tree(filelist, path):
+    """Create a tree with coverage statistics.
+
+    Takes the directory for coverage reports and a list of filenames relative
+    to that directory.  Parses all the files and constructs a module tree with
+    coverage statistics.
+
+    Returns the root node of the tree.
+    """
+    tree = CoverageNode()
+    for filename in filelist:
+        tree_index = filename_to_list(filename)
+        node = get_tree_node(tree, tree_index)
+        filepath = os.path.join(path, filename)
+        node._covered, node._total = parse_file(filepath)
+    return tree
+
+
+def traverse_tree(tree, index, function):
+    """Preorder traversal of a tree.
+
+    ``index`` is the path of the root node (usually []).
+
+    ``function`` gets one argument: the path of a node.
+    """
+    function(index)
+    for key, node in tree.items():
+        traverse_tree(node, index + [key], function)
+
+
+def index_to_url(index):
+    """Construct a relative hyperlink to a tree node given its path."""
+    if index:
+        return '%s.html' % '.'.join(index)
+    return 'index.html'
+
+
+def index_to_filename(index):
+    """Construct the plain-text coverage report filename for a node."""
+    if index:
+        return '%s.cover' % '.'.join(index)
+    return ''
+
+
+def index_to_nice_name(index):
+    """Construct an indented name for the node given its path."""
+    if index:
+        return '&nbsp;' * 4 * (len(index) - 1) + index[-1]
+    else:
+        return 'Everything'
+
+
+def index_to_name(index):
+    """Construct the full name for the node given its path."""
+    if index:
+        return '.'.join(index)
+    return 'everything'
+
+
+def generate_html(output_filename, tree, my_index, info, path, footer=""):
+    """Generate HTML for a tree node.
+
+    ``output_filename`` is the output file name.
+
+    ``tree`` is the root node of the tree.
+
+    ``my_index`` is the path of the node for which you are generating this HTML
+    file.
+
+    ``info`` is a list of paths of child nodes.
+
+    ``path`` is the directory name for the plain-text report files.
+    """
+    html = open(output_filename, 'w')
+    print >> html, """
+    <html>
+      <head><title>Unit test coverage for %(name)s</title>
+      <style type="text/css">
+        a {text-decoration: none; display: block; padding-right: 1em;}
+        a:hover {background: #EFA;}
+        hr {height: 1px; border: none; border-top: 1px solid gray;}
+        .notcovered {background: #FCC;}
+        .footer {margin: 2em; font-size: small; color: gray;}
+      </style>
+      </head>
+      <body><h1>Unit test coverage for %(name)s</h1>
+      <table>
+    """ % {'name': index_to_name(my_index)}
+    def key(node_path):
+        node = get_tree_node(tree, node_path)
+        return (len(node_path), -node.uncovered)
+    info.sort(key=key)
+    for file_index in info:
+        if not file_index:
+            continue # skip root node
+        node = get_tree_node(tree, file_index)
+        covered, total = node.coverage
+        uncovered = total - covered
+        percent = node.percent
+        nice_name = index_to_nice_name(file_index)
+        if not node.keys():
+            nice_name += '.py'
+        else:
+            nice_name += '/'
+        print >> html, '<tr><td><a href="%s">%s</a></td>' % \
+                       (index_to_url(file_index), nice_name),
+        print >> html, '<td>covered %s%% (%s of %s uncovered)</td></tr>' % \
+                       (percent, uncovered, total)
+    print >> html, '</table><hr/>'
+    if not get_tree_node(tree, my_index):
+        file_path = os.path.join(path, index_to_filename(my_index))
+        # XXX can get painful if filenames contain unsafe characters
+        pipe = os.popen('enscript -q --footer --header -h --language=html'
+                        ' --highlight=python --color -o - "%s"' % file_path,
+                        'r')
+        text = pipe.read()
+        if pipe.close():
+            # Failed to run enscript; maybe it is not installed?  Disable
+            # syntax highlighting then.
+            text = cgi.escape(file(file_path).read())
+        else:
+            text = text[text.find('<PRE>')+len('<PRE>'):]
+            text = text[:text.find('</PRE>')]
+        def color_uncov(line):
+            if '&gt;&gt;&gt;&gt;&gt;&gt;' in line:
+                return ('<div class="notcovered">%s</div>'
+                        % line.rstrip('\n'))
+            return line
+        text = ''.join(map(color_uncov, text.splitlines(True)))
+        print >> html, '<pre>%s</pre>' % text
+    print >> html, """
+      <div class="footer">
+      %s
+      </div>
+    </body>
+    </html>""" % footer
+    html.close()
+
+
+def generate_htmls_from_tree(tree, path, report_path, footer=""):
+    """Generate HTML files for all nodes in the tree.
+
+    ``tree`` is the root node of the tree.
+
+    ``path`` is the directory name for the plain-text report files.
+
+    ``report_path`` is the directory name for the output files.
+    """
+    def make_html(my_index):
+        info = []
+        def list_parents_and_children(index):
+            position = len(index)
+            my_position = len(my_index)
+            if position <= my_position and index == my_index[:position]:
+                info.append(index)
+            elif (position == my_position + 1 and
+                  index[:my_position] == my_index):
+                info.append(index)
+            return
+        traverse_tree(tree, [], list_parents_and_children)
+        output_filename = os.path.join(report_path, index_to_url(my_index))
+        if not my_index:
+            return # skip root node
+        generate_html(output_filename, tree, my_index, info, path, footer)
+    traverse_tree(tree, [], make_html)
+
+
+def make_coverage_reports(path, report_path):
+    """Convert reports from ``path`` into HTML files in ``report_path``."""
+    def filter_fn(filename):
+        return (filename.endswith('.cover') and
+                filename.startswith('schooltool') and
+                'tests' not in filename and
+                not filename.startswith('<'))
+    filelist = get_file_list(path, filter_fn)
+    tree = create_tree(filelist, path)
+    rev = get_svn_revision(os.path.join(path, os.path.pardir))
+    timestamp = str(datetime.datetime.utcnow())+"Z"
+    footer = "Generated for revision %s on %s" % (rev, timestamp)
+    generate_htmls_from_tree(tree, path, report_path, footer)
+
+
+def get_svn_revision(path):
+    """Return the Subversion revision number for a working directory."""
+    rev = os.popen('svnversion "%s"' % path, 'r').readline().strip()
+    if not rev:
+        rev = "UNKNOWN"
+    return rev
+
+
+def main():
+    """Process command line arguments and produce HTML coverage reports."""
+    if len(sys.argv) > 1:
+        path = sys.argv[1]
+    else:
+        path = 'coverage'
+    if len(sys.argv) > 2:
+        report_path = sys.argv[2]
+    else:
+        report_path = 'coverage/reports'
+    make_coverage_reports(path, report_path)
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/bin/coverage_reports.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/bin/mkschooltoolinst
===================================================================
--- schooltool/branches/upstream/current/bin/mkschooltoolinst	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/bin/mkschooltoolinst	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,57 @@
+#!/usr/bin/python
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Script to create a new Zope instance home.
+
+$Id$
+"""
+
+import os
+import sys
+
+here = os.path.dirname(os.path.realpath(__file__))
+swhome = os.path.dirname(here)
+
+from_checkout = os.path.isdir(os.path.join(swhome, ".svn"))
+
+for parts in [("src",), ("lib", "python"), ("Lib", "site-packages"),
+              ("Zope3", "src",), ("Zope3", "lib", "python"),
+              ("Zope3", "Lib", "site-packages")]:
+    for addon in [("zope", "app", "appsetup"), ("schooltool", "setup")]:
+        d = os.path.join(swhome, *(parts + addon))
+        if os.path.isdir(d):
+            d = os.path.join(swhome, *parts)
+            sys.path.insert(0, d)
+
+try:
+    import schooltool.setup
+    import zope.app.server
+except ImportError:
+    print >> sys.stderr, \
+          "Could not locate SchoolTool or Zope software installation!"
+    sys.exit(1)
+
+
+# Insert our custom skeleton directory
+sys.argv.insert(1, '--skelsrc=%s' %os.path.join(swhome, 'schooltool-skel'))
+
+# If no username and password was specified, use the default ones
+from schooltool.app import main
+if '-u' not in sys.argv and '--user' not in sys.argv:
+    sys.argv.insert(
+        1, '-u%s:%s' %(main.MANAGER_USERNAME, main.MANAGER_PASSWORD))
+
+from schooltool.setup.mkschooltoolinst import main
+
+sys.exit(main(from_checkout=from_checkout))


Property changes on: schooltool/branches/upstream/current/bin/mkschooltoolinst
___________________________________________________________________
Name: svn:executable
   + *

Added: schooltool/branches/upstream/current/bin/remove-stale-bytecode.py
===================================================================
--- schooltool/branches/upstream/current/bin/remove-stale-bytecode.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/bin/remove-stale-bytecode.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,84 @@
+#!/usr/bin/env python
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Recursively removes .pyc and .pyo files without a corresponding .py file.
+
+Usage: %(progname)s [options] [dirname ...]
+
+Options:
+    -h, --help      this message
+    -v, --verbose   print names of files before they are removed (default)
+    -q, --quiet     the opposite of --verbose
+    -n, --dry-run   do not actually remove the files (implies --verbose)
+
+If dirname is ommitted, %(progname)s starts looking for stale
+bytecode files in the current directory.
+"""
+
+import os
+import sys
+import getopt
+
+
+def main(argv=sys.argv):
+    progname = os.path.basename(argv[0])
+    helpmsg = __doc__.strip() % {'progname': progname}
+    verbose = True
+    dry_run = False
+    try:
+        opts, args = getopt.getopt(argv[1:], 'vqnh',
+                                   ['verbose', 'quiet', 'dry-run', 'help'])
+    except getopt.error, e:
+        print >> sys.stderr, e
+        print >> sys.stderr, 'try %s --help' % progname
+        sys.exit(1)
+    for k, v in opts:
+        if k in ('-v', '--verbose'):
+            verbose = True
+        elif k in ('-q', '--quiet'):
+            verbose = False
+        elif k in ('-n', '--dry-run'):
+            dry_run = True
+            verbose = True
+        elif k in ('-h', '--help'):
+            print helpmsg
+            sys.exit(0)
+    if not args:
+        args = ['.']
+    for root in args:
+        for dirpath, dirnames, filenames in os.walk(root):
+            filenames = map(os.path.normcase, filenames)
+            for filename in filenames:
+                if filename.endswith('.pyc') or filename.endswith('pyo'):
+                    sourcename = filename[:-1]
+                    if sourcename not in filenames:
+                        fullname = os.path.join(dirpath, filename)
+                        if verbose:
+                            print "Removing", fullname
+                        if not dry_run:
+                            try:
+                                os.unlink(fullname)
+                            except os.error, e:
+                                print >> sys.stderr, ("%s: %s: %s" %
+                                                      (progname, fullname, e))
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/bin/remove-stale-bytecode.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/bin/rest-client.py
===================================================================
--- schooltool/branches/upstream/current/bin/rest-client.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/bin/rest-client.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+"""
+A script to run the SchoolTool REST client from the source directory.
+"""
+
+import sys
+import os.path
+
+if sys.version_info < (2, 3):
+    print >> sys.stderr, '%s: need Python 2.3 or later.' % sys.argv[0]
+    print >> sys.stderr, 'Your python is %s' % sys.version
+    sys.exit(1)
+
+
+import os
+basedir = os.path.normpath(os.path.join(os.path.dirname(__file__),
+                                        os.path.pardir))
+sys.path.insert(0, os.path.join(basedir, 'src'))
+sys.path.insert(0, os.path.join(basedir, 'Zope3', 'src'))
+
+import schooltool.client
+schooltool.client.main()


Property changes on: schooltool/branches/upstream/current/bin/rest-client.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/bin/runfdoctests.py
===================================================================
--- schooltool/branches/upstream/current/bin/runfdoctests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/bin/runfdoctests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+"""Hacky script for a fast feedback loop with SchoolTool's functional tests.
+
+The problem with functional doctests is that the initial setup (ZCML parsing
+etc.) takes ages, and then your brand new and shiny functional doctest fails
+because of a silly typo.  You fix the typo and wait 30 seconds to find another
+one.  The feedback loop is just too slow for efficient development.
+
+Hence this script.  Run it in the root of your SchoolTool source tree, and
+enter a pathname of a functional doctest file at the prompt.  When you get
+that proverbial silly typo on line 17, just fix it and use readline's history
+to rerun the same test file.  You'll get feedback in seconds.
+"""
+
+import os
+import sys
+import time
+import glob
+import unittest
+import readline
+
+
+def main():
+    args = sys.argv[1:]
+
+    # Hack hack hack!
+    basedir = os.path.abspath(os.path.join(os.path.dirname(__file__),
+                                            os.path.pardir))
+    sys.path.insert(0, os.path.join(basedir, 'src'))
+    sys.path.insert(0, os.path.join(basedir, 'Zope3/src'))
+
+    # Tab completion
+    readline.set_completer_delims(' \t\n')
+    readline.parse_and_bind('tab: complete')
+
+    # Load and set up Zope 3.
+    start = time.time()
+    print "Bringing up ftesting.zcml (wait 20 seconds or so)"
+    from schooltool.testing.functional import load_ftesting_zcml
+    from schooltool.testing import analyze
+    from schooltool.app.rest.ftests import rest
+    load_ftesting_zcml()
+    elapsed = time.time() - start
+    print "Setup ate %.3f seconds" % elapsed
+
+    from zope.testing import doctest
+    from zope.app.testing.functional import FunctionalDocFileSuite
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF |
+                   doctest.NORMALIZE_WHITESPACE |
+                   doctest.REPORT_ONLY_FIRST_FAILURE)
+
+    try:
+        print "Try these test scripts:"
+        os.chdir(basedir)
+        os.system('find src -path "*/ftests/*.txt" ! -path "*/.svn/*"')
+        print
+        while True:
+            if args:
+                # Process command line arguments first, then go into
+                # interactive mode
+                filename = args.pop(0)
+                readline.add_history(filename)
+                print "fdoctest file name>", filename
+            else:
+                filename = raw_input("fdoctest file name> ")
+            if not filename:
+                print "^D to exit"
+            elif filename == 'pdb':
+                import pdb; pdb.set_trace()
+            else:
+                try:
+                    filename = os.path.join(os.path.pardir, filename)
+                    suite = FunctionalDocFileSuite(filename,
+                                                   globs={'analyze': analyze,
+                                                          'rest': rest},
+                                                   optionflags=optionflags)
+                    run(suite)
+                except Exception, e:
+                    import traceback
+                    traceback.print_exc()
+    except (KeyboardInterrupt, EOFError):
+        print "Bye!"
+
+
+def run(suite):
+    try:
+        from schooltool.testing.test import CustomTestRunner, Options, Colorizer, light_colormap
+    except ImportError:
+        runner = unittest.TextTestRunner()
+    else:
+        cfg = Options()
+        cfg.colorizer = Colorizer(light_colormap)
+        runner = CustomTestRunner(cfg, [])
+    runner.run(suite)
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/bin/runfdoctests.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Deleted: schooltool/branches/upstream/current/configure
===================================================================
--- schooltool/branches/upstream/current/configure	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/configure	2007-05-05 18:51:38 UTC (rev 836)
@@ -1,232 +0,0 @@
-#!/bin/sh
-
-# Generic Python application configure script for Unix
-
-PACKAGE_NAME='SchoolTool'
-PACKAGE_LABEL="$PACKAGE_NAME-2006.0-beta1"
-
-DEFAULT_PREFIX="/usr/local/$PACKAGE_LABEL"
-prefix="$DEFAULT_PREFIX"
-
-
-#########################################################################
-# XXX The code that searches for an "acceptable" Python is really evil  #
-# and doesn't make much sense for a general packaging tool.  Wee        #
-# really need to find a better way to deal with this; it may be that    #
-# we should simply look for several executable names, and use the       #
-# first one we find.  If the installer wants something else, they can   #
-# use --with-python.                                                    #
-#########################################################################
-
-
-# Place the optimal target version number (as returned by sys.version)
-# below
-TARGET="2.4.3"
-
-# Order a list of "acceptable" python version numbers (as returned by
-# sys.version) below in "best" to "worst" order, not including the
-# target version.  Up to six acceptable python versions are allowed.
-# Do not include the target version number in this list!
-ACCEPTABLE="2.4.2 2.4.1"
-
-# provide the executable names for all the acceptable versions
-# (and the target version) below
-EXENAMES="python python2 python2.4"
-
-
-# where are we?
-HERE="`dirname $0`"
-
-# should we be quiet?
-QUIET=""
-
-usage()
-{
-    echo
-    echo "configure [--help] [--quiet] [--with-python=path] [--prefix=path] "
-    #echo "          [--ignore-largefile] [--ignore-zlib]"
-    echo
-    echo "Create a Makefile suitable for building schooltool.app"
-    echo
-    echo "Options: "
-    echo " --help              shows usage and quits"
-    echo " --quiet             suppress nonessential output"
-    echo " --with-python       specify a path to a Python interpreter to use"
-    echo " --prefix            specify an installation path for binary data"
-    #echo " --ignore-largefile  ignore large file support warnings"
-    #echo " --ignore-zlib       ignore warnings about zlib"
-    echo
-    echo "Given no options, configure will search your PATH for a suitable"
-    echo "Python interpreter and use '$DEFAULT_PREFIX' as a prefix."
-    echo
-}
-
-# bootstrap ourselves by finding a Python interpreter if necessary
-get_python() {
-    OLDIFS="$IFS"
-    # Why are we playing with the IFS like this???
-    IFS=":"
-    FOUND=""
-    VERSION=""
-    FOUNDLIST=""
-    out "Testing for an acceptable Python interpreter..."
-    out ""
-    for DIR in $PATH; do
-        IFS="$OLDIFS"
-        for EXECUTABLE in $EXENAMES; do
-            FULL="$DIR/$EXECUTABLE"
-            if [ -x "$FULL" -a -f "$FULL" ]; then
-                CMD="import string,sys;a=string.split(sys.version)[0]"
-		# Strip trailing + from version number
-		CMD="$CMD;a=(a[-1]=='+')and(a[:-1])or(a);print a"
-                VERSION=`"$FULL" -c "$CMD"`
-                out "  Python version $VERSION found at $FULL"
-                if [ "$VERSION" = "$TARGET" ]; then
-                    FOUND="$FULL"
-                    FOUNDVERSION=$VERSION
-                    break 2
-                else
-                    i=1;
-                    for ACC in $ACCEPTABLE; do
-                        i=`expr $i + 1`
-			for SLOT in $FOUNDLIST; do
-                            if [ $SLOT -eq $i ]; then
-                                # slot "i" already populated.  This means we've
-                                # already found this particular version of
-                                # python.  Continue the for ACC in 
-                                # $ACCEPTABLE loop and don't overwrite the
-                                # one we already found (interpreters first
-                                # on the path win).
-                                continue 2
-                            fi
-                        done
-                        if [ "$VERSION" = "$ACC" ]; then
-                            FOUNDLIST="$FOUNDLIST $i"
-                            eval "FOUND$i=$FULL"
-                            eval "FOUNDVERSION$i=$VERSION"
-                        fi
-                    done
-                fi
-            fi
-        done
-    done
-    if [ "$VERSION" = "$TARGET" ]; then
-        out
-        out "  The optimum Python version ($TARGET) was found at $FOUND."
-    elif [ -z "$FOUND1" ] && [ -z "$FOUND2" ] && [ -z "$FOUND3" ] &&
-         [ -z "$FOUND4" ] && [ -z "$FOUND5" ] && [ -z "$FOUND6" ] ; then
-        out
-        out "  No suitable Python version found.  You should install"
-        out "  Python version $TARGET before continuing.  Versions"
-        out "  $ACCEPTABLE also work, but not as optimally."
-        exit 1
-    else
-        if   [ -n "$FOUND1" ]; then
-            FOUND=$FOUND1
-            FOUNDVERSION=$FOUNDVERSION1
-        elif [ -n "$FOUND2" ]; then
-            FOUND=$FOUND2
-            FOUNDVERSION=$FOUNDVERSION2
-        elif [ -n "$FOUND3" ]; then
-            FOUND=$FOUND3
-            FOUNDVERSION=$FOUNDVERSION3
-        elif [ -n "$FOUND4" ]; then
-            FOUND=$FOUND4
-            FOUNDVERSION=$FOUNDVERSION4
-        elif [ -n "$FOUND5" ]; then
-            FOUND=$FOUND5
-            FOUNDVERSION=$FOUNDVERSION5
-        elif [ -n "$FOUND6" ]; then
-            FOUND=$FOUND6
-            FOUNDVERSION=$FOUNDVERSION6
-        fi
-        out
-        out "  !! WARNING !!"
-        out "  An acceptable, but non-optimal Python version ($FOUNDVERSION)"
-        out "  was found at '$FOUND'."
-        out "  But consider installing version '$TARGET' before running"
-        out "  'make'.  If this isn't the Python version or interpreter"
-        out "  instance you wish to use, you may specify a Python interpreter"
-        out "  manually by rerunning the ./configure script with the"
-        out "  '--with-python' option."
-    fi
-    out ""
-}
-
-out() {
-    if [ -z "$QUIET" ]; then
-        echo $1
-    fi
-}
-
-
-while [ "$1" ] ; do
-    OPT="$1"
-    shift 1
-    case "$OPT" in
-    --help | --hel | --he | --h | -h)
-        usage
-        exit 0
-        ;;
-    --with-python=* | --with-pytho=* | --with-pyth=* | --with-pyt=* )
-        FOUND=`echo $OPT | sed -e 's/--[^=][^=]*=//'`
-        # use eval to do tilde expansion
-        eval "FOUND='$FOUND'"
-        ;;
-    --with-python | --with-pytho | --with-pyth | --with-pyt )
-        FOUND="$1"
-        shift 1
-        ;;
-    --quiet | --quie | --qui | --qu | --q | -q)
-        QUIET="true"
-        ;;
-    --force | --forc | --for | --fo | --f | -f)
-        FORCE_APP_HOME="true"
-        ;;
-    --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=* )
-        prefix=`echo $OPT | sed -e 's/--[^=][^=]*=//'`
-        # use eval to do tilde expansion
-        eval "prefix='$prefix'"
-        ;;
-    --prefix | --prefi | --pref | --pre | --pr | --p )
-        prefix="$1"
-        shift 1
-        ;;
-    *)
-        echo "argument not understood: $OPT" >@2
-        usage >@2
-        exit 2
-        ;;
-    esac
-done
-
-out ""
-out "Configuring schooltool.app installation"
-out ""
-
-if [ -z "$FOUND" ]; then
-    get_python
-else
-    out "Using Python interpreter at $FOUND"
-    out ""
-fi
-
-if [ -d "$prefix" -a ! "$FORCE_APP_HOME" ] ; then
-    echo 2>&1 "Installation directory $prefix already exists."
-    echo 2>&1 "Specify a directory that isn't being used, or"
-    echo 2>&1 "use --force to use it anyway."
-    out ""
-    exit 2
-fi
-
-# iff $prefix starts with '/', $FIRSTPART will be ''
-FIRSTPART="`echo $prefix | cut -f1 -d/`"
-if [ ! "" = "" ] ; then
-    prefix="`pwd`/$prefix"
-fi
-
-sed -e "s|@prefix@|$prefix|g" \
-    -e "s|@PYTHON@|$FOUND|g" \
-    "$HERE/Makefile.in" > "$HERE/Makefile"
-
-exit $?

Added: schooltool/branches/upstream/current/doc/ISSUES.txt
===================================================================
--- schooltool/branches/upstream/current/doc/ISSUES.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/doc/ISSUES.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,23 @@
+=================================
+Issues with the `refactor` branch
+=================================
+
+- There are several XXX.
+
+- There is an implicit expectation that all objects that can have a timetable
+  also provide a title.
+
+- Move the functionality of Person.overlaid_calendars to the view code.
+
+- A generation script has to be written:
+
+   * Convert timetables data attribute to an annotation value.
+
+- Build a better preference system where single preference groups can be
+  registered. I did a feasibility study and a modified zope.app.preference
+  implementation will work.
+
+- Application title is currently SchoolBell.
+
+- SchoolBell Person preferences show cal_periods; that's okay for now. We need
+  to develop a generic preferences framework for components.
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/doc/ISSUES.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/doc/building-with-mingw.txt
===================================================================
--- schooltool/branches/upstream/current/doc/building-with-mingw.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/doc/building-with-mingw.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,18 @@
+Building SchoolTool extension modules on Windows with MinGW
+===========================================================
+
+Download and install MinGW from http://www.mingw.org/ (MinGW-*.exe will do)
+
+Follow the instructions in the Distutils manual, section 6.2.2 (Using
+non-Microsoft compilers on Windows: GNU C / Cygwin / MinGW):
+
+  http://www.python.org/doc/current/inst/
+  http://www.python.org/doc/current/inst/tweak-flags.html#SECTION000622000000000000000
+
+Add mingw32 to your %PATH% if needed (e.g. `set PATH=%PATH%;c:\mingw\bin`)
+before executing `setup.py build --compiler=mingw32`.
+
+You should now have a bunch of .pyd files in the build\lib.win32-2.3 directory.
+Copy the contents of this directory on top of the src directory to get a
+working installation. The directory can also be compressed as it is for easy
+distribution.


Property changes on: schooltool/branches/upstream/current/doc/building-with-mingw.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/doc/restive-interface.txt
===================================================================
--- schooltool/branches/upstream/current/doc/restive-interface.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/doc/restive-interface.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,189 @@
+SchoolTool server RESTive interface
+===================================
+
+This is a brief list of all actions accessible through the RESTive interface
+to the SchoolTool server.
+
+  GET /
+    lists all application object containers
+
+  GET /persons
+    lists all persons in the system
+  POST /persons
+    creates a new person in the system
+  PUT /persons/new_person_id
+    creates a new person in the system
+  PUT /persons/existing_person_id
+    changes information for a person
+  DELETE /persons/person_id
+    permanently deletes a person from the system
+  GET /persons/person_id
+    shows the information for a person
+  PUT /persons/person_id/password
+    changes a person's password
+  PUT /persons/person_id/photo
+    upoad a photo for a person
+  GET /persons/person_id/photo
+    get the photo of a person
+  DELETE /persons/person_id/photo
+    remove the photo of a person
+  GET /persons/person_id/preferences
+    get the preferences of a person
+  PUT /persons/person_id/preferences
+    change the preferences of a person
+
+  GET /persons/person_id/academicStatus
+    view the person's academic status
+  POST /persons/person_id/academicStatus
+    change a person's academic status
+XXX why POST and not PUT?
+
+  GET /persons/person_id/promotion
+    view the person's promotion workflow
+  PUT /persons/person_id/promotion
+    create the person's promotion workflow
+  POST /persons/person_id/promotion
+    change the promotion workflow?
+
+  GET /persons/person_id/academicHistory
+    view the person's academic history.
+
+  GET /groups
+    lists all groups in the system
+  POST /groups
+    creates a new group in the system
+  PUT /groups/new_group_id
+    creates a new group in the system
+  PUT /groups/existing_group_id
+    changes information for a group
+  GET /groups/group_id
+    shows the information for a group
+  DELETE /groups/group_id
+    permanently deletes a group from the system
+
+  GET /resources
+    lists all resources in the system
+  POST /resources
+    creates a new resource in the system
+  PUT /resources/new_resource_id
+    creates a new resource in the system
+  PUT /resource/existing_resource_id
+    changes information for a resource
+  GET /resources/resource_id
+    shows the information for a resource
+  DELETE /resources/resource_id
+    permanently deletes a resource from the system
+
+  GET /courses
+    lists all courses in the system
+  POST /courses
+    creates a new course in the system
+  PUT /courses/new_course_id
+    creates a new course in the system
+  PUT /course/existing_course_id
+    changes information for a course
+  GET /courses/course_id
+    shows the information for a course
+  DELETE /courses/course_id
+    permanently deletes a course from the system
+
+  GET /sections
+    lists all sections in the system
+  POST /sections
+    creates a new section in the system
+  PUT /sections/new_section_id
+    creates a new section in the system
+  PUT /section/existing_section_id
+    changes information for a section
+  GET /sections/section_id
+    shows the information for a section
+  DELETE /sections/section_id
+    permanently deletes a section from the system
+
+  GET /levels
+    lists all levels in the system
+  POST /levels
+    create a new level
+  PUT /levels/new_level_id
+    create or replace a level
+  DELETE /levels/level_id
+    remove a level
+
+  GET /terms
+    lists all terms in the system
+  PUT /terms/new_term_id
+    creates a new term
+  PUT /terms/existing_term_id
+    replaces a term
+  GET /terms/term_id
+    shows the information for a term
+  DELETE /terms/term_id
+    deletes the term
+
+  GET /ttschemas
+    lists all defined timetable schemas
+  PUT /ttschemas/new_schema_id
+    creates a new timetable schema
+  GET /ttschemas/ttschema_id
+    shows the timetable schema
+
+XXX You cannot delete timetable schemas -- that would break existing
+    timetables.
+XXX You cannot modify timetable schemas once they're created either, for the
+    same reason.
+
+  GET ...object/calendar  (or /calendar.ics, or /calendar.vfb)
+    view an object's calendar (where the object can be a person, group or a
+    resource)
+  PUT ...object/calendar  (or /calendar.ics, or /calendar.vfb)
+    change an object's calendar (where the object can be a person, group or a
+    resource)
+
+  GET ...object/timetables
+    list an object's timetable (where the object can be a person, group or a
+    resource)
+  GET ...object/timetables/term_id.ttschema_id
+    view an object's timetable
+  PUT ...object/timetables/term_id.ttschema_id
+    change an object's timetables
+
+  GET ...object/composite-timetables
+    list an object's composite timetable (where the object can be a person,
+    group or a resource)
+  GET ...object/composite-timetables/term_id.ttschema_id
+    view an object's composite timetable
+
+XXX There used to be a way to get the calendar derived from all timetables
+
+  GET ...path/acl
+    view the access control list for a location
+  POST ...path/acl
+    change the access control list for a location
+
+We use POST rather than PUT on the ACL, because you do not send the full
+repesentation of the whole ACL.  You can change a subset of the access list
+by submitting just a subset.  Using PUT for that would be non-RESTive.
+
+  GET ...object/relationships
+    list all object's relationships (where the object can be a person, group or a
+    resource)
+  POST ...object/relationships
+    create a new relationship
+  GET ...object/relationships/nr
+    view a specific relationship
+  DELETE ...object/relationships/nr
+    break up a relationship
+
+  GET ...path/notes
+    view all notes on an object
+  POST ...path/notes
+    add new notes for an object
+
+XXX: There is currently no way to edit/delete notes via the RESTive interface.
+
+This list should be up-to-date (I think) with respect to SchoolTool revision
+4410.  It has not been verified, so it might contain errors or omissions.
+
+Ideally all this should be automatically extracted from source code (e.g.,
+docstrings for views).
+


Property changes on: schooltool/branches/upstream/current/doc/restive-interface.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/doc/schooltool-security.xls
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/doc/schooltool-security.xls
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/doc/wfmc-workflows.txt
===================================================================
--- schooltool/branches/upstream/current/doc/wfmc-workflows.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/doc/wfmc-workflows.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,205 @@
+=========================================
+Implementing WfMC Workflows in SchoolTool
+=========================================
+
+Introduction
+------------
+
+After much experimenting, Zope 3's developers have finally embraced WfMC-based
+workflows over state-based workflows. The main different between the two is
+that one is activity- and the other state-centric. In state-centric workflows
+the state of an object is managed by the workflow and behavior depends on this
+state. Transitions define the change from one state to another.
+
+Unfortunately, the state-centric workflow model does not really implement a
+workflow. A workflow is the flow of work, not state. Thus, the WfMC-based
+workflow model provides the concept of activities, which consists of a set of
+work items that have to be completed before the workflow can continue to the
+next activity.
+
+The are several obvious advantages of the activity-centric workflow model:
+
+- A state-centric workflow is intrinsically also document-centric. The WfMC
+  model is independent of a particular object that is subjected to a
+  workflow. It is thus much more powerful, since it can describe states of
+  many objects at once.
+
+- A WfMC workflow can be modeled independently of the software that will use
+  the workflow. The workflow will provide hooks via applications and
+  participants that allow the software to interact with the workflow
+  process.
+
+- Any given WfMC workflow can be easily extended or connected to a larger
+  workflow by replacing simple activities with activities that represent
+  sub-workflows.
+
+Now that I hopefully have convinced you that the WfMC workflow is the way to
+go, let's have a look on how to create a workflow and integrate it into your
+software. Note that I am not providing any unit tests here, because there are
+excellent examples in ``Zope3/src/zope/wfmc/*.txt`` and
+``schooltool/src/schooltool/level/README.txt``.
+
+
+Developing the Workflow Process
+-------------------------------
+
+With the ``zope.wfmc`` package you have choice to develop your workflow
+processes in Python or use the standard XPDL format. I strongly encourage you
+to use the latter one, since there are standard editors available for it (such
+as JaWE) which make it much easier to reason about the workflow. However,
+before you can produce anything useful in JaWE, you need to know the WfMC
+terminology:
+
+Process
+  This object describes one particular work process inside the
+  workflow of an entity. Usually your XPDL file will only contain one
+  process, but remember that WfMC was developed for very large entities
+  with extremely complex processes. Here is an example in the context of
+  SchoolTool. The entity, described by a XPDL file, is a particular
+  school. In a school many different processes are executed, such as
+  enrolling students or the promotion of students through the grades. As
+  mentioned before, one process could be the sub-process of another process.
+
+Activity
+  The activity describes one step inside a process. During an
+  activity, multiple tools (defined via applications) are called to interact
+  with software and also change workflow-relevant data. When all
+  tools are finished the activity will transition to the next one. In the
+  context of SchoolTool, an activity would be enrolling into a class (part
+  of a fictional registration process).
+
+Transition
+  This object, as the name suggests, represents a transition
+  from one activity to another. This object does not have a rich API and
+  merely defines a condition that decides whether a particular transition
+  can be done. In SchoolTool this could be a transition from passing the
+  final grade to graduating from the school.
+
+Application
+  An application is a piece of software that is executed. One
+  can think of it more of less as a function. The input parameters
+  (arguments of the function) can be specified and must be variables from
+  the workflow-relevant data. The application's output parameters (return
+  values) are stored as workflow-relevant data, overwriting existing data as
+  necessary. Applications can require manual input. For example, this could
+  be the assignment of a grade for course to a student.
+
+Participant
+  The participant is the actor/principal that is completing a
+  particular activity. In Zope terms we would think of the participant as a
+  role inside the system, such as a school manager, teacher or
+  student. However, the participant could be also a single human, department
+  or even the computer system, in which case it would be more like a Zope
+  principal.
+
+Workflow Relevant Data
+  This data (WfRD) contains values that are
+  necessary for the workflow function, either by calling applications or
+  evaluating conditions (for example during transitions). Th input and
+  output data of a process can be specified in its formal parameters and
+  will be stored or looked up in the WfRD, respectively. In Zope's
+  implementation, any type of Python object can be stored in the WfRD. In
+  the context of SchoolTool a WfRD variable could be the current level of a
+  student during the promotion process.
+
+When you first start JaWE, you get an empty document that looks pretty
+daunting at the beginning.  The first task will be to create a package.  This is
+a container for your workflow.  Go to File > New and enter an appropriate id and 
+title.
+
+The next task will be to create a process; do that
+by clicking on the `Toolbox` tab and then on the `Insert Process` icon. You
+then click inside the drawing area somewhere, which places the new process
+into the grid. You can now double click on the process object to modify the
+properties. However, there is not much to do yet besides changing the name and
+id.
+
+To truly edit the process, click on it once, then click on the `Edit` tab
+followed by selecting the `Edit` icon. A new window should open. This window is
+the edit area of the process. The first task is to create or select the
+participants of the process. If you have defined global participants, you can
+click on the `Process` tab and then on the `Participants` icon to show and
+hide global participants. The screen also allows you to create local
+participants. However, the better way to create local participants is to click
+on the `Toolbox` tab and selecting the `Participant` icon. Once the participant
+is created you should see a box with the participant's name in it. You can
+repeat this process as often as desired.
+
+The next step is to create the activities. You have the choice between
+generic, route, block and subflow activities. Thus far I have only needed
+generic activities. Select the `Generic activity` icon and click with the
+cursor inside any particpant and the activity will appear. You can then double
+click on the activity to edit it. Repeat this process until you have defined
+all activities.
+
+Now that you have developed the activities, you need to define the transitions
+between them. While you can choose between a simple, self-routed, and circular
+transition, I have only used simple transitions until now. To create a
+transition, click on the `Transition` icon then on the initial activity (this
+is a little finicky--make sure the initial activity is highlighted before you 
+drag), holding the mouse button and going to the final activity after which you 
+can let the mouse button go. You can then double click on the newly created 
+arrow representing the transition to edit the transition properties. The most
+important attribute here is the condition. In the expression field of the
+condition, you can enter a valid Python expression that should evaluate to
+``True`` or ``False``. All of the workflow-relevant data variables are
+available.
+
+The final step to complete the workflow is to define the starting point and
+several (at least one) end points. Simply create start and end buttons and
+connect them with the activities via transitions. You should now have a valid
+process.
+
+However, the workflow would not do much, because we have not defined the
+workflow-relevant data and applications yet. To add some workflow-relevant
+data definitions, click on the `Process` tab and then on the
+`Workflow-relevant data` icon. You can create new variables from the appearing
+dialog. Similarly, you can define applications by clicking on the
+`Applications` icon. To hook up the applications activities, double click on
+the activity, select the `Tool` tab in the dialog. Click on `New` to create a
+new tool. In the tool dialog, you simply select an application. You then have
+to match the formal parameters of the application with actual parameters of
+the tool. You basically tell the system which WfRD variable is sent in/out for
+which parameter of the application.
+
+Once all the applications are defined and hooked up you are done with defining
+the workflow and you can save the file.
+
+
+Hooking up the XPDL in Zope
+---------------------------
+
+The XPDL file can be easily integrated into your application. A script named
+``xpdl2zcml.py`` in ``zope/app/wfmc`` allows you to specify the XPDL file, the
+process id and the id of the process utility and will create all necessary
+ZCML directives for you. Simply copy the ZCML into your configuration file.
+
+
+Writing the Software
+--------------------
+
+All that is left now is to implement the participants and applications,
+so that they are found by the created adapter directives. A participant
+implementation is usually pretty trivial. The only functionality I have
+implemented for it thus far is the lookup of the work items. This is
+necessary, because for applications that need manual input, you want to
+reference them at a place that is easily accessible to the principal
+that needs to do the input.
+
+Applications come in two flavors: automatic and manual. Automatic applications
+are simple, since their ``start()`` method simply calls the ``finish()``
+method. The arguments to the those methods are the formal input and output
+parameters of the application, respectively. Automatic applications are good
+for making log entries and updating data.
+
+For manual applications, the ``start()`` is usually empty or simply stores the
+input parameter values. The ``finish()`` method is called by the software
+after the user made the necessary input. The input represents commonly the
+arguments to the ``finish()`` method. For manual applications you also need to
+add the application to the participant's work items. This can be either done
+in the constructor or the ``start()`` method.
+
+Once all the classes are written, the workflow should be fully functional.
+Usually the only UI you have to develop is the management and
+completion of manual applications/work items, which greatly depends on the
+software you are developing.


Property changes on: schooltool/branches/upstream/current/doc/wfmc-workflows.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/i18nextract.py
===================================================================
--- schooltool/branches/upstream/current/i18nextract.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/i18nextract.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,175 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Customization of Zope's message string extraction module for schooltool and
+schoolbell.
+
+This is just a very simple script to be run from within an un-packed and built
+schooltool checkout.
+
+$Id$
+"""
+import os
+import sys
+import tokenize
+import optparse
+
+from zope.i18nmessageid.message import MessageFactory
+from zope.app.locales.pygettext import make_escapes
+from zope.app.locales.extract import find_files
+
+_import_chickens = {}, {}, ("*",) # dead chickens needed by __import__
+
+here = os.path.abspath(os.path.dirname(__file__))
+
+# Remove this directory from path:
+# (prevents conflicts between python's test module and the test runner)
+sys.path[:] = [p for p in sys.path if os.path.abspath(p) != here]
+# Lets add the Zope and schooltool paths to sys.path
+zope3 = os.path.join(here, 'Zope3', 'src')
+sys.path.insert(0, zope3)
+st = os.path.join(here, 'src')
+sys.path.insert(0, st)
+
+from zope.app.locales import extract
+
+# Monkey patch the Zope3 translation extraction machinery
+extract.pot_header = """\
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005    Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+msgid ""
+msgstr ""
+"Project-Id-Version: %(version)s\\n"
+"POT-Creation-Date: %(time)s\\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\\n"
+"Language-Team: Schooltool Development Team <schooltool-dev at schooltool.org>\\n"
+"MIME-Version: 1.0\\n"
+"Content-Type: text/plain; charset=%(charset)s\\n"
+"Content-Transfer-Encoding: %(encoding)s\\n"
+"Generated-By: i18nextract.py\\n"
+
+"""
+
+def get_version():
+    version_file = os.path.join('src', 'schooltool', 'version.txt')
+    f = open(version_file, 'r')
+    result = f.read()
+    f.close()
+    return result
+
+class POTMaker(extract.POTMaker):
+
+    def _getProductVersion(self):
+        return "SchoolTool Version %s" % get_version()
+
+def py_strings(dir, domain="zope", exclude=(), verify_domain=False):
+    """Retrieve all Python messages from `dir` that are in the `domain`.
+    """
+    eater = extract.TokenEater()
+    make_escapes(0)
+    for filename in find_files(
+            dir, '*.py', exclude=('extract.py', 'pygettext.py')+tuple(exclude)):
+
+        if verify_domain:
+            common_path_lengths = [
+                len(os.path.commonprefix([os.path.abspath(filename), path]))
+                for path in sys.path]
+            l = sorted(common_path_lengths)[-1]
+            # remove .py ending from filenames
+            # replace all path separators with a dot
+            # remove the __init__ from the import path
+            import_name = filename[l+1:-3].replace(os.path.sep, ".").replace(".__init__", "")
+
+            try:
+                module = __import__(import_name, *_import_chickens)
+            except ImportError, e:
+                # XXX if we can't import it - we assume that the domain is
+                # the right one
+                print >> sys.stderr, "Could not import %s" % import_name
+            else:
+                mf = getattr(module, '_', None)
+                # XXX if _ is has no _domain set we assume that the domain
+                # is the right one, so if you are using something non
+                # MessageFactory you should set it's _domain attribute.
+                if hasattr(mf, '_domain'):
+                    if mf._domain != domain:
+                        # domain mismatch - skip
+                        continue
+
+        fp = open(filename)
+
+        try:
+            eater.set_filename(filename)
+            try:
+                tokenize.tokenize(fp.readline, eater)
+            except tokenize.TokenError, e:
+                print >> sys.stderr, '%s: %s, line %d, column %d' % (
+                    e[0], filename, e[1][0], e[1][1])
+        finally:
+            fp.close()
+    return eater.getCatalog()
+
+def write_pot(output_dir, path, domain, base_dir, site_zcml):
+    # Create the POT
+    output_file = os.path.join(path, output_dir, domain + '.pot')
+    maker = POTMaker(output_file, path)
+    maker.add(py_strings(path, domain, verify_domain=True), base_dir)
+    maker.add(extract.zcml_strings(path, domain, site_zcml=site_zcml), base_dir)
+    maker.add(extract.tal_strings(path, domain), base_dir)
+    maker.write()
+
+def parse_args(argv):
+    """Parse the command line arguments"""
+    parser = optparse.OptionParser(usage="usage: %prog [options]")
+    # XXX ! separate these
+    parser.add_option("--domain", dest="domain", default=None,
+                      help="The domain that should be extracted")
+    parser.add_option("--zcml", dest="zcml", default=None,
+                      help="ZCML file to start the extraction")
+    options, args = parser.parse_args(argv)
+    assert len(args) == 1
+    assert options.domain is not None
+    assert options.zcml is not None
+    return options
+
+if __name__ == '__main__':
+    here = os.path.abspath(os.path.dirname(__file__))
+    path = os.path.join(here, 'src')
+    # get the command line arguments
+    options = parse_args(sys.argv)
+    base_dir = here # Comments are relative to the source checkouts so we are
+                    # sure we don't have any absolute paths in there.
+    output_dir = os.path.join(here, 'src', 'schooltool', 'locales')
+    write_pot(output_dir, path, options.domain, base_dir, options.zcml)
+    print 'Extracted %s.pot to %s' % (options.domain, output_dir)


Property changes on: schooltool/branches/upstream/current/i18nextract.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/images/schooltool_zebra.xcf
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/images/schooltool_zebra.xcf
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Deleted: schooltool/branches/upstream/current/install.py
===================================================================
--- schooltool/branches/upstream/current/install.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/install.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -1,29 +0,0 @@
-#! /usr/bin/env python
-#
-# THIS IS A GENERATED FILE.  DO NOT EDIT THIS DIRECTLY.
-
-# Add the Support/ directory to sys.path to get our support code:
-#
-import os
-import sys
-
-try:
-    __file__
-except NameError:
-    # Python 2.2.x does not have __file__ for scripts.
-    __file__ = sys.argv[0]
-
-here = os.path.dirname(os.path.realpath(__file__))
-support_dir = os.path.join(here, 'Support')
-support_dir = os.path.normpath(support_dir)
-if os.path.isdir(support_dir):
-    sys.path.insert(0, support_dir)
-
-import zpkgsetup.setup
-
-
-context = zpkgsetup.setup.SetupContext(
-    'SchoolTool', '2006.0-beta1', __file__)
-
-context.initialize()
-context.setup()

Added: schooltool/branches/upstream/current/schoolbell-server.py
===================================================================
--- schooltool/branches/upstream/current/schoolbell-server.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schoolbell-server.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+"""
+A script to start the schoolbell server from the source directory.
+"""
+
+import sys
+import os.path
+
+if sys.version_info < (2, 4):
+    print >> sys.stderr, '%s: need Python 2.4 or later.' % sys.argv[0]
+    print >> sys.stderr, 'Your python is %s' % sys.version
+    sys.exit(1)
+
+# find the schoolbell config file if it exists
+dirname = os.path.dirname(__file__)
+config_file = os.path.join(dirname, 'schoolbell.conf')
+if not os.path.exists(config_file):
+    config_file = os.path.join(dirname, 'schoolbell.conf.in')
+
+# Change the default config file name by prepending a command-line argument
+sys.argv.insert(1, '--config=' + config_file)
+
+import os
+basedir = os.path.abspath(os.path.dirname(sys.argv[0]))
+sys.path.insert(0, os.path.join(basedir, 'src'))
+sys.path.insert(0, os.path.join(basedir, 'Zope3', 'src'))
+
+import schooltool.sbapp.main
+schooltool.sbapp.main.StandaloneServer().main()


Property changes on: schooltool/branches/upstream/current/schoolbell-server.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/schoolbell-site.zcml
===================================================================
--- schooltool/branches/upstream/current/schoolbell-site.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schoolbell-site.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="schoolbell">
+
+  <include files="schoolbell-includes/*-meta.zcml" />
+
+  <include package="schooltool" />
+  <include package="schooltool.sbapp" />
+
+  <include files="schoolbell-includes/*-configure.zcml" />
+
+  <!-- Provide local overrides of standard configurations-->
+  <includeOverrides files="schoolbell-includes/*-overrides.zcml" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/schoolbell-site.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/schoolbell.conf.in
===================================================================
--- schooltool/branches/upstream/current/schoolbell.conf.in	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schoolbell.conf.in	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,212 @@
+# Sample SchoolBell configuration file
+
+# identify the component configuration used to define the site:
+site-definition schoolbell-site.zcml
+
+#
+# web port
+# web interface:port
+#
+#   Specifies the port number and optionaly a network interface for
+#   the web application server to listen on
+#
+# Examples:
+#   web 8080
+#   web 127.0.0.1:80
+#
+
+web 7080
+
+#
+# rest port
+# rest interface:port
+#
+#   Specifies the port number and optionaly a network interface for
+#   the RESTive application server to listen on
+#
+# Examples:
+#   rest 7001
+#   rest 127.0.0.1:7001
+#
+
+rest 7001
+
+#
+# thread-pool-size n
+#
+#   Specifies the suggested size for request thread pool
+#
+# Default:
+#   thread-pool-size 10
+#
+
+#
+# pid-file
+#
+#   Specifies the path of a pid file.
+#
+# Default: no pidfile
+#
+pid-file schoolbell.pid
+
+#
+# error-log-file
+#
+#   Specifies the path of a log file used for exceptions. Special
+#   values STDERR and STDOUT mean standard error and standard output
+#   respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    error-log-file STDERR
+#
+# Examples:
+#    error-log-file /var/log/schooltool/error.log
+#    error-log-file STDERR
+#
+error-log-file var/schoolbell.log
+error-log-file STDERR
+
+#
+# web-access-log-file
+#
+#   Specifies the path of a file used for an Apache combined format
+#   access log of the web application.  Special values STDERR and
+#   STDOUT mean standard error and standard output respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    web-access-log-file STDOUT
+#
+# Examples:
+#    web-access-log-file /var/log/schooltool/access.log
+#    web-access-log-file STDOUT
+#
+web-access-log-file var/web-access.log
+
+#
+# attendance-log-file
+#
+#   Specifies the path of a log file used for attendance
+#   logging. Special values STDERR and STDOUT mean standard error and
+#   standard output respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    attendance-log-file var/attendance.log
+#
+# Examples:
+#    attendance-log-file /var/log/schooltool/attendance.log
+#    attendance-log-file STDOUT
+#
+attendance-log-file var/attendance.log
+
+
+#
+# lang
+#
+#    Specifies the locale of the messages to be used on the server.
+#
+#    If 'auto' is set, the language is chosen according to the user's
+#    preference specified in the web browser configuration.
+#
+# Default:
+#    lang auto
+#
+# Examples:
+#    lang de_DE
+#    lang fr
+lang auto
+
+#
+# <zodb>
+#   ...
+# </zodb>
+#
+#   Specifies a ZODB database to use.
+#   This section is required.
+#
+
+<zodb>
+  # <filestorage>		traditional FileStorage
+  #   path filename		required
+  #   create yes|no		default: yes
+  #   read-only yes|no		default: no
+  #   quota size		default: no quota
+  # </filestorage>
+  <filestorage>
+    path var/SchoolBell-Data.fs
+  </filestorage>
+
+  # <mappingstorage>		in-memory MappingStorage
+  #   name storage-name		default: Mapping Storage
+  # </mappingstorage>
+
+  # <fullstorage>		BerkeleyDB based storage
+  #   ...			XXX
+  # </fullstorage>
+
+  # <minimalstorage>		BerkeleyDB based storage, stripped down
+  #   ...			see <fullstorage>
+  # </minimalstorage>
+
+  # <zeoclient>
+  #   server address		one or more; required
+  #   cache-size n		default: 20000000 (bytes)
+  #   name storage-name		default: address of the server
+  #   client x			enables persistent cache for client x
+  #   var dirname		directory for persistent cache (default: .)
+  #   min-disconnect-poll n	default: 5
+  #   max-disconnect-poll n	default: 300
+  #   wait yes|no		default: yes
+  #   read-only yes|no		default: no
+  #   read-only-fallback yes|no	default: no
+  #   realm name		authentication realm
+  # </zeoclient>
+
+  # <demostorage>		currently broken
+  #   name			default: Demo Storage
+  #   quota			XXX
+  #   ...			another section describing base storage
+  # </demostorage>
+
+  # cache-size n
+  #
+  # Default:
+  #   cache-size 5000
+
+  # pool-size n
+  #
+  # Default:
+  #   pool-size 7
+
+</zodb>
+
+#
+# reportlab_fontdir
+#
+#   Specifies the path to TrueType fonts (Arial and Times New Roman)
+#   for reportlab.
+#
+#   Comment out to disable reportlab.
+#
+# Examples:
+#    reportlab_fontdir /usr/share/fonts/truetype/msttcorefonts
+#
+reportlab_fontdir /usr/share/fonts/truetype/msttcorefonts
+
+#
+# devmode
+#
+#   Switches the Developer Mode on and off.
+#
+# Default:
+#   devmode off
+#
+#devmode on

Added: schooltool/branches/upstream/current/schooltool-server.py
===================================================================
--- schooltool/branches/upstream/current/schooltool-server.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool-server.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+A script to start the schooltool server from the source directory.
+"""
+
+import sys
+import os
+import site
+
+if sys.version_info < (2, 4):
+    print >> sys.stderr, '%s: need Python 2.4 or later.' % sys.argv[0]
+    print >> sys.stderr, 'Your python is %s' % sys.version
+    sys.exit(1)
+
+here = os.path.dirname(os.path.realpath(__file__))
+
+# find the config file
+config_file = os.path.join(here, 'schooltool.conf')
+if not os.path.exists(config_file):
+    config_file = os.path.join(here, 'schooltool.conf.in')
+
+# Change the default config file name by prepending a command-line argument
+sys.argv.insert(1, '--config=' + config_file)
+
+# Remove this directory from path:
+sys.path[:] = [p for p in sys.path if os.path.abspath(p) != here]
+
+# add the src, eggs and Zope3/src to the python path and as sites so that eggs work
+src = os.path.join(here, 'src')
+eggs = os.path.join(here, 'eggs')
+sys.path.insert(0, eggs)
+sys.path.insert(0, src)
+import site
+site.addsitedir(src)
+site.addsitedir(eggs)
+
+# Now run the app
+import schooltool.app.main
+schooltool.app.main.StandaloneServer().main()


Property changes on: schooltool/branches/upstream/current/schooltool-server.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/schooltool-skel/bin/schooltool.in
===================================================================
--- schooltool/branches/upstream/current/schooltool-skel/bin/schooltool.in	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool-skel/bin/schooltool.in	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+#!<<PYTHON>>
+"""
+A script to start the schooltool server from the source directory.
+"""
+
+import sys
+import os.path
+import site
+
+ZOPE_SOFTWARE_HOME = r"<<ZOPE_SOFTWARE_HOME>>"
+SCHOOLTOOL_SOFTWARE_HOME = r"<<SCHOOLTOOL_SOFTWARE_HOME>>"
+INSTANCE_HOME = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+CONFIG_FILE = os.path.join(INSTANCE_HOME, "etc", "schooltool.conf")
+
+
+def run():
+    if sys.version_info < (2, 4):
+        print >> sys.stderr, '%s: need Python 2.4 or later.' % sys.argv[0]
+        print >> sys.stderr, 'Your python is %s' % sys.version
+        sys.exit(1)
+
+    # This removes the script directory from sys.path, which we do
+    # since there are no modules here.
+    #
+    basepath = filter(None, sys.path)
+
+    sys.path[:] = [os.path.join(INSTANCE_HOME, "lib", "python"),
+                   SCHOOLTOOL_SOFTWARE_HOME, ZOPE_SOFTWARE_HOME] + basepath
+    site.addsitedir(ZOPE_SOFTWARE_HOME)
+    site.addsitedir(SCHOOLTOOL_SOFTWARE_HOME)
+    site.addsitedir(os.path.join(INSTANCE_HOME, "lib", "python"))
+
+    from schooltool.app import main
+
+    main.MANAGER_USERNAME = r"<<USERNAME>>"
+    main.MANAGER_PASSWORD = r"<<PASSWORD>>"
+
+    main.StandaloneServer().main(sys.argv + ['--config', CONFIG_FILE])
+
+
+if __name__ == '__main__':
+    run()


Property changes on: schooltool/branches/upstream/current/schooltool-skel/bin/schooltool.in
___________________________________________________________________
Name: svn:executable
   + *

Added: schooltool/branches/upstream/current/schooltool-skel/bin/test.in
===================================================================
--- schooltool/branches/upstream/current/schooltool-skel/bin/test.in	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool-skel/bin/test.in	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,63 @@
+#!<<PYTHON>>
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Run tests in a SchoolTool instance home.
+
+$Id$
+"""
+
+import sys, os
+import site
+
+# Check the minimum python version
+if sys.version_info < (2, 4):
+    print >> sys.stderr, '%s: need Python 2.4 or later.' % sys.argv[0]
+    print >> sys.stderr, 'Your python is %s' % sys.version
+    sys.exit(1)
+
+here = os.path.dirname(os.path.realpath(__file__))
+here = os.path.dirname(here)
+
+SOFTWARE_HOME = r"<<SCHOOLTOOL_SOFTWARE_HOME>>"
+
+instance_lib = os.path.join(here, "lib", "python")
+
+sys.path[:0] = [instance_lib, SOFTWARE_HOME]
+site.addsitedir(SOFTWARE_HOME)
+site.addsitedir(instance_lib)
+
+from zope.testing import testrunner
+
+defaults = ['--tests-pattern', '^f?tests$']
+
+test_lib = instance_lib
+
+if testschooltool = "--testschooltool" in sys.argv[1:]:
+    sys.argv.remove("--testschooltool")
+    test_lib = SOFTWARE_HOME
+    # We only want to run schooltool tests
+    defaults += ['-m', 'schooltool']
+
+defaults += ['-test-path', test_lib]
+
+# Add our extra option to the help of the testrunner.
+testrunner.searching.add_option("--testschooltool", help="""\
+When specified, the tests for the installed SchoolTool software are run
+instead of the tests for the software installed in the instance.
+This is useful to determine the effects of additional software
+installation and configuration changes on the base Zope software.
+Unlike other options, this cannot be abbreviated.
+"""
+
+sys.exit(testrunner.run(defaults))


Property changes on: schooltool/branches/upstream/current/schooltool-skel/bin/test.in
___________________________________________________________________
Name: svn:executable
   + *

Added: schooltool/branches/upstream/current/schooltool-skel/etc/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/schooltool-skel/etc/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool-skel/etc/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="zope">
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+
+  <include package="schooltool.app.browser.ftests" file="brokenview-ftesting.zcml" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/schooltool-skel/etc/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/schooltool-skel/etc/schooltool.conf.in
===================================================================
--- schooltool/branches/upstream/current/schooltool-skel/etc/schooltool.conf.in	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool-skel/etc/schooltool.conf.in	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,283 @@
+# Sample SchoolTool HTTP server configuration file
+
+%define INSTANCE  <<INSTANCE_HOME>>
+
+%define CONFDIR   $INSTANCE/etc
+%define DATADIR   $INSTANCE/var
+%define LOGDIR    $INSTANCE/log
+
+# identify the component configuration used to define the site:
+site-definition $CONFDIR/site.zcml
+
+#
+# path /path/to/add
+# path /another/path/to/add
+#
+#  Specifies a path to add to the beginning of Python's module search path
+#  There can be zero or more 'path' directives
+#
+
+#
+# module dotted.module.name
+# module another.dotted.module.name
+#
+#  Lists modules to be set up when the server is started. The modules must
+#  provide IModuleSetup. The module 'schooltool.main' is implicitly listed
+#  first.
+#
+# Example:
+#   module school.example
+#
+
+#
+# listen[_ssl] port
+# listen[_ssl] interface:port
+#
+#   DEPRECIATED: The listen directives are depreciated in favour of the rest
+#   directives.
+#
+#   Specifies the port number and optionaly a network interface for
+#   the RESTive server to listen on. There can be one or more 'listen'
+#   directives. If _ssl is used the server will accept only SSL connctions
+#   on that port and a ssl_certificate configuration line is required.
+#
+# Examples:
+#   listen 7001
+#   listen 127.0.0.1:80
+#   listen_ssl 7002
+
+# listen 7001
+
+#
+# web[_ssl] port
+# web[_ssl] interface:port
+#
+#   Specifies the port number and optionaly a network interface for
+#   the web application server to listen on. There can be one or more
+#   'listen' directives. If _ssl is used the server will accept only
+#   SSL connctions on that port and a ssl_certificate configuration
+#   line is required.
+#
+#   Note: SSL is currently un-implemented in the schooltool server.
+#
+# Examples:
+#   web 8080
+#   web 127.0.0.1:80
+#   web_ssl 8443
+#
+
+web 7080
+
+#
+# rest port
+# rest interface:port
+#
+#   Specifies the port number and optionaly a network interface for
+#   the RESTive application server to listen on
+#
+# Examples:
+#   rest 7001
+#   rest 127.0.0.1:7001
+#
+
+# rest 7001
+
+#
+#
+# ssl_certificate certificate
+#
+#   Specifies a certificate in PEM format which contains a certificate and
+#   private key for use in SSL connections.
+#   This is required to use listen_ssl
+#
+
+#
+# thread-pool-size n
+#
+#   Specifies the suggested size for request thread pool
+#
+# Default:
+#   thread-pool-size 10
+#
+
+#
+# event-logging on|off
+#
+#   Enables or disables global event logging to /utils/eventlog
+#
+# Default:
+#   event-logging off
+#
+
+#
+# pid-file
+#
+#   Specifies the path of a pid file.
+#
+# Default: no pidfile
+#
+pid-file $DATADIR/schooltool.pid
+
+#
+# error-log-file
+#
+#   Specifies the path of a log file used for exceptions. Special
+#   values STDERR and STDOUT mean standard error and standard output
+#   respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    error-log-file STDERR
+#
+# Examples:
+#    error-log-file /var/log/schooltool/error.log
+#    error-log-file STDERR
+#
+error-log-file $LOGDIR/schooltool.log
+error-log-file STDERR
+
+#
+# rest-access-log-file
+#
+#   Specifies the path of a file used for an Apache combined format
+#   access log for the RESTive API server.  Special values STDERR and
+#   STDOUT mean standard error and standard output respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    rest-access-log-file STDOUT
+#
+# Examples:
+#    rest-access-log-file /var/log/schooltool/access.log
+#    rest-access-log-file STDOUT
+#
+rest-access-log-file $LOGDIR/rest-access.log
+
+#
+# web-access-log-file
+#
+#   Specifies the path of a file used for an Apache combined format
+#   access log of the web application.  Special values STDERR and
+#   STDOUT mean standard error and standard output respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    web-access-log-file STDOUT
+#
+# Examples:
+#    web-access-log-file /var/log/schooltool/access.log
+#    web-access-log-file STDOUT
+#
+web-access-log-file $LOGDIR/web-access.log
+
+#
+# lang
+#
+#   Specifies the locale of the messages to be used on the server.
+#   Several languages can be specified.
+#
+#   If a translation for a string is not found in a locale, the next listed
+#   locale is tried. If no translation is found, the string from the default
+#   locale is used.
+#
+# Default:
+#   lang en_US
+#
+# Examples:
+#   lang en_UK
+#   lang en_US.UTF-8
+
+#
+# domain
+#
+#   Specifies the name of the message catalog to be used on the server.
+#
+# Default:
+#   domain schooltool
+#
+# Examples:
+#   domain schoolbell
+
+#
+# <zodb>
+#   ...
+# </zodb>
+#
+#   Specifies a ZODB database to use.
+#   This section is required.
+#
+
+<zodb>
+  # <filestorage>		traditional FileStorage
+  #   path filename		required
+  #   create yes|no		default: yes
+  #   read-only yes|no		default: no
+  #   quota size		default: no quota
+  # </filestorage>
+  <filestorage>
+    path $DATADIR/Data.fs
+  </filestorage>
+
+  # <mappingstorage>		in-memory MappingStorage
+  #   name storage-name		default: Mapping Storage
+  # </mappingstorage>
+
+  # <fullstorage>		BerkeleyDB based storage
+  #   ...			XXX
+  # </fullstorage>
+
+  # <minimalstorage>		BerkeleyDB based storage, stripped down
+  #   ...			see <fullstorage>
+  # </minimalstorage>
+
+  # <zeoclient>
+  #   server address		one or more; required
+  #   cache-size n		default: 20000000 (bytes)
+  #   name storage-name		default: address of the server
+  #   client x			enables persistent cache for client x
+  #   var dirname		directory for persistent cache (default: .)
+  #   min-disconnect-poll n	default: 5
+  #   max-disconnect-poll n	default: 300
+  #   wait yes|no		default: yes
+  #   read-only yes|no		default: no
+  #   read-only-fallback yes|no	default: no
+  #   realm name		authentication realm
+  # </zeoclient>
+
+  # <demostorage>		currently broken
+  #   name			default: Demo Storage
+  #   quota			XXX
+  #   ...			another section describing base storage
+  # </demostorage>
+
+  # cache-size n
+  #
+  # Default:
+  #   cache-size 5000
+
+  # pool-size n
+  #
+  # Default:
+  #   pool-size 7
+
+</zodb>
+
+#
+# reportlab_fontdir
+#
+#   Specifies the path to TrueType fonts (Arial and Times New Roman)
+#   for ReportLab.
+#
+#   Comment out or set to empty string to disable reportlab.
+#
+# Examples:
+#    reportlab_fontdir /usr/share/fonts/truetype/msttcorefonts
+#
+# Uncomment the following and update the path to enable PDF generation:
+# reportlab_fontdir /usr/share/fonts/truetype/msttcorefonts

Added: schooltool/branches/upstream/current/schooltool-skel/etc/site.zcml
===================================================================
--- schooltool/branches/upstream/current/schooltool-skel/etc/site.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool-skel/etc/site.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="schooltool">
+
+  <include files="package-includes/*-meta.zcml" />
+
+  <include package="schooltool" />
+
+  <include files="package-includes/*-configure.zcml" />
+
+  <!-- Provide local overrides of standard configurations-->
+  <includeOverrides files="package-includes/*-overrides.zcml" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/schooltool-skel/etc/site.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/schooltool-skel/log/README.txt
===================================================================
--- schooltool/branches/upstream/current/schooltool-skel/log/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool-skel/log/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+This is the directory used to hold log files by default.


Property changes on: schooltool/branches/upstream/current/schooltool-skel/log/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/schooltool-skel/var/README.txt
===================================================================
--- schooltool/branches/upstream/current/schooltool-skel/var/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool-skel/var/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5 @@
+This directory contains files created and maintained by the SchoolTool
+application and related utilities while the server is running.
+This can include the object database as well as supplemental files
+(such as "pidfiles").  Log files are normally stored in the log/
+directory in the instance home.


Property changes on: schooltool/branches/upstream/current/schooltool-skel/var/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/schooltool.conf.in
===================================================================
--- schooltool/branches/upstream/current/schooltool.conf.in	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/schooltool.conf.in	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,303 @@
+# Sample SchoolTool HTTP server configuration file
+
+# identify the component configuration used to define the site:
+site-definition schooltool-skel/etc/site.zcml
+
+#
+# path /path/to/add
+# path /another/path/to/add
+#
+#  Specifies a path to add to the beginning of Python's module search path
+#  There can be zero or more 'path' directives
+#
+
+#
+# module dotted.module.name
+# module another.dotted.module.name
+#
+#  Lists modules to be set up when the server is started. The modules must
+#  provide IModuleSetup. The module 'schooltool.main' is implicitly listed
+#  first.
+#
+# Example:
+#   module school.example
+#
+
+#
+# listen[_ssl] port
+# listen[_ssl] interface:port
+#
+#   DEPRECIATED: The listen directives are depreciated in favour of the rest
+#   directives.
+#
+#   Specifies the port number and optionaly a network interface for
+#   the RESTive server to listen on. There can be one or more 'listen'
+#   directives. If _ssl is used the server will accept only SSL connctions
+#   on that port and a ssl_certificate configuration line is required.
+#
+# Examples:
+#   listen 7001
+#   listen 127.0.0.1:80
+#   listen_ssl 7002
+
+# listen 7001
+
+#
+# web[_ssl] port
+# web[_ssl] interface:port
+#
+#   Specifies the port number and optionaly a network interface for
+#   the web application server to listen on. There can be one or more
+#   'listen' directives. If _ssl is used the server will accept only
+#   SSL connctions on that port and a ssl_certificate configuration
+#   line is required.
+#
+#   Note: SSL is currently un-implemented in the schooltool server.
+#
+# Examples:
+#   web 8080
+#   web 127.0.0.1:80
+#   web_ssl 8443
+#
+
+web 7080
+
+#
+# rest port
+# rest interface:port
+#
+#   Specifies the port number and optionaly a network interface for
+#   the RESTive application server to listen on
+#
+# Examples:
+#   rest 7001
+#   rest 127.0.0.1:7001
+#
+
+# rest 7001
+
+#
+#
+# ssl_certificate certificate
+#
+#   Specifies a certificate in PEM format which contains a certificate and
+#   private key for use in SSL connections.
+#   This is required to use listen_ssl
+#
+
+#
+# thread-pool-size n
+#
+#   Specifies the suggested size for request thread pool
+#
+# Default:
+#   thread-pool-size 10
+#
+
+#
+# event-logging on|off
+#
+#   Enables or disables global event logging to /utils/eventlog
+#
+# Default:
+#   event-logging off
+#
+
+#
+# pid-file
+#
+#   Specifies the path of a pid file.
+#
+# Default: no pidfile
+#
+pid-file schooltool-skel/var/schooltool.pid
+
+#
+# error-log-file
+#
+#   Specifies the path of a log file used for exceptions. Special
+#   values STDERR and STDOUT mean standard error and standard output
+#   respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    error-log-file STDERR
+#
+# Examples:
+#    error-log-file /var/log/schooltool/error.log
+#    error-log-file STDERR
+#
+error-log-file schooltool-skel/var/schooltool.log
+error-log-file STDERR
+
+#
+# rest-access-log-file
+#
+#   Specifies the path of a file used for an Apache combined format
+#   access log for the RESTive API server.  Special values STDERR and
+#   STDOUT mean standard error and standard output respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    rest-access-log-file STDOUT
+#
+# Examples:
+#    rest-access-log-file /var/log/schooltool/access.log
+#    rest-access-log-file STDOUT
+#
+rest-access-log-file schooltool-skel/log/rest-access.log
+
+#
+# web-access-log-file
+#
+#   Specifies the path of a file used for an Apache combined format
+#   access log of the web application.  Special values STDERR and
+#   STDOUT mean standard error and standard output respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    web-access-log-file STDOUT
+#
+# Examples:
+#    web-access-log-file /var/log/schooltool/access.log
+#    web-access-log-file STDOUT
+#
+web-access-log-file schooltool-skel/log/web-access.log
+
+#
+# attendance-log-file
+#
+#   Specifies the path of a log file used for attendance
+#   logging. Special values STDERR and STDOUT mean standard error and
+#   standard output respectively.
+#
+#   You can specify more than one log file.  All messages will be duplicated
+#   to all the log files.
+#
+# Default:
+#    attendance-log-file var/attendance.log
+#
+# Examples:
+#    attendance-log-file /var/log/schooltool/attendance.log
+#    attendance-log-file STDOUT
+#
+attendance-log-file schooltool-skel/log/attendance.log
+
+#
+# lang
+#
+#   Specifies the locale of the messages to be used on the server.
+#
+#   If 'auto' is set, the language is chosen according to the user's
+#   preference specified in the web browser configuration.
+#
+# Default:
+#   lang auto
+#
+# Examples:
+#   lang en_UK
+#   lang fr
+
+#
+# domain
+#
+#   Specifies the name of the message catalog to be used on the server.
+#
+# Default:
+#   domain schooltool
+#
+# Examples:
+#   domain schoolbell
+
+#
+# <zodb>
+#   ...
+# </zodb>
+#
+#   Specifies a ZODB database to use.
+#   This section is required.
+#
+
+<zodb>
+  # <filestorage>		traditional FileStorage
+  #   path filename		required
+  #   create yes|no		default: yes
+  #   read-only yes|no		default: no
+  #   quota size		default: no quota
+  # </filestorage>
+  <filestorage>
+    path schooltool-skel/var/Data.fs
+  </filestorage>
+
+  # <mappingstorage>		in-memory MappingStorage
+  #   name storage-name		default: Mapping Storage
+  # </mappingstorage>
+
+  # <fullstorage>		BerkeleyDB based storage
+  #   ...			XXX
+  # </fullstorage>
+
+  # <minimalstorage>		BerkeleyDB based storage, stripped down
+  #   ...			see <fullstorage>
+  # </minimalstorage>
+
+  # <zeoclient>
+  #   server address		one or more; required
+  #   cache-size n		default: 20000000 (bytes)
+  #   name storage-name		default: address of the server
+  #   client x			enables persistent cache for client x
+  #   var dirname		directory for persistent cache (default: .)
+  #   min-disconnect-poll n	default: 5
+  #   max-disconnect-poll n	default: 300
+  #   wait yes|no		default: yes
+  #   read-only yes|no		default: no
+  #   read-only-fallback yes|no	default: no
+  #   realm name		authentication realm
+  # </zeoclient>
+
+  # <demostorage>		currently broken
+  #   name			default: Demo Storage
+  #   quota			XXX
+  #   ...			another section describing base storage
+  # </demostorage>
+
+  # cache-size n
+  #
+  # Default:
+  #   cache-size 5000
+
+  # pool-size n
+  #
+  # Default:
+  #   pool-size 7
+
+</zodb>
+
+#
+# reportlab_fontdir
+#
+#   Specifies the path to TrueType fonts (Arial and Times New Roman)
+#   for ReportLab.
+#
+#   Comment out or set to empty string to disable reportlab.
+#
+# Examples:
+#    reportlab_fontdir /usr/share/fonts/truetype/msttcorefonts
+#
+# Uncomment the following and update the path to enable PDF generation:
+#reportlab_fontdir /usr/share/fonts/truetype/msttcorefonts
+
+# devmode
+#
+#   Switches the Developer Mode on and off.
+#
+# Default:
+#   devmode off
+#
+#devmode on

Added: schooltool/branches/upstream/current/scripts/manage-schooltool
===================================================================
--- schooltool/branches/upstream/current/scripts/manage-schooltool	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/scripts/manage-schooltool	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+#!/usr/bin/python
+"""
+A script to start the SchoolTool server in a Debian system.
+"""
+
+# Please don't modify the following lines until you have looked in setup.py
+import sys
+# paths begin
+# paths end
+# config begin
+# config end
+
+import schooltool.main
+
+schooltool.main.StandaloneServer().manage(sys.argv + ['--manage'])

Added: schooltool/branches/upstream/current/scripts/schooltool
===================================================================
--- schooltool/branches/upstream/current/scripts/schooltool	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/scripts/schooltool	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,14 @@
+#!/usr/bin/python
+"""
+A script to start the SchoolTool server in a Debian system.
+"""
+
+# Please don't modify the following lines until you have looked in setup.py
+import sys
+# paths begin
+# paths end
+# config begin
+# config end
+
+import schooltool.main
+schooltool.main.StandaloneServer().main()

Added: schooltool/branches/upstream/current/scripts/schooltool-rest-client
===================================================================
--- schooltool/branches/upstream/current/scripts/schooltool-rest-client	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/scripts/schooltool-rest-client	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,12 @@
+#!/usr/bin/python
+"""
+A script to run the SchoolTool rest client.
+"""
+
+# Please don't modify the following lines until you have looked in setup.py
+import sys
+# paths begin
+# paths end
+
+import schooltool.main
+schooltool.client.main()

Modified: schooltool/branches/upstream/current/setup.cfg
===================================================================
--- schooltool/branches/upstream/current/setup.cfg	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/setup.cfg	2007-05-05 18:51:38 UTC (rev 836)
@@ -1,9 +1,3 @@
-# THIS IS A GENERATED FILE.
-
-[bdist_rpm]
-doc_files = SchoolTool/README.txt
-            SchoolTool/GPL.txt
-
-[install_lib]
-compile = 1
-optimize = 1
+[egg_info]
+tag_build = ~svn
+tag_svn_revision = 1

Added: schooltool/branches/upstream/current/setup.py
===================================================================
--- schooltool/branches/upstream/current/setup.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/setup.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,181 @@
+#!/usr/bin/env python
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005    Shuttleworth Foundation,
+#                       Brian Sutherland
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool setup script.
+"""
+
+
+# Check python version
+import sys
+if sys.version_info < (2, 4):
+    print >> sys.stderr, '%s: need Python 2.4 or later.' % sys.argv[0]
+    print >> sys.stderr, 'Your python is %s' % sys.version
+    sys.exit(1)
+
+import site
+site.addsitedir('eggs')
+
+import pkg_resources
+pkg_resources.require("setuptools>=0.6a11")
+
+import os
+from setuptools import setup, find_packages
+
+def get_version():
+    version_file = os.path.join('src', 'schooltool', 'version.txt')
+    f = open(version_file, 'r')
+    result = f.read()
+    f.close()
+    return result
+
+# Define packages we want to recursively include, we do this explicitly here
+# to avoid automatic accidents
+root_packages = ['schooltool.app',
+                 'schooltool.dashboard',
+                 'schooltool.demographics',
+                 'schooltool.generations',
+                 'schooltool.securitypolicy',
+                 'schooltool.relationship',
+                 'schooltool.course',
+                 'schooltool.timetable',
+                 'schooltool.person',
+                 'schooltool.help',
+                 'schooltool.locales',
+                 'schooltool.locales.en',
+                 'schooltool.resource',
+                 'schooltool.utility',
+                 'schooltool.term',
+                 'schooltool.table',
+                 'schooltool.group',
+                 'schooltool.widget',
+                 'schooltool.attendance',
+                 'schooltool.calendar',
+                 'schooltool.skin',
+                 'schooltool.tests',
+                 'schooltool.testing',
+                 'schooltool.traverser',
+
+                 # only needed for tests
+                 'schooltool.sampledata',
+                 'schooltool.gradebook',
+                 'schooltool.requirement',
+                 'schooltool.level',
+                 ]
+
+# Packages we want to non-recursively include
+packages = ['schooltool']
+
+package_data = {'schooltool': ['*.zcml', 'version.txt']}
+
+# filter packages eliminating things that don't match
+all_packages = set(find_packages('src'))
+for package in all_packages:
+    for root_package in root_packages:
+        if package.startswith(root_package):
+            packages.append(package)
+            package_data[package] = ['*.zcml',
+                                     '*.xml',
+                                     '*.xpdl',
+                                     '*.txt', # only for tests
+                                     '*.conf', # only for tests
+                                     '*/*.ics', # only for tests
+                                     '*.pt', '*/*.pt',
+                                     '*/*.png',
+                                     '*.css', '*/*.css',
+                                     '*/*/*.css',
+                                     '*/*.js',
+                                     '*/*/*.js',
+                                     '*/*.ico',
+                                     '*/*.gif',
+                                     '*/*/*.gif']
+            break
+
+package_data['schooltool.locales'].append('*/*/*.po')
+
+# Setup SchoolTool
+setup(
+    name="schooltool",
+    description="A common information systems platform for school administration.",
+    long_description="""
+SchoolTool is an open source school management information system.  It is
+a distributed client/server system.  The SchoolTool server presents two
+interfaces to clients:
+
+  - a traditional web application interface, usable with an ordinary browser.
+
+  - HTTP-based programming interface suitable for fat clients, adhering to
+    the Representational State Transfer (REST) architectural style (see
+    http://rest.blueoxen.net/).
+
+The web application interface is the primary one.  The RESTive interface is
+there for potential interoperability with other systems and fat clients to
+perform data entry that is inconvenient to do via the web application
+interface.
+
+Any modern web browser is suitable for the web application interface.  The
+interface degrades gracefully, so a browser that does not support CSS or
+Javascript will be usable, although perhaps not very nice or convenient.""",
+    version=get_version(),
+    url='http://www.schooltool.org',
+    license="GPL",
+    maintainer="SchoolTool development team",
+    maintainer_email="schooltool-dev at schooltool.org",
+    platforms=["any"],
+    classifiers=["Development Status :: 5 - Production/Stable",
+    "Environment :: Web Environment",
+    "Intended Audience :: End Users/Desktop",
+    "License :: OSI Approved :: GNU General Public License (GPL)",
+    "Operating System :: OS Independent",
+    "Programming Language :: Python",
+    "Programming Language :: Zope",
+    "Topic :: Education",
+    "Topic :: Office/Business :: Scheduling"],
+    package_dir={'': 'src'},
+    packages=packages,
+    install_requires=['pytz',
+                      'zc.resourcelibrary >= 0.7dev_r72506',
+                      'zc.table >= 0.7dev_r72459', 'zc.catalog >= 1.2dev',
+                      'hurry.query >= 0.9.2',
+                      'zc.datetimewidget >= 0.6.1dev_r72453',
+                      'zope.ucol >= 1.0.2', 'zope.html >= 0.1dev_r72429',
+                      'zope.file >= 0.1dev_r72428',
+                      'zope.mimetype >= 1.1dev_r72462',
+                      'z3c.javascript.mochikit >= 0.0.1',
+                      'zope.i18nmessageid',
+                      'zope.app.catalog',
+                      'zope.viewlet',
+                      'zope.app.file',
+                      'zope.app.onlinehelp',
+                      'zope.app.apidoc',
+                      'zope.optionstorage',
+                      'zope.wfmc',
+                      'zope.app.wfmc',
+                      'zope.server',
+                      'zope.app.wsgi',
+                      'zope.app.server',
+                      'zope.app.generations',
+                      'zope.app.securitypolicy',
+                      'zope.app.zcmlfiles'],
+    dependency_links=['http://ftp.schooltool.org/schooltool/eggs/',
+                      'http://download.zope.org/distribution/',
+                      'http://eggs.carduner.net/'],
+    package_data=package_data
+    )


Property changes on: schooltool/branches/upstream/current/setup.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schoolbell/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/app/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/app/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/app/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schoolbell/app/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/app/app.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/app/app.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/app/app.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,50 @@
+# Just for BBB:
+from persistent import Persistent
+from zope.interface import implements
+from zope.deprecation import deprecated
+
+from schooltool.person.person import PersonContainer, Person
+from schoolbell.app.interfaces import IPersonDetails
+
+class PersonDetails(Persistent):
+    """BBB an old class that is not used anymore but might appear in old
+    Data.fs files."""
+    implements(IPersonDetails)
+
+    __name__ = 'details'
+
+    def __init__(self, nickname=None, primary_email=None,
+                 secondary_email=None, primary_phone=None,
+                 secondary_phone=None, mailing_address=None, home_page=None):
+        self.nickname = nickname
+        self.primary_email = primary_email
+        self.secondary_email = secondary_email
+        self.primary_phone = primary_phone
+        self.secondary_phone = secondary_phone
+        self.mailing_address = mailing_address
+        self.home_page = home_page
+
+
+deprecated(('PersonDetails'),
+           'This class is not used anymore. '
+           'The reference will be gone in 0.15')
+
+deprecated(('PersonContainer', 'Person'),
+           'This class has moved to schooltool.person.person. '
+           'The reference will be gone in 0.15')
+
+from schooltool.group.group import GroupContainer, Group
+deprecated(('GroupContainer', 'Group'),
+           'This class has moved to schooltool.group.group. '
+           'The reference will be gone in 0.15')
+
+from schooltool.resource.resource import ResourceContainer, Resource
+deprecated(('ResourceContainer', 'Resource'),
+           'This class has moved to schooltool.resource.resource. '
+           'The reference will be gone in 0.15')
+
+from schooltool.app.app import SchoolToolApplication as SchoolBellApplication
+from schooltool.app.app import ApplicationPreferences
+deprecated(('SchoolBellApplication', 'ApplicationPreferences'),
+           'This class has moved to schooltool.app.app. '
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schoolbell/app/app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/app/cal.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/app/cal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/app/cal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,10 @@
+##############################################################################
+# BBB: Make sure the old data object references are still there.
+from zope.deprecation import deprecated
+
+from schooltool.app.cal import CalendarEvent, Calendar
+deprecated(('CalendarEvent', 'Calendar'),
+           'This class has moved to schooltool.app.cal '
+           'The reference will be gone in 0.15')
+
+##############################################################################


Property changes on: schooltool/branches/upstream/current/src/schoolbell/app/cal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/app/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/app/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/app/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,46 @@
+# Just for BBB:
+from zope.deprecation import deprecated
+from zope.location.interfaces import ILocation
+from zope.interface import Interface
+from zope.schema import TextLine, Text
+
+from schooltool import SchoolToolMessage as _
+
+class IPersonDetails(Interface, ILocation):
+    """Contacts details stored as an annotation on a Person."""
+
+    nickname = TextLine(
+        title=_("Nickname"),
+        required=False,
+        description=_("A short nickname for this person."))
+
+    primary_email = TextLine(
+        title=_("Primary Email"),
+        required=False)
+
+    secondary_email = TextLine(
+        title=_("Secondary Email"),
+        required=False)
+
+    primary_phone = TextLine(
+        title=_("Primary phone"),
+        required=False,
+        description=_("Recommended telephone number."))
+
+    secondary_phone = TextLine(
+        title=_("Secondary phone"),
+        required=False,
+        description=_("Secondary telephone number."))
+
+    home_page = TextLine(
+        title=_("Website"),
+        required=False,
+        description=_("Website or weblog."))
+
+    mailing_address = Text(
+        title=_("Mailing address"),
+        required=False)
+
+deprecated(('IPersonDetails'),
+           'This interface is not used anymore.'
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schoolbell/app/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/app/notes.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/app/notes.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/app/notes.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,10 @@
+##############################################################################
+# BBB: Make sure the old data object references are still there.
+from zope.deprecation import deprecated
+
+from schooltool.note.note import Notes, Note
+deprecated(('Notes', 'Note'),
+           'This class has moved to schooltool.note.note. '
+           'The reference will be gone in 0.15')
+
+##############################################################################


Property changes on: schooltool/branches/upstream/current/src/schoolbell/app/notes.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/app/security.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/app/security.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/app/security.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,8 @@
+# Just for BBB:
+from zope.deprecation import deprecated
+
+from schooltool.app.security import \
+     SchoolToolAuthenticationUtility as SchoolBellAuthenticationUtility
+deprecated(('SchoolBellAuthenticationUtility',),
+           'This class has moved to schooltool.app.security. '
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schoolbell/app/security.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/calendar/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/calendar/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/calendar/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schoolbell/calendar/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/calendar/recurrent.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/calendar/recurrent.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/calendar/recurrent.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+# Just for BBB:
+from zope.deprecation import deprecated
+
+from schooltool.calendar.recurrent import DailyRecurrenceRule
+from schooltool.calendar.recurrent import YearlyRecurrenceRule
+from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+from schooltool.calendar.recurrent import MonthlyRecurrenceRule
+deprecated(('DailyRecurrenceRule', 'YearlyRecurrenceRule',
+            'WeeklyRecurrenceRule', 'MonthlyRecurrenceRule'),
+           'This class has moved to schooltool.calendar.recurrent '
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schoolbell/calendar/recurrent.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/relationship/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/relationship/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/relationship/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schoolbell/relationship/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/relationship/relationship.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/relationship/relationship.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/relationship/relationship.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,7 @@
+# Just for BBB:
+from zope.deprecation import deprecated
+
+from schooltool.relationship.relationship import LinkSet, Link
+deprecated(('LinkSet', 'Link'),
+           'This class has moved to schooltool.relationship.relationship. '
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schoolbell/relationship/relationship.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schoolbell/relationship/uri.py
===================================================================
--- schooltool/branches/upstream/current/src/schoolbell/relationship/uri.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schoolbell/relationship/uri.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,7 @@
+# Just for BBB:
+from zope.deprecation import deprecated
+
+from schooltool.relationship.uri import URIObject
+deprecated(('URIObject',),
+           'This class has moved to schooltool.relationship.uri. '
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schoolbell/relationship/uri.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,38 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool libraries and application
+"""
+
+_version = None
+
+def get_version():
+    global _version
+    if _version is not None:
+        return _version
+    import os
+    directory = os.path.split(__file__)[0]
+    f = open(os.path.join(directory, 'version.txt'), 'r')
+    result = f.read()
+    _version = result
+    f.close()
+    return result
+
+from zope.i18nmessageid import MessageFactory
+SchoolToolMessage = MessageFactory("schooltool")


Property changes on: schooltool/branches/upstream/current/src/schooltool/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,141 @@
+SchoolTool currently provides a SchoolBell based calendar server that adds
+school specific features.  In addition to the basic SchoolBell Person, Groups,
+and Resources, SchoolTool adds Course and Sections.
+
+We need some test setup:
+
+    >>> from schooltool.testing import setup
+    >>> from schooltool.relationship.tests import setUp, tearDown
+    >>> setUp()
+    >>> from schooltool.group.group import Group
+    >>> from schooltool.person.person import Person, PersonContainer
+    >>> from schooltool.app import app
+    >>> from schooltool.course.course import Course
+    >>> from schooltool.course.section import Section
+
+    >>> school = setup.createSchoolToolApplication()
+
+    >>> school['courses']
+    <schooltool.course.course.CourseContainer object at ...>
+    >>> school['sections']
+    <schooltool.course.section.SectionContainer object at ...>
+
+A Course is a simple object with a title and description that can describe a
+particular course of study.
+
+    >>> ushistory = Course(title="US History", description="Years 1945 - 2000")
+    >>> school['courses']['ushistory'] = ushistory
+
+    >>> ushistory.title
+    'US History'
+
+    >>> ushistory.description
+    'Years 1945 - 2000'
+
+The educational material covered by a course is taught to sets of students in
+Sections.  Each section is related to the Course with the CourseSections
+relationship and the list of sections can be accessed via the Course.sections
+RelationshipProperty.
+
+We haven't set up any sections yet so:
+
+    >>> [section.title for section in ushistory.sections]
+    []
+
+is empty.  Let's create some sections and add them to US History.
+
+    >>> school['sections']['section1'] = section1 = Section(title="Section 1")
+    >>> school['sections']['section2'] = section2 = Section(title="Section 2")
+    >>> ushistory.sections.add(section1)
+    >>> ushistory.sections.add(section2)
+    >>> [section.title for section in ushistory.sections]
+    ['Section 1', 'Section 2']
+
+Each section represents a particular set of students meeting with a particular
+instructor at a particular time to cover the course material.
+
+    >>> school['persons']['teacher1'] = teacher1 = Person('Teacher1')
+    >>> school['persons']['teacher2'] = teacher2 = Person('Teacher2')
+    >>> school['persons']['student1'] = student1 = Person('Student1')
+    >>> school['persons']['student2'] = student2 = Person('Student2')
+    >>> school['persons']['student3'] = student3 = Person('Student3')
+    >>> school['persons']['student4'] = student4 = Person('Student4')
+
+The teacher of a section is defined with the Instruction relationship and can
+be accessed via the section.instructors RelationshipProperty:
+
+    >>> from schooltool.app.relationships import Instruction
+    >>> [teacher.username for teacher in section1.instructors]
+    []
+    >>> Instruction(instructor=teacher1, section=section1)
+    >>> [teacher.username for teacher in section1.instructors]
+    ['Teacher1']
+
+sections can have more than one instructor:
+
+    >>> section1.instructors.add(teacher2)
+    >>> [teacher.username for teacher in section1.instructors]
+    ['Teacher1', 'Teacher2']
+
+
+You can determine if a Person is a teacher using schooltool.relationship
+methods, there is also a method PersonView.isTeacher in schooltool's web UI:
+
+    >>> from schooltool.app.relationships import URISection, URIInstruction
+    >>> from schooltool.relationship import getRelatedObjects
+    >>> len(getRelatedObjects(teacher1, URISection,
+    ...                       rel_type=URIInstruction)) > 0
+    True
+
+sections students are associated with a section via the Membership
+relationship from SchoolBell or via the section.members property.  The section
+itself participates in the Membership relationship in the URIGroup role which
+is possible because Sections implement the IGroup interface.
+
+    >>> [student.username for student in section1.members]
+    []
+    >>> from schooltool.app.membership import Membership
+    >>> Membership(group=section1, member=student1)
+    >>> Membership(group=section1, member=student2)
+    >>> [student.username for student in section1.members]
+    ['Student1', 'Student2']
+
+We can use Groups to add multiple students to a section to keep the group of
+students together, similar to the "Form" concept used in some US Primary
+schools.
+
+    >>> school['groups']['form1'] = form1 = Group(title="Form1")
+    >>> form1.members.add(student3)
+    >>> form1.members.add(student4)
+    >>> section2.members.add(form1)
+    >>> [form.title for form in section2.members]
+    ['Form1']
+
+Checking for a person's status as a student is also handled with the
+schooltool.relationship methods.  There are convenience methods in PersonView
+as well:
+
+    >>> from schooltool.app.membership import URIGroup, URIMembership
+    >>> from schooltool.course.interfaces import ISection
+    >>> for obj in getRelatedObjects(student2, URIGroup,
+    ...                              rel_type=URIMembership):
+    ...     ISection.providedBy(obj)
+    True
+
+See schooltool.app.browser.app for showing individual members of the form in the
+UI.
+
+Sections can be part of more than 1 course and sections have a courses
+RelatioshipProperty to list what courses they implement.
+
+    >>> amlit = Course(title="American Literature",
+    ...                    description="Taught with US History")
+    >>> school['courses']['almit'] = ushistory
+    >>> amlit.sections.add(section1)
+    >>> [section.title for section in amlit.sections]
+    ['Section 1']
+    >>> [course.title for course in section1.courses]
+    ['US History', 'American Literature']
+
+    >>> tearDown()
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,105 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool Application
+
+$Id: __init__.py 6233 2006-06-12 17:52:59Z ignas $
+"""
+
+##############################################################################
+# BBB: Make sure the old data object references are still there.
+from zope.deprecation import deprecated
+
+from schooltool.app.app import SchoolToolApplication
+from schooltool.app.app import ApplicationPreferences
+deprecated(('SchoolToolApplication', 'ApplicationPreferences'),
+           'This class has moved to schooltool.app.app. '
+           'The reference will be gone in 0.15')
+
+from schooltool.app.overlay import \
+     CalendarOverlayInfo as CalendarAndTTOverlayInfo
+
+deprecated(('CalendarAndTTOverlayInfo',),
+           'This specific class has been deprecated. Use '
+           '`schooltool.app.overlay.CalendarOverlayInfo` and the '
+           '`IShowTimetables` instead. '
+           'The reference will be gone in 0.15')
+
+from schooltool.person.person import PersonContainer, Person
+from schooltool.person.preference import PersonPreferences
+deprecated(('PersonContainer', 'Person', 'PersonPreferences'),
+           'This class has moved to schooltool.person.person. '
+           'The reference will be gone in 0.15')
+
+from schooltool.group.group import GroupContainer, Group
+deprecated(('GroupContainer', 'Group'),
+           'This class has moved to schooltool.group.group. '
+           'The reference will be gone in 0.15')
+
+from schooltool.resource.resource import ResourceContainer, Resource
+deprecated(('ResourceContainer', 'Resource'),
+           'This class has moved to schooltool.resource.resource. '
+           'The reference will be gone in 0.15')
+
+from schooltool.course.course import CourseContainer, Course
+deprecated(('CourseContainer', 'Course'),
+           'This class has moved to schooltool.course.course. '
+           'The reference will be gone in 0.15')
+
+##############################################################################
+
+
+def registerTestSetup():
+    from zope.interface import classImplements
+    from schooltool.testing import registry
+
+    def haveCalendar():
+        from schooltool.app.app import SchoolToolApplication
+        from schooltool.app.interfaces import IHaveCalendar
+        if not IHaveCalendar.implementedBy(SchoolToolApplication):
+            classImplements(SchoolToolApplication, IHaveCalendar)
+    registry.register('CalendarComponents', haveCalendar)
+
+    def haveTimetables():
+        from schooltool.timetable.interfaces import IHaveTimetables
+
+        from schooltool.person.person import Person
+        if not IHaveTimetables.implementedBy(Person):
+            classImplements(Person, IHaveTimetables)
+
+        from schooltool.group.group import Group
+        if not IHaveTimetables.implementedBy(Group):
+            classImplements(Group, IHaveTimetables)
+
+        from schooltool.resource.resource import Resource
+        if not IHaveTimetables.implementedBy(Resource):
+            classImplements(Resource, IHaveTimetables)
+
+        from schooltool.app.app import SchoolToolApplication
+        if not IHaveTimetables.implementedBy(SchoolToolApplication):
+            classImplements(SchoolToolApplication, IHaveTimetables)
+    registry.register('TimetablesComponents', haveTimetables)
+
+registerTestSetup()
+del registerTestSetup
+
+from schooltool.course.section import SectionContainer, Section
+deprecated(('SectionContainer', 'Section'),
+           'This class has moved to schooltool.course.section. '
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/app.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/app.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/app.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,252 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool application
+
+$Id: app.py 6835 2007-04-12 11:05:03Z ignas $
+
+"""
+import calendar
+
+from persistent import Persistent
+from persistent.dict import PersistentDict
+
+from zope.component import adapts
+from zope.event import notify
+from zope.interface import implements
+from zope.interface import classProvides
+from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
+from zope.schema.interfaces import IVocabularyFactory
+
+from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations
+from zope.app.component.hooks import getSite
+from zope.app.component.site import SiteManagerContainer
+from zope.app.container import sample
+from zope.app.container.contained import NameChooser
+from zope.app.container.interfaces import INameChooser
+from zope.traversing.interfaces import IContainmentRoot
+
+from schooltool.app.overlay import ICalendarOverlayInfo
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.app.interfaces import IShowTimetables
+from schooltool.app.interfaces import ApplicationInitializationEvent
+from schooltool.app import relationships
+from schooltool.app.interfaces import IAsset
+from schooltool.relationship.relationship import RelationshipProperty
+
+
+SHOW_TIMETABLES_KEY = 'schooltool.timetable.showTimetables'
+
+
+class SchoolToolApplication(Persistent, sample.SampleContainer,
+                            SiteManagerContainer):
+    """The main application object.
+
+    This object can be added as a regular content object to a folder,
+    or it can be used as the application root object.
+    """
+
+    implements(ISchoolToolApplication, IAttributeAnnotatable, IContainmentRoot)
+
+    def __init__(self):
+        super(SchoolToolApplication, self).__init__()
+
+    def _newContainerData(self):
+        return PersistentDict()
+
+    def _title(self):
+        """This is required for the site calendar views to work.
+
+        Calendar views expect that their underlying objects (calendar
+        parents) have an attribute named `title`.
+        """
+        return IApplicationPreferences(self).title
+
+    title = property(_title)
+
+
+def getSchoolToolApplication(ignore=None):
+    """Return the nearest ISchoolToolApplication.
+
+    This function is also registered as an adapter, so you
+    can use it like this:
+
+        app = ISchoolToolApplication(None)
+
+    and stub it in unit tests.
+    """
+    candidate = getSite()
+    if ISchoolToolApplication.providedBy(candidate):
+        return candidate
+    else:
+        raise ValueError("can't get a SchoolToolApplication")
+
+
+class SimpleNameChooser(NameChooser):
+    """A name chooser that uses object titles as names.
+
+    SimpleNameChooser is an adapter for containers
+
+        >>> container = {}
+        >>> chooser = SimpleNameChooser(container)
+
+    It expects objects to have a `title` attribute, so only register it
+    as an adapter for containers that limit their contents to objects
+    with such attribute.
+
+    `chooseName` uses the title of the object to be added, converts it to
+    lowercase, strips punctuation, and replaces spaces with hyphens:
+
+        >>> from schooltool.person.person import Person
+        >>> obj = Person(title='Mr. Smith')
+        >>> chooser.chooseName('', obj)
+        u'mr-smith'
+
+    If the name is already taken, SimpleNameChooser adds a number at the end
+
+        >>> container['mr-smith'] = 42
+        >>> chooser.chooseName('', obj)
+        u'mr-smith-2'
+
+    If you provide a suggested name, it uses that one.
+
+        >>> chooser.chooseName('suggested-name', obj)
+        'suggested-name'
+
+    Bad names cause errors
+
+        >>> chooser.chooseName('@notallowed', obj)
+        Traceback (most recent call last):
+          ...
+        UserError: Names cannot begin with '+' or '@' or contain '/'
+
+    """
+
+    implements(INameChooser)
+
+    def chooseName(self, name, obj):
+        """See INameChooser."""
+        if not name:
+            name = u''.join([c for c in obj.title.lower()
+                             if c.isalnum() or c == ' ']).replace(' ', '-')
+        n = name
+        i = 1
+        while n in self.context:
+            i += 1
+            n = name + u'-' + unicode(i)
+        # Make sure the name is valid
+        self.checkName(n, obj)
+        return n
+
+
+class ApplicationPreferences(Persistent):
+    """Object for storing any application-wide preferences we have.
+
+    See schooltool.app.interfaces.ApplicationPreferences.
+    """
+
+    implements(IApplicationPreferences)
+
+    title = 'SchoolTool'
+
+    timezone = 'UTC'
+
+    dateformat = '%Y-%m-%d'
+
+    timeformat = '%H:%M'
+
+    weekstart = calendar.MONDAY
+
+    frontPageCalendar = True
+
+
+class Asset(object):
+    """A mixin for objects that may act as assets."""
+
+    implements(IAsset)
+
+    leaders = RelationshipProperty(relationships.URILeadership,
+                                   relationships.URIAsset,
+                                   relationships.URILeader)
+
+
+def getApplicationPreferences(app):
+    """Adapt a SchoolToolApplication to IApplicationPreferences."""
+
+    annotations = IAnnotations(app)
+    key = 'schooltool.app.ApplicationPreferences'
+    try:
+        return annotations[key]
+    except KeyError:
+        annotations[key] = ApplicationPreferences()
+        annotations[key].__parent__ = app
+        return annotations[key]
+
+
+class ShowTimetables(object):
+    """Adapter from ICalendarOverlayInfo to IShowTimetables.
+
+        >>> from zope.app.testing import setup
+        >>> setup.setUpAnnotations()
+
+        >>> from zope.interface import classImplements
+        >>> from schooltool.app.overlay import CalendarOverlayInfo
+        >>> from zope.annotation.interfaces import IAttributeAnnotatable
+        >>> classImplements(CalendarOverlayInfo, IAttributeAnnotatable)
+
+        >>> calendar = object()
+        >>> info = CalendarOverlayInfo(calendar, True, 'red', 'yellow')
+        >>> info.__parent__ = calendar
+        >>> stt = ShowTimetables(info)
+
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(IShowTimetables, stt)
+        True
+
+        >>> stt.showTimetables
+        True
+
+    The `showTimetables` attribute is changeable:
+
+        >>> stt.showTimetables = False
+        >>> stt.showTimetables
+        False
+
+    We need a __parent__ attribute for local security grants:
+
+        >>> stt.__parent__ is calendar
+        True
+
+    """
+
+    adapts(ICalendarOverlayInfo)
+    implements(IShowTimetables)
+
+    def __init__(self, context):
+        self.annotations = IAnnotations(context)
+        self.__parent__ = context.__parent__ # for local security grants
+
+    def getShowTimetables(self):
+        return self.annotations.get(SHOW_TIMETABLES_KEY, True)
+
+    def setShowTimetables(self, value):
+        self.annotations[SHOW_TIMETABLES_KEY] = value
+
+    showTimetables = property(getShowTimetables, setShowTimetables)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/booking.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/booking.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/booking.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,192 @@
+==============================
+Resource booking in SchoolBell
+==============================
+
+Overview
+--------
+
+Every calendar event may indicate that one or more resources (e.g., projectors,
+rooms) are needed for this event.  We call this "resource booking" in
+SchoolBell.  When a resource is booked, the calendar event is automatically
+added to the resource's calendar, and is kept in sync.
+
+
+Set up
+------
+
+Set up the calendaring framework:
+
+    >>> from zope.app.testing import setup
+    >>> setup.placelessSetUp()
+    >>> setup.setUpAnnotations()
+
+    >>> from schooltool.testing import setup as sbsetup
+    >>> sbsetup.setUpCalendaring()
+
+We will need some test fixture for relationships.
+
+    >>> from schooltool.relationship.tests import setUpRelationships
+    >>> setUpRelationships()
+
+You have a person and a resource
+
+    >>> from schooltool.resource.resource import Resource
+    >>> from schooltool.person.person import Person
+    >>> person = Person('froggy')
+    >>> resource = Resource('lily')
+    >>> resource2 = Resource('mud')
+
+
+Resource booking and unbooking
+------------------------------
+
+You want to create a calendar event and book a resource.  You can specify the
+resource when you're creating an event.
+
+    >>> from datetime import datetime, timedelta
+    >>> from schooltool.app.interfaces import ISchoolToolCalendar
+    >>> from schooltool.app.cal import CalendarEvent
+    >>> e = CalendarEvent(title="Presentation",
+    ...                   dtstart=datetime(2005, 3, 2, 12, 45),
+    ...                   duration=timedelta(minutes=45),
+    ...                   resources=[resource])
+    >>> ISchoolToolCalendar(person).addEvent(e)
+
+The event magically appears in the resource's calendar
+
+    >>> ISchoolToolCalendar(resource).find(e.unique_id) is e
+    True
+
+You can change the event to remove the booking
+
+    >>> e.unbookResource(resource)
+    >>> ISchoolToolCalendar(resource).find(e.unique_id)
+    Traceback (most recent call last):
+      ...
+    KeyError: ...
+
+or you may book a different resource
+
+    >>> e.bookResource(resource2)
+    >>> ISchoolToolCalendar(resource2).find(e.unique_id) is e
+    True
+
+
+Delayed booking
+---------------
+
+If you create an event with resource bookings, but never add that event
+anywhere, it doesn't appear in resource calendars.
+
+    >>> e = CalendarEvent(title="Bluffing",
+    ...                   dtstart=datetime(2005, 3, 2, 12, 15),
+    ...                   duration=timedelta(minutes=5),
+    ...                   resources=[resource])
+    >>> e in ISchoolToolCalendar(resource)
+    False
+    >>> e.bookResource(resource2)
+    >>> e in ISchoolToolCalendar(resource2)
+    False
+
+However just add the event somewhere, and it materializes in all three calendars
+
+    >>> ISchoolToolCalendar(person).addEvent(e)
+    >>> [e in ISchoolToolCalendar(x) for x in [person, resource, resource2]]
+    [True, True, True]
+
+
+Deleting events
+---------------
+
+So, you have an event in two calendars:
+
+    >>> e = CalendarEvent(title="Presentation",
+    ...                   dtstart=datetime(2005, 3, 3, 12, 00),
+    ...                   duration=timedelta(minutes=45),
+    ...                   resources=[resource2])
+    >>> ISchoolToolCalendar(person).addEvent(e)
+    >>> e in ISchoolToolCalendar(resource2)
+    True
+    >>> e in ISchoolToolCalendar(person)
+    True
+
+If you remove it from the person's calendar, it gets removed from the
+resource's calendar too.
+
+    >>> ISchoolToolCalendar(person).removeEvent(e)
+
+    >>> e not in ISchoolToolCalendar(resource2)
+    True
+
+If you remove an event from a resource's calendar, it loses that booking.
+
+    >>> e = CalendarEvent(title="Big presentation",
+    ...                   dtstart=datetime(2005, 3, 4, 12, 45),
+    ...                   duration=timedelta(minutes=45),
+    ...                   resources=[resource, resource2])
+    >>> ISchoolToolCalendar(person).addEvent(e)
+    >>> [e in ISchoolToolCalendar(x) for x in [person, resource, resource2]]
+    [True, True, True]
+
+    >>> ISchoolToolCalendar(resource).removeEvent(e)
+    >>> [e in ISchoolToolCalendar(x) for x in [person, resource, resource2]]
+    [True, False, True]
+    >>> list(e.resources) == [resource2]
+    True
+
+Clearing a calendar is equivalent to removing all its events:
+
+    >>> ISchoolToolCalendar(resource2).clear()
+    >>> [e in ISchoolToolCalendar(x) for x in [person, resource, resource2]]
+    [True, False, False]
+    >>> list(e.resources) == []
+    True
+
+
+Insane corner cases
+-------------------
+
+Booking loops are not allowed
+
+    >>> e = CalendarEvent(title="Strange presentation",
+    ...                   dtstart=datetime(2005, 3, 4, 12, 45),
+    ...                   duration=timedelta(minutes=5))
+    >>> ISchoolToolCalendar(resource).addEvent(e)
+    >>> e.bookResource(resource)
+    Traceback (most recent call last):
+      ...
+    ValueError: cannot book itself
+
+    >>> e.resources
+    ()
+
+It doesn't work if you do it differently either
+
+    >>> e = CalendarEvent(title="Strange presentation",
+    ...                   dtstart=datetime(2005, 3, 4, 12, 50),
+    ...                   duration=timedelta(minutes=5),
+    ...                   resources=[resource2, resource])
+    >>> ISchoolToolCalendar(resource).addEvent(e)
+    Traceback (most recent call last):
+      ...
+    ValueError: cannot book itself
+
+    >>> e in ISchoolToolCalendar(resource)
+    False
+    >>> e in ISchoolToolCalendar(resource2)
+    False
+
+
+Tear down
+---------
+
+    >>> setup.placelessTearDown()
+
+
+Remaining issues
+----------------
+
+XXX what if I do
+     e = CalendarEvent(resources=[r])
+     e.unbookResource(r)
+     without adding a to any calendars?


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/booking.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,303 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Browser views for the SchoolTool application.
+
+$Id: __init__.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import calendar
+import itertools
+
+from zope.interface import implements
+from zope.component import adapts
+from zope.publisher.browser import BrowserView
+from zope.size.interfaces import ISized
+from zope.traversing.interfaces import IPathAdapter, ITraversable
+from zope.app.security.interfaces import IPrincipal
+from zope.app.security.interfaces import IUnauthenticatedPrincipal
+from zope.app.dependable.interfaces import IDependable
+from zope.tales.interfaces import ITALESFunctionNamespace
+from zope.security.proxy import removeSecurityProxy
+from zope.security.checker import canAccess
+
+from pytz import timezone
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.person.interfaces import IPerson
+from schooltool.person.interfaces import IPersonPreferences
+
+
+class SchoolToolAPI(object):
+    """TALES function namespace for SchoolTool specific actions.
+
+    In a page template you can use it as follows:
+
+        tal:define="app context/schooltool:app"
+
+    """
+
+    implements(IPathAdapter, ITALESFunctionNamespace)
+
+    def __init__(self, context):
+        self.context = context
+
+    def setEngine(self, engine):
+        """See ITALESFunctionNamespace."""
+        pass
+
+    def app(self):
+        """Return the ISchoolToolApplication.
+
+        Sample usage in a page template:
+
+            <a tal:attributes="href context/schooltool:app/@@absolute_url">
+               Front page
+            </a>
+
+        """
+        return getSchoolToolApplication()
+    app = property(app)
+
+    def person(self):
+        """Adapt context to IPerson, default to None.
+
+        Sample usage in a page template:
+
+            <a tal:define="person request/principal/schooltool:person"
+               tal:condition="person"
+               tal:attributes="person/calendar/@@absolute_url">
+               My calendar
+            </a>
+
+        """
+        return IPerson(self.context, None)
+    person = property(person)
+
+    def authenticated(self):
+        """Check whether context is an authenticated principal.
+
+        Sample usage in a page template:
+
+            <tal:span tal:define="user request/principal"
+                      tal:condition="user/schooltool:authenticated"
+                      tal:replace="user/title">
+              User title
+            </tal:span>
+            <tal:span tal:define="user request/principal"
+                      tal:condition="not:user/schooltool:authenticated">
+              Anonymous
+            </tal:span>
+
+        """
+        if self.context is None: # no one is logged in
+            return False
+        if not IPrincipal.providedBy(self.context):
+            raise TypeError("schooltool:authenticated can only be applied"
+                            " to a principal but was applied on %r" % self.context)
+        return not IUnauthenticatedPrincipal.providedBy(self.context)
+    authenticated = property(authenticated)
+
+    def preferences(self):
+        """Return ApplicationPreferences for the SchoolToolApplication.
+
+        Sample usage in a page template:
+
+          <div tal:define="preferences context/schooltool:preferences">
+            <b tal:content="preferences/title"></b>
+          </div>
+
+        """
+        return IApplicationPreferences(self.app)
+    preferences = property(preferences)
+
+    def has_dependents(self):
+        """Check whether an object has dependents (via IDependable).
+
+        Objects that have dependents cannot be removed from the system.
+
+        Sample usage in a page template:
+
+          <input type="checkbox" name="delete"
+                 tal:attributes="disabled obj/schooltool:has_dependents" />
+
+        """
+        # We cannot adapt security-proxied objects to IDependable.  Unwrapping
+        # is safe since we do not modify anything, and the information whether
+        # an object can be deleted or not is not classified.
+        unwrapped_context = removeSecurityProxy(self.context)
+        dependable = IDependable(unwrapped_context, None)
+        if dependable is None:
+            return False
+        else:
+            return bool(dependable.dependents())
+    has_dependents = property(has_dependents)
+
+
+class PathAdapterUtil(object):
+
+    adapts(None)
+    implements(IPathAdapter, ITraversable)
+
+    def __init__(self, context):
+        self.context = context
+
+
+class SortBy(PathAdapterUtil):
+    """TALES path adapter for sorting lists.
+
+    In a page template you can use it as follows:
+
+        tal:repeat="something some_iterable/sortby:attribute_name"
+
+    In Python code you can write
+
+        >>> l = [{'name': 'banana'}, {'name': 'apple'}]
+        >>> SortBy(l).traverse('name')
+        [{'name': 'apple'}, {'name': 'banana'}]
+
+    You can sort arbitrary iterables, not just lists.  The sort key
+    can refer to a dictionary key, or an object attribute.
+    """
+
+    def traverse(self, name, furtherPath=()):
+        """Return self.context sorted by a given key."""
+        # We need to get the first item without losing it forever
+        iterable = iter(self.context)
+        try:
+            first = iterable.next()
+        except StopIteration:
+            return [] # We got an empty list
+        iterable = itertools.chain([first], iterable)
+        # removeSecurityProxy is safe here because subsequent getattr() will
+        # raise Unauthorized or ForbiddenAttribute as appropriate.  It is
+        # necessary here to fix http://issues.schooltool.org/issue174
+        if hasattr(removeSecurityProxy(first), name):
+            items = [(getattr(item, name), item) for item in iterable]
+        else:
+            items = [(item[name], item) for item in iterable]
+        items.sort()
+        return [row[-1] for row in items]
+
+
+class CanAccess(PathAdapterUtil):
+    """TALES path adapter for checking access rights.
+
+    In a page template this adapter can be used like this:
+
+        <p tal:condition="context/can_access:title"
+           tal:content="context/title" />
+
+    """
+
+    def traverse(self, name, furtherPath=()):
+        """Returns True if self.context.(name) can be accessed."""
+        return canAccess(self.context, name)
+
+
+class FilterAccessible(PathAdapterUtil):
+    """TALES path adapter for XXX
+
+    In a page template this adapter can be used like this:
+
+        <p tal:repeat="group context/groups/filter_accessible:title"
+           tal:content="group/title" />
+
+    """
+
+    def traverse(self, name, furtherPath=()):
+        """XXX"""
+        return [item for item in self.context
+                if canAccess(item, name)]
+
+
+class SortedFilterAccessible(PathAdapterUtil):
+    """TALES path adapter for XXX
+
+    In a page template this adapter can be used like this:
+
+        <p tal:repeat="group context/groups/sorted_filter_accessible:title"
+           tal:content="group/title" />
+
+    """
+
+    def traverse(self, name, furtherPath=()):
+        """XXX"""
+        filtered = FilterAccessible(self.context).traverse(name)
+        return SortBy(filtered).traverse(name)
+
+
+class SchoolToolSized(object):
+    """An adapter to provide number of persons in a SchoolTool instance."""
+
+    implements(ISized)
+
+    def __init__(self, app):
+        self._app = app
+
+    def sizeForSorting(self):
+        return (_("Persons"), len(self._app['persons']))
+
+    def sizeForDisplay(self):
+        num = self.sizeForSorting()[1]
+        if num == 1:
+            msgid = _("1 person")
+        else:
+            msgid = _("${number} persons", mapping={'number': num})
+        return msgid
+
+
+class ViewPreferences(object):
+    """Preference class to attach to views."""
+
+    def __init__(self, request):
+        person = IPerson(request.principal, None)
+        if person is not None:
+            prefs = IPersonPreferences(person)
+        else:
+            try:
+                app = getSchoolToolApplication()
+                prefs = IApplicationPreferences(app)
+            except (ValueError, TypeError):
+                prefs = None
+
+        if prefs is not None:
+            self.dateformat = prefs.dateformat
+            self.timeformat = prefs.timeformat
+            self.first_day_of_week = prefs.weekstart
+            self.timezone = timezone(prefs.timezone)
+        else:
+            # no user, no application - test environment
+            self.dateformat = '%Y-%m-%d'
+            self.timeformat = '%H:%M'
+            self.first_day_of_week = calendar.MONDAY
+            self.timezone = timezone('UTC')
+
+    def renderDatetime(self, dt):
+        dt = dt.astimezone(self.timezone)
+        return dt.strftime('%s %s' % (self.dateformat, self.timeformat))
+
+
+def same(obj1, obj2):
+    """Return True if the references obj1 and obj2 point to the same object.
+
+    The references may be security-proxied.
+    """
+    return removeSecurityProxy(obj1) is removeSecurityProxy(obj2)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/app.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/app.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/app.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,283 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool application views.
+
+$Id: app.py 6860 2007-04-13 23:37:39Z ignas $
+"""
+
+from zope.component import getUtility
+from zope.interface import implements
+from zope.security.interfaces import IParticipation
+from zope.security.management import getSecurityPolicy
+from zope.security.proxy import removeSecurityProxy
+from zope.app import zapi
+from zope.app.form.utility import getWidgetsData, setUpWidgets
+from zope.app.form.browser.add import AddView
+from zope.app.form.browser.editview import EditView
+from zope.app.form.interfaces import IInputWidget
+from zope.app.form.interfaces import WidgetsError
+from zope.publisher.browser import BrowserView
+from zope.component import queryMultiAdapter
+from zope.app.security.interfaces import IAuthentication
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.interfaces import IAsset
+from schooltool.person.interfaces import IPerson
+from schooltool.person.interfaces import IPersonFactory
+from schooltool.table.table import CheckboxColumn
+from schooltool.table.table import label_cell_formatter_factory
+from schooltool.table.interfaces import ITableFormatter
+
+
+class ApplicationView(BrowserView):
+    """A view for the main application."""
+
+    def update(self):
+        prefs = IApplicationPreferences(getSchoolToolApplication())
+        if prefs.frontPageCalendar:
+            url = zapi.absoluteURL(ISchoolToolCalendar(self.context),
+                                   self.request)
+            self.request.response.redirect(url)
+
+
+class BaseAddView(AddView):
+    """Common functionality for adding groups and resources"""
+
+    def nextURL(self):
+        return zapi.absoluteURL(self.context.context, self.request)
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(self.nextURL())
+        else:
+            return AddView.update(self)
+
+
+class BaseEditView(EditView):
+    """An edit view for resources and groups"""
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            url = zapi.absoluteURL(self.context, self.request)
+            self.request.response.redirect(url)
+        else:
+            status = EditView.update(self)
+            if 'UPDATE_SUBMIT' in self.request and not self.errors:
+                url = zapi.absoluteURL(self.context, self.request)
+                self.request.response.redirect(url)
+            return status
+
+
+class RelationshipViewBase(BrowserView):
+    """A base class for views that add/remove members from a relationship."""
+
+    __call__ = ViewPageTemplateFile('templates/edit_relationships.pt')
+
+    title = None
+    current_title = None
+    available_title = None
+
+    def add(self, item):
+        """Add an item to the list of selected items."""
+        # Only those who can edit this section will see the view so it
+        # is safe to remove the security proxy here
+        collection = removeSecurityProxy(self.getCollection())
+        collection.add(item)
+
+    def remove(self, item):
+        """Remove an item from selected items."""
+        # Only those who can edit this section will see the view so it
+        # is safe to remove the security proxy here
+        collection = removeSecurityProxy(self.getCollection())
+        collection.remove(item)
+
+    def getCollection(self):
+        """Return the backend storage for related objects."""
+        raise NotImplementedError("Subclasses should override this method.")
+
+    def getSelectedItems(self):
+        """Return a sequence of items that are already selected."""
+        return self.getCollection()
+
+    def getAvailableItems(self):
+        """Return a sequence of items that can be selected."""
+        container = self.getAvailableItemsContainer()
+        selected_items = set(self.getSelectedItems())
+        return [p for p in container.values()
+                if p not in selected_items]
+
+    def getAvailableItemsContainer(self):
+        """Returns the backend storage for available items."""
+        raise NotImplementedError("Subclasses should override this method.")
+
+    def createTableFormatter(self, **kwargs):
+        prefix = kwargs['prefix']
+        container = self.getAvailableItemsContainer()
+        formatter = queryMultiAdapter((container, self.request),
+                                      ITableFormatter)
+        columns_before = [CheckboxColumn(prefix=prefix, title="")]
+        formatters = [label_cell_formatter_factory(prefix)]
+        formatter.setUp(formatters=formatters,
+                        columns_before=columns_before,
+                        **kwargs)
+        return formatter
+
+    def getOmmitedItems(self):
+        return self.getSelectedItems()
+
+    def update(self):
+        context_url = zapi.absoluteURL(self.context, self.request)
+
+        if 'ADD_ITEMS' in self.request:
+            for item in self.getAvailableItems():
+                if 'add_item.' + item.__name__ in self.request:
+                    self.add(removeSecurityProxy(item))
+        elif 'REMOVE_ITEMS' in self.request:
+            for item in self.getSelectedItems():
+                if 'remove_item.' + item.__name__ in self.request:
+                    self.remove(removeSecurityProxy(item))
+        elif 'CANCEL' in self.request:
+            self.request.response.redirect(context_url)
+
+        self.available_table = self.createTableFormatter(
+            ommit=self.getOmmitedItems(),
+            prefix="add_item")
+
+        self.selected_table = self.createTableFormatter(
+            filter=lambda l: l,
+            items=self.getSelectedItems(),
+            prefix="remove_item",
+            batch_size=0)
+
+
+class LoginView(BrowserView):
+    """A login view"""
+
+    error = None
+
+    def __call__(self):
+        self.update()
+        return self.index()
+
+    def update(self):
+        if ('LOGIN' in self.request and 'username' in self.request and
+            'password' in self.request):
+            auth = zapi.getUtility(IAuthentication)
+            try:
+                auth.setCredentials(self.request, self.request['username'],
+                                    self.request['password'])
+            except ValueError:
+                self.error = _("Username or password is incorrect")
+            else:
+                principal = auth.authenticate(self.request)
+                person = IPerson(principal, None)
+                if 'nexturl' in self.request:
+                    nexturl = self.request['nexturl']
+                elif person is not None:
+                    nexturl = zapi.absoluteURL(
+                        ISchoolToolCalendar(person), self.request)
+                else:
+                    nexturl = zapi.absoluteURL(self.context, self.request)
+                self.request.response.redirect(nexturl)
+
+
+class LogoutView(BrowserView):
+    """Clears the authentication creds from the session"""
+
+    def __call__(self):
+        auth = zapi.getUtility(IAuthentication)
+        auth.clearCredentials(self.request)
+        url = zapi.absoluteURL(self.context, self.request)
+        self.request.response.redirect(url)
+
+
+class ApplicationPreferencesView(BrowserView):
+    """View used for editing application preferences."""
+
+    __used_for__ = IApplicationPreferences
+
+    error = None
+    message = None
+
+    schema = IApplicationPreferences
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+
+        app = getSchoolToolApplication()
+        prefs = self.schema(app)
+        initial = {}
+        for field in self.schema:
+            initial[field] = getattr(prefs, field)
+        setUpWidgets(self, self.schema, IInputWidget, initial=initial)
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            url = zapi.absoluteURL(self.context, self.request)
+            self.request.response.redirect(url)
+        elif 'UPDATE_SUBMIT' in self.request:
+            try:
+                data = getWidgetsData(self, self.schema)
+            except WidgetsError:
+                return # Errors will be displayed next to widgets
+
+            app = getSchoolToolApplication()
+            prefs = self.schema(app)
+            for field in self.schema:
+                if field in data: # skip non-fields
+                    setattr(prefs, field, data[field])
+
+
+class ProbeParticipation:
+    """A stub participation for use in hasPermissions."""
+    implements(IParticipation)
+    def __init__(self, principal):
+        self.principal = principal
+        self.interaction = None
+
+
+def hasPermissions(permissions, object, principalid):
+    """Test if the principal has access according to the security policy."""
+    principal = zapi.getUtility(IAuthentication).getPrincipal(principalid)
+    participation = ProbeParticipation(principal)
+    interaction = getSecurityPolicy()(participation)
+    return [interaction.checkPermission(permission, object)
+            for permission in permissions]
+
+
+class LeaderView(RelationshipViewBase):
+
+    __used_for__ = IAsset
+
+    title = _("Leaders")
+    current_title = _("Current leaders")
+    available_title = _("Available leaders")
+
+    def getCollection(self):
+        return self.context.leaders
+
+    def getAvailableItemsContainer(self):
+        return ISchoolToolApplication(None)['persons']
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/cal.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/cal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/cal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2684 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool application views.
+
+$Id: cal.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+import urllib
+import base64
+import calendar
+from datetime import datetime, date, time, timedelta
+from sets import Set
+
+import transaction
+from pytz import timezone, utc
+from zope.component import queryMultiAdapter, adapts
+from zope.component import subscribers
+from zope.event import notify
+from zope.interface import implements, Interface
+from zope.i18n import translate
+from zope.publisher.interfaces.browser import IBrowserPublisher
+from zope.publisher.interfaces import NotFound
+from zope.security.interfaces import Unauthorized
+from zope.security.proxy import removeSecurityProxy
+from zope.security.checker import canAccess
+from zope.schema import Date, TextLine, Choice, Int, Bool, List, Text
+from zope.schema.interfaces import RequiredMissing, ConstraintNotSatisfied
+from zope.app import zapi
+from zope.annotation.interfaces import IAnnotations
+from zope.lifecycleevent import ObjectModifiedEvent
+from zope.app.form.browser.add import AddView
+from zope.app.form.browser.editview import EditView
+from zope.app.form.utility import setUpWidgets
+from zope.app.form.interfaces import ConversionError
+from zope.app.form.interfaces import IWidgetInputError, IInputWidget
+from zope.app.form.interfaces import WidgetInputError, WidgetsError
+from zope.app.form.utility import getWidgetsData
+from zope.publisher.browser import BrowserView
+from zope.traversing.browser.absoluteurl import absoluteURL
+from zope.filerepresentation.interfaces import IWriteFile, IReadFile
+from zope.app.session.interfaces import ISession
+from zope.traversing.api import getPath
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.html.field import HtmlFragment
+from zc.table.column import GetterColumn
+from zc.table import table
+
+from schooltool import SchoolToolMessage as _
+
+from schooltool.skin.interfaces import IBreadcrumbInfo
+from schooltool.skin import breadcrumbs
+from schooltool.table.table import CheckboxColumn
+from schooltool.table.interfaces import IFilterWidget
+from schooltool.app.browser import ViewPreferences, same
+from schooltool.app.browser import pdfcal
+from schooltool.app.browser.overlay import CalendarOverlayView
+from schooltool.app.browser.interfaces import ICalendarProvider
+from schooltool.app.browser.interfaces import IEventForDisplay
+from schooltool.app.interfaces import ISchoolToolCalendarEvent
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.interfaces import IHaveCalendar, IShowTimetables
+from schooltool.table.batch import IterableBatch
+from schooltool.table.table import label_cell_formatter_factory
+from schooltool.calendar.interfaces import ICalendar
+from schooltool.calendar.interfaces import IEditCalendar
+from schooltool.calendar.recurrent import DailyRecurrenceRule
+from schooltool.calendar.recurrent import YearlyRecurrenceRule
+from schooltool.calendar.recurrent import MonthlyRecurrenceRule
+from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+from schooltool.calendar.interfaces import IDailyRecurrenceRule
+from schooltool.calendar.interfaces import IYearlyRecurrenceRule
+from schooltool.calendar.interfaces import IMonthlyRecurrenceRule
+from schooltool.calendar.interfaces import IWeeklyRecurrenceRule
+from schooltool.calendar.utils import parse_date, parse_datetimetz
+from schooltool.calendar.utils import parse_time, weeknum_bounds
+from schooltool.calendar.utils import week_start, prev_month, next_month
+from schooltool.course.interfaces import ISection
+from schooltool.person.interfaces import IPerson, IPersonPreferences
+from schooltool.person.interfaces import vocabulary
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.term.term import getTermForDate
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.resource.interfaces import IBaseResource
+from schooltool.resource.interfaces import IBookingCalendar
+from schooltool.resource.interfaces import IResourceTypeInformation
+
+
+#
+# Constants
+#
+
+month_names = {
+    1: _("January"), 2: _("February"), 3: _("March"),
+    4: _("April"), 5: _("May"), 6: _("June"),
+    7: _("July"), 8: _("August"), 9: _("September"),
+    10: _("October"), 11: _("November"), 12: _("December")}
+
+day_of_week_names = {
+    0: _("Monday"), 1: _("Tuesday"), 2: _("Wednesday"), 3: _("Thursday"),
+    4: _("Friday"), 5: _("Saturday"), 6: _("Sunday")}
+
+short_day_of_week_names = {
+    0: _("Mon"), 1: _("Tue"), 2: _("Wed"), 3: _("Thu"),
+    4: _("Fri"), 5: _("Sat"), 6: _("Sun"),
+}
+
+
+#
+# Traversal
+#
+
+class ToCalendarTraverser(object):
+    """A traverser that allows to traverse to a calendar owner's calendar."""
+
+    adapts(IHaveCalendar)
+    implements(IBrowserPublisher)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        if name == 'calendar':
+            return ISchoolToolCalendar(self.context)
+        elif name in ('calendar.ics', 'calendar.vfb'):
+            calendar = ISchoolToolCalendar(self.context)
+            view = queryMultiAdapter((calendar, request), name=name)
+            if view is not None:
+                return view
+
+        raise NotFound(self.context, name, request)
+
+    def browserDefault(self, request):
+        return self.context, ('index.html', )
+
+
+class CalendarTraverser(object):
+    """A smart calendar traverser that can handle dates in the URL."""
+
+    adapts(ICalendar)
+    implements(IBrowserPublisher)
+
+    queryMultiAdapter = staticmethod(queryMultiAdapter)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def browserDefault(self, request):
+        return self.context, ('daily.html', )
+
+    def publishTraverse(self, request, name):
+        view_name = self.getHTMLViewByDate(request, name)
+        if not view_name:
+            view_name = self.getPDFViewByDate(request, name)
+        if view_name:
+            return self.queryMultiAdapter((self.context, request),
+                                          name=view_name)
+
+        view = queryMultiAdapter((self.context, request), name=name)
+        if view is not None:
+            return view
+
+        try:
+            event_id = base64.decodestring(name)
+        except:
+            raise NotFound(self.context, name, request)
+
+        try:
+            return self.context.find(event_id)
+        except KeyError:
+            raise NotFound(self.context, event_id, request)
+
+    def getHTMLViewByDate(self, request, name):
+        """Get HTML view name from URL component."""
+        return self.getViewByDate(request, name, 'html')
+
+    def getPDFViewByDate(self, request, name):
+        """Get PDF view name from URL component."""
+        if not name.endswith('.pdf'):
+            return None
+        name = name[:-4] # strip off the .pdf
+        view_name = self.getViewByDate(request, name, 'pdf')
+        if view_name == 'yearly.pdf':
+            return None # the yearly PDF view is not available
+        else:
+            return view_name
+
+    def getViewByDate(self, request, name, suffix):
+        """Get view name from URL component."""
+        parts = name.split('-')
+
+        if len(parts) == 2 and parts[1].startswith('w'): # a week was given
+            try:
+                year = int(parts[0])
+                week = int(parts[1][1:])
+            except ValueError:
+                return
+            request.form['date'] = self.getWeek(year, week).isoformat()
+            return 'weekly.%s' % suffix
+
+        # a year, month or day might have been given
+        try:
+            parts = [int(part) for part in parts]
+        except ValueError:
+            return
+        if not parts:
+            return
+        parts = tuple(parts)
+
+        if not (1900 < parts[0] < 2100):
+            return
+
+        if len(parts) == 1:
+            request.form['date'] = "%d-01-01" % parts
+            return 'yearly.%s' % suffix
+        elif len(parts) == 2:
+            request.form['date'] = "%d-%02d-01" % parts
+            return 'monthly.%s' % suffix
+        elif len(parts) == 3:
+            request.form['date'] = "%d-%02d-%02d" % parts
+            return 'daily.%s' % suffix
+
+    def getWeek(self, year, week):
+        """Get the start of a week by week number.
+
+        The Monday of the given week is returned as a datetime.date.
+
+            >>> traverser = CalendarTraverser(None, None)
+            >>> traverser.getWeek(2002, 11)
+            datetime.date(2002, 3, 11)
+            >>> traverser.getWeek(2005, 1)
+            datetime.date(2005, 1, 3)
+            >>> traverser.getWeek(2005, 52)
+            datetime.date(2005, 12, 26)
+
+        """
+        return weeknum_bounds(year, week)[0]
+
+
+#
+# Calendar displaying backend
+#
+
+class EventForDisplay(object):
+    """A decorated calendar event."""
+
+    implements(IEventForDisplay)
+
+    cssClass = 'event'  # at the moment no other classes are used
+
+    def __init__(self, event, request, color1, color2, source_calendar,
+                 timezone):
+        self.request = request
+        self.source_calendar = source_calendar
+        if canAccess(source_calendar, '__iter__'):
+            # Due to limitations in the default Zope 3 security
+            # policy, a calendar event inherits permissions from the
+            # calendar of its __parent__.  However if there's an event
+            # that books a resource, and the authenticated user has
+            # schooltool.view access for the resource's calendar, she
+            # should be able to view this event when it comes from the
+            # resource's calendar.  For this reason we have to remove
+            # the security proxy and check the permission manually.
+            event = removeSecurityProxy(event)
+        self.context = event
+        self.dtend = event.dtstart + event.duration
+        self.color1 = color1
+        self.color2 = color2
+        self.shortTitle = self.title
+        if len(self.title) > 16:
+            self.shortTitle = self.title[:15] + '...'
+        self.dtstarttz = event.dtstart.astimezone(timezone)
+        self.dtendtz = self.dtend.astimezone(timezone)
+
+    def __cmp__(self, other):
+        return cmp(self.context.dtstart, other.context.dtstart)
+
+    def __getattr__(self, name):
+        return getattr(self.context, name)
+
+    def getBooker(self):
+        """Return the booker."""
+        event = ISchoolToolCalendarEvent(self.context, None)
+        if event:
+            return event.owner
+
+    def getBookedResources(self):
+        """Return the list of booked resources."""
+        booker = ISchoolToolCalendarEvent(self.context, None)
+        if booker:
+            return booker.resources
+        else:
+            return ()
+
+    def viewLink(self):
+        """Return the URL where you can view this event.
+
+        Returns None if the event is not viewable (e.g. it is a timetable
+        event).
+        """
+        if self.context.__parent__ is None:
+            return None
+
+        if IEditCalendar.providedBy(self.source_calendar):
+            # display the link of the source calendar (the event is a
+            # booking event)
+            return '%s/%s' % (zapi.absoluteURL(self.source_calendar, self.request),
+                              urllib.quote(self.__name__))
+
+        # if event is comming from an immutable (readonly) calendar,
+        # display the absolute url of the event itself
+        return zapi.absoluteURL(self, self.request)
+
+
+    def editLink(self):
+        """Return the URL where you can edit this event.
+
+        Returns None if the event is not editable (e.g. it is a timetable
+        event).
+        """
+        if self.context.__parent__ is None:
+            return None
+        return '%s/edit.html?date=%s' % (
+                        zapi.absoluteURL(self.context, self.request),
+                        self.dtstarttz.strftime('%Y-%m-%d'))
+
+    def deleteLink(self):
+        """Return the URL where you can delete this event.
+
+        Returns None if the event is not deletable (e.g. it is a timetable
+        event).
+        """
+        if self.context.__parent__ is None:
+            return None
+        return '%s/delete.html?event_id=%s&date=%s' % (
+                        zapi.absoluteURL(self.source_calendar, self.request),
+                        self.unique_id,
+                        self.dtstarttz.strftime('%Y-%m-%d'))
+
+    def bookingLink(self):
+        """Return the URL where you can book resources for this event.
+
+        Returns None if you can't do that.
+        """
+        if self.context.__parent__ is None:
+            return None
+        return '%s/booking.html?date=%s' % (
+                        zapi.absoluteURL(self.context, self.request),
+                        self.dtstarttz.strftime('%Y-%m-%d'))
+
+    def renderShort(self):
+        """Short representation of the event for the monthly view."""
+        if self.dtstarttz.date() == self.dtendtz.date():
+            fmt = '%H:%M'
+        else:
+            fmt = '%b&nbsp;%d'
+        return "%s (%s&ndash;%s)" % (self.shortTitle,
+                                     self.dtstarttz.strftime(fmt),
+                                     self.dtendtz.strftime(fmt))
+
+
+class CalendarDay(object):
+    """A single day in a calendar.
+
+    Attributes:
+       'date'   -- date of the day (a datetime.date instance)
+       'title'  -- day title, including weekday and date.
+       'events' -- list of events that took place that day, sorted by start
+                   time (in ascending order).
+    """
+
+    def __init__(self, date, events=None):
+        if events is None:
+            events = []
+        self.date = date
+        self.events = events
+        day_of_week = day_of_week_names[date.weekday()]
+
+    def __cmp__(self, other):
+        return cmp(self.date, other.date)
+
+    def today(self):
+        """Return 'today' if self.date is today, otherwise return ''."""
+        # XXX shouldn't use date.today; it depends on the server's timezone
+        # which may not match user expectations
+        return self.date == date.today() and 'today' or ''
+
+
+#
+# Calendar display views
+#
+
+class CalendarViewBase(BrowserView):
+    """A base class for the calendar views.
+
+    This class provides functionality that is useful to several calendar views.
+    """
+
+    __used_for__ = ISchoolToolCalendar
+
+    # Which day is considered to be the first day of the week (0 = Monday,
+    # 6 = Sunday).  Based on authenticated user preference, defaults to Monday
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+        # XXX Clean this up (use self.preferences in this and subclasses)
+        prefs = ViewPreferences(request)
+        self.first_day_of_week = prefs.first_day_of_week
+        self.time_fmt = prefs.timeformat
+        self.dateformat = prefs.dateformat
+        self.timezone = prefs.timezone
+
+        self._days_cache = None
+
+    def eventAddLink(self, hour):
+        item = self.context.__parent__
+        if IBaseResource.providedBy(item):
+            rc = ISchoolToolApplication(None)['resources']
+            booking_calendar = IBookingCalendar(rc)
+            url = absoluteURL(booking_calendar, self.request)
+            url = "%s/book_one_resource.html?resource_id=%s" % (url, item.__name__)
+            url = "%s&start_date=%s&start_time=%s:00&title=%s&duration=%s" % (
+                url, self.cursor, hour['time'],
+                _("Unnamed Event"), hour['duration']*60)
+        else:
+            url = "%s/add.html?field.start_date=%s&field.start_time=%s&field.duration=%s"
+            url = url % (absoluteURL(self.context, self.request),
+                         self.cursor, hour['time'], hour['duration'])
+        return url
+
+    def pdfURL(self):
+        if pdfcal.disabled:
+            return None
+        else:
+            assert self.cal_type != 'yearly'
+            url = self.calURL(self.cal_type, cursor=self.cursor)
+            return url + '.pdf'
+
+    def dayTitle(self, day):
+        formatter = zapi.getMultiAdapter((day, self.request), name='fullDate')
+        return formatter()
+
+    __url = None
+
+    def calURL(self, cal_type, cursor=None):
+        """Construct a URL to a calendar at cursor."""
+        if cursor is None:
+            session = ISession(self.request)['calendar']
+            dt = session.get('last_visited_day')
+            if dt and self.inCurrentPeriod(dt):
+                cursor = dt
+            else:
+                cursor = self.cursor
+
+        if self.__url is None:
+            self.__url = absoluteURL(self.context, self.request)
+
+        if cal_type == 'daily':
+            dt = cursor.isoformat()
+        elif cal_type == 'weekly':
+            dt = '%04d-w%02d' % cursor.isocalendar()[:2]
+        elif cal_type == 'monthly':
+            dt = cursor.strftime('%Y-%m')
+        elif cal_type == 'yearly':
+            dt = str(cursor.year)
+        else:
+            raise ValueError(cal_type)
+
+        return '%s/%s' % (self.__url, dt)
+
+    def _initDaysCache(self):
+        """Initialize the _days_cache attribute.
+
+        When ``update`` figures out which time period will be displayed to the
+        user, it calls ``_initDaysCache`` to give the view a chance to
+        precompute the calendar events for the time interval.
+
+        The base implementation designates three months around self.cursor as
+        the time interval for caching.
+        """
+        # The calendar portlet will always want three months around self.cursor
+        start_of_prev_month = prev_month(self.cursor)
+        first = week_start(start_of_prev_month, self.first_day_of_week)
+        end_of_next_month = next_month(next_month(self.cursor)) - timedelta(1)
+        last = week_start(end_of_next_month,
+                          self.first_day_of_week) + timedelta(7)
+        self._days_cache = DaysCache(self._getDays, first, last)
+
+    def update(self):
+        """Figure out which date we're supposed to be showing.
+
+        Can extract date from the request or the session.  Defaults on today.
+        """
+        session = ISession(self.request)['calendar']
+        dt = session.get('last_visited_day')
+
+        if 'date' not in self.request:
+            # XXX shouldn't use date.today; it depends on the server's timezone
+            # which may not match user expectations
+            self.cursor = dt or date.today()
+        else:
+            # TODO: It would be nice not to b0rk when the date is invalid but
+            # fall back to the current date, as if the date had not been
+            # specified.
+            self.cursor = parse_date(self.request['date'])
+
+        if not (dt and self.inCurrentPeriod(dt)):
+            session['last_visited_day'] = self.cursor
+
+        self._initDaysCache()
+
+    def inCurrentPeriod(self, dt):
+        """Return True if dt is in the period currently being shown."""
+        raise NotImplementedError("override in subclasses")
+
+    def pigeonhole(self, intervals, days):
+        """Sort CalendarDay objects into date intervals.
+
+        Can be used to sort a list of CalendarDay objects into weeks,
+        months, quarters etc.
+
+        `intervals` is a list of date pairs that define half-open time
+        intervals (the start date is inclusive, and the end date is
+        exclusive).  Intervals can overlap.
+
+        Returns a list of CalendarDay object lists -- one list for
+        each interval.
+        """
+        results = []
+        for start, end in intervals:
+            results.append([day for day in days if start <= day.date < end])
+        return results
+
+    def getWeek(self, dt):
+        """Return the week that contains the day dt.
+
+        Returns a list of CalendarDay objects.
+        """
+        start = week_start(dt, self.first_day_of_week)
+        end = start + timedelta(7)
+        return self.getDays(start, end)
+
+    def getMonth(self, dt, days=None):
+        """Return a nested list of days in the month that contains dt.
+
+        Returns a list of lists of date objects.  Days in neighbouring
+        months are included if they fall into a week that contains days in
+        the current month.
+        """
+        start_of_next_month = next_month(dt)
+        start_of_week = week_start(dt.replace(day=1), self.first_day_of_week)
+        start_of_display_month = start_of_week
+
+        week_intervals = []
+        while start_of_week < start_of_next_month:
+            start_of_next_week = start_of_week + timedelta(7)
+            week_intervals.append((start_of_week, start_of_next_week))
+            start_of_week = start_of_next_week
+
+        end_of_display_month = start_of_week
+        if not days:
+            days = self.getDays(start_of_display_month, end_of_display_month)
+        # Make sure the cache contains all the days we're interested in
+        assert days[0].date <= start_of_display_month, 'not enough days'
+        assert days[-1].date >= end_of_display_month - timedelta(1), 'not enough days'
+        weeks = self.pigeonhole(week_intervals, days)
+        return weeks
+
+    def getYear(self, dt):
+        """Return the current year.
+
+        This returns a list of quarters, each quarter is a list of months,
+        each month is a list of weeks, and each week is a list of CalendarDays.
+        """
+        first_day_of_year = date(dt.year, 1, 1)
+        year_start_day_padded_weeks = week_start(first_day_of_year,
+                                                 self.first_day_of_week)
+        last_day_of_year = date(dt.year, 12, 31)
+        year_end_day_padded_weeks = week_start(last_day_of_year,
+                                               self.first_day_of_week) + timedelta(7)
+
+        day_cache = self.getDays(year_start_day_padded_weeks,
+                                 year_end_day_padded_weeks)
+
+        quarters = []
+        for q in range(4):
+            quarter = [self.getMonth(date(dt.year, month + (q * 3), 1),
+                                     day_cache)
+                       for month in range(1, 4)]
+            quarters.append(quarter)
+        return quarters
+
+    _day_events = None # cache
+
+    def dayEvents(self, date):
+        """Return events for a day sorted by start time.
+
+        Events spanning several days and overlapping with this day
+        are included.
+        """
+        if self._day_events is None:
+            self._day_events = {}
+
+        if date in self._day_events:
+            day = self._day_events[date]
+        else:
+            day = self.getDays(date, date + timedelta(1))[0]
+            self._day_events[date] = day
+        return day.events
+
+    _calendars = None # cache
+
+    def getCalendars(self):
+        providers = subscribers((self.context, self.request), ICalendarProvider)
+
+        if self._calendars is None:
+            result = []
+            for provider in providers:
+                result += provider.getCalendars()
+            self._calendars = result
+        return self._calendars
+
+    def getEvents(self, start_dt, end_dt):
+        """Get a list of EventForDisplay objects for a selected time interval.
+
+        `start_dt` and `end_dt` (datetime objects) are bounds (half-open) for
+        the result.
+        """
+        for calendar, color1, color2 in self.getCalendars():
+            for event in calendar.expand(start_dt, end_dt):
+                if (same(event.__parent__, self.context) and
+                    calendar is not self.context):
+                    # Skip resource booking events (coming from
+                    # overlaid calendars) if they were booked by the
+                    # person whose calendar we are viewing.
+                    # removeSecurityProxy(event.__parent__) and
+                    # removeSecurityProxy(self.context) are needed so we
+                    # could compare them.
+                    continue
+                yield EventForDisplay(event, self.request, color1, color2,
+                                      calendar, self.timezone)
+
+    def getDays(self, start, end):
+        """Get a list of CalendarDay objects for a selected period of time.
+
+        Uses the _days_cache.
+
+        `start` and `end` (date objects) are bounds (half-open) for the result.
+
+        Events spanning more than one day get included in all days they
+        overlap.
+        """
+        if self._days_cache is None:
+            return self._getDays(start, end)
+        else:
+            return self._days_cache.getDays(start, end)
+
+    def _getDays(self, start, end):
+        """Get a list of CalendarDay objects for a selected period of time.
+
+        No caching.
+
+        `start` and `end` (date objects) are bounds (half-open) for the result.
+
+        Events spanning more than one day get included in all days they
+        overlap.
+        """
+        events = {}
+        day = start
+        while day < end:
+            events[day] = []
+            day += timedelta(1)
+
+        # We have date objects, but ICalendar.expand needs datetime objects
+        start_dt = self.timezone.localize(datetime.combine(start, time()))
+        end_dt = self.timezone.localize(datetime.combine(end, time()))
+        for event in self.getEvents(start_dt, end_dt):
+            #  day1  day2  day3  day4  day5
+            # |.....|.....|.....|.....|.....|
+            # |     |  [-- event --)  |     |
+            # |     |  ^  |     |  ^  |     |
+            # |     |  `dtstart |  `dtend   |
+            #        ^^^^^       ^^^^^
+            #      first_day   last_day
+            #
+            # dtstart and dtend are datetime.datetime instances and point to
+            # time instants.  first_day and last_day are datetime.date
+            # instances and point to whole days.  Also note that [dtstart,
+            # dtend) is a half-open interval, therefore
+            #   last_day == dtend.date() - 1 day   when dtend.time() is 00:00
+            #                                      and duration > 0
+            #               dtend.date()           otherwise
+            dtend = event.dtend
+            if event.allday:
+                first_day = event.dtstart.date()
+                last_day = max(first_day, (dtend - dtend.resolution).date())
+            else:
+                first_day = event.dtstart.astimezone(self.timezone).date()
+                last_day = max(first_day, (dtend.astimezone(self.timezone) -
+                                           dtend.resolution).date())
+            # Loop through the intersection of two day ranges:
+            #    [start, end) intersect [first_day, last_day]
+            # Note that the first interval is half-open, but the second one is
+            # closed.  Since we're dealing with whole days,
+            #    [first_day, last_day] == [first_day, last_day + 1 day)
+            day = max(start, first_day)
+            limit = min(end, last_day + timedelta(1))
+            while day < limit:
+                events[day].append(event)
+                day += timedelta(1)
+
+        days = []
+        day = start
+        while day < end:
+            events[day].sort()
+            days.append(CalendarDay(day, events[day]))
+            day += timedelta(1)
+        return days
+
+    def prevMonth(self):
+        """Return the first day of the previous month."""
+        return prev_month(self.cursor)
+
+    def nextMonth(self):
+        """Return the first day of the next month."""
+        return next_month(self.cursor)
+
+    def prevDay(self):
+        return self.cursor - timedelta(1)
+
+    def nextDay(self):
+        return self.cursor + timedelta(1)
+
+    def getJumpToYears(self):
+        """Return jump targets for five years centered on the current year."""
+        this_year = datetime.today().year
+        return [{'label': year,
+                 'href': self.calURL('yearly', date(year, 1, 1))}
+                for year in range(this_year - 2, this_year + 3)]
+
+    def getJumpToMonths(self):
+        """Return a list of months for the drop down in the jump portlet."""
+        year = self.cursor.year
+        return [{'label': v,
+                 'href': self.calURL('monthly', date(year, k, 1))}
+                for k, v in month_names.items()]
+
+    def monthTitle(self, date):
+        return month_names[date.month]
+
+    def renderRow(self, week, month):
+        """Do some HTML rendering in Python for performance.
+
+        This gains us 0.4 seconds out of 0.6 on my machine.
+        Here is the original piece of ZPT:
+
+         <td class="cal_yearly_day" tal:repeat="day week">
+          <a tal:condition="python:day.date.month == month[1][0].date.month"
+             tal:content="day/date/day"
+             tal:attributes="href python:view.calURL('daily', day.date);
+                             class python:(len(day.events) > 0
+                                           and 'cal_yearly_day_busy'
+                                           or  'cal_yearly_day')
+                                        + (day.today() and ' today' or '')"/>
+         </td>
+        """
+        result = []
+
+        for day in week:
+            result.append('<td class="cal_yearly_day">')
+            if day.date.month == month:
+                if len(day.events):
+                    cssClass = 'cal_yearly_day_busy'
+                else:
+                    cssClass = 'cal_yearly_day'
+                if day.today():
+                    cssClass += ' today'
+                # Let us hope that URLs will not contain < > & or "
+                # This is somewhat related to
+                #   http://issues.schooltool.org/issue96
+                result.append('<a href="%s" class="%s">%s</a>' %
+                              (self.calURL('daily', day.date), cssClass,
+                               day.date.day))
+            result.append('</td>')
+        return "\n".join(result)
+
+    def canAddEvents(self):
+        """Return True if current viewer can add events to this calendar."""
+        return canAccess(self.context, "addEvent")
+
+    def canRemoveEvents(self):
+        """Return True if current viewer can remove events to this calendar."""
+        return canAccess(self.context, "removeEvent")
+
+
+class DaysCache(object):
+    """A cache of calendar days.
+
+    Since the expansion of recurrent calendar events, and the pigeonholing of
+    calendar events into days is an expensive task, it is better to compute
+    the calendar days of a single larger period of time, and then refer
+    to subsets of the result.
+
+    DaysCache provides an object that is able to do so.  The goal here is that
+    any view will need perform the expensive computation only once or twice.
+    """
+
+    def __init__(self, expensive_getDays, cache_first, cache_last):
+        """Create a cache.
+
+        ``expensive_getDays`` is a function that takes a half-open date range
+        and returns a list of CalendarDay objects.
+
+        ``cache_first`` and ``cache_last`` provide the initial approximation
+        of the date range that will be needed in the future.  You may later
+        extend the cache interval by calling ``extend``.
+        """
+        self.expensive_getDays = expensive_getDays
+        self.cache_first = cache_first
+        self.cache_last = cache_last
+        self._cache = None
+
+    def extend(self, first, last):
+        """Extend the cache.
+
+        You should call ``extend`` before any calls to ``getDays``, and not
+        after.
+        """
+        self.cache_first = min(self.cache_first, first)
+        self.cache_last = max(self.cache_last, last)
+
+    def getDays(self, first, last):
+        """Return a list of calendar days from ``first`` to ``last``.
+
+        If the interval from ``first`` to ``last`` falls into the cached
+        range, and the cache is already computed, this operation becomes
+        fast.
+
+        If the interval is not in cache, delegates to the expensive_getDays
+        computation.
+        """
+        assert first <= last, 'invalid date range: %s..%s' % (first, last)
+        if first >= self.cache_first and last <= self.cache_last:
+            if self._cache is None:
+                self._cache = self.expensive_getDays(self.cache_first,
+                                                     self.cache_last)
+            first_idx = (first - self.cache_first).days
+            last_idx = (last - self.cache_first).days
+            return self._cache[first_idx:last_idx]
+        else:
+            return self.expensive_getDays(first, last)
+
+
+class WeeklyCalendarView(CalendarViewBase):
+    """A view that shows one week of the calendar."""
+
+    __used_for__ = ISchoolToolCalendar
+
+    cal_type = 'weekly'
+
+    next_title = _("Next week")
+    current_title = _("Current week")
+    prev_title = _("Previous week")
+
+    def inCurrentPeriod(self, dt):
+        # XXX wrong if week starts on Sunday.
+        return dt.isocalendar()[:2] == self.cursor.isocalendar()[:2]
+
+    def title(self):
+        month_name_msgid = month_names[self.cursor.month]
+        month_name = translate(month_name_msgid, context=self.request)
+        msg = _('${month}, ${year} (week ${week})',
+                mapping = {'month': month_name,
+                           'year': self.cursor.year,
+                           'week': self.cursor.isocalendar()[1]})
+        return msg
+
+    def prev(self):
+        """Return the link for the previous week."""
+        return self.calURL('weekly', self.cursor - timedelta(weeks=1))
+
+    def current(self):
+        """Return the link for the current week."""
+        # XXX shouldn't use date.today; it depends on the server's timezone
+        # which may not match user expectations
+        return self.calURL('weekly', date.today())
+
+    def next(self):
+        """Return the link for the next week."""
+        return self.calURL('weekly', self.cursor + timedelta(weeks=1))
+
+    def getCurrentWeek(self):
+        """Return the current week as a list of CalendarDay objects."""
+        return self.getWeek(self.cursor)
+
+
+class AtomCalendarView(WeeklyCalendarView):
+    """View the upcoming week's events in Atom formatted xml."""
+
+    def getCurrentWeek(self):
+        """Return the current week as a list of CalendarDay objects."""
+        # XXX shouldn't use date.today; it depends on the server's timezone
+        # which may not match user expectations
+        return self.getWeek(date.today())
+
+    def w3cdtf_datetime(self, dt):
+        # XXX: shouldn't assume the datetime is in UTC
+        assert dt.tzname() == 'UTC'
+        return dt.strftime("%Y-%m-%dT%H:%M:%SZ")
+
+    def w3cdtf_datetime_now(self):
+        return datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
+
+
+class MonthlyCalendarView(CalendarViewBase):
+    """Monthly calendar view."""
+
+    __used_for__ = ISchoolToolCalendar
+
+    cal_type = 'monthly'
+
+    next_title = _("Next month")
+    current_title = _("Current month")
+    prev_title = _("Previous month")
+
+    def inCurrentPeriod(self, dt):
+        return (dt.year, dt.month) == (self.cursor.year, self.cursor.month)
+
+    def title(self):
+        month_name_msgid = month_names[self.cursor.month]
+        month_name = translate(month_name_msgid, context=self.request)
+        msg = _('${month}, ${year}',
+                mapping={'month': month_name, 'year': self.cursor.year})
+        return msg
+
+    def prev(self):
+        """Return the link for the previous month."""
+        return self.calURL('monthly', self.prevMonth())
+
+    def current(self):
+        """Return the link for the current month."""
+        # XXX shouldn't use date.today; it depends on the server's timezone
+        # which may not match user expectations
+        return self.calURL('monthly', date.today())
+
+    def next(self):
+        """Return the link for the next month."""
+        return self.calURL('monthly', self.nextMonth())
+
+    def dayOfWeek(self, date):
+        return day_of_week_names[date.weekday()]
+
+    def weekTitle(self, date):
+        msg = _('Week ${week_no}',
+                mapping={'week_no': date.isocalendar()[1]})
+        return msg
+
+    def getCurrentMonth(self):
+        """Return the current month as a nested list of CalendarDays."""
+        return self.getMonth(self.cursor)
+
+
+class YearlyCalendarView(CalendarViewBase):
+    """Yearly calendar view."""
+
+    __used_for__ = ISchoolToolCalendar
+
+    cal_type = 'yearly'
+
+    next_title = _("Next year")
+    current_title = _("Current year")
+    prev_title = _("Previous year")
+
+    def pdfURL(self):
+        return None
+
+    def inCurrentPeriod(self, dt):
+        return dt.year == self.cursor.year
+
+    def title(self):
+        return unicode(self.cursor.year)
+
+    def prev(self):
+        """Return the link for the previous year."""
+        return self.calURL('yearly', date(self.cursor.year - 1, 1, 1))
+
+    def current(self):
+        """Return the link for the current year."""
+        # XXX shouldn't use date.today; it depends on the server's timezone
+        # which may not match user expectations
+        return self.calURL('yearly', date.today())
+
+    def next(self):
+        """Return the link for the next year."""
+        return self.calURL('yearly', date(self.cursor.year + 1, 1, 1))
+
+    def shortDayOfWeek(self, date):
+        return short_day_of_week_names[date.weekday()]
+
+    def _initDaysCache(self):
+        """Initialize the _days_cache attribute.
+
+        When ``update`` figures out which time period will be displayed to the
+        user, it calls ``_initDaysCache`` to give the view a chance to
+        precompute the calendar events for the time interval.
+
+        This implementation designates the year of self.cursor as the time
+        interval for caching.
+        """
+        CalendarViewBase._initDaysCache(self)
+        first_day_of_year = self.cursor.replace(month=1, day=1)
+        first = week_start(first_day_of_year, self.first_day_of_week)
+        last_day_of_year = self.cursor.replace(month=12, day=31)
+        last = week_start(last_day_of_year,
+                          self.first_day_of_week) + timedelta(7)
+        self._days_cache.extend(first, last)
+
+
+class DailyCalendarView(CalendarViewBase):
+    """Daily calendar view.
+
+    The events are presented as boxes on a 'sheet' with rows
+    representing hours.
+
+    The challenge here is to present the events as a table, so that
+    the overlapping events are displayed side by side, and the size of
+    the boxes illustrate the duration of the events.
+    """
+
+    __used_for__ = ISchoolToolCalendar
+
+    cal_type = 'daily'
+
+    starthour = 8
+    endhour = 19
+
+    next_title = _("The next day")
+    current_title = _("Today")
+    prev_title = _("The previous day")
+
+    def inCurrentPeriod(self, dt):
+        return dt == self.cursor
+
+    def title(self):
+        return self.dayTitle(self.cursor)
+
+    def prev(self):
+        """Return the link for the next day."""
+        return self.calURL('daily', self.cursor - timedelta(1))
+
+    def current(self):
+        """Return the link for today."""
+        # XXX shouldn't use date.today; it depends on the server's timezone
+        # which may not match user expectations
+        return self.calURL('daily', date.today())
+
+    def next(self):
+        """Return the link for the previous day."""
+        return self.calURL('daily', self.cursor + timedelta(1))
+
+    def getColumns(self):
+        """Return the maximum number of events that are overlapping.
+
+        Extends the event so that start and end times fall on hour
+        boundaries before calculating overlaps.
+        """
+        width = [0] * 24
+        daystart = datetime.combine(self.cursor, time(tzinfo=utc))
+        for event in self.dayEvents(self.cursor):
+            t = daystart
+            dtend = daystart + timedelta(1)
+            for title, start, duration in self.calendarRows():
+                if start <= event.dtstart < start + duration:
+                    t = start
+                if start < event.dtstart + event.duration <= start + duration:
+                    dtend = start + duration
+            while True:
+                width[t.hour] += 1
+                t += timedelta(hours=1)
+                if t >= dtend:
+                    break
+        return max(width) or 1
+
+    def _setRange(self, events):
+        """Set the starthour and endhour attributes according to events.
+
+        The range of the hours to display is the union of the range
+        8:00-18:00 and time spans of all the events in the events
+        list.
+        """
+        for event in events:
+            start = self.timezone.localize(datetime.combine(self.cursor,
+                                            time(self.starthour)))
+            end = self.timezone.localize(datetime.combine(self.cursor,
+                   time()) + timedelta(hours=self.endhour)) # endhour may be 24
+            if event.dtstart < start:
+                newstart = max(self.timezone.localize(
+                                        datetime.combine(self.cursor, time())),
+                                        event.dtstart.astimezone(self.timezone))
+                self.starthour = newstart.hour
+
+            if event.dtstart + event.duration > end and \
+                event.dtstart.astimezone(self.timezone).day <= self.cursor.day:
+                newend = min(self.timezone.localize(
+                                        datetime.combine(self.cursor,
+                                                        time())) + timedelta(1),
+                            event.dtstart.astimezone(self.timezone) +
+                                        event.duration + timedelta(0, 3599))
+                self.endhour = newend.hour
+                if self.endhour == 0:
+                    self.endhour = 24
+
+    __cursor = None
+    __calendar_rows = None
+
+    def calendarRows(self):
+        """Iterate over (title, start, duration) of time slots that make up
+        the daily calendar.
+
+        Returns a list, caches the answer for subsequent calls.
+        """
+        view = zapi.getMultiAdapter((self.context, self.request),
+                                    name='daily_calendar_rows')
+        return view.calendarRows(self.cursor, self.starthour, self.endhour)
+
+    def _getCurrentTime(self):
+        """Returns current time localized to UTC timezone."""
+        return utc.localize(datetime.utcnow())
+
+    def getHours(self):
+        """Return an iterator over the rows of the table.
+
+        Every row is a dict with the following keys:
+
+            'time' -- row label (e.g. 8:00)
+            'cols' -- sequence of cell values for this row
+
+        A cell value can be one of the following:
+            None  -- if there is no event in this cell
+            event -- if an event starts in this cell
+            ''    -- if an event started above this cell
+
+        """
+        nr_cols = self.getColumns()
+        all_events = self.dayEvents(self.cursor)
+        # Filter allday events
+        simple_events = [event for event in all_events
+                         if not event.allday]
+        self._setRange(simple_events)
+        slots = Slots()
+        top = 0
+        for title, start, duration in self.calendarRows():
+            end = start + duration
+            hour = start.hour
+
+            # Remove the events that have already ended
+            for i in range(nr_cols):
+                ev = slots.get(i, None)
+                if ev is not None and ev.dtstart + ev.duration <= start:
+                    del slots[i]
+
+            # Add events that start during (or before) this hour
+            while (simple_events and simple_events[0].dtstart < end):
+                event = simple_events.pop(0)
+                slots.add(event)
+
+            cols = []
+            # Format the row
+            for i in range(nr_cols):
+                ev = slots.get(i, None)
+                if (ev is not None
+                    and ev.dtstart < start
+                    and hour != self.starthour):
+                    # The event started before this hour (except first row)
+                    cols.append('')
+                else:
+                    # Either None, or new event
+                    cols.append(ev)
+
+            height = duration.seconds / 900.0
+            if height < 1.5:
+                # Do not display the time of the start of the period when there
+                # is too little space as that looks rather ugly.
+                title = ''
+
+            active = start <= self._getCurrentTime() < end
+
+            yield {'title': title,
+                   'cols': tuple(cols),
+                   'time': start.strftime("%H:%M"),
+                   'active': active,
+                   'top': top,
+                   'height': height,
+                   # We can trust no period will be longer than a day
+                   'duration': duration.seconds // 60}
+
+            top += height
+
+    def snapToGrid(self, dt):
+        """Calculate the position of a datetime on the display grid.
+
+        The daily view uses a grid where a unit (currently 'em', but that
+        can be changed in the page template) corresponds to 15 minutes, and
+        0 represents self.starthour.
+
+        Clips dt so that it is never outside today's box.
+        """
+        base = self.timezone.localize(datetime.combine(self.cursor, time()))
+        display_start = base + timedelta(hours=self.starthour)
+        display_end = base + timedelta(hours=self.endhour)
+        clipped_dt = max(display_start, min(dt, display_end))
+        td = clipped_dt - display_start
+        offset_in_minutes = td.seconds / 60 + td.days * 24 * 60
+        return offset_in_minutes / 15.
+
+    def eventTop(self, event):
+        """Calculate the position of the top of the event block in the display.
+
+        See `snapToGrid`.
+        """
+        return self.snapToGrid(event.dtstart.astimezone(self.timezone))
+
+    def eventHeight(self, event, minheight=3):
+        """Calculate the height of the event block in the display.
+
+        Rounds the height up to a minimum of minheight.
+
+        See `snapToGrid`.
+        """
+        dtend = event.dtstart + event.duration
+        return max(minheight,
+                   self.snapToGrid(dtend) - self.snapToGrid(event.dtstart))
+
+    def getAllDayEvents(self):
+        """Get a list of EventForDisplay objects for the all-day events at the
+        cursors current position.
+        """
+        for event in self.dayEvents(self.cursor):
+            if event.allday:
+                yield event
+
+
+class DailyCalendarRowsView(BrowserView):
+    """Daily calendar rows view for SchoolTool.
+
+    This view differs from the original view in SchoolBell in that it can
+    also show day periods instead of hour numbers.
+    """
+
+    __used_for__ = ISchoolToolCalendar
+
+    def getPersonTimezone(self):
+        """Return the prefered timezone of the user."""
+        return ViewPreferences(self.request).timezone
+
+    def getPeriodsForDay(self, date):
+        """Return a list of timetable periods defined for `date`.
+
+        This function uses the default timetable schema and the appropriate time
+        period for `date`.
+
+        Retuns a list of (id, dtstart, duration) tuples.  The times
+        are timezone-aware and in the timezone of the timetable.
+
+        Returns an empty list if there are no periods defined for `date` (e.g.
+        if there is no default timetable schema, or `date` falls outside all
+        time periods, or it happens to be a holiday).
+        """
+        schooldays = getTermForDate(date)
+        ttcontainer = getSchoolToolApplication()['ttschemas']
+        if ttcontainer.default_id is None or schooldays is None:
+            return []
+        ttschema = ttcontainer.getDefault()
+        tttz = timezone(ttschema.timezone)
+        displaytz = self.getPersonTimezone()
+
+        # Find out the days in the timetable that our display date overlaps
+        daystart = displaytz.localize(datetime.combine(date, time(0)))
+        dayend = daystart + date.resolution
+        day1 = daystart.astimezone(tttz).date()
+        day2 = dayend.astimezone(tttz).date()
+
+        def resolvePeriods(date):
+            term = getTermForDate(date)
+            if not term:
+                return []
+
+            periods = ttschema.model.periodsInDay(term, ttschema, date)
+            result = []
+            for id, tstart, duration in  periods:
+                dtstart = datetime.combine(date, tstart)
+                dtstart = tttz.localize(dtstart)
+                result.append((id, dtstart, duration))
+            return result
+
+        periods = resolvePeriods(day1)
+        if day2 != day1:
+            periods += resolvePeriods(day2)
+
+        result = []
+
+        # Filter out periods outside date boundaries and chop off the
+        # ones overlapping them.
+        for id, dtstart, duration in periods:
+            if (dtstart + duration <= daystart) or (dayend <= dtstart):
+                continue
+            if dtstart < daystart:
+                duration -= daystart - dtstart
+                dtstart = daystart.astimezone(tttz)
+            if dayend < dtstart + duration:
+                duration = dayend - dtstart
+            result.append((id, dtstart, duration))
+
+        return result
+
+    def getPeriods(self, cursor):
+        """Return the date we get from getPeriodsForDay.
+
+        Checks user preferences, returns an empty list if no user is
+        logged in.
+        """
+        person = IPerson(self.request.principal, None)
+        if (person is not None and
+            IPersonPreferences(person).cal_periods):
+            return self.getPeriodsForDay(cursor)
+        else:
+            return []
+
+    def calendarRows(self, cursor, starthour, endhour):
+        """Iterate over (title, start, duration) of time slots that make up
+        the daily calendar.
+
+        Returns a generator.
+        """
+        tz = self.getPersonTimezone()
+        periods = self.getPeriods(cursor)
+
+        daystart = tz.localize(datetime.combine(cursor, time()))
+        rows = [daystart + timedelta(hours=hour)
+                for hour in range(starthour, endhour+1)]
+
+        if periods:
+            timetable = getSchoolToolApplication()['ttschemas'].getDefault()
+            tttz = timezone(timetable.timezone)
+
+            # Put starts and ends of periods into rows
+            for period in periods:
+                period_id, pstart, duration = period
+                pend = (pstart + duration).astimezone(tz)
+                for point in rows[:]:
+                    if pstart < point < pend:
+                        rows.remove(point)
+                if pstart not in rows:
+                    rows.append(pstart)
+                if pend not in rows:
+                    rows.append(pend)
+            rows.sort()
+
+        calendarRows = []
+
+        start, row_ends = rows[0], rows[1:]
+        start = start.astimezone(tz)
+        for end in row_ends:
+            if periods and periods[0][1] == start:
+                period = periods.pop(0)
+                calendarRows.append((period[0], start, period[2]))
+            else:
+                duration = end - start
+                calendarRows.append(('%d:%02d' % (start.hour, start.minute),
+                                     start, duration))
+            start = end
+        return calendarRows
+
+    def rowTitle(self, hour, minute):
+        """Return the row title as HH:MM or H:MM am/pm."""
+        prefs = ViewPreferences(self.request)
+        return time(hour, minute).strftime(prefs.timeformat)
+
+
+class CalendarSTOverlayView(CalendarOverlayView):
+    """View for the calendar overlay portlet.
+
+    Much like the original CalendarOverlayView in SchoolBell, this view allows
+    you to choose calendars to be displayed, but this one allows you to view
+    timetables of the calendar owners as well.
+
+    This view can be used with any context, but it gets rendered to an empty
+    string unless context is the calendar of the authenticated user.
+
+    Note that this view contains a self-posting form and handles submits that
+    contain 'OVERLAY_APPLY' or 'OVERLAY_MORE' in the request.
+    """
+
+    SHOW_TIMETABLE_KEY = 'schooltool.app.browser.cal.show_my_timetable'
+
+    def items(self):
+        """Return items to be shown in the calendar overlay.
+
+        Does not include "my calendar".
+
+        Each item is a dict with the following keys:
+
+            'title' - title of the calendar, or label for section calendars
+
+            'calendar' - the calendar object
+
+            'color1', 'color2' - colors assigned to this calendar
+
+            'id' - identifier for form controls
+
+            'checked' - was this item checked for display (either "checked" or
+            None)?
+
+            'checked_tt' - was this calendar owner's timetable checked for
+            display?
+        """
+        def getTitleOrLabel(item):
+            object = item.calendar.__parent__
+            if ISection.providedBy(object):
+                return removeSecurityProxy(object.label)
+            else:
+                return item.calendar.title
+
+        person = IPerson(self.request.principal)
+        items = [(item.calendar.title,
+                  {'title': getTitleOrLabel(item),
+                   'id': getPath(item.calendar.__parent__),
+                   'calendar': item.calendar,
+                   'checked': item.show and "checked" or '',
+                   'checked_tt':
+                       IShowTimetables(item).showTimetables and "checked" or '',
+                   'color1': item.color1,
+                   'color2': item.color2})
+                 for item in person.overlaid_calendars
+                 if canAccess(item.calendar, '__iter__')]
+        items.sort()
+        return [i[-1] for i in items]
+
+    def update(self):
+        """Process form submission."""
+        if 'OVERLAY_APPLY' in self.request:
+            person = IPerson(self.request.principal)
+            selected = Set(self.request.get('overlay_timetables', []))
+            for item in person.overlaid_calendars:
+                path = getPath(item.calendar.__parent__)
+                # XXX this is related to the issue
+                # http://issues.schooltool.org/issue391!
+                IShowTimetables(item).showTimetables = path in selected
+
+            # The unproxied object will only be used for annotations.
+            person = removeSecurityProxy(person)
+
+            annotations = IAnnotations(person)
+            annotations[self.SHOW_TIMETABLE_KEY] = bool('my_timetable'
+                                                        in self.request)
+        return CalendarOverlayView.update(self)
+
+    def myTimetableShown(self):
+        person = IPerson(self.request.principal)
+        # The unproxied object will only be used for annotations.
+        person = removeSecurityProxy(person)
+        annotations = IAnnotations(person)
+        return annotations.get(self.SHOW_TIMETABLE_KEY, True)
+
+
+class CalendarListSubscriber(object):
+    """A subscriber that can tell which calendars should be displayed.
+
+    This subscriber includes composite timetable calendars, overlaid
+    calendars and the calendar you are looking at.
+    """
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getCalendars(self):
+        """Get a list of calendars to display.
+
+        Yields tuples (calendar, color1, color2).
+        """
+        # personal calendar
+        yield (self.context, '#9db8d2', '#7590ae')
+
+        parent = zapi.getParent(self.context)
+        ttcalendar = ICompositeTimetables(parent).makeTimetableCalendar()
+
+        user = IPerson(self.request.principal, None)
+        if user is None:
+            yield (ttcalendar, '#9db8d2', '#7590ae')
+            return # unauthenticated user
+
+        unproxied_context = removeSecurityProxy(self.context)
+        unproxied_calendar = removeSecurityProxy(ISchoolToolCalendar(user))
+        if unproxied_context is not unproxied_calendar:
+            yield (ttcalendar, '#9db8d2', '#7590ae')
+            return # user looking at the calendar of some other person
+
+        # personal timetable
+        unproxied_person = removeSecurityProxy(user) # for annotations
+        annotations = IAnnotations(unproxied_person)
+        if annotations.get(CalendarSTOverlayView.SHOW_TIMETABLE_KEY, True):
+            yield (ttcalendar, '#9db8d2', '#7590ae')
+            # Maybe we should change the colour to differ from the user's
+            # personal calendar?
+
+        for item in user.overlaid_calendars:
+            if canAccess(item.calendar, '__iter__'):
+                # overlaid calendars
+                if item.show:
+                    yield (item.calendar, item.color1, item.color2)
+
+                # overlaid timetables
+                if IShowTimetables(item).showTimetables:
+                    owner = item.calendar.__parent__
+                    ttcalendar = ICompositeTimetables(owner).makeTimetableCalendar()
+                    yield (ttcalendar, item.color1, item.color2)
+
+#
+# Calendar modification views
+#
+
+
+class EventDeleteView(BrowserView):
+    """A view for deleting events."""
+
+    __used_for__ = ISchoolToolCalendar
+
+    def handleEvent(self):
+        """Handle a request to delete an event.
+
+        If the event is not recurrent, it is simply deleted, None is returned
+        and the user is redirected to the calendar view.
+
+        If the event being deleted is recurrent event, the request is checked
+        for a command.  If one is found, it is handled, the user again is
+        redirected to the calendar view.  If no commands are found in the
+        request, the recurrent event is returned to be shown in the view.
+        """
+        event_id = self.request['event_id']
+        date = parse_date(self.request['date'])
+
+        event = self._findEvent(event_id)
+        if event is None:
+            # The event was not found.
+            return self._redirectBack()
+
+        if event.recurrence is None or event.__parent__ != self.context:
+            # Bah, the event is not recurrent.  Easy!
+            # XXX It shouldn't be.  We should still ask for confirmation.
+            self.context.removeEvent(removeSecurityProxy(event))
+            return self._redirectBack()
+        else:
+            # The event is recurrent, we might need to show a form.
+            return self._deleteRepeatingEvent(event, date)
+
+    def _findEvent(self, event_id):
+        """Find an event that has the id event_id.
+
+        First the event is searched for in the current calendar and then,
+        overlaid calendars if any.
+
+        If no event with the given id is found, None is returned.
+        """
+        try:
+            return self.context.find(event_id)
+        except KeyError:
+            pass
+
+    def _redirectBack(self):
+        """Redirect to the current calendar's daily view."""
+        url = absoluteURL(self.context, self.request)
+        self.request.response.redirect(url)
+
+    def _deleteRepeatingEvent(self, event, date):
+        """Delete a repeating event."""
+        if 'CANCEL' in self.request:
+            pass # Fall through and redirect back to the calendar.
+        elif 'ALL' in self.request:
+            self.context.removeEvent(removeSecurityProxy(event))
+        elif 'FUTURE' in self.request:
+            self._modifyRecurrenceRule(event, until=(date - timedelta(1)),
+                                       count=None)
+        elif 'CURRENT' in self.request:
+            exceptions = event.recurrence.exceptions + (date, )
+            self._modifyRecurrenceRule(event, exceptions=exceptions)
+        else:
+            return event # We don't know what to do, let's ask the user.
+
+        # We did our job, redirect back to the calendar view.
+        return self._redirectBack()
+
+    def _modifyRecurrenceRule(self, event, **kwargs):
+        """Modify the recurrence rule of an event.
+
+        If the event does not have any recurrences afterwards, it is removed
+        from the parent calendar
+        """
+        rrule = event.recurrence
+        new_rrule = rrule.replace(**kwargs)
+        # This view requires the modifyEvent permission.
+        event.recurrence = removeSecurityProxy(new_rrule)
+        if not event.hasOccurrences():
+            ICalendar(event).removeEvent(removeSecurityProxy(event))
+
+
+class Slots(dict):
+    """A dict with automatic key selection.
+
+    The add method automatically selects the lowest unused numeric key
+    (starting from 0).
+
+    Example:
+
+      >>> s = Slots()
+      >>> s.add("first")
+      >>> s
+      {0: 'first'}
+
+      >>> s.add("second")
+      >>> s
+      {0: 'first', 1: 'second'}
+
+    The keys can be reused:
+
+      >>> del s[0]
+      >>> s.add("third")
+      >>> s
+      {0: 'third', 1: 'second'}
+
+    """
+
+    def add(self, obj):
+        i = 0
+        while i in self:
+            i += 1
+        self[i] = obj
+
+
+class CalendarEventView(BrowserView):
+    """View for single events."""
+
+    # XXX what are these used for?
+    color1 = '#9db8d2'
+    color2 = '#7590ae'
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+        self.preferences = ViewPreferences(request)
+
+        self.dtstart = context.dtstart.astimezone(self.preferences.timezone)
+        self.dtend = self.dtstart + context.duration
+        self.start = self.dtstart.strftime(self.preferences.timeformat)
+        self.end = self.dtend.strftime(self.preferences.timeformat)
+
+        dayformat = '%A, ' + self.preferences.dateformat
+        self.day = unicode(self.dtstart.strftime(dayformat))
+
+        self.display = EventForDisplay(context, self.request,
+                                       self.color1, self.color2,
+                                       context.__parent__,
+                                       timezone=self.preferences.timezone)
+
+
+class ICalendarEventAddForm(Interface):
+    """Schema for event adding form."""
+
+    title = TextLine(
+        title=_("Title"),
+        required=False)
+    allday = Bool(
+        title=_("All day"),
+        required=False)
+    start_date = Date(
+        title=_("Date"),
+        required=False)
+    start_time = TextLine(
+        title=_("Time"),
+        description=_("Start time in 24h format"),
+        required=False)
+
+    duration = Int(
+        title=_("Duration"),
+        required=False,
+        default=60)
+
+    duration_type = Choice(
+        title=_("Duration Type"),
+        required=False,
+        default="minutes",
+        vocabulary=vocabulary([("minutes", _("Minutes")),
+                               ("hours", _("Hours")),
+                               ("days", _("Days"))]))
+
+    location = TextLine(
+        title=_("Location"),
+        required=False)
+
+    description = HtmlFragment(
+        title=_("Description"),
+        required=False)
+
+    # Recurrence
+    recurrence = Bool(
+        title=_("Recurring"),
+        required=False)
+
+    recurrence_type = Choice(
+        title=_("Recurs every"),
+        required=True,
+        default="daily",
+        vocabulary=vocabulary([("daily", _("Day")),
+                               ("weekly", _("Week")),
+                               ("monthly", _("Month")),
+                               ("yearly", _("Year"))]))
+
+    interval = Int(
+        title=_("Repeat every"),
+        required=False,
+        default=1)
+
+    range = Choice(
+        title=_("Range"),
+        required=False,
+        default="forever",
+        vocabulary=vocabulary([("count", _("Count")),
+                               ("until", _("Until")),
+                               ("forever", _("forever"))]))
+
+    count = Int(
+        title=_("Number of events"),
+        required=False)
+
+    until = Date(
+        title=_("Repeat until"),
+        required=False)
+
+    weekdays = List(
+        title=_("Weekdays"),
+        required=False,
+        value_type=Choice(
+            title=_("Weekday"),
+            vocabulary=vocabulary([(0, _("Mon")),
+                                   (1, _("Tue")),
+                                   (2, _("Wed")),
+                                   (3, _("Thu")),
+                                   (4, _("Fri")),
+                                   (5, _("Sat")),
+                                   (6, _("Sun"))])))
+
+    monthly = Choice(
+        title=_("Monthly"),
+        default="monthday",
+        required=False,
+        vocabulary=vocabulary([("monthday", "md"),
+                               ("weekday", "wd"),
+                               ("lastweekday", "lwd")]))
+
+    exceptions = Text(
+        title=_("Exception dates"),
+        required=False)
+
+
+class CalendarEventViewMixin(object):
+    """A mixin that holds the code common to CalendarEventAdd and Edit Views."""
+
+    timezone = utc
+
+    def _setError(self, name, error=RequiredMissing()):
+        """Set an error on a widget."""
+        # XXX Touching widget._error is bad, see
+        #     http://dev.zope.org/Zope3/AccessToWidgetErrors
+        # The call to setRenderedValue is necessary because
+        # otherwise _getFormValue will call getInputValue and
+        # overwrite _error while rendering.
+        widget = getattr(self, name + '_widget')
+        widget.setRenderedValue(widget._getFormValue())
+        if not IWidgetInputError.providedBy(error):
+            error = WidgetInputError(name, widget.label, error)
+        widget._error = error
+
+    def _requireField(self, name, errors):
+        """If widget has no input, WidgetInputError is set.
+
+        Also adds the exception to the `errors` list.
+        """
+        widget = getattr(self, name + '_widget')
+        field = widget.context
+        try:
+            if widget.getInputValue() == field.missing_value:
+                self._setError(name)
+                errors.append(widget._error)
+        except WidgetInputError, e:
+            # getInputValue might raise an exception on invalid input
+            errors.append(e)
+
+    def setUpEditorWidget(self, editor):
+        editor.editorWidth = 430
+        editor.editorHeight = 300
+        editor.toolbarConfiguration = "schooltool"
+        url = zapi.absoluteURL(ISchoolToolApplication(None), self.request)
+        editor.configurationPath = (url + '/@@/editor_config.js')
+
+    def weekdayChecked(self, weekday):
+        """Return True if the given weekday should be checked.
+
+        The weekday of start_date is always checked, others can be selected by
+        the user.
+
+        Used to format checkboxes for weekly recurrences.
+        """
+        return (int(weekday) in self.weekdays_widget._getFormValue() or
+                self.weekdayDisabled(weekday))
+
+    def weekdayDisabled(self, weekday):
+        """Return True if the given weekday should be disabled.
+
+        The weekday of start_date is always disabled, all others are always
+        enabled.
+
+        Used to format checkboxes for weekly recurrences.
+        """
+        day = self.getStartDate()
+        return bool(day and day.weekday() == int(weekday))
+
+    def getMonthDay(self):
+        """Return the day number in a month, according to start_date.
+
+        Used by the page template to format monthly recurrence rules.
+        """
+        evdate = self.getStartDate()
+        if evdate is None:
+            return '??'
+        else:
+            return str(evdate.day)
+
+    def getWeekDay(self):
+        """Return the week and weekday in a month, according to start_date.
+
+        The output looks like '4th Tuesday'
+
+        Used by the page template to format monthly recurrence rules.
+        """
+        evdate = self.getStartDate()
+        if evdate is None:
+            return _("same weekday")
+
+        weekday = evdate.weekday()
+        index = (evdate.day + 6) // 7
+
+        indexes = {1: _('1st'), 2: _('2nd'), 3: _('3rd'), 4: _('4th'),
+                   5: _('5th')}
+        day_of_week = day_of_week_names[weekday]
+        return "%s %s" % (indexes[index], day_of_week)
+
+    def getLastWeekDay(self):
+        """Return the week and weekday in a month, counting from the end.
+
+        The output looks like 'Last Friday'
+
+        Used by the page template to format monthly recurrence rules.
+        """
+        evdate = self.getStartDate()
+
+        if evdate is None:
+            return _("last weekday")
+
+        lastday = calendar.monthrange(evdate.year, evdate.month)[1]
+
+        if lastday - evdate.day >= 7:
+            return None
+        else:
+            weekday = evdate.weekday()
+            day_of_week_msgid = day_of_week_names[weekday]
+            day_of_week = translate(day_of_week_msgid, context=self.request)
+            msg = _("Last ${weekday}", mapping={'weekday': day_of_week})
+            return msg
+
+    def getStartDate(self):
+        """Return the value of the widget if a start_date is set."""
+        try:
+            return self.start_date_widget.getInputValue()
+        except (WidgetInputError, ConversionError):
+            return None
+
+    def updateForm(self):
+        # Just refresh the form.  It is necessary because some labels for
+        # monthly recurrence rules depend on the event start date.
+        self.update_status = ''
+        try:
+            data = getWidgetsData(self, self.schema, names=self.fieldNames)
+            kw = {}
+            for name in self._keyword_arguments:
+                if name in data:
+                    kw[str(name)] = data[name]
+            self.processRequest(kw)
+        except WidgetsError, errors:
+            self.errors = errors
+            self.update_status = _("An error occurred.")
+            return self.update_status
+        # AddView.update() sets self.update_status and returns it.  Weird,
+        # but let's copy that behavior.
+        return self.update_status
+
+    def processRequest(self, kwargs):
+        """Put information from the widgets into a dict.
+
+        This method performs additional validation, because Zope 3 forms aren't
+        powerful enough.  If any errors are encountered, a WidgetsError is
+        raised.
+        """
+        errors = []
+        self._requireField("title", errors)
+        self._requireField("start_date", errors)
+
+        # What we require depends on weather or not we have an allday event
+        allday = kwargs.pop('allday', None)
+        if not allday:
+            self._requireField("start_time", errors)
+
+        self._requireField("duration", errors)
+
+        # Remove fields not needed for makeRecurrenceRule from kwargs
+        title = kwargs.pop('title', None)
+        start_date = kwargs.pop('start_date', None)
+        start_time = kwargs.pop('start_time', None)
+        if start_time:
+            try:
+                start_time = parse_time(start_time)
+            except ValueError:
+                self._setError("start_time",
+                               ConversionError(_("Invalid time")))
+                errors.append(self.start_time_widget._error)
+        duration = kwargs.pop('duration', None)
+        duration_type = kwargs.pop('duration_type', 'minutes')
+        location = kwargs.pop('location', None)
+        description = kwargs.pop('description', None)
+        recurrence = kwargs.pop('recurrence', None)
+
+        if recurrence:
+            self._requireField("interval", errors)
+            self._requireField("recurrence_type", errors)
+            self._requireField("range", errors)
+
+            range = kwargs.get('range')
+            if range == "count":
+                self._requireField("count", errors)
+            elif range == "until":
+                self._requireField("until", errors)
+                if start_date and kwargs.get('until'):
+                    if kwargs['until'] < start_date:
+                        self._setError("until", ConstraintNotSatisfied(
+                                    _("End date is earlier than start date")))
+                        errors.append(self.until_widget._error)
+
+        exceptions = kwargs.pop("exceptions", None)
+        if exceptions:
+            try:
+                kwargs["exceptions"] = datesParser(exceptions)
+            except ValueError:
+                self._setError("exceptions", ConversionError(
+                 _("Invalid date.  Please specify YYYY-MM-DD, one per line.")))
+                errors.append(self.exceptions_widget._error)
+
+        if errors:
+            raise WidgetsError(errors)
+
+        # Some fake data for allday events, based on what iCalendar seems to
+        # expect
+        if allday is True:
+            # iCalendar has no spec for describing all-day events, but it seems
+            # to be the de facto standard to give them a 1d duration.
+            # XXX ignas: ical has allday events, they are different
+            # from normal events, because they have a date as their
+            # dtstart not a datetime
+            duration_type = "days"
+            start_time = time(0, 0, tzinfo=utc)
+            start = datetime.combine(start_date, start_time)
+        else:
+            start = datetime.combine(start_date, start_time)
+            start = self.timezone.localize(start).astimezone(utc)
+
+        dargs = {duration_type : duration}
+        duration = timedelta(**dargs)
+
+        # Shift the weekdays to the correct timezone
+        if 'weekdays' in kwargs and kwargs['weekdays']:
+            kwargs['weekdays'] = tuple(convertWeekdaysList(start,
+                                                           self.timezone,
+                                                           start.tzinfo,
+                                                           kwargs['weekdays']))
+
+
+        rrule = recurrence and makeRecurrenceRule(**kwargs) or None
+        return {'location': location,
+                'description': description,
+                'title': title,
+                'allday': allday,
+                'start': start,
+                'duration': duration,
+                'rrule': rrule}
+
+
+class CalendarEventAddView(CalendarEventViewMixin, AddView):
+    """A view for adding an event."""
+
+    __used_for__ = ISchoolToolCalendar
+    schema = ICalendarEventAddForm
+
+    title = _("Add event")
+    submit_button_title = _("Add")
+
+    show_book_checkbox = True
+    show_book_link = False
+    _event_uid = None
+
+    error = None
+
+    def __init__(self, context, request):
+
+        prefs = ViewPreferences(request)
+        self.timezone = prefs.timezone
+
+        if "field.start_date" not in request:
+            # XXX shouldn't use date.today; it depends on the server's timezone
+            # which may not match user expectations
+            today = date.today().strftime("%Y-%m-%d")
+            request.form["field.start_date"] = today
+        super(AddView, self).__init__(context, request)
+        self.setUpEditorWidget(self.description_widget)
+
+    def create(self, **kwargs):
+        """Create an event."""
+        data = self.processRequest(kwargs)
+        event = self._factory(data['start'], data['duration'], data['title'],
+                              recurrence=data['rrule'],
+                              location=data['location'],
+                              allday=data['allday'],
+                              description=data['description'])
+        return event
+
+    def add(self, event):
+        """Add the event to a calendar."""
+        self.context.addEvent(event)
+        uid = event.unique_id
+        self._event_name = event.__name__
+        session_data = ISession(self.request)['schooltool.calendar']
+        session_data.setdefault('added_event_uids', set()).add(uid)
+        return event
+
+    def update(self):
+        """Process the form."""
+        if 'UPDATE' in self.request:
+            return self.updateForm()
+        elif 'CANCEL' in self.request:
+            self.update_status = ''
+            self.request.response.redirect(self.nextURL())
+            return self.update_status
+        else:
+            return AddView.update(self)
+
+    def nextURL(self):
+        """Return the URL to be displayed after the add operation."""
+        if "field.book" in self.request:
+            url = absoluteURL(self.context, self.request)
+            return '%s/%s/booking.html' % (url, self._event_name)
+        else:
+            return absoluteURL(self.context, self.request)
+
+
+class ICalendarEventEditForm(ICalendarEventAddForm):
+    pass
+
+
+class CalendarEventEditView(CalendarEventViewMixin, EditView):
+    """A view for editing an event."""
+
+    error = None
+    show_book_checkbox = False
+    show_book_link = True
+
+    title = _("Edit event")
+    submit_button_title = _("Update")
+
+    def __init__(self, context, request):
+        prefs = ViewPreferences(request)
+        self.timezone = prefs.timezone
+        EditView.__init__(self, context, request)
+        self.setUpEditorWidget(self.description_widget)
+
+    def keyword_arguments(self):
+        """Wraps fieldNames under another name.
+
+        AddView and EditView API does not match so some wrapping is needed.
+        """
+        return self.fieldNames
+
+    _keyword_arguments = property(keyword_arguments, None)
+
+    def _setUpWidgets(self):
+        setUpWidgets(self, self.schema, IInputWidget, names=self.fieldNames,
+                     initial=self._getInitialData(self.context))
+
+    def _getInitialData(self, context):
+        """Extract initial widgets data from context."""
+
+        initial = {}
+        initial["title"] = context.title
+        initial["allday"] = context.allday
+        initial["start_date"] = context.dtstart.date()
+        initial["start_time"] = context.dtstart.astimezone(self.timezone).strftime("%H:%M")
+        duration = context.duration.seconds / 60 + context.duration.days * 1440
+        initial["duration_type"] = (duration % 60 and "minutes" or
+                                    duration % (24 * 60) and "hours" or
+                                    "days")
+        initial["duration"] = (initial["duration_type"] == "minutes" and duration or
+                               initial["duration_type"] == "hours" and duration / 60 or
+                               initial["duration_type"] == "days" and duration / 60 / 24)
+        initial["location"] = context.location
+        initial["description"] = context.description
+        recurrence = context.recurrence
+        initial["recurrence"] = recurrence is not None
+        if recurrence:
+            initial["interval"] = recurrence.interval
+            recurrence_type = (
+                IDailyRecurrenceRule.providedBy(recurrence) and "daily" or
+                IWeeklyRecurrenceRule.providedBy(recurrence) and "weekly" or
+                IMonthlyRecurrenceRule.providedBy(recurrence) and "monthly" or
+                IYearlyRecurrenceRule.providedBy(recurrence) and "yearly")
+
+            initial["recurrence_type"] = recurrence_type
+            if recurrence.until:
+                initial["until"] = recurrence.until
+                initial["range"] = "until"
+            elif recurrence.count:
+                initial["count"] = recurrence.count
+                initial["range"] = "count"
+            else:
+                initial["range"] = "forever"
+
+            if recurrence.exceptions:
+                exceptions = map(str, recurrence.exceptions)
+                initial["exceptions"] = "\n".join(exceptions)
+
+            if recurrence_type == "weekly":
+                if recurrence.weekdays:
+                    # Convert weekdays to the correct TZ
+                    initial["weekdays"] = convertWeekdaysList(
+                        self.context.dtstart,
+                        self.context.dtstart.tzinfo,
+                        self.timezone,
+                        recurrence.weekdays)
+
+            if recurrence_type == "monthly":
+                if recurrence.monthly:
+                    initial["monthly"] = recurrence.monthly
+
+        return initial
+
+    def getStartDate(self):
+        if "field.start_date" in self.request:
+            return CalendarEventViewMixin.getStartDate(self)
+        else:
+            return self.context.dtstart.astimezone(self.timezone).date()
+
+    def applyChanges(self):
+        data = getWidgetsData(self, self.schema, names=self.fieldNames)
+        kw = {}
+        for name in self._keyword_arguments:
+            if name in data:
+                kw[str(name)] = data[name]
+
+        widget_data = self.processRequest(kw)
+
+        parsed_date = parse_datetimetz(widget_data['start'].isoformat())
+        self.context.dtstart = parsed_date
+        self.context.recurrence = widget_data['rrule']
+        for attrname in ['allday', 'duration', 'title',
+                         'location', 'description']:
+            setattr(self.context, attrname, widget_data[attrname])
+        return True
+
+    def update(self):
+        if self.update_status is not None:
+            # We've been called before. Just return the status we previously
+            # computed.
+            return self.update_status
+
+        status = ''
+
+        start_date = self.context.dtstart.strftime("%Y-%m-%d")
+
+        if "UPDATE" in self.request:
+            return self.updateForm()
+        elif 'CANCEL' in self.request:
+            self.update_status = ''
+            if 'cancel_url' in self.request:
+                nextURL = self.request['cancel_url']
+                self.request.response.redirect(nextURL)
+            else:
+                self.request.response.redirect(self.nextURL())
+            return self.update_status
+        elif "UPDATE_SUBMIT" in self.request:
+            # Replicating EditView functionality
+            changed = False
+            try:
+                changed = self.applyChanges()
+                if changed:
+                    notify(ObjectModifiedEvent(self.context))
+            except WidgetsError, errors:
+                self.errors = errors
+                status = _("An error occurred.")
+                transaction.abort()
+            else:
+                if changed:
+                    formatter = self.request.locale.dates.getFormatter(
+                        'dateTime', 'medium')
+                    status = _("Updated on ${date_time}",
+                               mapping = {'date_time': formatter.format(
+                                   datetime.utcnow())})
+                self.request.response.redirect(self.nextURL())
+
+        self.update_status = status
+        return status
+
+    def nextURL(self):
+        """Return the URL to be displayed after the add operation."""
+        if "field.book" in self.request:
+            return absoluteURL(self.context, self.request) + '/booking.html'
+        else:
+            return absoluteURL(self.context.__parent__, self.request)
+
+
+class EventForBookingDisplay(object):
+    """Event wrapper for display in booking view.
+
+    This is a wrapper around an ICalendarEvent object.  It adds view-specific
+    attributes:
+
+        dtend -- timestamp when the event ends
+        shortTitle -- title truncated to ~15 characters
+
+    """
+
+    def __init__(self, event):
+        # The event came from resource calendar, so its parent might
+        # be a calendar we don't have permission to view.
+        self.context = removeSecurityProxy(event)
+        self.dtstart = self.context.dtstart
+        self.dtend = self.context.dtstart + self.context.duration
+        self.title = self.context.title
+        if len(self.title) > 16:
+            # Title needs truncation.
+            self.shortTitle = self.title[:15] + '...'
+        else:
+            self.shortTitle = self.title
+        self.unique_id = self.context.unique_id
+
+
+class CalendarEventBookingView(CalendarEventView):
+    """A view for booking resources."""
+
+    errors = ()
+    update_status = None
+
+    template = ViewPageTemplateFile("templates/event_booking.pt")
+
+    def __init__(self, context, request):
+        CalendarEventView.__init__(self, context, request)
+
+        format = '%s - %s' % (self.preferences.dateformat,
+                              self.preferences.timeformat)
+        self.start = u'' + self.dtstart.strftime(format)
+        self.end = u'' + self.dtend.strftime(format)
+
+    def __call__(self):
+        self.checkPermission()
+        return self.template()
+
+    def checkPermission(self):
+        if canAccess(self.context, 'bookResource'):
+            return
+        # If the authenticated user has the addEvent permission and has
+        # come here directly from the event adding form, let him book.
+        # (Fixes issue 486.)
+        if self.justAddedThisEvent():
+            return
+        raise Unauthorized("user not allowed to book")
+
+    def hasBookedItems(self):
+        return bool(self.context.resources)
+
+    def bookingStatus(self, item, formatter):
+        conflicts = list(self.getConflictingEvents(item))
+        status = {}
+        for conflict in conflicts:
+            if conflict.context.__parent__ and conflict.context.__parent__.__parent__:
+                zapi.absoluteURL(self.context, self.request)
+                owner = conflict.context.__parent__.__parent__
+                url = zapi.absoluteURL(owner, self.request)
+            else:
+                owner = conflict.context.activity.owner
+                url = owner.absolute_url()
+            owner_url = "%s/calendar" % url
+            owner_name = owner.title
+            status[owner_name] = owner_url
+        return status
+
+    def columns(self):
+
+        def statusFormatter(value, item, formatter):
+            url = []
+            if value:
+                for eventOwner, ownerCalendar in value.items():
+                    url.append('<a href="%s">%s</a>' % (ownerCalendar, eventOwner))
+                return ", ".join(url)
+            else:
+                return 'Free'
+        return [GetterColumn(name='title',
+                             title=u"Title",
+                             getter=lambda i, f: i.title,
+                             subsort=True),
+                GetterColumn(name='type',
+                             title=u"Type",
+                             getter=lambda i, f: IResourceTypeInformation(i).title,
+                             subsort=True),
+                GetterColumn(title="Booked by others",
+                             cell_formatter=statusFormatter,
+                             getter=self.bookingStatus
+                             )]
+
+    def getBookedItems(self):
+        return removeSecurityProxy(self.context.resources)
+
+    def updateBatch(self, lst):
+        extra_url = ""
+        if self.filter_widget:
+            extra_url = self.filter_widget.extra_url()
+        self.batch = IterableBatch(lst, self.request, sort_by='title', extra_url=extra_url)
+
+    def renderBookedTable(self):
+        prefix = "remove_item"
+        columns = [CheckboxColumn(prefix=prefix, name='remove', title=u'')]
+        available_columns = self.columns()
+        available_columns[0].cell_formatter = label_cell_formatter_factory(prefix)
+        columns.extend(available_columns)
+        formatter = table.FormFullFormatter(
+            self.context, self.request, self.getBookedItems(),
+            columns=columns,
+            sort_on=self.sortOn(),
+            prefix="booked")
+        formatter.cssClasses['table'] = 'data'
+        return formatter()
+
+    def renderAvailableTable(self):
+        prefix = "add_item"
+        columns = [CheckboxColumn(prefix=prefix, name='add', title=u'',
+                                  isDisabled=self.getConflictingEvents)]
+        available_columns = self.columns()
+        available_columns[0].cell_formatter = label_cell_formatter_factory(prefix)
+        columns.extend(available_columns)
+        formatter = table.FormFullFormatter(
+            self.context, self.request, self.filter(self.availableResources),
+            columns=columns,
+            batch_start=self.batch.start, batch_size=self.batch.size,
+            sort_on=self.sortOn(),
+            prefix="available")
+        formatter.cssClasses['table'] = 'data'
+        return formatter()
+
+    def sortOn(self):
+        return (("title", False),)
+
+    def getAvailableItemsContainer(self):
+        return ISchoolToolApplication(None)['resources']
+
+    def getAvailableItems(self):
+        container = self.getAvailableItemsContainer()
+        bookedItems = set(self.getBookedItems())
+        allItems = set(self.availableResources)
+        return list(allItems - bookedItems)
+
+    def filter(self, list):
+        return self.filter_widget.filter(list)
+
+
+    def justAddedThisEvent(self):
+        session_data = ISession(self.request)['schooltool.calendar']
+        added_event_ids = session_data.get('added_event_uids', [])
+        return self.context.unique_id in added_event_ids
+
+    def clearJustAddedStatus(self):
+        """Remove the context uid from the list of added events."""
+        session_data = ISession(self.request)['schooltool.calendar']
+        added_event_ids = session_data.get('added_event_uids', [])
+        uid = self.context.unique_id
+        if uid in added_event_ids:
+            added_event_ids.remove(uid)
+
+    def update(self):
+        """Book/unbook resources according to the request."""
+        start_date = self.context.dtstart.strftime("%Y-%m-%d")
+        self.filter_widget = queryMultiAdapter((self.getAvailableItemsContainer(),
+                                                self.request),
+                                                IFilterWidget)
+
+        if 'CANCEL' in self.request:
+            url = absoluteURL(self.context, self.request)
+            self.request.response.redirect(self.nextURL())
+
+        elif "BOOK" in self.request: # and not self.update_status:
+            self.update_status = ''
+            sb = getSchoolToolApplication()
+            for res_id, resource in sb["resources"].items():
+                if 'add_item.%s' % res_id in self.request:
+                    booked = self.hasBooked(resource)
+                    if not booked:
+                        event = removeSecurityProxy(self.context)
+                        event.bookResource(resource)
+            self.clearJustAddedStatus()
+
+        elif "UNBOOK" in self.request:
+            self.update_status = ''
+            sb = getSchoolToolApplication()
+            for res_id, resource in sb["resources"].items():
+                if 'remove_item.%s' % res_id in self.request:
+                    booked = self.hasBooked(resource)
+                    if booked:
+                        # Always allow unbooking, even if permission to
+                        # book that specific resource was revoked.
+                        self.context.unbookResource(resource)
+        self.updateBatch(self.filter(self.availableResources))
+        return self.update_status
+
+    @property
+    def availableResources(self):
+        """Gives us a list of all bookable resources."""
+        sb = getSchoolToolApplication()
+        calendar_owner = removeSecurityProxy(self.context.__parent__.__parent__)
+        def isBookable(resource):
+            if resource is calendar_owner:
+                # A calendar event in a resource's calendar shouldn't book
+                # that resource, it would be silly.
+                return False
+            if self.canBook(resource) and not self.hasBooked(resource):
+                return True
+            return False
+        return filter(isBookable, sb['resources'].values())
+
+    def canBook(self, resource):
+        """Can the user book this resource?"""
+        return canAccess(ISchoolToolCalendar(resource), "addEvent")
+
+    def hasBooked(self, resource):
+        """Checks whether a resource is booked by this event."""
+        return resource in self.context.resources
+
+    def nextURL(self):
+        """Return the URL to be displayed after the add operation."""
+        return absoluteURL(self.context.__parent__, self.request)
+
+    def getConflictingEvents(self, resource):
+        """Return a list of events that would conflict when booking a resource."""
+        calendar = ISchoolToolCalendar(resource)
+        if not canAccess(calendar, "expand"):
+            return []
+
+        ttcalendar = ICompositeTimetables(resource).makeTimetableCalendar()
+        events = []
+
+        for cal in (calendar, ttcalendar):
+            evts = list(cal.expand(self.context.dtstart,
+                                   self.context.dtstart + self.context.duration))
+            events.extend(evts)
+
+        return [EventForBookingDisplay(event)
+                for event in events
+                if event != self.context]
+
+
+def makeRecurrenceRule(interval=None, until=None,
+                       count=None, range=None,
+                       exceptions=None, recurrence_type=None,
+                       weekdays=None, monthly=None):
+    """Return a recurrence rule according to the arguments."""
+    if interval is None:
+        interval = 1
+
+    if range != 'until':
+        until = None
+    if range != 'count':
+        count = None
+
+    if exceptions is None:
+        exceptions = ()
+
+    kwargs = {'interval': interval, 'count': count,
+              'until': until, 'exceptions': exceptions}
+
+    if recurrence_type == 'daily':
+        return DailyRecurrenceRule(**kwargs)
+    elif recurrence_type == 'weekly':
+        weekdays = weekdays or ()
+        return WeeklyRecurrenceRule(weekdays=tuple(weekdays), **kwargs)
+    elif recurrence_type == 'monthly':
+        monthly = monthly or "monthday"
+        return MonthlyRecurrenceRule(monthly=monthly, **kwargs)
+    elif recurrence_type == 'yearly':
+        return YearlyRecurrenceRule(**kwargs)
+    else:
+        raise NotImplementedError()
+
+
+def convertWeekdaysList(dt, fromtz, totz, weekdays):
+    """Convert the weekday list from one timezone to the other.
+
+    The days can shift by one day in either direction or stay,
+    depending on the timezones and the time of the event.
+
+    The arguments are as follows:
+
+       dt       -- the tz-aware start of the event
+       fromtz   -- the timezone the weekdays list is in
+       totz     -- the timezone the weekdays list is converted to
+       weekdays -- a list of values in range(7), 0 is Monday.
+
+    """
+    delta_td = dt.astimezone(totz).date() - dt.astimezone(fromtz).date()
+    delta = delta_td.days
+    return [(wd + delta) % 7 for wd in weekdays]
+
+
+def datesParser(raw_dates):
+    r"""Parse dates on separate lines into a tuple of date objects.
+
+    Incorrect lines are ignored.
+
+    >>> datesParser('2004-05-17\n\n\n2004-01-29')
+    (datetime.date(2004, 5, 17), datetime.date(2004, 1, 29))
+
+    >>> datesParser('2004-05-17\n123\n\nNone\n2004-01-29')
+    Traceback (most recent call last):
+    ...
+    ValueError: Invalid date: '123'
+
+    """
+    results = []
+    for dstr in raw_dates.splitlines():
+        if dstr:
+            d = parse_date(dstr)
+            if isinstance(d, date):
+                results.append(d)
+    return tuple(results)
+
+
+def enableVfbView(ical_view):
+    """XXX wanna docstring!"""
+    return IReadFile(ical_view.context)
+
+
+def enableICalendarUpload(ical_view):
+    """An adapter that enables HTTP PUT for calendars.
+
+    When the user performs an HTTP PUT request on /path/to/calendar.ics,
+    Zope 3 traverses to a view named 'calendar.ics' (which is most likely
+    a schooltool.calendar.browser.Calendar ICalendarView).  Then Zope 3 finds an
+    IHTTPrequest view named 'PUT'.  There is a standard one, that adapts
+    its context (which happens to be the view named 'calendar.ics' in this
+    case) to IWriteFile, and calls `write` on it.
+
+    So, to hook up iCalendar uploads, the simplest way is to register an
+    adapter for CalendarICalendarView that provides IWriteFile.
+
+        >>> from zope.app.testing import setup, ztapi
+        >>> setup.placelessSetUp()
+
+    We have a calendar that provides IEditCalendar.
+
+        >>> from schooltool.calendar.interfaces import IEditCalendar
+        >>> from schooltool.app.cal import Calendar
+        >>> calendar = Calendar(None)
+
+    We have a fake "real adapter" for IEditCalendar
+
+        >>> class RealAdapter:
+        ...     implements(IWriteFile)
+        ...     def __init__(self, context):
+        ...         pass
+        ...     def write(self, data):
+        ...         print 'real adapter got %r' % data
+        >>> ztapi.provideAdapter(IEditCalendar, IWriteFile, RealAdapter)
+
+    We have a fake view on that calendar
+
+        >>> from zope.publisher.browser import BrowserView
+        >>> from zope.publisher.browser import TestRequest
+        >>> view = BrowserView(calendar, TestRequest())
+
+    And now we can hook things up together
+
+        >>> adapter = enableICalendarUpload(view)
+        >>> adapter.write('iCalendar data')
+        real adapter got 'iCalendar data'
+
+        >>> setup.placelessTearDown()
+
+    """
+    return IWriteFile(ical_view.context)
+
+
+class CalendarEventBreadcrumbInfo(breadcrumbs.GenericBreadcrumbInfo):
+    """Calendar Event Breadcrumb Info
+
+    First, set up a parent:
+
+      >>> class Object(object):
+      ...     def __init__(self, parent=None, name=None):
+      ...         self.__parent__ = parent
+      ...         self.__name__ = name
+
+      >>> calendar = Object()
+      >>> from zope.traversing.interfaces import IContainmentRoot
+      >>> import zope.interface
+      >>> zope.interface.directlyProvides(calendar, IContainmentRoot)
+
+    Now setup the event:
+
+      >>> event = Object(calendar, u'+1243 at localhost')
+
+    Setup a request:
+
+      >>> from zope.publisher.browser import TestRequest
+      >>> request = TestRequest()
+
+    Now register the breadcrumb info component and other setup:
+
+      >>> import zope.component
+      >>> import zope.interface
+      >>> from schooltool.skin import interfaces, breadcrumbs
+      >>> zope.component.provideAdapter(breadcrumbs.GenericBreadcrumbInfo,
+      ...                              (Object, TestRequest),
+      ...                              interfaces.IBreadcrumbInfo)
+
+      >>> from zope.app.testing import setup
+      >>> setup.setUpTraversal()
+
+    Now initialize this info and test it:
+
+      >>> info = CalendarEventBreadcrumbInfo(event, request)
+      >>> info.url
+      'http://127.0.0.1/+1243@localhost/edit.html'
+    """
+
+    @property
+    def url(self):
+        name = urllib.quote(self.context.__name__.encode('utf-8'), "@+")
+        parent_info = zapi.getMultiAdapter(
+            (self.context.__parent__, self.request), IBreadcrumbInfo)
+        return '%s/%s/edit.html' %(parent_info.url, name)
+
+CalendarBreadcrumbInfo = breadcrumbs.CustomNameBreadCrumbInfo(_('Calendar'))


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/cal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,589 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <!-- Viewlet Managers -->
+
+  <zope:interface
+      interface=".skin.ICalendarEventContext"
+      type="zope.contentprovider.interfaces.ITALNamespaceData" />
+
+  <viewletManager
+      name="schooltool.CalendarEvent"
+      permission="zope.Public"
+      provides="schooltool.app.browser.skin.ICalendarEventViewletManager"
+      class="schooltool.app.browser.skin.CalendarEventViewletManager"
+      />
+
+  <viewlet
+      name="event-info"
+      for="*"
+      manager="schooltool.app.browser.skin.ICalendarEventViewletManager"
+      template="templates/event_info_viewlet.pt"
+      permission="zope.Public"
+      order="10"
+      />
+
+
+ <!-- TALES path expressions -->
+
+  <zope:class class=".SortBy">
+    <allow interface="zope.traversing.interfaces.ITraversable" />
+  </zope:class>
+
+  <zope:adapter
+      for="*"
+      name="sortby"
+      provides="zope.traversing.interfaces.IPathAdapter"
+      factory=".SortBy"
+      trusted="yes"
+      />
+
+  <zope:adapter
+      for="*"
+      name="can_access"
+      provides="zope.traversing.interfaces.IPathAdapter"
+      factory=".CanAccess"
+      />
+
+  <zope:adapter
+      for="*"
+      name="filter_accessible"
+      provides="zope.traversing.interfaces.IPathAdapter"
+      factory=".FilterAccessible"
+      />
+
+  <zope:adapter
+      for="*"
+      name="sorted_filter_accessible"
+      provides="zope.traversing.interfaces.IPathAdapter"
+      factory=".SortedFilterAccessible"
+      />
+
+  <zope:adapter
+      for="*"
+      name="schooltool"
+      provides="zope.traversing.interfaces.IPathAdapter"
+      factory=".SchoolToolAPI"
+      />
+
+  <!-- Skin and resources -->
+
+  <zope:subscriber
+      handler=".skin.schoolToolTraverseSubscriber"
+      for="schooltool.app.interfaces.ISchoolToolApplication zope.app.publication.interfaces.IBeforeTraverseEvent"
+      />
+
+  <page
+      name="calendar_macros"
+      for="*"
+      permission="zope.View"
+      template="templates/calendar_macros.pt"
+      />
+
+  <resource name="day.png" file="resources/day.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="week.png" file="resources/week.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="month.png" file="resources/month.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="year.png" file="resources/year.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+
+  <!-- calwidget (external) -->
+
+  <resource name="calwidget-calendar.js"
+      file="resources/calwidget/calendar.js"
+      layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource name="calwidget-calendar.css"
+      file="resources/calwidget/calendar.css"
+      layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource name="calwidget-icon.gif"
+      file="resources/calwidget/icon.gif"
+      layer="schooltool.skin.ISchoolToolLayer" />
+
+  <!-- Breadcrumbs -->
+
+  <zope:adapter
+      for="schooltool.app.interfaces.ISchoolToolCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      factory=".cal.CalendarBreadcrumbInfo"
+      trusted="true"
+      permission="zope.Public"
+      />
+
+  <zope:adapter
+      for="schooltool.app.interfaces.ISchoolToolCalendarEvent
+           zope.publisher.interfaces.http.IHTTPRequest"
+      factory=".cal.CalendarEventBreadcrumbInfo"
+      trusted="true"
+      permission="zope.Public"
+      />
+
+  <!-- Actions menu -->
+
+  <!-- TODO: remove this menu - 2006-07-04 gintas -->
+  <menu id="schooltool_actions" title="Actions" />
+
+  <!-- Adapters -->
+
+  <zope:adapter
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      provides="zope.size.interfaces.ISized"
+      factory=".SchoolToolSized"
+      />
+
+  <zope:adapter
+      for="schooltool.calendar.browser.CalendarICalendarView"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".cal.enableICalendarUpload"
+      trusted="yes"
+      />
+
+  <!-- Pluggable Traverser Plugins -->
+
+  <zope:subscriber
+      for="zope.app.container.interfaces.IReadContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory="schooltool.traverser.traverser.ContainerTraverserPlugin"
+      />
+
+  <!-- Application Traverser -->
+
+  <zope:view
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.publisher.interfaces.browser.IBrowserPublisher"
+      factory="schooltool.traverser.browser.PluggableBrowserTraverser"
+      permission="zope.Public"
+      />
+
+  <!-- Views for the application -->
+
+  <page
+      name="index.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      class="schooltool.app.browser.app.ApplicationView"
+      template="templates/index.pt"
+      permission="zope.Public"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <addMenuItem
+      title="SchoolTool"
+      class="schooltool.app.app.SchoolToolApplication"
+      permission="zope.ManageContent"
+      />
+
+  <!-- XXX: Ahhh! Why is this a view of the person? -->
+  <page
+      name="site-preferences.html"
+      for="schooltool.person.interfaces.IPerson"
+      class="schooltool.app.browser.app.ApplicationPreferencesView"
+      template="templates/application_preferences.pt"
+      permission="schooltool.edit"
+      />
+
+
+  <!-- Make index.html the default ZMI view for ISchoolToolApplication -->
+
+  <menuItem
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      menu="zmi_views" title="View" action="index.html" />
+
+  <!-- Views for everything -->
+
+  <page
+      for="*"
+      name="login.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      template="templates/login.pt"
+      class=".app.LoginView"
+      permission="zope.Public"
+      />
+
+  <page
+      for="*"
+      name="logout.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class=".app.LogoutView"
+      permission="zope.Public"
+      />
+
+  <!-- Calendar views -->
+
+  <!-- Sigh. Cannot specify multiple for and permission in subsscriber ;-( -->
+  <zope:class class=".cal.ToCalendarTraverser">
+    <allow interface="schooltool.traverser.interfaces.ITraverserPlugin" />
+  </zope:class>
+
+  <zope:subscriber
+      for="schooltool.app.interfaces.IHaveCalendar
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".cal.ToCalendarTraverser"
+      />
+
+  <zope:view
+      for="schooltool.calendar.interfaces.ICalendar"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.publisher.interfaces.browser.IBrowserPublisher"
+      factory=".cal.CalendarTraverser"
+      permission="zope.Public"
+      />
+
+  <zope:view
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.publisher.interfaces.browser.IBrowserPublisher"
+      factory=".cal.CalendarTraverser"
+      permission="zope.Public"
+      />
+
+  <configure package="schooltool.skin">
+    <navigationViewlet
+      name="view-calendar"
+      for="schooltool.app.interfaces.IHaveCalendar"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.view"
+      link="calendar"
+      title="View Calendar"
+      order="10"
+      />
+
+    <navigationViewlet
+      name="new-event"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.edit"
+      link="add.html"
+      title="New Event"
+      order="20"
+      />
+
+    <navigationViewlet
+      name="open-in-ical"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.view"
+      link="calendar.ics"
+      title="Open in iCal"
+      order="20"
+      />
+
+    <navigationViewlet
+      name="timetables-csvimport"
+      for="schooltool.course.interfaces.ISectionContainer"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.edit"
+      link="@@timetables-csvimport.html"
+      title="Import Sections"
+      order="50"
+      />
+
+    <navigationViewlet
+      name="edit-leaders"
+      for="schooltool.app.interfaces.IAsset"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.edit"
+      link="@@leaders.html"
+      title="Edit Leaders"
+      order="40"
+      />
+
+    <navigationViewlet
+      name="site-preferences"
+      for="schooltool.person.interfaces.IPerson"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.edit"
+      link="@@site-preferences.html"
+      title="Change Site Preferences"
+      order="50"
+      />
+
+    <page
+      name="delete.html"
+      for="zope.app.container.interfaces.IContainer"
+      class="schooltool.skin.containers.ContainerDeleteView"
+      template="templates/container_delete.pt"
+      permission="zope.View"
+      />
+
+  </configure>
+
+  <page
+      name="daily.html"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".cal.DailyCalendarView"
+      template="templates/cal_daily.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="Calendar (Daily)"
+      />
+
+  <page
+      name="daily.pdf"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".pdfcal.DailyPDFCalendarView"
+      attribute="pdfdata"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="Calendar (Daily, PDF)"
+      />
+
+  <page
+      name="weekly.html"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".cal.WeeklyCalendarView"
+      template="templates/cal_weekly.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="Calendar (Weekly)"
+      />
+
+  <page
+      name="weekly.pdf"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".pdfcal.WeeklyPDFCalendarView"
+      attribute="pdfdata"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="Calendar (Weekly, PDF)"
+      />
+
+  <page
+      name="monthly.html"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".cal.MonthlyCalendarView"
+      template="templates/cal_monthly.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="Calendar (Monthly)"
+      />
+
+  <page
+      name="monthly.pdf"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".pdfcal.MonthlyPDFCalendarView"
+      attribute="pdfdata"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="Calendar (Monthly, PDF)"
+      />
+
+  <page
+      name="yearly.html"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".cal.YearlyCalendarView"
+      template="templates/cal_yearly.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="Calendar (Yearly)"
+      />
+
+  <page
+      name="atom.xml"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".cal.AtomCalendarView"
+      template="templates/cal_atom.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="Atom View"
+      />
+
+  <page
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      name="calendar.ics"
+      permission="schooltool.view"
+      class="schooltool.calendar.browser.CalendarICalendarView"
+      attribute="show"
+      menu="zmi_views"
+      title="iCalendar"
+      />
+
+  <page
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      name="calendar.vfb"
+      permission="zope.Public"
+      class="schooltool.calendar.browser.CalendarVfbView"
+      attribute="show"
+      menu="zmi_views"
+      title="Free/Busy"
+      />
+
+  <page
+      name="delete.html"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      class=".cal.EventDeleteView"
+      template="templates/recevent_delete.pt"
+      permission="schooltool.edit"
+      />
+
+  <!-- Calendar event views -->
+
+  <page
+      name="index.html"
+      for="schooltool.app.interfaces.ICalendarEvent"
+      class="schooltool.app.browser.cal.CalendarEventView"
+      template="templates/event.pt"
+      permission="zope.View"
+      menu="zmi_views"
+      title="View"
+      />
+
+  <addform
+      label="Add Event"
+      name="add.html"
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      schema=".cal.ICalendarEventAddForm"
+      arguments=""
+      keyword_arguments="title allday start_date start_time duration
+                         duration_type recurrence location description
+                         recurrence_type interval range until count monthly
+                         exceptions weekdays"
+      content_factory="schooltool.app.cal.CalendarEvent"
+      permission="schooltool.edit"
+      template="templates/event_add.pt"
+      class=".cal.CalendarEventAddView">
+
+    <widget field="description" height="5" />
+    <widget field="exceptions" width="20" height="5" />
+  </addform>
+
+  <editform
+      for="schooltool.app.interfaces.ISchoolToolCalendarEvent"
+      name="edit.html"
+      label="Edit Event"
+      schema=".cal.ICalendarEventEditForm"
+      fields="title allday start_date start_time duration duration_type
+              recurrence location description recurrence_type interval
+              range until count monthly exceptions weekdays"
+      class=".cal.CalendarEventEditView"
+      permission="schooltool.edit"
+      template="templates/event_add.pt">
+
+    <widget field="description" height="5" />
+    <widget field="exceptions" width="20" height="5" />
+  </editform>
+
+  <page
+      for="schooltool.app.interfaces.ISchoolToolCalendarEvent"
+      name="booking.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class=".cal.CalendarEventBookingView"
+      permission="zope.View"
+      />
+
+  <page
+      for="*"
+      name="calendar_overlay"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class=".cal.CalendarSTOverlayView"
+      template="templates/calendar_overlay.pt"
+      permission="zope.View"
+      />
+
+  <page
+      for="schooltool.calendar.interfaces.ICalendar"
+      name="daily_calendar_rows"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class=".cal.DailyCalendarRowsView"
+      permission="zope.View"
+      />
+
+  <!-- XXX: Mmh, is ISectionContainer the only component using this -->
+  <!--      view class? -->
+  <page
+      name="timetables-csvimport.html"
+      for="schooltool.course.interfaces.ISectionContainer"
+      class="schooltool.app.browser.csvimport.TimetableCSVImportView"
+      template="templates/timetables-csvimport.pt"
+      permission="schooltool.edit"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <page
+      for="schooltool.app.interfaces.IAsset"
+      name="leaders.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class=".app.LeaderView"
+      permission="schooltool.edit"
+      />
+
+  <!-- Documentation -->
+
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      xmlns:apidoc="http://namespaces.zope.org/apidoc"
+      zcml:condition="have apidoc">
+
+    <apidoc:bookchapter
+        id="browser"
+        title="Browser UI"
+        parent="schooltool"
+        doc_path="ftests/README.txt" />
+
+    <apidoc:bookchapter
+        id="login"
+        title="Login"
+        parent="schooltool/browser"
+        doc_path="ftests/login.txt" />
+
+    <apidoc:bookchapter
+        id="errors"
+        title="Errors"
+        parent="schooltool/browser"
+        doc_path="ftests/errors.txt" />
+
+    <apidoc:bookchapter
+        id="cal"
+        title="Calendar"
+        parent="schooltool/browser"
+        doc_path="ftests/cal.txt" />
+
+    <apidoc:bookchapter
+        id="navigation"
+        title="Navigation"
+        parent="schooltool/browser"
+        doc_path="ftests/navigation.txt" />
+
+    <apidoc:bookchapter
+        id="app"
+        title="Application"
+        parent="schooltool/browser"
+        doc_path="ftests/app.txt" />
+
+    <apidoc:bookchapter
+        id="calwidget"
+        title="Calendar Widget"
+        parent="schooltool/browser"
+        doc_path="resources/calwidget/README.txt" />
+
+    <apidoc:bookchapter
+        id="templates"
+        title="Templates"
+        parent="schooltool/browser"
+        doc_path="templates.txt" />
+
+  </configure>
+
+  <!-- Calendar provider subscriber  -->
+
+  <zope:subscriber
+      for="schooltool.app.interfaces.ISchoolToolCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides=".cal.ICalendarProvider"
+      factory=".cal.CalendarListSubscriber"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/csvimport.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/csvimport.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/csvimport.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,561 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool application views.
+
+$Id: csvimport.py 6565 2007-01-11 16:43:11Z ignas $
+"""
+import csv
+
+from zope.security.proxy import removeSecurityProxy
+from zope.app.container.interfaces import INameChooser
+from zope.publisher.browser import BrowserView
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.app import SimpleNameChooser
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.course.interfaces import ISectionContainer
+from schooltool.course.section import Section
+from schooltool.timetable import TimetableActivity
+from schooltool.timetable.interfaces import ITimetables
+
+
+class ImportErrorCollection(object):
+    """A simple container for import errors.
+
+    This class just holds errors that occur in the CSVImporter class so they
+    can be dealt with by the CSVImportView class.
+    """
+
+    def __init__(self):
+        self.generic = []
+        self.fields = []
+
+    def anyErrors(self):
+        return bool(self.generic or self.fields)
+
+    def __repr__(self):
+        return "<%s %r>" % (self.__class__.__name__, self.__dict__)
+
+
+class TimetableImportErrorCollection(object):
+
+    def __init__(self):
+        self.generic = []
+        self.day_ids = []
+        self.periods = []
+        self.persons = []
+        self.courses = []
+        self.sections = []
+        self.records = []
+
+    def anyErrors(self):
+        return bool(self.generic or self.day_ids or self.periods
+                    or self.persons or self.courses or self.sections
+                    or self.records)
+
+    def __repr__(self):
+        return "<%s %r>" % (self.__class__.__name__, self.__dict__)
+
+
+class InvalidCSVError(Exception):
+    pass
+
+
+class BaseCSVImportView(BrowserView):
+
+    __used_for__ = ISchoolToolApplication
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+        self.errors = []
+        self.success = []
+
+    def update(self):
+        if "UPDATE_SUBMIT" not in self.request:
+            return
+
+        charset = self.getCharset()
+        if charset is None:
+            return
+
+        csvfile = self.request.get('csvfile', '')
+        if csvfile:
+            csvfile = csvfile.read()
+
+        csvtext = self.request.get('csvtext', '')
+
+        if not csvfile and not csvtext:
+            self.errors.append(_('No data provided'))
+            return
+
+        if csvfile:
+            try:
+                unicode(csvfile, charset)
+            except UnicodeError:
+                self.errors.append(_('Could not convert data to Unicode'
+                                     ' (incorrect charset?).'))
+                return
+
+        self.importer = self.importer_class(self.context, charset)
+        ok = True
+        if csvfile:
+            ok = self.importer.importFromCSV(csvfile)
+            if ok:
+                self.success.append(_("CSV file imported successfully."))
+            else:
+                self.errors.append(_("Failed to import CSV file"))
+                self._presentErrors(self.importer.errors)
+
+        ok = True
+        if csvtext:
+            self.importer.charset = None
+            ok = self.importer.importFromCSV(csvtext)
+            if ok:
+                self.success.append(_("CSV text imported successfully."))
+            else:
+                self.errors.append(_("Failed to import CSV text"))
+                self._presentErrors(self.importer.errors)
+
+    def _presentErrors(self, err):
+        """Add any errors in our ErrorCollection to the view errors.
+        """
+        if err.generic:
+            self.errors.extend(err.generic)
+
+        if err.fields:
+            self.errors.extend(err.fields)
+
+    def getCharset(self):
+        """Return the charset (as a string) that was specified in the request.
+
+        Updates self.errors and returns None if the charset was not specified
+        or if it is invalid.
+        """
+        charset = self.request['charset']
+        if charset == 'other':
+            charset = self.request['other_charset']
+        if not charset:
+            self.errors.append(_("No charset specified"))
+            return
+        try:
+            unicode(' ', charset)
+        except LookupError:
+            self.errors.append(_("Unknown charset"))
+            return
+        return charset
+
+
+class BaseCSVImporter(object):
+    """A base class for CSV parsers and importers.
+
+    Subclasses should define the createAndAdd method.
+    """
+
+    def __init__(self, container, charset=None):
+        self.container = container
+        self.errors = ImportErrorCollection()
+        self.charset = charset
+        self.chooser = SimpleNameChooser(container)
+
+    def parseCSVRows(self, rows):
+        """Parse rows (a list of strings) in CSV format.
+
+        Returns a list of rows as lists.
+
+        rows must be in the encoding specified during construction of
+        BaseCSVImportView; the returned values are in unicode.
+
+        If the provided data is invalid, self.errors.generic will be updated
+        and None will be returned.
+        """
+        result = []
+        reader = csv.reader(rows)
+        line = 0
+        try:
+            while True:
+                line += 1
+                values = [v.strip() for v in reader.next()]
+                if self.charset:
+                    values = [unicode(v, self.charset) for v in values]
+                # Remove trailing empty cells.
+                while values and not values[-1].strip():
+                    del values[-1]
+                result.append(values)
+        except StopIteration:
+            return result
+        except csv.Error:
+            error_msg = _("Error in CSV data, line ${line_no}",
+                          mapping={'line_no': line})
+            self.errors.generic.append(error_msg)
+        except UnicodeError:
+            error_msg = _("Conversion to unicode failed in line ${line_no}",
+                          mapping={'line_no': line})
+            self.errors.generic.append(error_msg)
+
+    def importFromCSV(self, csvdata):
+        """Import objects from CSV data.
+
+        Should not throw exceptions, but will set self.*error attributes.
+        Returns True on success.  If False is returned, it means that at least
+        one of attributes of self.errors have been set, and that no changes to
+        the database have been applied.
+        """
+        rows = self.parseCSVRows(csvdata.splitlines())
+        if rows is None:
+            return False
+
+        for dry_run in [True, False]:
+
+            for rowdata in rows:
+                self.createAndAdd(rowdata, dry_run)
+
+            if self.errors.anyErrors():
+                return False
+
+        return True
+
+    def createAndAdd(self, obj, dry_run=True):
+        """Create object and add to container.
+
+        If dry_run is True, don't actually do anything, just validate the data.
+
+        This should be defined in the subclass.
+        """
+        raise NotImplementedError("Please override this method in subclasses")
+
+
+# XXX: This should be in the schooltool.timetable package.
+class TimetableCSVImporter(object):
+    """A timetable CSV parser and importer.
+
+    You will most likely want to use the importFromCSV(csvdata) method.
+
+    This class does not use exceptions for handling errors excessively
+    because of the nature of error-checking: we want to gather many errors
+    in one sweep and present them to the user at once.
+    """
+
+    def __init__(self, container, charset=None):
+        # XXX It appears that our security declarations are inadequate,
+        #     because things break without this removeSecurityProxy.
+        self.app = getSchoolToolApplication()
+        self.sections = removeSecurityProxy(container)
+        self.persons = self.app['persons']
+        self.errors = TimetableImportErrorCollection()
+        self.charset = charset
+
+    def importSections(self, sections_csv): # TODO: see importFromCSV
+        """Import sections from CSV data.
+
+        At the top of the file there should be a header row:
+
+        timetable_schema_id, term_id
+
+        Then an empty line should follow, and the remaining CSV data should
+        consist of chunks like this:
+
+        course_id, instructor_id
+        day_id, period_id
+        day_id, period_id
+        ...
+        ***
+        student_id
+        student_id
+        ...
+
+        """
+        if '\n' not in sections_csv:
+            self.errors.generic.append(_("No data provided"))
+            raise InvalidCSVError()
+
+        rows = self.parseCSVRows(sections_csv.splitlines())
+
+        if rows[1]:
+            self.errors.generic.append(_("Row 2 is not empty"))
+            raise InvalidCSVError()
+
+        self.importHeader(rows[0])
+        if self.errors.anyErrors():
+            raise InvalidCSVError()
+
+        self.importChunks(rows[2:], dry_run=True)
+        if self.errors.anyErrors():
+            raise InvalidCSVError()
+
+        self.importChunks(rows[2:], dry_run=False)
+        if self.errors.anyErrors():
+            raise AssertionError('something bad happened while importing CSV'
+                                 ' data, aborting transaction.')
+
+    def importChunks(self, rows, dry_run=True):
+        """Import chunks separated by empty lines."""
+        chunk_start = 0
+        for i, row in enumerate(rows):
+            if not row:
+                if rows[chunk_start]:
+                    self.importChunk(rows[chunk_start:i],
+                                     chunk_start + 3, dry_run)
+                chunk_start = i + 1
+        if rows and rows[-1]:
+            self.importChunk(rows[chunk_start:], chunk_start + 3, dry_run)
+
+    def importChunk(self, rows, line, dry_run=True):
+        """Import a chunk of data that describes a section.
+
+        You should run this method with dry_run=True before trying the
+        real thing, or you might get in trouble.
+        """
+        row = rows[0]
+        if len(row[:2]) != 2:
+            err_msg = _('Wrong section header on line ${line_no} (it should contain a'
+                        ' course id and an instructor id)',
+                        mapping={'line_no': line})
+            self.errors.generic.append(err_msg)
+            return
+        course_id, instructor_id = row[:2]
+
+        course = self.app['courses'].get(course_id, None)
+        if course is None:
+            self.errors.courses.append(course_id)
+
+        instructor = self.persons.get(instructor_id, None)
+        if instructor is None:
+            self.errors.persons.append(instructor_id)
+
+        line_ofs = 1
+        periods = []
+        finished = False
+        for row in rows[1:]:
+            line_ofs += 1
+            if row == ['***']:
+                finished = True
+                break
+            elif len(row) == 2:
+                day_id, period_id = row
+            else:
+                err_msg = _('Malformed line ${line_no} (it should contain a'
+                            ' day id and a period id)',
+                            mapping={'line_no': line + line_ofs - 1})
+                self.errors.generic.append(err_msg)
+                continue
+
+            # check day_id
+            try:
+                ttday = self.ttschema[day_id]
+            except KeyError:
+                if day_id not in self.errors.day_ids:
+                    self.errors.day_ids.append(day_id)
+                continue
+
+            # check period_id
+            if (period_id not in ttday.periods
+                and period_id not in self.errors.periods):
+                self.errors.periods.append(period_id)
+                continue
+
+            periods.append((day_id, period_id))
+
+        if not finished:
+            err_msg = _("Incomplete section description on line ${line}",
+                        mapping = {'line': line})
+            self.errors.generic.append(err_msg)
+            return
+        if len(rows) == line_ofs:
+            err_msg = _("No students in section (line ${line})",
+                        mapping = {'line': line + line_ofs})
+            self.errors.generic.append(err_msg)
+            return
+
+        section = self.createSection(course, instructor, periods,
+                                     dry_run=dry_run)
+        self.importPersons(rows[line_ofs:], section, dry_run=dry_run)
+
+    def createSection(self, course, instructor, periods, dry_run=True):
+        """Create a section.
+
+        `periods` is a list of tuples (day_id, period_id).
+
+        A title is generated from the titles of `course` and `instructor`.
+        If an existing section with the same title is found, it is used instead
+        of creating a new one.
+
+        The created section is returned, or None if dry_run is True.
+        """
+        if dry_run:
+            return None
+
+        # Create or pick a section.
+        section_title = '%s - %s' % (course.title, instructor.title)
+        for sctn in self.app['sections'].values():
+            # Look for an existing section with the same title.
+            if sctn.title == section_title:
+                section = sctn
+                break
+        else:
+            # No existing sections with this title found, create a new one.
+            section = Section(title=section_title)
+            chooser = INameChooser(self.sections)
+            section_name = chooser.chooseName('', section)
+            self.sections[section_name] = section
+
+        # Establish links to course and to teacher
+        if course not in section.courses:
+            section.courses.add(course)
+        if instructor not in section.instructors:
+            section.instructors.add(instructor)
+
+        # Create a timetable
+        timetables = ITimetables(section).timetables
+        timetable_key = ".".join((self.term.__name__, self.ttschema.__name__))
+        if timetable_key not in timetables.keys():
+            tt = self.ttschema.createTimetable()
+            timetables[timetable_key] = tt
+        else:
+            tt = timetables[timetable_key]
+
+        # Add timetable activities.
+        for day_id, period_id in periods:
+            # XXX no resource booking in here, the form is not used
+            # anyway though
+            act = TimetableActivity(title=course.title, owner=section)
+            tt[day_id].add(period_id, act)
+
+        return section
+
+    def importPersons(self, person_data, section, dry_run=True):
+        """Import persons into a section."""
+        for row in person_data:
+            person_id = row[0]
+            try:
+                person = self.persons[person_id]
+            except KeyError:
+                if person_id not in self.errors.persons:
+                    self.errors.persons.append(person_id)
+            else:
+                if not dry_run:
+                    if person not in section.members:
+                        section.members.add(person)
+
+    def importHeader(self, row):
+        """Read the header row of the CSV file.
+
+        Sets self.term and self.ttschema.
+        """
+        if len(row) != 2:
+            self.errors.generic.append(
+                    _("The first row of the CSV file must contain"
+                      " the term id and the timetable schema id."))
+            return
+
+        term_id, ttschema_id = row
+
+        try:
+            self.term = self.app['terms'][term_id]
+        except KeyError:
+            error_msg = _("The term ${term} does not exist.",
+                          mapping={'term': term_id})
+            self.errors.generic.append(error_msg)
+
+        try:
+            self.ttschema = self.app['ttschemas'][ttschema_id]
+        except KeyError:
+            error_msg = _("The timetable schema ${schema} does not exist.",
+                          mapping={'schema': ttschema_id})
+            self.errors.generic.append(error_msg)
+
+    def parseCSVRows(self, rows):
+        """Parse rows (a list of strings) in CSV format.
+
+        Returns a list of rows as lists.  Trailing empty cells are discarded.
+
+        rows must be in the encoding specified during construction of
+        TimetableCSVImportView; the returned values are in unicode.
+
+        If the provided data is invalid, self.errors.generic will be updated
+        and InvalidCSVError will be returned.
+        """
+        result = []
+        reader = csv.reader(rows)
+        line = 0
+        try:
+            while True:
+                line += 1
+                values = [v.strip() for v in reader.next()]
+                if self.charset:
+                    values = [unicode(v, self.charset) for v in values]
+                # Remove trailing empty cells.
+                while values and not values[-1].strip():
+                    del values[-1]
+                result.append(values)
+        except StopIteration:
+            return result
+        except csv.Error:
+            error_msg = _("Error in timetable CSV data, line ${line_no}",
+                          mapping={'line_no': line})
+            self.errors.generic.append(error_msg)
+            raise InvalidCSVError()
+        except UnicodeError:
+            error_msg = _("Conversion to unicode failed in line ${line_no}",
+                          mapping={'line_no': line})
+            self.errors.generic.append(error_msg)
+            raise InvalidCSVError()
+
+    def importFromCSV(self, csvdata):
+        """Invoke importSections while playing with BaseCSVImportView nicely.
+
+        Currently sb.BaseCSVImportView expects ImporterClass.importFromCSV
+        return True on success, False on error.  It would be nicer if it
+        caught InvalidCSVErrors instead.  When this refactoring is performed,
+        this method may be removed and importSections can be renamed to
+        importFromCSV.
+        """
+        try:
+            self.importSections(csvdata)
+        except InvalidCSVError:
+            return False
+        else:
+            return True
+
+
+class TimetableCSVImportView(BaseCSVImportView):
+    """Timetable CSV import view."""
+
+    __used_for__ = ISectionContainer
+
+    importer_class = TimetableCSVImporter
+
+    def _presentErrors(self, err):
+        if err.generic:
+            self.errors.extend(err.generic)
+
+        # XXX: Shrug, this seems not very extensible.
+        for key, msg in [
+            ('day_ids', _("Day ids not defined in selected schema: ${args}.")),
+            ('periods', _("Periods not defined in selected days: ${args}.")),
+            ('persons', _("Persons not found: ${args}.")),
+            ('courses', _("Courses not found: ${args}.")),
+            ('sections', _("Sections not found: ${args}.")),
+            ('records', _("Invalid records: ${args}."))]:
+            v = getattr(err, key)
+            if v:
+                values = ', '.join([unicode(st) for st in v])
+                msg = _(msg, mapping={'args': values})
+                self.errors.append(msg)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/csvimport.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,29 @@
+Functional doctests for SchoolBell
+==================================
+
+This directory contains functional tests for SchoolBell.  Most of them
+are functional doctests.  To learn more about them, read
+Zope3/src/zope/app/ftests/doctest.txt
+
+
+Tips and tricks for writing functional doctests
+-----------------------------------------------
+
+- Start with a .txt file generated by Zope's doctest generator, or just
+  copy and paste an existing doctest and change requests/responses manually.
+
+- Replace "Authorization: Basic (whatever goes here)" with
+  "Authorization: Basic mgr:mgrpw"
+
+- Replace "Content-Length: (a number)" with "Content-Length: ..." in the output
+  (but not in the input!)
+
+- Remove all port numbers after 'localhost' (e.g., if you used tcpwatch and
+  went to http://localhost:9080/, then in your .txt file replace all instances
+  of "localhost:9080" with just "localhost").
+
+- Replace a number of long boring lines with a single ellipsis (...).
+
+- When you get a huge diff, look for lines that start with a question mark (?),
+  they are most informative.
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,24 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Common code for functional tests.
+
+$Id: __init__.py 6027 2006-05-09 13:26:07Z mg $
+"""
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/app.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/app.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/app.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,416 @@
+Functional doctest for SchoolTool
+=================================
+
+This is a functional doctest for schooltool.  To find out more about
+functional doctests, read Zope3/src/zope/app/ftests/doctest.txt
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+    >>> 'SchoolTool' in manager.contents
+    True
+
+The SchoolTool version is displayed on the page:
+
+    >>> import schooltool
+    >>> str(manager.contents).count(schooltool.get_version()) > 0
+    True
+
+Let's create a person so that we can fool around with his calendar:
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Frog', 'frog', 'pwd')
+
+Let's create a second person so that we can test access control.
+
+    >>> addPerson('Toad', 'toad', 'doat')
+
+Also, let's create a group:
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('New Group').click()
+
+    >>> manager.getControl('Title').value = 'Animals'
+    >>> manager.getControl('Add').click()
+
+    >>> 'Animals' in manager.contents
+    True
+
+Now we log in as the frog:
+
+    >>> frog = Browser()
+    >>> frog.open('http://localhost/')
+    >>> frog.getLink('Log In').click()
+    >>> frog.getControl('Username').value = 'frog'
+    >>> frog.getControl('Password').value = 'pwd'
+    >>> frog.getControl('Log in').click()
+
+We should be redirected from the index page to the calendar
+
+    >>> frog.url
+    'http://localhost/persons/frog/calendar'
+
+And we should have permission to see the calendar:
+
+    >>> frog.headers['status']
+    '200 Ok'
+
+The daily view should be the default for a person's calendar:
+
+    >>> frog.getLink('My Calendar').click()
+    >>> 'calendar-view-day' in frog.contents
+    True
+
+Let's make sure that we can see the SchoolTool preferences page:
+
+    >>> frog.getLink('Frog').click()
+    >>> frog.getLink('Change Preferences').click()
+    >>> 'cal_periods' in frog.contents
+    True
+
+We should be able to see terms and schemas without authenticating:
+
+    >>> anonymous = Browser()
+    >>> anonymous.open('http://localhost/terms')
+    >>> anonymous.headers['status']
+    '200 Ok'
+
+    >>> anonymous.open('http://localhost/ttschemas')
+    >>> anonymous.headers['status']
+    '200 Ok'
+
+But you have to log in to see persons, groups, and other locations:
+
+    >>> anonymous.open('http://localhost/persons')
+    >>> print anonymous.url
+    http://localhost/@@login.html?forbidden=yes&nexturl=...
+
+    >>> anonymous.open('http://localhost/groups')
+    >>> print anonymous.url
+    http://localhost/@@login.html?forbidden=yes&nexturl=...
+
+    >>> anonymous.open('http://localhost/resources')
+    >>> print anonymous.url
+    http://localhost/@@login.html?forbidden=yes&nexturl=...
+
+The section container view points to the timetable import form:
+
+    >>> manager.open('http://localhost/sections')
+    >>> print manager.contents
+    <!DOCTYPE ...>
+    ...
+    <a href="http://localhost/sections/@@timetables-csvimport.html">Import
+    Sections</a>
+    ...
+
+This is a school, so we should add some courses
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('New Course').click()
+    >>> manager.getControl('Title').value = 'History'
+    >>> manager.getControl('Add').click()
+
+    >>> 'History' in manager.contents
+    True
+
+Let's see that course:
+
+    >>> manager.getLink('History').click()
+    >>> 'History' in manager.contents
+    True
+
+Lets create a section to add to that course:
+
+    >>> manager.getLink('New Section').click()
+    >>> manager.getControl('Code').value = 'HIS1'
+    >>> manager.getControl('Description').value = 'Section1'
+    >>> manager.getControl('Add').click()
+
+Notice we got redirected to the course we added the section to.
+
+    >>> print manager.contents
+    <!DOCTYPE ...>
+    ...
+    ...History...
+    ...
+    ...<h3>Sections</h3>
+    ...
+    ...<p>Section1</p>
+    ...
+
+Looking at the section:
+
+    >>> manager.getLink('(HIS1)').click()
+    >>> print manager.contents
+    <!DOCTYPE ...>
+    ...
+    ...Section of
+    <BLANKLINE>
+          <a href="http://localhost/courses/history">History</a>
+    <BLANKLINE>
+    ...
+
+Frog can't see the section's calendar by default
+
+    >>> frog.open('http://localhost/sections/his1/calendar')
+    >>> print frog.url
+    http://localhost/@@login.html?forbidden=yes&nexturl=...
+
+Frog's overlay portlet has just his own calendar and application
+calendar:
+
+    >>> frog.getLink('My Calendar').click()
+    >>> def print_portlet(contents):
+    ...     print analyze.queryHTML(
+    ...         'id("portlet-calendar-overlay")//table[@class="overlays"]', contents)[0]
+
+    >>> print_portlet(frog.contents)
+    <table class="overlays"><tr><th style="text-align: center">
+              <acronym title="Personal calendar">Cal</acronym>
+            </th>
+            <th><acronym title="Timetable calendar">TT</acronym></th>
+            <th></th>
+            <th></th>
+          </tr><tr style="background: #9db8d2"><td><input type="checkbox" checked disabled></td>
+            <td><input type="checkbox" name="my_timetable" checked></td>
+            <td style="width: 100%">My Calendar</td>
+            <td></td>
+          </tr><tr style="background: #e0b6af"><td><input type="checkbox" name="overlay:list" checked value="/"></td>
+            <td><input type="checkbox" name="overlay_timetables:list" checked value="/"></td>
+            <td style="width: 100%">SchoolTool</td>
+            <td><a class="go" style="background: #c1665a;
+                color: #c1665a" href="http://localhost/calendar">...</a></td>
+        </tr></table>
+
+As does Toad's:
+
+    >>> toad = Browser()
+    >>> toad.open('http://localhost/')
+    >>> toad.getLink('Log In').click()
+    >>> toad.getControl('Username').value = 'toad'
+    >>> toad.getControl('Password').value = 'doat'
+    >>> toad.getControl('Log in').click()
+
+    >>> toad.getLink('My Calendar').click()
+    >>> print_portlet(toad.contents)
+    <table class="overlays"><tr><th style="text-align: center">
+              <acronym title="Personal calendar">Cal</acronym>
+            </th>
+            <th><acronym title="Timetable calendar">TT</acronym></th>
+            <th></th>
+            <th></th>
+          </tr><tr style="background: #9db8d2"><td><input type="checkbox" checked disabled></td>
+            <td><input type="checkbox" name="my_timetable" checked></td>
+            <td style="width: 100%">My Calendar</td>
+            <td></td>
+          </tr><tr style="background: #e0b6af"><td><input type="checkbox" name="overlay:list" checked value="/"></td>
+            <td><input type="checkbox" name="overlay_timetables:list" checked value="/"></td>
+            <td style="width: 100%">SchoolTool</td>
+            <td><a class="go" style="background: #c1665a;
+                color: #c1665a" href="http://localhost/calendar">...</a></td>
+        </tr></table>
+
+Adding a teacher:
+
+    >>> manager.getLink('edit instructors').click()
+    >>> manager.getControl(name='add_item.frog').value = True
+    >>> manager.getControl('Add').click()
+
+    >>> print manager.contents
+    <BLANKLINE>
+    ...
+      <legend>Current Instructors</legend>
+    ...
+         <label for="remove_item.frog">Frog</label>
+    ...
+      <legend>Available Instructors</legend>
+    ...
+
+Now Frog is in the Instructors div
+
+    >>> manager.getControl('Cancel').click()
+    >>> print manager.contents
+    <!DOCTYPE ...>
+    ...
+    ...Section of
+    <BLANKLINE>
+          <a href="http://localhost/courses/history">History</a>
+    <BLANKLINE>
+    ...
+          <h3>Instructors</h3>
+          <ul>
+            <li>
+              <a href="http://localhost/persons/frog">Frog</a>
+            </li>
+          </ul>
+    ...
+
+Toad should still be able to see the course view even though it is
+showing bits of frog's personal information as well as the section
+list:
+
+    >>> toad.getLink('SchoolTool').click()
+    >>> toad.getLink('Courses').click()
+    >>> toad.getLink('History').click()
+    >>> print toad.url
+    http://localhost/courses/history
+
+Frog can see the calendar now
+
+    >>> frog.open('http://localhost/sections/his1/calendar')
+    >>> 'Calendar for HIS1' in frog.contents
+    True
+
+And Frog's overlay portlet shows the section:
+
+    >>> frog.getLink('My Calendar').click()
+    >>> print_portlet(frog.contents)
+    <table class="overlays"><tr><th style="text-align: center">
+              <acronym title="Personal calendar">Cal</acronym>
+            </th>
+            <th><acronym title="Timetable calendar">TT</acronym></th>
+            <th></th>
+            <th></th>
+          </tr><tr style="background: #9db8d2"><td><input type="checkbox" checked disabled></td>
+            <td><input type="checkbox" name="my_timetable" checked></td>
+            <td style="width: 100%">My Calendar</td>
+            <td></td>
+          </tr><tr style="background: #eed680"><td><input type="checkbox" name="overlay:list" checked value="/sections/his1"></td>
+            <td><input type="checkbox" name="overlay_timetables:list" value="/sections/his1"></td>
+            <td style="width: 100%">Frog -- History</td>
+            <td><a class="go" style="background: #d1940c;
+                color: #d1940c" href="http://localhost/sections/his1/calendar">...</a></td>
+        </tr><tr style="background: #e0b6af"><td><input type="checkbox" name="overlay:list" checked value="/"></td>
+            <td><input type="checkbox" name="overlay_timetables:list" checked value="/"></td>
+            <td style="width: 100%">SchoolTool</td>
+            <td><a class="go" style="background: #c1665a;
+                color: #c1665a" href="http://localhost/calendar">...</a></td>
+        </tr></table>
+
+If we fire Frog, in hopes of getting Salamander to step in:
+
+    >>> manager.getLink('edit instructors').click()
+    >>> manager.getControl(name='remove_item.frog').value = True
+    >>> manager.getControl('Remove').click()
+
+Frog can't see the section's calendar any more
+
+    >>> frog.open('http://localhost/sections/his1/calendar')
+    >>> print frog.url
+    http://localhost/@@login.html?forbidden=yes&nexturl=...
+
+and he's no longer an instructor:
+
+    >>> manager.getControl('Cancel').click()
+    >>> print manager.contents
+    <!DOCTYPE ...>
+    ...
+          <h3>Instructors</h3>
+          <ul>
+          </ul>
+    ...
+
+And the section's calendar is no longer in his overlay portlet.
+
+    >>> frog.getLink('My Calendar').click()
+    >>> print_portlet(frog.contents)
+    <table class="overlays"><tr><th style="text-align: center">
+              <acronym title="Personal calendar">Cal</acronym>
+            </th>
+            <th><acronym title="Timetable calendar">TT</acronym></th>
+            <th></th>
+            <th></th>
+          </tr><tr style="background: #9db8d2"><td><input type="checkbox" checked disabled></td>
+            <td><input type="checkbox" name="my_timetable" checked></td>
+            <td style="width: 100%">My Calendar</td>
+            <td></td>
+          </tr><tr style="background: #e0b6af"><td><input type="checkbox" name="overlay:list" checked value="/"></td>
+            <td><input type="checkbox" name="overlay_timetables:list" checked value="/"></td>
+            <td style="width: 100%">SchoolTool</td>
+            <td><a class="go" style="background: #c1665a;
+                color: #c1665a" href="http://localhost/calendar">...</a></td>
+        </tr></table>
+
+Adding a student:
+
+    >>> manager.getLink('edit individuals').click()
+    >>> manager.getControl(name='add_item.toad').value = True
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('HIS1').click()
+
+Now toad is in the Students div
+
+    >>> print manager.contents
+    <BLANKLINE>
+    ...
+    ...Section of
+    <BLANKLINE>
+        <a href="http://localhost/courses/history">History</a>
+    <BLANKLINE>
+    ...
+          <h3>Students</h3>
+    ...
+          <a href="http://localhost/persons/toad">Toad</a>
+    ...
+
+Toad can see the calendar now:
+
+    >>> toad.open('http://localhost/sections/his1/calendar')
+    >>> print toad.url
+    http://localhost/sections/his1/calendar
+
+And Toad's overlay portlet shows the section:
+
+    >>> toad.open('http://localhost/persons/toad/calendar')
+    >>> print_portlet(toad.contents)
+    <table class="overlays"><tr><th style="text-align: center">
+              <acronym title="Personal calendar">Cal</acronym>
+            </th>
+            <th><acronym title="Timetable calendar">TT</acronym></th>
+            <th></th>
+            <th></th>
+          </tr><tr style="background: #9db8d2"><td><input type="checkbox" checked disabled></td>
+            <td><input type="checkbox" name="my_timetable" checked></td>
+            <td style="width: 100%">My Calendar</td>
+            <td></td>
+          </tr><tr style="background: #eed680"><td><input type="checkbox" name="overlay:list" checked value="/sections/his1"></td>
+            <td><input type="checkbox" name="overlay_timetables:list" value="/sections/his1"></td>
+            <td style="width: 100%"> -- History</td>
+            <td><a class="go" style="background: #d1940c;
+                color: #d1940c" href="http://localhost/sections/his1/calendar">...</a></td>
+        </tr><tr style="background: #e0b6af"><td><input type="checkbox" name="overlay:list" checked value="/"></td>
+            <td><input type="checkbox" name="overlay_timetables:list" checked value="/"></td>
+            <td style="width: 100%">SchoolTool</td>
+            <td><a class="go" style="background: #c1665a;
+                color: #c1665a" href="http://localhost/calendar">...</a></td>
+        </tr></table>
+
+Though students can't see the section list (nor sections themselves) by
+default:
+
+    >>> frog.open('http://localhost/sections/his1')
+    >>> print frog.url
+    http://localhost/@@login.html?forbidden=yes&nexturl=...
+
+we can give them the permission:
+
+    >>> url = manager.url
+    >>> manager.open('http://localhost/access_control.html')
+    >>> manager.getControl('Everyone can view section information and calendars').click()
+    >>> manager.getControl('Apply').click()
+
+Students still aren't given the option to change the location:
+
+    >>> frog.open('http://localhost/sections/his1')
+    >>> print frog.url
+    http://localhost/sections/his1
+    >>> "change location" not in frog.contents
+    True
+
+
+Epilogue
+--------
+
+ vim: ft=rest


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/app.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/brokenview-ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/brokenview-ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/brokenview-ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser">
+
+  <page
+      name="breakit.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      class="schooltool.app.browser.ftests.test_all.BrokenView"
+      permission="zope.Public"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/brokenview-ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-recurrence.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-recurrence.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-recurrence.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,81 @@
+Regression test for broken weekly recurrence in far-off-UTC timezones
+=====================================================================
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.handleErrors = False
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.open('http://localhost/')
+
+Let's go to the user preferences view:
+
+    >>> manager.getLink("SchoolTool Manager").click()
+    >>> manager.getLink("Change Preferences").click()
+
+Let's set the timezone to Australia:
+
+    >>> manager.getControl("Time Zone").value = ["Australia/Canberra"]
+    >>> manager.getControl("Apply").click()
+
+Let go to the calendar, a particular day in fact:
+
+    >>> manager.getLink("My Calendar").click()
+    >>> manager.open(manager.url + '/2006-01-01')
+    >>> "Calendar for SchoolTool Manager - Sunday, January 1, 2006" \
+    ... in manager.contents
+    True
+
+Let's add an event:
+
+    >>> manager.getLink("8:00").click()
+    >>> manager.getControl("Title").value = "Foo bar"
+    >>> manager.getControl("Recurring").click()
+    >>> manager.getControl(name="field.recurrence_type").value = ["weekly"]
+
+We see Sunday checked and disabled:
+
+    >>> manager.getControl("Sun").selected
+    True
+    >>> manager.getControl("Sun").disabled
+    True
+
+We also check Wednesday:
+
+    >>> manager.getControl("Wed").click()
+
+And submit:
+
+    >>> manager.getControl("Add").click()
+
+Let's look back at the event edit view:
+
+    >>> manager.getLink("Foo bar").click()
+    >>> manager.getLink("edit event").click()
+
+We see Sunday and Wednesday checked and Sunday disabled:
+
+    >>> manager.getControl("Sun").selected
+    True
+    >>> manager.getControl("Wed").selected
+    True
+
+    >>> manager.getControl("Sun").disabled
+    True
+
+Let's look at the next Wednesday:
+
+    >>> manager.open("http://localhost/persons/manager/calendar/2006-01-04")
+    >>> "Calendar for SchoolTool Manager - Wednesday, January 4, 2006" \
+    ...                                             in manager.contents
+    True
+    >>> "Foo bar" in manager.contents
+    True
+
+And the following Sunday:
+
+    >>> manager.open("http://localhost/persons/manager/calendar/2006-01-08")
+    >>> "Calendar for SchoolTool Manager - Sunday, January 8, 2006" \
+    ...                                             in manager.contents
+    True
+    >>> "Foo bar" in manager.contents
+    True


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-recurrence.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-security.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-security.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-security.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,479 @@
+Functional doctest for calendaring
+==================================
+
+This test verifies the security checking for calendars.
+
+Set up
+------
+
+We will obviously need a SchoolTool instance.
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+    >>> 'SchoolTool' in manager.contents
+    True
+
+Let's create a person so that we can fool around with his calendar:
+
+    >>> from schooltool.app.browser.ftests import setup
+    >>> setup.addPerson('Frog', 'frog', 'pwd')
+
+Let's create more persons so that we can test access control.
+
+    >>> setup.addPerson('Toad', 'toad', 'doat')
+
+
+Adding new events
+-----------------
+
+Let the Frog add an ordinary event that takes place on 3rd February, 2005:
+
+    >>> frog = Browser()
+    >>> frog.open('http://localhost/')
+    >>> frog.getLink('Log In').click()
+    >>> frog.getControl('Username').value = 'frog'
+    >>> frog.getControl('Password').value = 'pwd'
+    >>> frog.getControl('Log in').click()
+
+    >>> frog.getLink('New Event').click()
+
+    >>> frog.getControl('Title').value = 'Sleeping'
+    >>> frog.getControl('Date').value = '2005-02-03'
+    >>> frog.getControl('Time').value = '01:00'
+    >>> frog.getControl('Duration').value = '500'
+
+    >>> frog.getControl('Add').click()
+
+Let's make Frog's calendar public:
+
+    >>> frog.getLink('Frog').click()
+    >>> frog.getLink('Change Preferences').click()
+    >>> frog.getControl('Make calendar public').click()
+    >>> frog.getControl('Apply').click()
+
+Toad should still not even see the new event links (but span tags instead):
+
+    >>> toad = Browser()
+    >>> toad.open('http://localhost/')
+    >>> toad.getLink('Log In').click()
+    >>> toad.getControl('Username').value = 'toad'
+    >>> toad.getControl('Password').value = 'doat'
+    >>> toad.getControl('Log in').click()
+
+    # Sigh, there is really no way to get to Frog's calendar :-(
+    >>> toad.handleErrors = False
+    >>> toad.open('http://localhost/persons/frog/calendar/2005-02-03')
+
+    >>> print toad.contents
+    <BLANKLINE>
+    ...
+      <h6 style="background: #7590ae">
+        <a href="http://localhost/persons/frog/calendar/..."
+           title="Sleeping">
+          Sleeping
+          <span class="start-end">
+            (<span>01:00</span>
+              - <span>09:20</span>)
+          </span>
+        </a>
+      </h6>
+    ...
+
+Now let Toad try to add an event on Frog's calendar (even though there is no
+link for it):
+
+    >>> toad.open('http://localhost/persons/frog/calendar/add.html')
+    Traceback (most recent call last):
+    ...
+    Unauthorized: (..., 'schooltool.edit')
+
+Let's make Toad a manager (that should give him the permission to add
+events to Frog's calendar):
+
+    >>> manager.open('http://localhost/groups/manager/@@members_persons.html')
+    >>> manager.getControl('Toad').click()
+    >>> manager.getControl('Add').click()
+
+Now the Toad can add events to Frog's calendar:
+
+    >>> toad.open('http://localhost/persons/frog/calendar/add.html')
+
+    >>> toad.getControl('Title').value = 'Dreaming'
+    >>> toad.getControl('Date').value = '2005-02-03'
+    >>> toad.getControl('Time').value = '01:00'
+    >>> toad.getControl('Duration').value = '500'
+
+    >>> toad.getControl('Add').click()
+
+
+# Editing events
+# --------------
+
+# Let's add a calendar through iCalendar PUT view (so we would know the event id):
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic frog:pwd
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:dummy-uid
+#     ... SUMMARY:Empty calendar
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """, handle_errors=False)
+#     HTTP/1.1 200 Ok
+#     Content-Length: 0
+#     Set-Cookie: ...
+#     <BLANKLINE>
+
+# Let the Frog modify this event:
+
+#     >>> frog.open('http://localhost/persons/frog/calendar/'
+#     ...           'dummy-uid/edit.html?date=2005-02-04')
+
+#     >>> frog.getControl('Title').value = 'Sleeping'
+#     >>> frog.getControl('Date').value = '2005-02-03'
+#     >>> frog.getControl('Time').value = '01:00'
+#     >>> frog.getControl('Duration').value = '500'
+#     >>> frog.getControl(name="field.duration_type").value = ['minutes']
+
+#     >>> frog.getControl('Update', index=1).click()
+
+# Now let the Toad try and modify the event too:
+
+#     >>> toad.open('http://localhost/persons/frog/calendar/'
+#     ...           'dummy-uid/edit.html?date=2005-02-04')
+#     Traceback (most recent call last):
+#     ...
+#     Unauthorized: (..., 'schooltool.edit')
+
+# Toad should not see the event delete link
+
+#     >>> toad.open('http://localhost/persons/frog/calendar/2005-02-03')
+#     >>> print toad.contents
+#     <BLANKLINE>
+#     ...
+#     <h6 style="background: #7590ae">
+#       <a href="http://localhost/persons/frog/calendar/dummy-uid"
+#          title="Sleeping">
+#         Sleeping
+#         <span class="start-end">
+#           (<span>01:00</span>
+#              -
+#            <span>09:20</span>)
+#         </span>
+#       </a>
+#     </h6>
+#     ...
+
+# Let's grant Toad the `modifyEvent` permission on Frog's calendar:
+
+#     >>> manager.getLink('Set Up Access').click()
+
+#     >>> toad_settings = manager.getControl(name='sb.person.toad')
+#     >>> toad_settings.value = ['schooltool.viewCalendar',
+#     ...                        'schooltool.addEvent',
+#     ...                        'schooltool.modifyEvent']
+
+#     >>> manager.getControl('Set Access', index=0).click()
+
+# Now let the Toad try and modify the event too:
+
+#     >>> toad.open('http://localhost/persons/frog/calendar/'
+#     ...           'dummy-uid/edit.html?date=2005-02-04')
+
+#     >>> toad.getControl('Title').value = 'Sleeping'
+#     >>> toad.getControl('Date').value = '2005-02-03'
+#     >>> toad.getControl('Time').value = '01:00'
+#     >>> toad.getControl('Duration').value = '500'
+
+#     >>> toad.getControl('Update', index=1).click()
+
+
+# Uploading iCalendar files
+# -------------------------
+
+# Random anonymous persons cannot see or overwrite someone's calendar
+
+#     >>> anonymous = Browser()
+#     >>> anonymous.handleErrors = False
+#     >>> anonymous.open('http://localhost/persons/frog/calendar.ics')
+#     Traceback (most recent call last):
+#     ...
+#     Unauthorized: (..., 'schooltool.viewCalendar')
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar.ics HTTP/1.1
+#     ... Host: localhost:7080
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:empty-calendar-placeholder at schooltool.org
+#     ... SUMMARY:Empty calendar
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """, handle_errors=False)
+#     Traceback (most recent call last):
+#     ...
+#     Unauthorized: (..., 'schooltool.viewCalendar')
+
+# The manager now allows Toad to only see Frog's calendar, but not modify it:
+
+#     >>> manager.getLink('Set Up Access').click()
+
+#     >>> toad_settings = manager.getControl(name='sb.person.toad')
+#     >>> toad_settings.value = ['schooltool.viewCalendar']
+
+#     >>> manager.getControl('Set Access', index=0).click()
+
+#     >>> toad.open('http://localhost/persons/frog/calendar/')
+#     >>> toad.headers['status']
+#     '200 Ok'
+
+#     >>> toad.open('http://localhost/persons/frog/calendar.ics')
+#     >>> toad.headers['status']
+#     '200 Ok'
+
+# So Toad cannot modify the calendar.
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic toad:doat
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid at example.com
+#     ... SUMMARY:Sample event
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """, handle_errors=False)
+#     Traceback (most recent call last):
+#     ...
+#     Unauthorized: (..., 'schooltool.addEvent')
+
+# Unless the manager grants him modification permissions too.
+
+#     >>> manager.getLink('Set Up Access').click()
+#     >>> toad_settings = manager.getControl(name='sb.person.toad')
+#     >>> toad_settings.value = ['schooltool.viewCalendar',
+#     ...                        'schooltool.addEvent',
+#     ...                        'schooltool.modifyEvent']
+#     >>> manager.getControl('Set Access', index=0).click()
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic toad:doat
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid at example.com
+#     ... SUMMARY:Sample event
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """, handle_errors=False)
+#     HTTP/1.1 200 Ok
+#     ...
+
+# The permissions are more finely-grained: If Toad has the `addEvent`
+# permission, but not modifyEvent, he can only add new events, but not modify or
+# delete existing ones.
+
+#     >>> manager.getLink('Set Up Access').click()
+#     >>> toad_settings = manager.getControl(name='sb.person.toad')
+#     >>> toad_settings.value = ['schooltool.viewCalendar',
+#     ...                        'schooltool.addEvent']
+#     >>> manager.getControl('Set Access', index=0).click()
+
+# Modification: forbidden
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic toad:doat
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid at example.com
+#     ... SUMMARY:Sample event (modified)
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """)
+#     HTTP/1.1 401 Unauthorized
+#     ...
+
+# Removal: forbidden
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic toad:doat
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:empty-calendar-placeholder at schooltool.org
+#     ... SUMMARY:Empty calendar
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """)
+#     HTTP/1.1 401 Unauthorized
+#     ...
+
+# Addition: allowed
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic toad:doat
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid2 at example.com
+#     ... SUMMARY:New event
+#     ... DTSTART:20050204T120000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid at example.com
+#     ... SUMMARY:Sample event
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """)
+#     HTTP/1.1 200 Ok
+#     ...
+
+# Now let's allow modification, but not addition
+
+#     >>> manager.getLink('Set Up Access').click()
+#     >>> toad_settings = manager.getControl(name='sb.person.toad')
+#     >>> toad_settings.value = ['schooltool.viewCalendar',
+#     ...                        'schooltool.modifyEvent']
+#     >>> manager.getControl('Set Access', index=0).click()
+
+# Removal: allowed
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic toad:doat
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid at example.com
+#     ... SUMMARY:Sample event
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """)
+#     HTTP/1.1 200 Ok
+#     ...
+
+# Modification: allowed
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic toad:doat
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid at example.com
+#     ... SUMMARY:Sample event (modified)
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT2H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """)
+#     HTTP/1.1 200 Ok
+#     ...
+
+# Addition: not allowed
+
+#     >>> print http(r"""
+#     ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+#     ... Authorization: Basic toad:doat
+#     ... Content-Length: 244
+#     ... Content-Type: text/calendar
+#     ...
+#     ... BEGIN:VCALENDAR
+#     ... VERSION:2.0
+#     ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid at example.com
+#     ... SUMMARY:Sample event (modified)
+#     ... DTSTART:20050204T100000
+#     ... DURATION:PT2H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... BEGIN:VEVENT
+#     ... UID:some-uid2 at example.com
+#     ... SUMMARY:New event
+#     ... DTSTART:20050204T120000
+#     ... DURATION:PT1H
+#     ... DTSTAMP:20050203T150000
+#     ... END:VEVENT
+#     ... END:VCALENDAR
+#     ... """)
+#     HTTP/1.1 401 Unauthorized
+#     ...
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal-security.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,885 @@
+Functional doctest for calendaring
+==================================
+
+Set up
+------
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.handleErrors = False
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.open('http://localhost/')
+    >>> 'SchoolTool' in manager.contents
+    True
+
+Let's create a person so that we can fool around with his calendar:
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Frog', 'frog', 'pwd')
+
+Let's create a second person so that we can test access control.
+
+    >>> addPerson('Toad', 'toad', 'doat')
+
+Also, let's create a group:
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('New Group').click()
+
+    >>> manager.getControl('Title').value = 'Animals'
+
+    >>> manager.getControl('Add').click()
+    >>> 'Animals' in manager.contents
+    True
+
+
+Calendar views
+--------------
+
+First, let's have a look at the person's empty calendar in iCalendar format.
+We should find just a placeholder there.
+
+    >>> frog = Browser()
+    >>> frog.handleErrors = False
+    >>> frog.open('http://localhost/')
+    >>> frog.getLink('Log In').click()
+    >>> frog.getControl('Username').value = 'frog'
+    >>> frog.getControl('Password').value = 'pwd'
+    >>> frog.getControl('Log in').click()
+
+    >>> frog.getLink('My Calendar').click()
+    >>> frog.getLink('Open in iCal').click()
+    >>> frog.headers['content-type']
+    'text/calendar; charset=UTF-8'
+    >>> print frog.contents
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    BEGIN:VEVENT
+    UID:empty-calendar-placeholder at schooltool.org
+    SUMMARY:Empty calendar
+    DTSTART:19700101T000000Z
+    DURATION:P0D
+    DTSTAMP:...
+    END:VEVENT
+    END:VCALENDAR
+    <BLANKLINE>
+
+Now just the VFREEBUSY component of calendar
+
+    # XXX: Where is the link for this file?
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/calendar.vfb')
+    >>> frog.headers['content-type']
+    'text/calendar; charset=UTF-8'
+    >>> print frog.contents
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    METHOD:PUBLISH
+    BEGIN:VFREEBUSY
+    END:VFREEBUSY
+    END:VCALENDAR
+    <BLANKLINE>
+
+Let's render the weekly calendar view:
+
+    # XXX: There is no link in the app for this URL.
+    >>> frog.open('http://localhost/persons/frog/calendar/weekly.html')
+    >>> frog.headers['status']
+    '200 Ok'
+
+Now let's render the monthly calendar view:
+
+    # XXX: There is no link in the app for this URL.
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/monthly.html')
+    >>> frog.headers['status']
+    '200 Ok'
+
+The yearly calendar view should also be rendered just fine:
+
+    # XXX: There is no link in the app for this URL.
+    >>> frog.open('http://localhost/persons/frog/calendar/yearly.html')
+    >>> frog.headers['status']
+    '200 Ok'
+
+The daily calendar view works too:
+
+    # XXX: There is no link in the app for this URL.
+    >>> frog.open('http://localhost/persons/frog/calendar/daily.html')
+    >>> frog.headers['status']
+    '200 Ok'
+
+The atom view should be here
+
+    # XXX: There is no link in the app for this URL.
+    >>> frog.open('http://localhost/persons/frog/calendar/atom.xml')
+    >>> frog.headers['status']
+    '200 Ok'
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    <feed xmlns="http://purl.org/atom/ns#"
+    ...
+    </feed>
+
+While PDF views will always be disabled when SchoolBell is running as a
+content object in Zope 3, it may be possible to enable PDF views for this
+test.  We shall try to enable them.
+
+    >>> from schooltool.app.browser.tests.test_pdfcal import tryToSetUpReportLab
+    >>> pdf_enabled = tryToSetUpReportLab()
+
+    >>> if pdf_enabled:
+    ...     frog.open('http://localhost/'
+    ...               'persons/frog/calendar/2005-07-01.pdf')
+    ...     '%PDF-1.3' in frog.contents
+    ... else:
+    ...     True
+    True
+
+Let's make sure that the site-wide calendar is rendered, assuming that PDF
+support is enabled.
+
+    >>> if pdf_enabled:
+    ...     manager.open('http://localhost/calendar/2005-07-01.pdf')
+    ...     '%PDF-1.3' in frog.contents
+    ... else:
+    ...     True
+    True
+
+Now we will try disabling PDF views and check if the switch works.
+
+    >>> from schooltool.app.browser import pdfcal
+    >>> real_pdfcal_disabled = pdfcal.disabled
+    >>> pdfcal.disabled = True
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/2005-07-01.pdf')
+    >>> frog.headers['content-type']
+    'text/plain;charset=utf-8'
+    >>> print frog.contents
+    <BLANKLINE>
+    PDF support is disabled...
+
+    >>> pdfcal.disabled = real_pdfcal_disabled
+
+The daily view should be the default:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/')
+    >>> 'calendar-view-day' in frog.contents
+    True
+
+You can also use nice URLs for the calendar views:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2004-07-15')
+    >>> 'calendar-view-day' in frog.contents
+    True
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2004-07')
+    >>> 'calendar-view-month' in frog.contents
+    True
+
+
+Adding new events
+-----------------
+
+Let's add an ordinary event that takes place on 3rd February, 2005:
+
+    >>> frog.getLink('New Event').click()
+
+    >>> frog.getControl('Title').value = 'Sleeping'
+    >>> frog.getControl('Date').value = '2005-02-03'
+    >>> frog.getControl('Time').value = '01:00'
+    >>> frog.getControl('Duration').value = '500'
+
+    >>> frog.getControl('Add').click()
+
+The event should be visible in the daily calendar view:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-03')
+    >>> 'Sleeping' in frog.contents
+    True
+
+We should be able to find the event in the iCalendar view too.  This time,
+let's use an aliased URL (directly on the person rather than on the calendar):
+
+    >>> frog.getLink('Open in iCal').click()
+    >>> print frog.contents
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ...BEGIN:VEVENT
+    UID:...
+    SUMMARY:Sleeping
+    DTSTART:20050203T010000Z
+    DURATION:PT8H20M
+    DTSTAMP:...
+    END:VEVENT...
+    END:VCALENDAR
+    <BLANKLINE>
+
+And lets make sure that time is listed as BUSY
+
+    >>> frog.open('http://localhost/persons/frog/calendar/calendar.vfb')
+    >>> print frog.contents
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    METHOD:PUBLISH
+    BEGIN:VFREEBUSY
+    FREEBUSY:20050203T010000/20050203T09200000Z
+    END:VFREEBUSY
+    END:VCALENDAR
+    <BLANKLINE>
+
+Check the other views:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-w05')
+    >>> 'Sleeping' in frog.contents
+    True
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02')
+    >>> 'Sleeping' in frog.contents
+    True
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005')
+    >>> 'class="cal_yearly_day_busy">3</a>' in frog.contents
+    True
+
+Now let's add an allday event 29th March, 2005:
+
+    >>> frog.getLink('New Event').click()
+
+    >>> frog.getControl('Title').value = 'A Birthday'
+    >>> frog.getControl('Date').value = '2005-03-29'
+    >>> frog.getControl('All day').click()
+
+    >>> frog.getControl('Add').click()
+
+The event should be visible in the daily calendar view but separate from
+normal events
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-03-29')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    ...A Birthday...
+    ...
+    ...calendar-view-day...
+    ...
+
+We should see it in all the views:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-w13')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    ...Current week...
+    ...
+    <span>A Birthday</span>
+    (<span>All day</span>)
+    ...
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-03')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    ...Current month...
+    ...
+    <span>A Birthday</span>
+    (<span>All day</span>)
+    ...
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    ...Current year...
+    ...
+    ...class="cal_yearly_day_busy">3</a>...
+    ...
+    ...class="cal_yearly_day_busy">29</a>...
+    ...
+
+
+At some point, Frog has to go to bed every night. So a few years down the
+road, let's create a recurring event.
+
+    >>> print http(r"""
+    ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+    ... Host: localhost:7080
+    ... Authorization: Basic frog:pwd
+    ... Content-Type: text/calendar
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:lalala/fooo
+    ... SUMMARY:Sleep alot
+    ... DTSTART:20070205T100000
+    ... DURATION:PT1H
+    ... DTSTAMP:20070205T150000
+    ... RRULE:FREQ=DAILY;INTERVAL=1
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+
+Let's see that in all the views
+
+Daily:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2007-02-05')
+    >>> 'Sleep alot' in frog.contents
+    True
+
+It recurs
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2007-02-06')
+    >>> 'Sleep alot' in frog.contents
+    True
+
+Regression test for events with ids that have slashes in them:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2007-02-06')
+    >>> frog.getLink('Sleep alot').click()
+
+    >>> import re
+    >>> frog.open('http://localhost/persons/frog/calendar/2007-w6')
+    >>> contents = analyze.queryHTML('//div[@id="column-center"]', frog.contents)[0]
+    >>> len(re.findall('Sleep alot', contents))
+    14
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2007-02')
+    >>> contents = analyze.queryHTML('//div[@id="column-center"]', frog.contents)[0]
+    >>> len(re.findall('Sleep alot', contents))
+    28
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2007-02')
+    >>> len(re.findall('cal_yearly_day_busy', frog.contents))
+    55
+
+Let's just check that when we update the form, the duration type last entered
+is preserved (regression test for http://issues.schooltool.org/issue197):
+
+    >>> frog.getLink('New Event').click()
+
+    >>> frog.getControl('Title').value = 'A Birthday'
+    >>> frog.getControl('Date').value = '2005-03-29'
+    >>> frog.getControl('All day').click()
+    >>> frog.getControl(name='field.duration_type').value = ['hours']
+
+    >>> frog.getControl('Update form').click()
+    >>> '<option value="hours" selected="selected">' in frog.contents
+    True
+
+The duration should be set even if form has errors in it:
+
+    >>> frog.getLink('New Event').click()
+
+    >>> frog.getControl('Date').value = '2005-03-29'
+    >>> frog.getControl('All day').click()
+    >>> frog.getControl(name='field.duration_type').value = ['hours']
+
+    >>> frog.getControl('Add').click()
+    >>> '<option value="hours" selected="selected">' in frog.contents
+    True
+
+
+Editing events
+--------------
+
+Let's add a calendar through iCalendar PUT view (so we would know the event id):
+
+    >>> print http(r"""
+    ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+    ... Host: localhost:7080
+    ... Authorization: Basic frog:pwd
+    ... Content-Type: text/calendar
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:dummy-uid
+    ... SUMMARY:Important event
+    ... DTSTART:20050204T100000
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+Let's see what the breadcrumbs are for this event:
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/ZHVtbXktdWlk/edit.html')
+    >>> print analyze.queryHTML('//div[@class="breadcrumbs"]',
+    ...                         frog.contents)[0]
+    <div class="breadcrumbs">
+      <a href="http://localhost">SchoolTool</a>
+      &raquo;
+      <a href="http://localhost/persons">persons</a>
+      &raquo;
+      <a href="http://localhost/persons/frog">Frog</a>
+      &raquo;
+      <a href="http://localhost/persons/frog/calendar">Calendar</a>
+      &raquo;
+      <a href="http://localhost/persons/frog/calendar/ZHVtbXktdWlk/edit.html">Important event</a>
+    </div>
+
+Let Frog modify this event:
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/ZHVtbXktdWlk/edit.html?date=2005-02-04')
+    >>> frog.getControl('Title').value = 'Sleeping'
+    >>> frog.getControl('Date').value = '2005-02-03'
+    >>> frog.getControl('Time').value = '01:00'
+    >>> frog.getControl('Duration').value = '500'
+    >>> frog.getControl('Update', index=1).click()
+
+Let's check the new values.  Also, notice that the date value from the
+request got into a hidden field:
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/ZHVtbXktdWlk/edit.html')
+    >>> 'Sleeping' in frog.contents
+    True
+    >>> '2005-02-03' in frog.contents
+    True
+    >>> '01:00' in frog.contents
+    True
+    >>> '500' in frog.contents
+    True
+
+Let's enter some invalid values:
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/ZHVtbXktdWlk/edit.html?date=2005-02-04')
+
+    >>> frog.getControl('Date').value = '20050203'
+    >>> frog.getControl('Time').value = '0100'
+    >>> frog.getControl('Duration').value = '500h'
+
+    >>> frog.getControl('Update', index=1).click()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    ...<input type="hidden" name="date" value="2005-02-04" />
+    ...
+    ...<input class="textType" id="field.start_date" name="field.start_date" size="10" type="text" value="20050203"  />
+    ...<div class="error"><span class="error">Invalid datetime data</span></div>
+    ...
+    ...<input class="textType" id="field.duration" name="field.duration" size="10" type="text" value="500h"  />
+    ...</div>
+      <div class="clear">&nbsp;</div>
+      <div class="error"><span class="error">Invalid integer data</span></div>
+    ...
+
+If we cancel the form - we should be redirected to the day "date" tells us:
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/ZHVtbXktdWlk/edit.html?date=2005-02-07')
+    >>> frog.getControl('Cancel').click()
+
+    # XXX: This test says nothing; in fact it shows that this feature does not
+    #      work.
+    #>>> '2005-02-07' in frog.contents
+    #True
+
+Let's change the recurrence of the event a bit more this time:
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/ZHVtbXktdWlk/edit.html')
+
+    >>> frog.getControl('Recurring').click()
+    >>> frog.getControl(name='field.recurrence_type').value = ['monthly']
+    >>> frog.getControl('1st Thursday of every month').click()
+    >>> frog.getControl('Repeat until').click()
+    >>> frog.getControl(name='field.until').value = '2005-12-01'
+
+    >>> frog.getControl('Update', index=1).click()
+
+Let's check the new values:
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/ZHVtbXktdWlk/edit.html')
+
+    >>> frog.getControl('Recurring').selected
+    True
+    >>> frog.getControl(name='field.recurrence_type').value
+    ['monthly']
+    >>> frog.getControl('1st Thursday of every month').selected
+    True
+    >>> frog.getControl('Repeat until').selected
+    True
+    >>> frog.getControl(name='field.until').value
+    '2005-12-01'
+
+
+Uploading iCalendar files
+-------------------------
+
+We can try and put an updated calendar:
+
+    >>> print http("""
+    ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+    ... Host: localhost:7080
+    ... Authorization: Basic frog:pwd
+    ... Content-Type: text/calendar
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:empty-calendar-placeholder at schooltool.org
+    ... SUMMARY:Empty calendar
+    ... DTSTART:20050204T100000
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+This should have cleared the calendar.
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-03')
+    >>> 'Sleeping' in frog.contents
+    False
+
+
+Calendar overlaying
+-------------------
+
+SchoolTool lets users overlay calendars of other users and groups, and see all
+calendar events in one view.  When you are logged in, and you look at your own
+calendar, you will see a new portlet on the left:
+
+    >>> frog.getLink('My Calendar').click()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+      <div id="portlet-calendar-overlay" class="portlet">
+    <BLANKLINE>
+      <h4>Calendars</h4>
+    <BLANKLINE>
+    ...
+            <td style="width: 100%">My Calendar</td>
+    ...
+          <input name="OVERLAY_APPLY" type="submit"
+                 value="Apply" />
+          <input name="OVERLAY_MORE" type="submit"
+                 value="More..." />
+    ...
+      </form>
+    </div>
+    ...
+
+Initially it contains only your own calendar.  You can click on "More..."
+and add other calendars to this list.
+
+    >>> frog.getControl('More...').click()
+
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+        <fieldset class="inline">
+          <legend>Groups</legend>
+          <p>
+              There are no groups with calendars accessible to you.
+            </p>
+    <BLANKLINE>
+        </fieldset>
+    ...
+
+Let's allow frog to see all the group calendars:
+
+    >>> manager.open('http://localhost/access_control.html')
+    >>> manager.getControl('Everyone can view group calendars').click()
+    >>> manager.getControl('Apply').click()
+
+Reload the overlay list, and there we have all the groups:
+
+    >>> frog.reload()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+        <fieldset class="inline">
+          <legend>Groups</legend>
+    <BLANKLINE>
+          <select size="8" multiple="multiple" id="groups"
+                  name="groups:list">
+            <option value="animals">Animals</option>
+            <option value="clerks">Clerks</option>
+            <option value="administrators">School Administrators</option>
+            <option value="manager">Site Managers</option>
+            <option value="students">Students</option>
+            <option value="teachers">Teachers</option>
+          </select>
+        </fieldset>
+    ...
+
+    >>> frog.getControl('Animals').click()
+    >>> frog.getControl('Clerks').click()
+    >>> frog.getControl('Apply').click()
+
+Now, you can see many calendars in the overlay portlet: animals,
+other built-in groups and the application calendar
+
+    >>> frog.getLink('My Calendar').click()
+    >>> 'Animals' in frog.contents
+    True
+    >>> print analyze.queryHTML('//td[text()="SchoolTool"]', frog.contents)[0]
+    <td style="width: 100%">SchoolTool</td>
+
+Let's remove the application calendar from the overlay
+
+    >>> frog.getControl('More...').click()
+
+    >>> frog.getControl('SchoolTool site-wide calendar').click()
+    >>> frog.getControl('Apply').click()
+
+Now the application calendar is no longer in the overlay portlet
+
+    >>> frog.getLink('My Calendar').click()
+    >>> analyze.queryHTML('//td[text()="SchoolTool"]', frog.contents)
+    []
+
+If we restrict permissions on the application calendar, it will no longer be
+available in the overlay selection view:
+
+Demonstrate that it is there now:
+
+    >>> frog.getControl('More...').click()
+    >>> frog.getControl('SchoolTool site-wide calendar')
+    <ItemControl name='application' type='checkbox' optionValue='application' selected=False>
+
+Restrict permissions on the application calendar
+
+    >>> manager.open('http://localhost/access_control.html')
+    >>> manager.getControl('Everyone can view the application calendar').click()
+    >>> manager.getControl('Apply').click()
+
+And now it's gone
+
+    >>> frog.reload()
+    >>> frog.getControl('SchoolTool site-wide calendar')
+    Traceback (most recent call last):
+    ...
+    LookupError: label 'SchoolTool site-wide calendar'
+
+Regression test for Issue243 (Calendars with identical titles are
+throwing system error):
+
+    >>> frog.getLink('My Calendar').click()
+    >>> len(analyze.queryHTML('//td[text()="Clerks"]', frog.contents))
+    1
+
+Rename the group so its title would be Managers:
+
+    >>> manager.open('http://localhost')
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('Animals').click()
+    >>> manager.getLink('Edit Info').click()
+
+    >>> manager.getControl('Title').value = 'Clerks'
+    >>> manager.getControl('Apply').click()
+
+Calendars with identical titles will get sorted in random order so I
+am just checking that they are there:
+
+    >>> frog.reload()
+    >>> len(analyze.queryHTML('//td[text()="Clerks"]', frog.contents))
+    2
+
+Rename the group back to Animals:
+
+    >>> manager.getLink('Edit Info').click()
+    >>> manager.getControl('Title').value = 'Animals'
+    >>> manager.getControl('Apply').click()
+
+Now, if there are events in the animals' and toad's calendars, you can
+see them:
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('Clerks').click()
+    >>> manager.getLink('View Calendar').click()
+    >>> manager.getLink('New Event').click()
+
+    >>> manager.getControl('Title').value = 'Eat flies'
+    >>> manager.getControl('Date').value = '2005-02-03'
+    >>> manager.getControl('Time').value = '09:00'
+    >>> manager.getControl('Duration').value = '30'
+    >>> manager.getControl('Add').click()
+
+    >>> manager.getLink('SchoolTool').click()
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('Animals').click()
+    >>> manager.getLink('View Calendar').click()
+    >>> manager.getLink('New Event').click()
+
+    >>> manager.getControl('Title').value = 'Daily meeting'
+    >>> manager.getControl('Date').value = '2005-02-03'
+    >>> manager.getControl('Time').value = '10:00'
+    >>> manager.getControl('Duration').value = '30'
+    >>> manager.getControl('Add').click()
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-03')
+    >>> 'Eat flies' in frog.contents
+    True
+    >>> 'Daily meeting' in frog.contents
+    True
+
+If the permissions to overlaid calendars are revoked, you can still
+see your calendar, albeit without overlaid events:
+
+    >>> manager.open('http://localhost/access_control.html')
+    >>> manager.getControl('Everyone can view group calendars').click()
+    >>> manager.getControl('Apply').click()
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-03')
+    >>> frog.headers['status']
+    '200 Ok'
+
+    >>> 'Eat flies' in frog.contents
+    False
+    >>> 'Daily meeting' in frog.contents
+    False
+
+
+The Tomorrow's events box
+-------------------------
+
+Warning, this test might break if run exactly at midnight, as the
+value of 'tomorrow' jumps to the next day.
+
+First of all, what is tomorrow?
+
+    >>> from datetime import date
+    >>> tomorrow = date.today() + date.resolution
+
+Now, let's add an event which will take place tomorrow:
+
+    >>> frog.getLink('My Calendar').click()
+    >>> frog.getLink('New Event').click()
+
+    >>> frog.getControl('Title').value = 'Important meeting'
+    >>> frog.getControl('Date').value = str(tomorrow)
+    >>> frog.getControl('Time').value = '12:00'
+    >>> frog.getControl('Duration').value = '60'
+    >>> frog.getControl('Add').click()
+
+We should see it in the calendar for today:
+
+    >>> frog.getLink('My Calendar').click()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    <div id="portlet-next-day-events" class="portlet">
+      <h4>Tomorrow's Events</h4>
+      <ul>
+    <BLANKLINE>
+         <li>
+           <a href="...
+              title="Important meeting"
+              style="color: #7590ae">
+             <strong>12:00</strong>
+             Important meeti...
+           </a>
+         </li>
+    <BLANKLINE>
+      </ul>
+    </div>
+    ...
+
+
+Now, let's take a look at the daily calendar for an arbitrary day.  It
+should have the event we have just created in the Tomorrow's events box.
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-01-01')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+         <div id="portlet-next-day-events" class="portlet">
+           <h4>Tomorrow's Events</h4>
+           <ul>
+    <BLANKLINE>
+             <li>
+               <a href="...
+                  title="Important meeting"
+                  style="color: #7590ae">
+                 <strong>12:00</strong>
+                 Important meeti...
+               </a>
+             </li>
+    <BLANKLINE>
+           </ul>
+         </div>
+    ...
+
+
+A Sunbird weekly recurrence workaround
+======================================
+
+It seems that Mozilla Calendar does not include the weekday of the
+first occurence of the event to the BYDAY list of weekdays the event
+recurs on.  So, in the recurrence editing form, we must always
+consider the weekday of the first recurrence of the event to be on, by
+adding a hidden input field beside a disabled checkbox:
+
+Let's add an event on 2005-01-01 (Saturday) that recurs on Tuesdays,
+too.  Notice we don't mark Saturday in the BYDAY list:
+
+    >>> print http(r"""
+    ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+    ... Host: localhost:7080
+    ... Authorization: Basic frog:pwd
+    ... Content-Type: text/calendar
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:important at event
+    ... SUMMARY:Important event
+    ... DTSTART:20050101T100000
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... RRULE:FREQ=WEEKLY;BYDAY=TU;INTERVAL=1
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+Now, let's get this event and see its RRULE:
+
+    >>> frog.open('http://localhost/'
+    ...           'persons/frog/calendar/calendar.ics')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    SUMMARY:Important event
+    RRULE:FREQ=WEEKLY;BYDAY=TU,SA;INTERVAL=1
+    ...


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/cal.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/composite-timetables.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/composite-timetables.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/composite-timetables.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,297 @@
+Timetabling in SchoolTool
+=========================
+
+This functional doctest demonstrates and tests SchoolTool's timetable
+browser views.
+
+We do most of the fixture setup through ReSTive views for now.  A lot of the
+code has been copied from rest/composite-timetables.txt.
+
+Overview
+--------
+
+1. Set up 1 Term, 1 Schema, a User and a a couple of Groups
+2. Add the User to both Groups
+3. Check composite Timetable for the User
+
+Prologue
+--------
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+    >>> 'SchoolTool' in manager.contents
+    True
+
+Add a term:
+
+    >>> print http(r"""
+    ... PUT /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+    ...             first="2003-09-01" last="2003-09-07">
+    ...     <title>2005 Fall</title>
+    ...     <daysofweek>Monday Tuesday Wednesday Thursday Friday</daysofweek>
+    ...     <holiday date="2003-09-03">Holiday</holiday>
+    ...     <holiday date="2003-09-06">Holiday</holiday>
+    ...     <holiday date="2003-09-23">Holiday</holiday>
+    ... </schooldays>
+    ... """)
+    HTTP/1.1 201 Created
+    Content-Length: 0
+    Location: ...
+    Set-Cookie: ...
+    <BLANKLINE>
+
+Add Schema:
+
+    >>> print rest(r"""
+    ... PUT /ttschemas/schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+    ...   <title>Some Title</title>
+    ...   <timezone name="UTC"/>
+    ...   <model factory="SequentialDaysTimetableModel">
+    ...     <daytemplate>
+    ...       <used when="default" />
+    ...       <period id="A" tstart="9:00" duration="60" />
+    ...       <period id="C" tstart="9:00" duration="60" />
+    ...       <period id="B" tstart="10:00" duration="60" />
+    ...       <period id="D" tstart="10:00" duration="60" />
+    ...     </daytemplate>
+    ...     <daytemplate>
+    ...       <used when="Friday Thursday" />
+    ...       <period id="A" tstart="8:00" duration="60" />
+    ...       <period id="C" tstart="8:00" duration="60" />
+    ...       <period id="B" tstart="11:00" duration="60" />
+    ...       <period id="D" tstart="11:00" duration="60" />
+    ...     </daytemplate>
+    ...   </model>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...     </period>
+    ...     <period id="D">
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    Content-Length: 0
+    ...
+
+Let's create a person so that we can fool around with his calendar:
+
+    >>> from schooltool.app.browser.ftests import setup
+    >>> setup.addPerson('John', 'john', 'pwd')
+
+Add 2 groups:
+
+    >>> print rest("""
+    ... PUT /groups/boys HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Boys"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /groups/guys HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Guys"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Add John to boys and guys:
+
+    >>> print rest("""
+    ... POST /persons/john/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/groups/boys"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /persons/john/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/groups/guys"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+Add a course:
+
+    >>> print rest("""
+    ... PUT /courses/birdwatching HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+And a couple of sections:
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding1"
+    ...         course="birding" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-2 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding2"
+    ...         course="birding" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Let's add guys and boys to different sections:
+
+    >>> print rest("""
+    ... POST /groups/guys/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...  xlink:href="http://localhost/sections/birdwatching-1"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /groups/boys/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...  xlink:href="http://localhost/sections/birdwatching-2"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+Add section timetables:
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-1/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...       <activity title="English for boys"/>
+    ...     </period>
+    ...     <period id="D">
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-2/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...     </period>
+    ...     <period id="D">
+    ...       <activity title="English for tough guys"/>
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+Finally, we're done with setup.
+
+Rendering views
+---------------
+
+Let's look at John's composite calendar:
+
+    >>> print http(r"""
+    ... GET /persons/john/calendar/2003-09-02 HTTP/1.1
+    ... Authorization: Basic john:pwd""", handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    ...
+    English for boys
+    ...
+    English for tou...
+    ...
+
+
+Epilogue
+--------
+
+ vim: ft=rest


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/composite-timetables.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/deletion.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/deletion.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/deletion.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,83 @@
+Deleting SchoolBell objects
+===========================
+
+This is, partially, a regression test.  When you delete a SchoolBell object,
+all of its relationships should be broken -- otherwise other related object
+will have references to an object that does not exist (due to ZODB garbage
+collection semantics the object will exist, but it will have no __parent__
+and will, therefore, break views that try to determine its absolute URL).
+
+Set up
+------
+
+We go to the front page
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+    >>> 'SchoolTool' in manager.contents
+    True
+
+We add a group
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('New Group').click()
+
+    >>> manager.getControl('Title').value = 'group1'
+    >>> manager.getControl('Add').click()
+
+    >>> 'group1' in manager.contents
+    True
+
+We add a person
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('person1', 'person', groups=['group1'])
+
+We look at the groups of the person we added
+
+    >>> manager.open('http://localhost/persons')
+    >>> manager.getLink('person1').click()
+
+    >>> 'group1' in manager.contents
+    True
+
+We look at the members of the group
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('group1').click()
+    >>> 'person1' in manager.contents
+    True
+
+
+Test
+----
+
+We delete the person
+
+    >>> manager.getLink('Persons').click()
+    >>> manager.getControl(name='delete.person').value = ['on']
+    >>> manager.getControl('Delete').click()
+    >>> manager.getControl('Confirm').click()
+
+It is no longer there
+
+    >>> manager.getLink('Persons').click()
+    >>> 'person1' not in manager.contents
+    True
+
+We look at the members of the group (this used to cause internal errors in an
+earlier version of SchoolTool):
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('group1').click()
+    >>> manager.headers['status']
+    '200 Ok'
+
+'person1' is no longer there
+
+    >>> 'person1' not in manager.contents
+    True
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/deletion.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/errors.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/errors.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/errors.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,53 @@
+Error handling in browser views
+===============================
+
+
+NotFound
+--------
+
+When you go to a location that doesn't exist, you get a pretty standard
+404 error page
+
+    >>> print http("""
+    ... GET /nosuchthing HTTP/1.1
+    ... """)
+    HTTP/1.1 404 Not Found
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+        <title>Not Found</title>
+    ...
+              <h1>Not Found</h1>
+    ...
+    <h3>
+      The page that you are trying to access is not available
+    </h3>
+    ...
+    SchoolTool&trade; is a Trademark of The Shuttleworth Foundation.
+    ...
+
+Internal server errors
+----------------------
+
+When an internal server error happens, we show a nice view pointing to our
+issue tracker. For testing purposes a view that causes a runtime error has
+been registered. Now, let's trigger it:
+
+    >>> print http("""
+    ... GET /breakit.html HTTP/1.1
+    ... """)
+    HTTP/1.1 500 Internal Server Error
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <title>Server Error</title>
+    ...
+    <h1>Server Error</h1>
+    ...
+    ...Houston, we've got a problem...
+    ...
+    SchoolTool&trade; is a Trademark of The Shuttleworth Foundation.
+    ...
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/errors.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1-tiny.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1-tiny.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1.dot
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1.dot	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1.dot	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,31 @@
+digraph "Timetable Schema Wizard" {
+  FirstStep -> CycleStep [style="bold"];
+  CycleStep -> IndependentDaysStep [style="bold"];
+  CycleStep -> DayEntryStep;
+  DayEntryStep -> IndependentDaysStep;
+  IndependentDaysStep -> SimpleSlotEntryStep [style="bold"];
+  IndependentDaysStep -> WeeklySlotEntryStep;
+  IndependentDaysStep -> SequentialModelStep;
+  SequentialModelStep -> WeeklySlotEntryStep;
+  SequentialModelStep -> RotatingSlotEntryStep;
+  SimpleSlotEntryStep -> NamedPeriodsStep [style="bold"];
+  RotatingSlotEntryStep -> NamedPeriodsStep;
+  WeeklySlotEntryStep -> NamedPeriodsStep;
+  NamedPeriodsStep -> PeriodNamesStep;
+  NamedPeriodsStep -> HomeroomStep [style="bold"];
+  PeriodNamesStep -> PeriodOrderSimple;
+  PeriodNamesStep -> PeriodOrderComplex;
+  PeriodOrderSimple -> HomeroomStep;
+  PeriodOrderComplex -> HomeroomStep;
+  HomeroomStep -> FinalStep [style="bold"];
+  HomeroomStep -> HomeroomPeriodsStep;
+  HomeroomPeriodsStep -> FinalStep;
+
+  FirstStep[style="filled"];
+  CycleStep[style="filled"];
+  IndependentDaysStep[style="filled"];
+  SimpleSlotEntryStep[style="filled"];
+  NamedPeriodsStep[style="filled"];
+  HomeroomStep[style="filled"];
+  FinalStep[style="filled"];
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-1.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2-tiny.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2-tiny.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2.dot
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2.dot	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2.dot	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+digraph "Timetable Schema Wizard" {
+  FirstStep -> CycleStep [style="bold"];
+  CycleStep -> IndependentDaysStep;
+  CycleStep -> DayEntryStep [style="bold"];
+  DayEntryStep -> IndependentDaysStep [style="bold"];
+  IndependentDaysStep -> SimpleSlotEntryStep [style="bold"];
+  IndependentDaysStep -> WeeklySlotEntryStep;
+  IndependentDaysStep -> SequentialModelStep;
+  SequentialModelStep -> WeeklySlotEntryStep;
+  SequentialModelStep -> RotatingSlotEntryStep;
+  SimpleSlotEntryStep -> NamedPeriodsStep [style="bold"];
+  RotatingSlotEntryStep -> NamedPeriodsStep;
+  WeeklySlotEntryStep -> NamedPeriodsStep;
+  NamedPeriodsStep -> PeriodNamesStep [style="bold"];
+  NamedPeriodsStep -> HomeroomStep;
+  PeriodNamesStep -> PeriodOrderSimple [style="bold"];
+  PeriodNamesStep -> PeriodOrderComplex;
+  PeriodOrderSimple -> HomeroomStep [style="bold"];
+  PeriodOrderComplex -> HomeroomStep;
+  HomeroomStep -> FinalStep;
+  HomeroomStep -> HomeroomPeriodsStep [style="bold"];
+  HomeroomPeriodsStep -> FinalStep [style="bold"];
+
+  FirstStep[style="filled"];
+  CycleStep[style="filled"];
+  DayEntryStep[style="filled"];
+  IndependentDaysStep[style="filled"];
+  SimpleSlotEntryStep[style="filled"];
+  NamedPeriodsStep[style="filled"];
+  PeriodNamesStep[style="filled"];
+  PeriodOrderSimple[style="filled"];
+  HomeroomStep[style="filled"];
+  HomeroomPeriodsStep[style="filled"];
+  FinalStep[style="filled"];
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-2.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3-tiny.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3-tiny.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3.dot
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3.dot	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3.dot	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,34 @@
+digraph "Timetable Schema Wizard" {
+  FirstStep -> CycleStep [style="bold"];
+  CycleStep -> IndependentDaysStep;
+  CycleStep -> DayEntryStep [style="bold"];
+  DayEntryStep -> IndependentDaysStep [style="bold"];
+  IndependentDaysStep -> SimpleSlotEntryStep [style="bold"];
+  IndependentDaysStep -> WeeklySlotEntryStep;
+  IndependentDaysStep -> SequentialModelStep;
+  SequentialModelStep -> WeeklySlotEntryStep;
+  SequentialModelStep -> RotatingSlotEntryStep;
+  SimpleSlotEntryStep -> NamedPeriodsStep [style="bold"];
+  RotatingSlotEntryStep -> NamedPeriodsStep;
+  WeeklySlotEntryStep -> NamedPeriodsStep;
+  NamedPeriodsStep -> PeriodNamesStep [style="bold"];
+  NamedPeriodsStep -> HomeroomStep;
+  PeriodNamesStep -> PeriodOrderSimple;
+  PeriodNamesStep -> PeriodOrderComplex [style="bold"];
+  PeriodOrderSimple -> HomeroomStep;
+  PeriodOrderComplex -> HomeroomStep [style="bold"];
+  HomeroomStep -> FinalStep [style="bold"];
+  HomeroomStep -> HomeroomPeriodsStep;
+  HomeroomPeriodsStep -> FinalStep;
+
+  FirstStep[style="filled"];
+  CycleStep[style="filled"];
+  DayEntryStep[style="filled"];
+  IndependentDaysStep[style="filled"];
+  SimpleSlotEntryStep[style="filled"];
+  NamedPeriodsStep[style="filled"];
+  PeriodNamesStep[style="filled"];
+  PeriodOrderComplex[style="filled"];
+  HomeroomStep[style="filled"];
+  FinalStep[style="filled"];
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-3.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4-tiny.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4-tiny.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4.dot
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4.dot	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4.dot	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+digraph "Timetable Schema Wizard" {
+  FirstStep -> CycleStep [style="bold"];
+  CycleStep -> IndependentDaysStep [style="bold"];
+  CycleStep -> DayEntryStep;
+  DayEntryStep -> IndependentDaysStep;
+  IndependentDaysStep -> SimpleSlotEntryStep;
+  IndependentDaysStep -> WeeklySlotEntryStep [style="bold"];
+  IndependentDaysStep -> SequentialModelStep;
+  SequentialModelStep -> WeeklySlotEntryStep;
+  SequentialModelStep -> RotatingSlotEntryStep;
+  SimpleSlotEntryStep -> NamedPeriodsStep;
+  RotatingSlotEntryStep -> NamedPeriodsStep;
+  WeeklySlotEntryStep -> NamedPeriodsStep [style="bold"];
+  NamedPeriodsStep -> PeriodNamesStep [style="bold"];
+  NamedPeriodsStep -> HomeroomStep;
+  PeriodNamesStep -> PeriodOrderSimple;
+  PeriodNamesStep -> PeriodOrderComplex [style="bold"];
+  PeriodOrderSimple -> HomeroomStep;
+  PeriodOrderComplex -> HomeroomStep [style="bold"];
+  HomeroomStep -> FinalStep [style="bold"];
+  HomeroomStep -> HomeroomPeriodsStep;
+  HomeroomPeriodsStep -> FinalStep;
+
+  FirstStep[style="filled"];
+  CycleStep[style="filled"];
+  IndependentDaysStep[style="filled"];
+  WeeklySlotEntryStep[style="filled"];
+  NamedPeriodsStep[style="filled"];
+  PeriodNamesStep[style="filled"];
+  PeriodOrderComplex[style="filled"];
+  HomeroomStep[style="filled"];
+  FinalStep[style="filled"];
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-4.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5-tiny.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5-tiny.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5.dot
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5.dot	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5.dot	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+digraph "Timetable Schema Wizard" {
+  FirstStep -> CycleStep [style="bold"];
+  CycleStep -> IndependentDaysStep;
+  CycleStep -> DayEntryStep [style="bold"];
+  DayEntryStep -> IndependentDaysStep [style="bold"];
+  IndependentDaysStep -> SimpleSlotEntryStep;
+  IndependentDaysStep -> WeeklySlotEntryStep;
+  IndependentDaysStep -> SequentialModelStep [style="bold"];
+  SequentialModelStep -> WeeklySlotEntryStep [style="bold"];
+  SequentialModelStep -> RotatingSlotEntryStep;
+  SimpleSlotEntryStep -> NamedPeriodsStep;
+  RotatingSlotEntryStep -> NamedPeriodsStep;
+  WeeklySlotEntryStep -> NamedPeriodsStep [style="bold"];
+  NamedPeriodsStep -> PeriodNamesStep [style="bold"];
+  NamedPeriodsStep -> HomeroomStep;
+  PeriodNamesStep -> PeriodOrderSimple;
+  PeriodNamesStep -> PeriodOrderComplex [style="bold"];
+  PeriodOrderSimple -> HomeroomStep;
+  PeriodOrderComplex -> HomeroomStep [style="bold"];
+  HomeroomStep -> FinalStep [style="bold"];
+  HomeroomStep -> HomeroomPeriodsStep;
+  HomeroomPeriodsStep -> FinalStep;
+
+  FirstStep[style="filled"];
+  CycleStep[style="filled"];
+  DayEntryStep[style="filled"];
+  IndependentDaysStep[style="filled"];
+  SequentialModelStep[style="filled"];
+  WeeklySlotEntryStep[style="filled"];
+  NamedPeriodsStep[style="filled"];
+  PeriodNamesStep[style="filled"];
+  PeriodOrderComplex[style="filled"];
+  HomeroomStep[style="filled"];
+  FinalStep[style="filled"];
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-5.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6-tiny.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6-tiny.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6.dot
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6.dot	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6.dot	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+digraph "Timetable Schema Wizard" {
+  FirstStep -> CycleStep [style="bold"];
+  CycleStep -> IndependentDaysStep;
+  CycleStep -> DayEntryStep [style="bold"];
+  DayEntryStep -> IndependentDaysStep [style="bold"];
+  IndependentDaysStep -> SimpleSlotEntryStep;
+  IndependentDaysStep -> WeeklySlotEntryStep;
+  IndependentDaysStep -> SequentialModelStep [style="bold"];
+  SequentialModelStep -> WeeklySlotEntryStep;
+  SequentialModelStep -> RotatingSlotEntryStep [style="bold"];
+  SimpleSlotEntryStep -> NamedPeriodsStep;
+  RotatingSlotEntryStep -> NamedPeriodsStep [style="bold"];
+  WeeklySlotEntryStep -> NamedPeriodsStep;
+  NamedPeriodsStep -> PeriodNamesStep [style="bold"];
+  NamedPeriodsStep -> HomeroomStep;
+  PeriodNamesStep -> PeriodOrderSimple;
+  PeriodNamesStep -> PeriodOrderComplex [style="bold"];
+  PeriodOrderSimple -> HomeroomStep;
+  PeriodOrderComplex -> HomeroomStep [style="bold"];
+  HomeroomStep -> FinalStep [style="bold"];
+  HomeroomStep -> HomeroomPeriodsStep;
+  HomeroomPeriodsStep -> FinalStep;
+
+  FirstStep[style="filled"];
+  CycleStep[style="filled"];
+  DayEntryStep[style="filled"];
+  IndependentDaysStep[style="filled"];
+  SequentialModelStep[style="filled"];
+  RotatingSlotEntryStep[style="filled"];
+  NamedPeriodsStep[style="filled"];
+  PeriodNamesStep[style="filled"];
+  PeriodOrderComplex[style="filled"];
+  HomeroomStep[style="filled"];
+  FinalStep[style="filled"];
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard-6.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard.dot
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard.dot	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/ttschema-wizard.dot	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,23 @@
+digraph "Timetable Schema Wizard" {
+  FirstStep -> CycleStep;
+  CycleStep -> IndependentDaysStep;
+  CycleStep -> DayEntryStep;
+  DayEntryStep -> IndependentDaysStep;
+  IndependentDaysStep -> SimpleSlotEntryStep;
+  IndependentDaysStep -> WeeklySlotEntryStep;
+  IndependentDaysStep -> SequentialModelStep;
+  SequentialModelStep -> WeeklySlotEntryStep;
+  SequentialModelStep -> RotatingSlotEntryStep;
+  SimpleSlotEntryStep -> NamedPeriodsStep;
+  RotatingSlotEntryStep -> NamedPeriodsStep;
+  WeeklySlotEntryStep -> NamedPeriodsStep;
+  NamedPeriodsStep -> PeriodNamesStep;
+  NamedPeriodsStep -> HomeroomStep;
+  PeriodNamesStep -> PeriodOrderSimple;
+  PeriodNamesStep -> PeriodOrderComplex;
+  PeriodOrderSimple -> HomeroomStep;
+  PeriodOrderComplex -> HomeroomStep;
+  HomeroomStep -> FinalStep;
+  HomeroomStep -> HomeroomPeriodsStep;
+  HomeroomPeriodsStep -> FinalStep;
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/update-images.sh
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/update-images.sh	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/update-images.sh	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,8 @@
+#!/bin/sh
+# Generate png files out of GraphViz .dot source files.
+# You need to have graphviz and ImageMagic installed
+for n in 1 2 3 4 5 6; do
+  dot -Tpng -o ttschema-wizard-$n.png ttschema-wizard-$n.dot
+  mogrify -resize 50% ttschema-wizard-$n.png
+  convert -resize 25% ttschema-wizard-$n.png ttschema-wizard-$n-tiny.png
+done


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/images/update-images.sh
___________________________________________________________________
Name: svn:executable
   + *

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/login.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/login.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/login.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,62 @@
+Login and Logout views
+----------------------
+
+We have an app instance:
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.handleErrors = False
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.open('http://localhost/')
+    >>> 'SchoolTool' in manager.contents
+    True
+
+We add a person
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Some User', 'user', 'secret')
+
+We have the views ``@@login.html`` and ``@@logout.html`` on the main
+application object. Those views log in or log out the user of the session.
+
+    >>> anonymous = Browser()
+    >>> anonymous.open('http://localhost/')
+    >>> anonymous.getLink('Log In').click()
+    >>> anonymous.headers['status']
+    '200 Ok'
+
+Make sure the current version number is somewhere on the page:
+
+    >>> import schooltool
+    >>> schooltool.get_version() in anonymous.contents
+    True
+
+Incorrect password:
+
+    >>> anonymous.getControl('Username').value = 'user'
+    >>> anonymous.getControl('Password').value = 'bad'
+    >>> anonymous.getControl('Log in').click()
+    >>> 'Username or password is incorrect' in anonymous.contents
+    True
+
+Another attempt:
+
+    >>> anonymous.getControl('Username').value = 'user'
+    >>> anonymous.getControl('Password').value = 'secret'
+    >>> anonymous.getControl('Log in').click()
+
+Now we are authenticated:
+
+    >>> 'Some User' in anonymous.contents
+    True
+
+Now we can log out:
+
+    >>> anonymous.getLink('Log Out').click()
+
+We are logged out:
+
+    >>> anonymous.getLink('Log in')
+    Traceback (most recent call last):
+    ...
+    LinkNotFoundError


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/login.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/membership.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/membership.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/membership.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,123 @@
+Functional doctest for group membership
+=======================================
+
+Setup
+-----
+
+We need an application with a few groups and persons.
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+A bunch of persons:
+
+    >>> manager.getLink('Persons').click()
+    >>> manager.getLink('Import Persons').click()
+
+    >>> manager.getControl('CSV Data').value = '''\
+    ... person001, Q. Bert
+    ... person002, W. Bert
+    ... person003, E. Bert
+    ... person004, R. Bert
+    ... person005, T. Bert
+    ... person006, Y. Bert
+    ... person007, U. Bert
+    ... person008, I. Bert
+    ... person009, O. Bert
+    ... person010, P. Bert
+    ... person011, A. Bert
+    ... person012, S. Bert
+    ... person013, D. Bert
+    ... person014, F. Bert
+    ... person015, G. Bert
+    ... '''
+    >>> manager.getControl('Submit').click()
+
+    >>> '<p>CSV text imported successfully.</p>' in manager.contents
+    True
+
+A bunch of groups:
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('Import Groups').click()
+
+    >>> manager.getControl('CSV Data').value = '''\
+    ... group001, Z Team
+    ... group002, X Team
+    ... group003, C Team
+    ... group004, V Team
+    ... group005, B Team
+    ... group006, N Team
+    ... group007, M Team
+    ... group008, L Team
+    ... group009, K Team
+    ... group010, J Team
+    ... group011, H Team
+    ... group012, G Team
+    ... group013, F Team
+    ... group014, D Team
+    ... group015, S Team
+    ... '''
+    >>> manager.getControl('Submit').click()
+
+    >>> '<p>CSV text imported successfully.</p>' in manager.contents
+    True
+
+
+Group member view
+-----------------
+
+Let's go to a group, and look at its members.
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('group001').click()
+    >>> manager.getLink('edit members').click()
+    >>> manager.getLink('Show All').click()
+
+    >>> '<title>group001</title>' in manager.contents
+    True
+
+    # Only shows first ten persons
+    >>> checkbox = '<input type="checkbox" name="%s" id="%s" />'
+    >>> for i in [1, 3, 4, 8, 9, 10, 11, 13, 14, 15]:
+    ...     id = "add_item.person%.3i" % i
+    ...     ith_checkbox = checkbox % (id, id)
+    ...     if ith_checkbox not in manager.contents:
+    ...        print ith_checkbox
+
+Let's add a few members.
+
+    >>> manager.getControl('Q. Bert').click()
+    >>> manager.getControl('A. Bert').click()
+
+    >>> manager.getControl('Add').click()
+
+    >>> body = manager.contents
+    >>> 'name="remove_item.person001"' in body
+    True
+    >>> 'name="remove_item.person011"' in body
+    True
+
+We can perform a search and limit the list in the 'Add Members' box. This
+particular bit also serves as a regression test for issue 341.
+
+    >>> manager.getControl(name='SEARCH_TITLE').value = 'D.'
+    >>> manager.getControl('Find Now').click()
+
+    >>> 'name="add_item.person013"' in manager.contents
+    True
+    >>> 'name="add_item.person005"' in manager.contents
+    False
+
+But the search does not affect the already existing member list:
+
+    >>> 'name="remove_item.person001"' in manager.contents
+    True
+    >>> 'name="remove_item.person011"' in manager.contents
+    True
+
+
+TODO: make this test more extensive -- test that removal works, etc, etc.


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/membership.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/navigation.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/navigation.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/navigation.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,72 @@
+Navigation
+----------
+
+We have a view called 'schooltool_navigation'.  Its output is included in the
+page macros template to get the navigation portlet.  Browser requests, such
+as used in this functional test, do not represent normal usage.
+
+
+Set up
+------
+
+We will create a resource
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+
+Navigation view
+---------------
+
+The `schooltool_navigation` view is registered for "*".  It will present
+a portlet with the navigation links depending on the authorized user.
+
+    >>> manager.open('http://localhost/')
+
+    >>> print analyze.queryHTML('//a[text()="Persons"]', manager.contents)[0]
+    <a href="http://localhost/persons">Persons</a>
+
+    >>> print analyze.queryHTML('//a[text()="Courses"]', manager.contents)[0]
+    <a href="http://localhost/courses">Courses</a>
+
+    >>> print analyze.queryHTML('//a[text()="Sections"]', manager.contents)[0]
+    <a href="http://localhost/sections">Sections</a>
+
+    >>> print analyze.queryHTML('//a[text()="Resources"]', manager.contents)[0]
+    <a href="http://localhost/resources">Resources</a>
+
+    >>> print analyze.queryHTML('//a[text()="Terms"]', manager.contents)[0]
+    <a href="http://localhost/terms">Terms</a>
+
+    >>> print analyze.queryHTML('//a[text()="School Timetables"]',
+    ...                         manager.contents)[0]
+    <a href="http://localhost/ttschemas">School Timetables</a>
+
+The main technical challenge in this view is finding the nearest
+``ISchoolToolApplication`` instance, and providing the links relative to
+it.
+
+    >>> manager.open('http://localhost/groups/manager')
+
+    >>> print analyze.queryHTML('//a[text()="Persons"]', manager.contents)[0]
+    <a href="http://localhost/persons">Persons</a>
+
+    >>> print analyze.queryHTML('//a[text()="Courses"]', manager.contents)[0]
+    <a href="http://localhost/courses">Courses</a>
+
+    >>> print analyze.queryHTML('//a[text()="Sections"]', manager.contents)[0]
+    <a href="http://localhost/sections">Sections</a>
+
+    >>> print analyze.queryHTML('//a[text()="Resources"]', manager.contents)[0]
+    <a href="http://localhost/resources">Resources</a>
+
+    >>> print analyze.queryHTML('//a[text()="Terms"]', manager.contents)[0]
+    <a href="http://localhost/terms">Terms</a>
+
+    >>> print analyze.queryHTML('//a[text()="School Timetables"]',
+    ...                         manager.contents)[0]
+    <a href="http://localhost/ttschemas">School Timetables</a>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/navigation.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/personinstructor.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/personinstructor.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/personinstructor.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,92 @@
+Functional test for instructor access to students' data
+=======================================================
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+    >>> 'SchoolTool' in manager.contents
+    True
+
+Let's create a coupe of persons who will be students and teachers:
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Frog', 'frog', 'pwd')
+    >>> addPerson('Toad', 'toad', 'doat')
+
+Also, let's create a group:
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('New Group').click()
+
+    >>> manager.getControl('Title').value = 'Animals'
+    >>> manager.getControl('Add').click()
+
+    >>> 'Animals' in manager.contents
+    True
+
+We'll need a course and a section:
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('New Course').click()
+    >>> manager.getControl('Title').value = 'History'
+    >>> manager.getControl('Add').click()
+
+    >>> 'History' in manager.contents
+    True
+
+    >>> manager.getLink('History').click()
+    >>> manager.getLink('New Section').click()
+    >>> manager.getControl('Code').value = 'HIS1'
+    >>> manager.getControl('Description').value = 'Section1'
+    >>> manager.getControl('Add').click()
+
+Let's make the frog a teacher:
+
+    >>> manager.getLink('(HIS1)').click()
+    >>> manager.getLink('edit instructors').click()
+    >>> manager.getControl(name='add_item.frog').value = True
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Cancel').click()
+    >>> print manager.contents
+    <!DOCTYPE ...>
+    ...
+          <h3>Instructors</h3>
+          <ul>
+            <li>
+              <a href="http://localhost/persons/frog">Frog</a>
+            </li>
+          </ul>
+    ...
+
+The frog cannot see the toad's personal info:
+
+    >>> frog = Browser()
+    >>> frog.open('http://localhost/')
+    >>> frog.getLink('Log In').click()
+    >>> frog.getControl('Username').value = 'frog'
+    >>> frog.getControl('Password').value = 'pwd'
+    >>> frog.getControl('Log in').click()
+
+    >>> frog.open('http://localhost/persons/toad')
+    >>> print frog.url
+    http://localhost/@@login.html?forbidden=yes&nexturl=...
+
+Let's make toad join the section:
+
+    >>> manager.getLink('edit individuals').click()
+    >>> manager.getControl(name='add_item.toad').value = True
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('HIS1').click()
+
+Now frog can see the demographics of toad alright:
+
+    >>> frog.open('http://localhost/persons/toad')
+    >>> print frog.url
+    http://localhost/persons/toad
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+        <title>Person info: Toad</title>
+    ...


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/personinstructor.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/schedule-single-student.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/schedule-single-student.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/schedule-single-student.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,479 @@
+Scheduling a single student in SchoolTool
+=========================================
+
+This functional doctest demonstrates and tests the scheduling of a
+single student view.
+
+We do most of the fixture setup through ReSTive views for now.  A lot of the
+code has been copied from rest/composite-timetables.txt.
+
+Overview
+--------
+
+1. Set up 1 Term, 1 Schema, a User, a Course and 3 Sections
+2. Add timetables to sections
+3. Schedule the student
+
+Prologue
+--------
+
+Add a term:
+
+    >>> print http(r"""
+    ... PUT /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+    ...             first="2003-09-01" last="2003-09-07">
+    ...     <title>2005 Fall</title>
+    ...     <daysofweek>Monday Tuesday Wednesday Thursday Friday</daysofweek>
+    ...     <holiday date="2003-09-03">Holiday</holiday>
+    ...     <holiday date="2003-09-06">Holiday</holiday>
+    ...     <holiday date="2003-09-23">Holiday</holiday>
+    ... </schooldays>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Add a schema:
+
+    >>> print rest(r"""
+    ... PUT /ttschemas/schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+    ...   <title>Some Title</title>
+    ...   <timezone name="UTC"/>
+    ...   <model factory="SequentialDaysTimetableModel">
+    ...     <daytemplate>
+    ...       <used when="default" />
+    ...       <period id="A" tstart="9:00" duration="60" />
+    ...       <period id="C" tstart="9:00" duration="60" />
+    ...       <period id="B" tstart="10:00" duration="60" />
+    ...       <period id="D" tstart="10:00" duration="60" />
+    ...     </daytemplate>
+    ...     <daytemplate>
+    ...       <used when="Friday Thursday" />
+    ...       <period id="A" tstart="8:00" duration="60" />
+    ...       <period id="C" tstart="8:00" duration="60" />
+    ...       <period id="B" tstart="11:00" duration="60" />
+    ...       <period id="D" tstart="11:00" duration="60" />
+    ...     </daytemplate>
+    ...   </model>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...     </period>
+    ...     <period id="D">
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Lets add a course and 3 sections:
+
+    >>> print rest("""
+    ... PUT /courses/birdwatching HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding1"
+    ...         course="birding"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-2 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding2"
+    ...         course="birding"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-3 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding3"
+    ...         course="birding"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /courses/birdwatching/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...  xlink:role="http://schooltool.org/ns/coursesections/section"
+    ...               xlink:arcrole="http://schooltool.org/ns/coursesections"
+    ...  xlink:href="http://localhost/sections/birdwatching-1"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /courses/birdwatching/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...  xlink:role="http://schooltool.org/ns/coursesections/section"
+    ...               xlink:arcrole="http://schooltool.org/ns/coursesections"
+    ...  xlink:href="http://localhost/sections/birdwatching-2"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /courses/birdwatching/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...  xlink:role="http://schooltool.org/ns/coursesections/section"
+    ...               xlink:arcrole="http://schooltool.org/ns/coursesections"
+    ...  xlink:href="http://localhost/sections/birdwatching-3"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+Add timetables to sections
+==========================
+
+Lets add a timetable for the first section:
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-1/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...       <activity title="Birdwatching 1"/>
+    ...     </period>
+    ...     <period id="D">
+    ...       <activity title="Birdwatching 1 (practice)"/>
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+For the second one:
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-2/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...       <activity title="Birdwatching 2"/>
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...     </period>
+    ...     <period id="D">
+    ...       <activity title="Birdwatching 2 (practice)"/>
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+And the third one:
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-3/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...       <activity title="Birdwatching 3 (practice)"/>
+    ...     </period>
+    ...     <period id="B">
+    ...       <activity title="Birdwatching 3"/>
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...     </period>
+    ...     <period id="D">
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+We will need a student too:
+
+    >>> from schooltool.app.browser.ftests import setup
+    >>> setup.addPerson('John', 'john', 'pwd')
+
+Rendering view
+==============
+
+All the sections sohuld bee seen in the drop down lists:
+
+    >>> print http(r"""
+    ... GET /persons/john/@@schedule.html HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    ...
+            <th>A</th>
+            <td>
+              <select name="sections:list">
+                <option value="" selected="selected">none</option>
+                <option value="birdwatching-2"> -- Birding</option>
+                <option value="birdwatching-3"> -- Birding</option>
+              </select>
+            </td>
+    ...
+            <th>B</th>
+            <td>
+              <select name="sections:list">
+                <option value="" selected="selected">none</option>
+                <option value="birdwatching-3"> -- Birding</option>
+              </select>
+            </td>
+    ...
+            <th>C</th>
+            <td>
+              <select name="sections:list">
+                <option value="" selected="selected">none</option>
+                <option value="birdwatching-1"> -- Birding</option>
+              </select>
+            </td>
+    ...
+            <th>D</th>
+            <td>
+              <select name="sections:list">
+                <option value="" selected="selected">none</option>
+                <option value="birdwatching-1"> -- Birding</option>
+                <option value="birdwatching-2"> -- Birding</option>
+              </select>
+            </td>
+    ...
+
+Lets add John to Birdwatching 1:
+
+    >>> print http(r"""
+    ... POST /persons/john/@@schedule.html HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Length: 33
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... sections=birdwatching-1&SAVE=Save""")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    ...
+            <th>A</th>
+            <td>
+              <select name="sections:list">
+                <option value="" selected="selected">none</option>
+                <option value="birdwatching-2"> -- Birding</option>
+                <option value="birdwatching-3"> -- Birding</option>
+              </select>
+            </td>
+    ...
+            <th>B</th>
+            <td>
+              <select name="sections:list">
+                <option value="" selected="selected">none</option>
+                <option value="birdwatching-3"> -- Birding</option>
+              </select>
+            </td>
+    ...
+            <th>C</th>
+            <td>
+              <select name="sections:list">
+                <option value="">none</option>
+                <option selected="selected"
+                        value="birdwatching-1"> -- Birding</option>
+              </select>
+            </td>
+    ...
+            <th>D</th>
+            <td>
+              <select name="sections:list">
+                <option value="">none</option>
+                <option selected="selected"
+                        value="birdwatching-1"> -- Birding</option>
+                <option value="birdwatching-2"> -- Birding</option>
+              </select>
+            </td>
+    ...
+
+If john is added to bw1 and bw2 a conflict should arise:
+
+    >>> print http(r"""
+    ... POST /persons/john/@@schedule.html HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Length: 57
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... sections=birdwatching-1&sections=birdwatching-2&SAVE=Save""")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    ...
+            <th>A</th>
+            <td>
+              <select name="sections:list">
+                <option value="">none</option>
+                <option selected="selected"
+                        value="birdwatching-2"> -- Birding</option>
+                <option value="birdwatching-3"> -- Birding</option>
+              </select>
+            </td>
+    ...
+            <th>B</th>
+            <td>
+              <select name="sections:list">
+                <option value="" selected="selected">none</option>
+                <option value="birdwatching-3"> -- Birding</option>
+              </select>
+            </td>
+    ...
+            <th>C</th>
+            <td>
+              <select name="sections:list">
+                <option value="">none</option>
+                <option selected="selected"
+                        value="birdwatching-1"> -- Birding</option>
+              </select>
+            </td>
+    ...
+          <tr class="conflict">
+            <th>D</th>
+            <td>
+              <select name="sections:list">
+                <option value="">none</option>
+                <option selected="selected"
+                        value="birdwatching-1"> -- Birding</option>
+                <option value="birdwatching-2"> -- Birding</option>
+              </select>
+            </td>
+            <td>
+              <select name="sections:list">
+                <option value="">none</option>
+                <option value="birdwatching-1"> -- Birding</option>
+                <option selected="selected"
+                        value="birdwatching-2"> -- Birding</option>
+              </select>
+            </td>
+            <td class="conflict">
+            Scheduling conflict.
+            </td>
+          </tr>
+    ...
+
+Lets resolve the conflict by moving the student to the bw3:
+
+    >>> print http(r"""
+    ... POST /persons/john/@@schedule.html HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Length: 57
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... sections=birdwatching-1&sections=birdwatching-3&SAVE=Save""")
+    HTTP/1.1 200 Ok
+    ...
+
+Now our student should be in sections bw1 and bw2:
+
+    >>> print rest(r"""
+    ... GET /persons/john/relationships/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+    ...
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/group"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://localhost/sections/birdwatching-1">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/john/relationships/2"/>
+        </relationship>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/calendar_subscription/provider"
+                      xlink:arcrole="http://schooltool.org/ns/calendar_subscription"
+                      xlink:href="http://localhost/sections/birdwatching-1/calendar">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/john/relationships/3"/>
+        </relationship>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/group"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://localhost/sections/birdwatching-3">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/john/relationships/..."/>
+        </relationship>
+      </existing>
+    </relationships>
+    <BLANKLINE>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/schedule-single-student.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/section-booking.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/section-booking.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/section-booking.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,149 @@
+Tests for resource booking in timetable events
+----------------------------------------------
+
+A manager logs in and sets up timetabling:
+
+    >>> from schooltool.app.browser.ftests import setup
+    >>> setup.addPerson('Frog', 'frog')
+    >>> setup.setUpTimetabling(username='frog')
+
+Let's create a resource:
+
+    >>> setup.addResource('A resource')
+
+and book it for our history class:
+
+    >>> print rest("""
+    ... PUT  /sections/history6a/timetables/2005-fall.default HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Monday">
+    ...     <period id="09:30-10:25">
+    ...       <activity title="History 6">
+    ...           <resource xlink:type="simple"
+    ...                     xlink:title="Resrouce"
+    ...                     xlink:href="/resources/a-resource" />
+    ...       </activity>
+    ...     </period>
+    ...   </day>
+    ...   <day id="Wednesday">
+    ...     <period id="11:35-12:20">
+    ...       <activity title="History 6">
+    ...           <resource xlink:type="simple"
+    ...                     xlink:title="Resrouce"
+    ...                     xlink:href="/resources/a-resource" />
+    ...       </activity>
+    ...     </period>
+    ...   </day>
+    ... </timetable>""", handle_errors=False)
+    HTTP/1.1 200 Ok
+    ...
+
+
+Section events should be visible in the calendar of the resource:
+
+    >>> manager = setup.logInManager()
+    >>> manager.open('http://localhost/resources/a-resource/calendar/2005-09-07')
+    >>> print analyze.queryHTML('id("content-body")', manager.contents)[0]
+    <div id="content-body">
+    ...
+        <a href="http://localhost/resources/a-resource/calendar/..." title="History 6">
+          History 6
+          <span class="start-end">
+            (<span>11:35</span>
+               -
+             <span>12:20</span>)
+          </span>
+        </a>
+    ...
+
+They are editable:
+
+    >>> manager.getLink('History 6').click()
+    >>> manager.getLink('edit event').click()
+    >>> manager.getControl('Description').value = "Assignement."
+    >>> manager.getControl('Apply').click()
+    >>> print analyze.queryHTML('id("content-body")', manager.contents)[0]
+    <div id="content-body">
+    ...
+        <a href="http://localhost/sections/history6a/calendar/..." title="History 6">
+          History 6
+          <span class="start-end">
+            (<span>11:35</span>
+              - <span>12:20</span>)
+          </span>
+        </a>
+    ...
+      <div class="description">Assignement.</div>
+    ...
+
+Now if we will unschedule the other activity this one should retain
+it's description:
+
+    >>> manager.open('http://localhost/sections/history6a')
+    >>> manager.getLink('Schedule').click()
+    >>> manager.getControl(name="Monday.09:30-10:25").value = False
+    >>> manager.getControl(name="Wednesday.11:35-12:20").value = True
+    >>> manager.getControl('Save').click()
+
+Let's look at it:
+
+    >>> manager.open('http://localhost/resources/a-resource/calendar/2005-09-07')
+    >>> print analyze.queryHTML('id("content-body")', manager.contents)[0]
+    <div id="content-body">
+    ...
+        <a href="http://localhost/resources/a-resource/calendar/..." title="History 6">
+          History 6
+          <span class="start-end">
+            (<span>11:35</span>
+               -
+             <span>12:20</span>)
+          </span>
+        </a>
+    ...
+      <div class="description">Assignement.</div>
+    ...
+
+    >>> manager.getLink('Resources').click()
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = "Mud"
+    >>> manager.getControl('Add').click()
+
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+
+    >>> manager.getControl(name='delete.mud').value = ['delete.mud']
+    >>> manager.getControl(name='delete.a-resource').value = ['delete.a-resource']
+    >>> manager.getControl('Book').click()
+    >>> manager.open("%s/2005-09-07" % manager.url)
+
+There should be two resources available to add there:
+
+
+    >>> manager.getLink('Mud').text
+    'Mud'
+    >>> manager.getLink('A resource').text
+    'A resource'
+
+Let's add the Mud resource:
+
+    >>> manager.getLink('Mud').click()
+
+We are now redirected to the event edit view:
+
+
+    >>> manager.getControl('Title').value
+    '09:30-10:25'
+
+    >>> manager.getControl('Date').value
+    '2005-09-07'
+
+And the resource is added:
+
+    >>> manager.getLink('Book resources').click()
+    >>> print analyze.queryHTML('//label[@for="remove_item.mud"]', manager.contents)[0]
+    <label for="remove_item.mud">Mud</label>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/section-booking.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/setup.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/setup.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/setup.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,151 @@
+"""
+High-level setup functions for functional tests.
+
+$Id: setup.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+from zope.testbrowser.testing import Browser
+
+
+def logInManager():
+    """Create a Browser instance and log in as a manager."""
+    manager = Browser()
+    manager.handleErrors = False
+    manager.addHeader('Authorization', 'Basic manager:schooltool')
+    manager.open('http://localhost/')
+    assert 'SchoolTool' in manager.contents
+    return manager
+
+
+def logIn(username, password=None):
+    """Create a Browser instance and log in."""
+    if not password:
+        password = username + 'pwd'
+    browser = Browser()
+    browser.handleErrors = False
+    browser.open('http://localhost/')
+    browser.getLink('Log In').click()
+    browser.getControl('Username').value = username
+    browser.getControl('Password').value = password
+    browser.getControl('Log in').click()
+    assert 'Log Out' in browser.contents
+    return browser
+
+
+def addPerson(name, username=None, password=None, groups=None, browser=None):
+    """Add a person.
+
+    If username is not specified, it will be taken to be name.lower().
+
+    If password is not specified, it will be taken to be username + 'pwd'.
+    """
+    if not username:
+        username = name.lower()
+    if not password:
+        password = username + 'pwd'
+    if browser is None:
+        browser = logInManager()
+    browser.getLink('Persons').click()
+    browser.getLink('New Person').click()
+    browser.getControl('Full name').value = name
+    browser.getControl('Username').value = username
+    browser.getControl('Password').value = password
+    browser.getControl('Verify password').value = password
+    browser.getControl('Add').click()
+
+    if groups:
+        browser.open('http://localhost/persons/%s' % username)
+        browser.getLink('edit groups').click()
+        for group in groups:
+            browser.getControl(name='add_item.%s' % group).value = True
+        browser.getControl('Add').click()
+    browser.open('http://localhost/persons')
+
+def addResource(title):
+    """Add a resource."""
+    manager = logInManager()
+    manager.getLink('Resources').click()
+    manager.getLink('New Resource').click()
+    manager.getControl('Title').value = title
+    manager.getControl('Add').click()
+    manager.getControl('Type').value = ['resource|Resource']
+    manager.getControl('Search').click()
+    assert title in manager.contents
+
+
+def setUpTimetabling(username):
+    """Create the infrastructure for functional tests involving timetables.
+
+    Creates it for the given user.
+    """
+
+    # We will need a term and a School timetable:
+    manager = logInManager()
+    manager.getLink('Terms').click()
+    manager.getLink('New Term').click()
+
+    manager.getControl('Title').value = '2005 Fall'
+    manager.getControl('Start date').value = '2005-09-01'
+    manager.getControl('End date').value = '2006-01-31'
+    manager.getControl('Next').click()
+
+
+    manager.getControl('Sunday').click()
+    manager.getControl('Saturday').click()
+    manager.getControl('Add term').click()
+
+    # Now the timetable:
+
+    manager.open('http://localhost/ttschemas')
+    manager.getLink('New Timetable').click()
+
+    manager.getControl('Title').value = 'default'
+    manager.getControl('Next').click()
+    manager.getControl('Days of the week').click()
+    manager.getControl('Same time each day').click()
+    manager.getControl(name='field.times').value = """
+       9:30-10:25
+       10:30-11:25
+       11:35-12:20
+       12:45-13:30
+       13:35-14:20
+       14:30-15:15
+    """
+    manager.getControl('Next').click()
+    manager.getControl('Designated by time').click()
+    manager.getControl('No').click()
+
+    # We will need a course:
+
+    manager.open('http://localhost/courses')
+    manager.getLink('New Course').click()
+
+    manager.getControl('Title').value = 'History 6'
+    manager.getControl('Identifier').value = 'history6'
+    manager.getControl('Description').value = 'History for the sixth class'
+    manager.getControl('Add').click()
+
+    # And a section:
+
+    manager.getLink('History 6').click()
+    manager.getLink('New Section').click()
+    manager.getControl('Code').value = 'history-6a'
+    manager.getControl('Identifier').value = 'history6a'
+    manager.getControl('Description').value = 'History for the class 6A'
+    manager.getControl('Add').click()
+
+    # Let's assign Frog as a teacher for History 6:
+
+    manager.getLink(url='http://localhost/sections/history6a').click()
+    manager.getLink('edit instructors').click()
+    manager.getControl('Frog').selected = True
+    manager.getControl('Add').click()
+
+    # And schedule the section:
+
+    manager.open('http://localhost/sections/history6a')
+    manager.getLink('Schedule').click()
+
+    manager.getControl(name="Monday.09:30-10:25").value = True
+    manager.getControl(name="Wednesday.11:35-12:20").value = True
+    manager.getControl('Save').click()


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/setup.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/system-objects.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/system-objects.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/system-objects.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,90 @@
+System objects
+==============
+
+SchoolTool has a default user object and some default group objects.  These
+objects are special and cannot be deleted.
+
+This functional test makes sure they cannot be deleted via the browser
+interface.
+
+
+Setup
+-----
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager_browser = Browser()
+    >>> manager_browser.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager_browser.handleErrors = False
+    >>> manager_browser.open('http://localhost/')
+    >>> "SchoolTool" in manager_browser.contents
+    True
+
+Let us add a user and a group, so that container views have something besides
+the default system objects:
+
+    >>> manager_browser.getLink('Groups').click()
+    >>> manager_browser.getLink('New Group').click()
+    >>> manager_browser.getControl('Title').value = 'A Group'
+    >>> manager_browser.getControl('Add').click()
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Stephan Richter', 'srichter', 'foobar')
+
+Test
+----
+
+The list of persons should have a disabled checkbox next to the manager user
+
+    >>> manager_browser.open('http://localhost/persons')
+    >>> f = open('/tmp/dump.html', 'w')
+    >>> f.write(manager_browser.contents)
+    >>> f.close()
+
+    >>> for td in analyze.queryHTML('//table[@class="data"]//tr/td', manager_browser.contents):
+    ...     print td
+    <td>
+          <input type="checkbox" name="delete.manager" id="delete.manager" disabled></td>
+    <td>
+          <a href="http://localhost/persons/manager">SchoolTool Manager</a>
+    </td>
+    <td>
+          <input type="checkbox" name="delete.srichter" id="delete.srichter"></td>
+    <td>
+          <a href="http://localhost/persons/srichter">Stephan Richter</a>
+    </td>
+
+The list of groups should have a disabled checkbox next to the default groups
+
+    >>> manager_browser.open('http://localhost/groups')
+    >>> for td in analyze.queryHTML('//table[@class="data"]//tr/td', manager_browser.contents):
+    ...     print td
+    <td>
+          <input type="checkbox" name="delete.a-group" id="delete.a-group"></td>
+    <td>
+          <a href="http://localhost/groups/a-group">A Group</a>
+    </td>
+    <td>
+          <input type="checkbox" name="delete.clerks" id="delete.clerks" disabled></td>
+    <td>
+          <a href="http://localhost/groups/clerks">Clerks</a>
+    </td>
+    <td>
+          <input type="checkbox" name="delete.administrators" id="delete.administrators" disabled></td>
+    <td>
+          <a href="http://localhost/groups/administrators">School Administrators</a>
+    </td>
+    <td>
+          <input type="checkbox" name="delete.manager" id="delete.manager" disabled></td>
+    <td>
+          <a href="http://localhost/groups/manager">Site Managers</a>
+    </td>
+    <td>
+          <input type="checkbox" name="delete.students" id="delete.students" disabled></td>
+    <td>
+          <a href="http://localhost/groups/students">Students</a>
+    </td>
+    <td>
+          <input type="checkbox" name="delete.teachers" id="delete.teachers" disabled></td>
+    <td>
+          <a href="http://localhost/groups/teachers">Teachers</a>
+    </td>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/system-objects.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.app.app.
+
+$Id: test_all.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+
+from zope.interface import implements
+from zope.publisher.interfaces.browser import IBrowserPublisher
+from zope.publisher.browser import BrowserView
+
+from schooltool.testing.functional import collect_ftests
+
+
+class BrokenView(BrowserView):
+    implements(IBrowserPublisher)
+
+    def browserDefault(self, request):
+        return self, ()
+
+    def publishTraverse(self, name, request):
+        raise LookupError(name)
+
+    def __call__(self):
+        raise RuntimeError("Houston, we've got a problem")
+
+
+def test_suite():
+    return collect_ftests()
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema-wizard.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema-wizard.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema-wizard.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,943 @@
+Functional test for timetable schema add wizard
+===============================================
+
+There are several paths through the timetable schema wizard.  We shall test
+several of those, so that all pages are rendered, and all the branches are
+taken.
+
+   |testpath1| |testpath2| |testpath3| |testpath4| |testpath5| |testpath6|
+
+.. |testpath1| image:: images/ttschema-wizard-1-tiny.png
+.. |testpath2| image:: images/ttschema-wizard-2-tiny.png
+.. |testpath3| image:: images/ttschema-wizard-3-tiny.png
+.. |testpath4| image:: images/ttschema-wizard-4-tiny.png
+.. |testpath5| image:: images/ttschema-wizard-5-tiny.png
+.. |testpath6| image:: images/ttschema-wizard-6-tiny.png
+
+.. contents:: Overview
+   :backlinks: none
+
+.. You can generate the png pictures from GraphViz files by running the
+.. update-images.sh shell script in the images/ subdirectory.
+
+The usual setup
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+
+Weekly timetable
+----------------
+
+.. image:: images/ttschema-wizard-1.png
+
+Let's go to the `new timetable schema` wizard:
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+    >>> '<h1>New timetable schema</h1>' in manager.contents
+    True
+
+We enter a title and press `Next` button:
+
+    >>> manager.getControl('Title').value = 'Default'
+    >>> manager.getControl('Next').click()
+
+You can now choose the general type of the schedule. Let's choose the weekly
+type for now -- we'll try the rotating cycle later.
+
+    >>> manager.getControl('Days of the week').click()
+
+Now you can choose whether the classes start at the same time every day. Let's
+say that classes begin at the same time:
+
+    >>> manager.getControl('Same time each day').click()
+
+Enter now start and end times for each slot, one slot (HH:MM - HH:MM) per
+line. By default there are two periods. Let's add two more entries.
+
+    >>> manager.getControl(name='field.times').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+    >>> manager.getControl('Next').click()
+
+Do periods have names or are they simply designated by time? For now, let's
+say that periods are designated by time.
+
+    >>> manager.getControl('Designated by time').click()
+
+Do we use a homeroom period?  Let's say no:
+
+    >>> manager.getControl('No').click()
+
+The timetable schema gets created. Now we see the newly created timetable
+schema in the list.
+
+    >>> manager.getLink('Default')
+    <Link text='Default' url='http://localhost/ttschemas/default'>
+
+We can examine its composition more easily by invoking the RESTive view.
+
+    >>> print rest(r"""
+    ... GET /ttschemas/default HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+      <title>Default</title>
+      <timezone name="UTC"/>
+      <model factory="WeeklyTimetableModel">
+        <daytemplate>
+          <used when="default"/>
+          <period duration="55" tstart="09:30"/>
+          <period duration="55" tstart="10:30"/>
+          <period duration="55" tstart="11:30"/>
+          <period duration="55" tstart="12:30"/>
+        </daytemplate>
+      </model>
+      <day id="Monday">
+        <period id="09:30-10:25"/>
+        <period id="10:30-11:25"/>
+        <period id="11:30-12:25"/>
+        <period id="12:30-13:25"/>
+      </day>
+      <day id="Tuesday">
+        <period id="09:30-10:25"/>
+        <period id="10:30-11:25"/>
+        <period id="11:30-12:25"/>
+        <period id="12:30-13:25"/>
+      </day>
+      <day id="Wednesday">
+        <period id="09:30-10:25"/>
+        <period id="10:30-11:25"/>
+        <period id="11:30-12:25"/>
+        <period id="12:30-13:25"/>
+      </day>
+      <day id="Thursday">
+        <period id="09:30-10:25"/>
+        <period id="10:30-11:25"/>
+        <period id="11:30-12:25"/>
+        <period id="12:30-13:25"/>
+      </day>
+      <day id="Friday">
+        <period id="09:30-10:25"/>
+        <period id="10:30-11:25"/>
+        <period id="11:30-12:25"/>
+        <period id="12:30-13:25"/>
+      </day>
+    </timetable>
+
+
+Rotating timetable
+------------------
+
+.. image:: images/ttschema-wizard-2.png
+
+Let's do it again!
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+
+We enter a title and press the `Next` button:
+
+    >>> manager.getControl('Title').value = 'Rotating'
+    >>> manager.getControl('Next').click()
+
+Let's choose rotating.
+
+    >>> manager.getControl('Rotating cycle').click()
+
+Enter names of days in cycle, one per line. We shall have three days,
+designated A, B, and ... (oh no! the suspense!) ...  C.
+
+
+    >>> manager.getControl(name='field.days').value = """\
+    ... A
+    ... B
+    ... C
+    ... """
+    >>> manager.getControl('Next').click()
+
+Do classes begin and end at the same time each day in your school's timetable?
+Let's say that classes begin at the same time:
+
+    >>> manager.getControl('Same time each day').click()
+
+Enter start and end times for each slot, one slot (HH:MM - HH:MM) per
+line. Let's add two more periods.
+
+    >>> manager.getControl(name='field.times').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+    >>> manager.getControl('Next').click()
+
+Do periods have names or are they simply designated by time? This time, let's
+say that periods are named.
+
+    >>> manager.getControl('Have names').click()
+
+Enter names of periods, one per line.
+
+    >>> manager.getControl(name='field.periods').value = """\
+    ... Period_A
+    ... Period_C
+    ... Period_B
+    ... Period_D
+    ... """
+    >>> manager.getControl('Next').click()
+
+We get to choose whether sequences of periods in all days are the same. Let's
+say they are the same.
+
+    >>> manager.getControl('Same').click()
+
+We can rearrange the periods now:
+
+    >>> manager.getControl('Next').click()
+
+Do we use a homeroom period?  Let's say yes:
+
+    >>> manager.getControl('Yes').click()
+
+Please indicate the homeroom period for each day.  Easy.  To make it more
+interesting, let's say that day A uses Period_A for homeroom, day B gets
+Period_B, while day C skips attendance.
+
+    >>> manager.getControl(name='homeroom_0_Period_A').value = 'checked'
+    >>> manager.getControl(name='homeroom_1_Period_C').value = 'checked'
+    >>> manager.getControl(name='homeroom_1_Period_D').value = 'checked'
+    >>> manager.getControl('Next').click()
+
+Now we see the newly created timetable schema in the list.
+
+    >>> manager.getLink('Rotating')
+    <Link text='Rotating' url='http://localhost/ttschemas/rotating'>
+
+We can examine its composition more easily by invoking the RESTive view.
+
+    >>> print rest(r"""
+    ... GET /ttschemas/rotating HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+      <title>Rotating</title>
+      <timezone name="UTC"/>
+      <model factory="SequentialDayIdBasedTimetableModel">
+        <daytemplate>
+          <used when="A B C"/>
+          <period duration="55" tstart="09:30"/>
+          <period duration="55" tstart="10:30"/>
+          <period duration="55" tstart="11:30"/>
+          <period duration="55" tstart="12:30"/>
+        </daytemplate>
+      </model>
+      <day id="A">
+        <period homeroom="" id="Period_A"/>
+        <period id="Period_C"/>
+        <period id="Period_B"/>
+        <period id="Period_D"/>
+      </day>
+      <day id="B">
+        <period id="Period_A"/>
+        <period homeroom="" id="Period_C"/>
+        <period id="Period_B"/>
+        <period homeroom="" id="Period_D"/>
+      </day>
+      <day id="C">
+        <period id="Period_A"/>
+        <period id="Period_C"/>
+        <period id="Period_B"/>
+        <period id="Period_D"/>
+      </day>
+    </timetable>
+
+
+Rotating timetable, different daily period order
+------------------------------------------------
+
+.. image:: images/ttschema-wizard-3.png
+
+Let's do it again!
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+
+We enter a title and press the `Next` button:
+
+    >>> manager.getControl('Title').value = 'Rotating 2'
+    >>> manager.getControl('Next').click()
+
+Let's choose rotating.
+
+    >>> manager.getControl('Rotating cycle').click()
+
+We shall have three days, designated A, B, and C.
+
+    >>> manager.getControl(name='field.days').value = """\
+    ... A
+    ... B
+    ... C
+    ... """
+    >>> manager.getControl('Next').click()
+
+Do classes begin and end at the same time each day in your school's timetable?
+Let's say that classes begin at the same time:
+
+    >>> manager.getControl('Same time each day').click()
+
+Enter start and end times for each slot, one slot (HH:MM - HH:MM) per
+line. Let's add two more periods to the default two:
+
+    >>> manager.getControl(name='field.times').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+    >>> manager.getControl('Next').click()
+
+Do periods have names or are they simply designated by time? Let's say that
+periods are named.
+
+    >>> manager.getControl('Have names').click()
+
+Enter names of periods, one per line.
+
+    >>> manager.getControl(name='field.periods').value = """\
+    ... Period_A
+    ... Period_B
+    ... Period_C
+    ... Period_D
+    ... """
+    >>> manager.getControl('Next').click()
+
+We get to choose whether sequences of periods in all days are the same. Let's
+say they are different.
+
+    >>> manager.getControl('Different').click()
+
+Please put the periods in order for each day. We can rearrange them to our
+liking:
+
+    >>> manager.getControl(name='period_0_0').value = ['Period_A']
+    >>> manager.getControl(name='period_0_1').value = ['Period_C']
+    >>> manager.getControl(name='period_0_2').value = ['Period_B']
+    >>> manager.getControl(name='period_0_3').value = ['Period_D']
+
+    >>> manager.getControl(name='period_1_0').value = ['Period_D']
+    >>> manager.getControl(name='period_1_1').value = ['Period_B']
+    >>> manager.getControl(name='period_1_2').value = ['Period_C']
+    >>> manager.getControl(name='period_1_3').value = ['Period_A']
+
+    >>> manager.getControl(name='period_2_0').value = ['Period_A']
+    >>> manager.getControl(name='period_2_1').value = ['Period_B']
+    >>> manager.getControl(name='period_2_2').value = ['Period_C']
+    >>> manager.getControl(name='period_2_3').value = ['Period_D']
+    >>> manager.getControl('Next').click()
+
+Do we use a homeroom period?  Let's say no:
+
+    >>> manager.getControl('No').click()
+
+The schema is now created:
+
+    >>> print rest(r"""
+    ... GET /ttschemas/rotating-2 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+      <title>Rotating 2</title>
+      <timezone name="UTC"/>
+      <model factory="SequentialDayIdBasedTimetableModel">
+        <daytemplate>
+          <used when="A B C"/>
+          <period duration="55" tstart="09:30"/>
+          <period duration="55" tstart="10:30"/>
+          <period duration="55" tstart="11:30"/>
+          <period duration="55" tstart="12:30"/>
+        </daytemplate>
+      </model>
+      <day id="A">
+        <period id="Period_A"/>
+        <period id="Period_C"/>
+        <period id="Period_B"/>
+        <period id="Period_D"/>
+      </day>
+      <day id="B">
+        <period id="Period_D"/>
+        <period id="Period_B"/>
+        <period id="Period_C"/>
+        <period id="Period_A"/>
+      </day>
+      <day id="C">
+        <period id="Period_A"/>
+        <period id="Period_B"/>
+        <period id="Period_C"/>
+        <period id="Period_D"/>
+      </day>
+    </timetable>
+
+
+Weekly timetable, named periods
+-------------------------------
+
+.. image:: images/ttschema-wizard-4.png
+
+Let's go to the timetable schema wizard:
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+
+We enter a title and press Next
+
+    >>> manager.getControl('Title').value = 'Weekly 2'
+    >>> manager.getControl('Next').click()
+
+Does your school's timetable cycle use days of the week, or a rotating cycle?
+Let's choose weekly again.
+
+    >>> manager.getControl('Days of the week').click()
+
+Do classes begin and end at the same time each day in your school's timetable?
+Let's say that classes begin at different times:
+
+    >>> manager.getControl('Different times').click()
+
+Enter start and end times for each slot on each day, one slot (HH:MM - HH:MM)
+per line.  Let's add a few periods.  All days have the same periods, except
+Friday.
+
+    >>> manager.getControl(name='times.0').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+
+    >>> manager.getControl(name='times.1').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+
+    >>> manager.getControl(name='times.2').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+
+    >>> manager.getControl(name='times.3').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+
+    >>> manager.getControl(name='times.4').value = """\
+    ... 9:30-10:20
+    ... 10:25-11:15
+    ... 11:20-12:10
+    ... """
+    >>> manager.getControl('Next').click()
+
+Do periods have names or are they simply designated by time? Let's say that
+periods are named.
+
+    >>> manager.getControl('Have names').click()
+
+Now enter names of periods, one per line. We will name them periods A, B, C,
+D, E, F.  Next we get to choose whether sequences of periods in all days are
+the same:
+
+    >>> manager.getControl(name='field.periods').value = """\
+    ... A
+    ... B
+    ... C
+    ... D
+    ... E
+    ... F
+    ... """
+    >>> manager.getControl('Next').click()
+
+Is the sequence of periods each day the same or different? Let's say they are
+different.
+
+    >>> manager.getControl('Different').click()
+
+Please put the periods in order for each day. We can rearrange a little bit:
+
+    >>> manager.getControl(name='period_0_0').value = ['A']
+    >>> manager.getControl(name='period_0_1').value = ['B']
+    >>> manager.getControl(name='period_0_2').value = ['C']
+    >>> manager.getControl(name='period_0_3').value = ['D']
+
+    >>> manager.getControl(name='period_1_0').value = ['B']
+    >>> manager.getControl(name='period_1_1').value = ['C']
+    >>> manager.getControl(name='period_1_2').value = ['D']
+    >>> manager.getControl(name='period_1_3').value = ['E']
+
+    >>> manager.getControl(name='period_2_0').value = ['C']
+    >>> manager.getControl(name='period_2_1').value = ['D']
+    >>> manager.getControl(name='period_2_2').value = ['E']
+    >>> manager.getControl(name='period_2_3').value = ['F']
+
+    >>> manager.getControl(name='period_3_0').value = ['D']
+    >>> manager.getControl(name='period_3_1').value = ['E']
+    >>> manager.getControl(name='period_3_2').value = ['F']
+    >>> manager.getControl(name='period_3_3').value = ['A']
+
+    >>> manager.getControl(name='period_4_0').value = ['C']
+    >>> manager.getControl(name='period_4_1').value = ['D']
+    >>> manager.getControl(name='period_4_2').value = ['E']
+
+    >>> manager.getControl('Next').click()
+
+Do we use a homeroom period?  Let's say no:
+
+    >>> manager.getControl('No').click()
+
+The schema is now created:
+
+    >>> print rest(r"""
+    ... GET /ttschemas/weekly-2 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+      <title>Weekly 2</title>
+      <timezone name="UTC"/>
+      <model factory="WeeklyTimetableModel">
+        <daytemplate>
+          <used when="Friday"/>
+          <period duration="50" tstart="09:30"/>
+          <period duration="50" tstart="10:25"/>
+          <period duration="50" tstart="11:20"/>
+        </daytemplate>
+        <daytemplate>
+          <used when="Monday Thursday Tuesday Wednesday"/>
+          <period duration="55" tstart="09:30"/>
+          <period duration="55" tstart="10:30"/>
+          <period duration="55" tstart="11:30"/>
+          <period duration="55" tstart="12:30"/>
+        </daytemplate>
+        <daytemplate>
+          <used when="default"/>
+        </daytemplate>
+      </model>
+      <day id="Monday">
+        <period id="A"/>
+        <period id="B"/>
+        <period id="C"/>
+        <period id="D"/>
+      </day>
+      <day id="Tuesday">
+        <period id="B"/>
+        <period id="C"/>
+        <period id="D"/>
+        <period id="E"/>
+      </day>
+      <day id="Wednesday">
+        <period id="C"/>
+        <period id="D"/>
+        <period id="E"/>
+        <period id="F"/>
+      </day>
+      <day id="Thursday">
+        <period id="D"/>
+        <period id="E"/>
+        <period id="F"/>
+        <period id="A"/>
+      </day>
+      <day id="Friday">
+        <period id="C"/>
+        <period id="D"/>
+        <period id="E"/>
+      </day>
+    </timetable>
+
+
+Rotating timetable, different period times (per weekday)
+--------------------------------------------------------
+
+.. image:: images/ttschema-wizard-5.png
+
+Let's do it again!
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+
+We enter a title and press Next
+
+    >>> manager.getControl('Title').value = 'Rotating 3'
+    >>> manager.getControl('Next').click()
+
+Let's choose rotating.
+
+    >>> manager.getControl('Rotating cycle').click()
+
+We shall have three days, designated A, B, and C.
+
+    >>> manager.getControl(name='field.days').value = """\
+    ... A
+    ... B
+    ... C
+    ... """
+    >>> manager.getControl('Next').click()
+
+Let's say that classes begin at different times
+
+    >>> manager.getControl('Different').click()
+
+Do start and end times vary based on the day of the week (Monday -
+Friday) or the day in the cycle?  We'll go with weekly.
+
+    >>> manager.getControl('Day of week').click()
+
+Let's add a few periods.  All days must have the same number of periods.
+
+    >>> for day in [0, 1, 2, 3]:
+    ...     manager.getControl(name='times.%d' % day).value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+
+    >>> manager.getControl(name='times.4').value = """\
+    ... 9:30-10:20
+    ... 10:25-11:15
+    ... 11:20-12:10
+    ... 12:15-13:05
+    ... """
+
+    >>> manager.getControl('Next').click()
+
+Do periods have names or are they simply designated by time? Let's say that
+periods are named.
+
+    >>> manager.getControl('Have names').click()
+
+We will name them periods A, B, C, D.
+
+    >>> manager.getControl(name='field.periods').value = """\
+    ... Period_A
+    ... Period_B
+    ... Period_C
+    ... Period_D
+    ... """
+    >>> manager.getControl('Next').click()
+
+We get to choose whether sequences of periods in all days are the same:
+Let's say they are different.
+
+    >>> manager.getControl('Different').click()
+
+Please put the periods in order for each day. We can rearrange them a bit:
+
+    >>> manager.getControl(name='period_0_0').value = ['Period_A']
+    >>> manager.getControl(name='period_0_1').value = ['Period_C']
+    >>> manager.getControl(name='period_0_2').value = ['Period_B']
+    >>> manager.getControl(name='period_0_3').value = ['Period_D']
+
+    >>> manager.getControl(name='period_1_0').value = ['Period_D']
+    >>> manager.getControl(name='period_1_1').value = ['Period_B']
+    >>> manager.getControl(name='period_1_2').value = ['Period_C']
+    >>> manager.getControl(name='period_1_3').value = ['Period_A']
+
+    >>> manager.getControl(name='period_2_0').value = ['Period_A']
+    >>> manager.getControl(name='period_2_1').value = ['Period_B']
+    >>> manager.getControl(name='period_2_2').value = ['Period_C']
+    >>> manager.getControl(name='period_2_3').value = ['Period_D']
+
+    >>> manager.getControl('Next').click()
+
+Do we use a homeroom period?  Let's say no:
+
+    >>> manager.getControl('No').click()
+
+The schema is now created:
+
+    >>> print rest(r"""
+    ... GET /ttschemas/rotating-3 HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+      <title>Rotating 3</title>
+      <timezone name="UTC"/>
+      <model factory="SequentialDaysTimetableModel">
+        <daytemplate>
+          <used when="Friday"/>
+          <period duration="50" tstart="09:30"/>
+          <period duration="50" tstart="10:25"/>
+          <period duration="50" tstart="11:20"/>
+          <period duration="50" tstart="12:15"/>
+        </daytemplate>
+        <daytemplate>
+          <used when="Monday Thursday Tuesday Wednesday"/>
+          <period duration="55" tstart="09:30"/>
+          <period duration="55" tstart="10:30"/>
+          <period duration="55" tstart="11:30"/>
+          <period duration="55" tstart="12:30"/>
+        </daytemplate>
+        <daytemplate>
+          <used when="default"/>
+        </daytemplate>
+      </model>
+      <day id="A">
+        <period id="Period_A"/>
+        <period id="Period_C"/>
+        <period id="Period_B"/>
+        <period id="Period_D"/>
+      </day>
+      <day id="B">
+        <period id="Period_D"/>
+        <period id="Period_B"/>
+        <period id="Period_C"/>
+        <period id="Period_A"/>
+      </day>
+      <day id="C">
+        <period id="Period_A"/>
+        <period id="Period_B"/>
+        <period id="Period_C"/>
+        <period id="Period_D"/>
+      </day>
+    </timetable>
+
+
+Rotating timetable, different period times (rotating day)
+---------------------------------------------------------
+
+.. image:: images/ttschema-wizard-6.png
+
+Let's do it one last time!
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+
+We enter a title and press the `Next` button:
+
+    >>> manager.getControl('Title').value = 'Rotating 4'
+    >>> manager.getControl('Next').click()
+
+Let's choose rotating.
+
+    >>> manager.getControl('Rotating cycle').click()
+
+We shall have three days, designated Day A, Day B, and Day C.
+
+    >>> manager.getControl(name='field.days').value = """\
+    ... Day A
+    ... Day B
+    ... Day C
+    ... """
+    >>> manager.getControl('Next').click()
+
+Do classes begin and end at the same time each day in your school's timetable?
+Let's say that classes begin at the same time:
+
+    >>> manager.getControl('Different times').click()
+
+Do start and end times vary based on the day of the week (Monday -
+Friday) or the day in the cycle?
+
+    >>> manager.getControl('Day in cycle').click()
+
+Enter start and end times for each slot on each day, one slot (HH:MM - HH:MM)
+per line. Let's add a few periods.  Day 2 will have one period more.
+
+    >>> manager.getControl(name='times.0').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+
+    >>> manager.getControl(name='times.1').value = """\
+    ... 9:00-9:55
+    ... 10:00-10:55
+    ... 11:00-11:55
+    ... 12:00-12:55
+    ... 13:00-13:55
+    ... """
+
+    >>> manager.getControl(name='times.2').value = """\
+    ... 9:30-10:25
+    ... 10:30-11:25
+    ... 11:30-12:25
+    ... 12:30-13:25
+    ... """
+    >>> manager.getControl('Next').click()
+
+Do periods have names or are they simply designated by time? Let's say that
+periods are named.
+
+    >>> manager.getControl('Have names').click()
+
+We will name them periods A, B, C, D, E, F.  Next we get to choose whether
+sequences of periods in all days are the same:
+
+    >>> manager.getControl(name='field.periods').value = """\
+    ... A
+    ... B
+    ... C
+    ... D
+    ... E
+    ... F
+    ... """
+    >>> manager.getControl('Next').click()
+
+Is the sequence of periods each day the same or different? Let's say they are
+different.
+
+    >>> manager.getControl('Different').click()
+
+Please put the periods in order for each day. We can rearrange them a bit:
+
+    >>> manager.getControl(name='period_0_0').value = ['A']
+    >>> manager.getControl(name='period_0_1').value = ['B']
+    >>> manager.getControl(name='period_0_2').value = ['C']
+    >>> manager.getControl(name='period_0_3').value = ['D']
+
+    >>> manager.getControl(name='period_1_0').value = ['B']
+    >>> manager.getControl(name='period_1_1').value = ['C']
+    >>> manager.getControl(name='period_1_2').value = ['D']
+    >>> manager.getControl(name='period_1_3').value = ['E']
+    >>> manager.getControl(name='period_1_4').value = ['F']
+
+    >>> manager.getControl(name='period_2_0').value = ['C']
+    >>> manager.getControl(name='period_2_1').value = ['D']
+    >>> manager.getControl(name='period_2_2').value = ['E']
+    >>> manager.getControl(name='period_2_3').value = ['F']
+
+    >>> manager.getControl('Next').click()
+
+Do we use a homeroom period?  Let's say no:
+
+    >>> manager.getControl('No').click()
+
+The schema is now created:
+
+    >>> print rest(r"""
+    ... GET /ttschemas/rotating-4 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+      <title>Rotating 4</title>
+      <timezone name="UTC"/>
+      <model factory="SequentialDayIdBasedTimetableModel">
+        <daytemplate>
+          <used when="C Day Day A"/>
+          <period duration="55" tstart="09:30"/>
+          <period duration="55" tstart="10:30"/>
+          <period duration="55" tstart="11:30"/>
+          <period duration="55" tstart="12:30"/>
+        </daytemplate>
+        <daytemplate>
+          <used when="Day B"/>
+          <period duration="55" tstart="09:00"/>
+          <period duration="55" tstart="10:00"/>
+          <period duration="55" tstart="11:00"/>
+          <period duration="55" tstart="12:00"/>
+          <period duration="55" tstart="13:00"/>
+        </daytemplate>
+      </model>
+      <day id="Day A">
+        <period id="A"/>
+        <period id="B"/>
+        <period id="C"/>
+        <period id="D"/>
+      </day>
+      <day id="Day B">
+        <period id="B"/>
+        <period id="C"/>
+        <period id="D"/>
+        <period id="E"/>
+        <period id="F"/>
+      </day>
+      <day id="Day C">
+        <period id="C"/>
+        <period id="D"/>
+        <period id="E"/>
+        <period id="F"/>
+      </day>
+    </timetable>
+
+
+The Cancel button
+-----------------
+
+Let's do it once more!
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+
+We enter a title and press Next
+
+    >>> manager.getControl('Title').value = 'Rotating'
+    >>> manager.getControl('Next').click()
+
+And now we suddenly realize that we don't need another schema.  We can't
+simply go away and forget about this wizard, because it remembers the
+last step we completed:
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+    >>> "Days of the week" in manager.contents
+    True
+    >>> "Rotating cycle" in manager.contents
+    True
+
+However we can press the Cancel button and go back to the beginning
+
+    >>> manager.getControl('Cancel').click()
+    >>> manager.url
+    'http://localhost/ttschemas'
+
+If we now click on the New Timetable button, we'll see the first page
+again.
+
+    >>> manager.getLink('New Timetable').click()
+    >>> manager.getControl('Title')
+    <Control name='field.title' type='text'>
+
+
+.. vim: ft=rest fdm=indent


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema-wizard.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,481 @@
+Functional test for timetable schemas
+=====================================
+
+
+Overview
+--------
+
+1. Add a timetable schema named 'weekly' with the advanced add view.
+2. Add another timetable schema -- one called 'Schema 2'.
+3. Choose the second schema as the default one.
+4. Add a third timetable schema ('other') -- but this time use the simple add
+   view.
+5. Create a term '2005-summer' from 2005-06-01 to 2005-08-31.
+6. Mark 2005-07-07 as a special day -- change class start and end times.
+7. Switch the default schema to 'other'.
+8. Mark 2005-07-07 as an emergency day -- move it to 2005-09-01.
+9. Verify that 2005-09-01 remembers class times specified in step 6.
+10. Delete a school timetable
+11. Delete a term
+
+
+Setup
+-----
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+The schema container is empty initially:
+
+    >>> manager.getLink('School Timetables').click()
+    >>> '<p>There are none.</p>' in manager.contents
+    True
+
+
+Advanced timetable schema add view
+----------------------------------
+
+Let's go to the advanced 'New Timetable Schema' view:
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+    >>> manager.getLink('advanced adding form').click()
+
+When we enter a schema name and press the 'Add day' button, we get an
+extra day:
+
+    >>> manager.getControl('Title').value = 'weekly'
+    >>> manager.getControl('Add day').click()
+    >>> 'Day 2' in manager.contents
+    True
+
+When we click 'Add Period', we get an extra period!
+
+    >>> manager.getControl('Add period').click()
+    >>> 'Period 2' in manager.contents
+    True
+
+Finally we post the completed form:
+
+Make sure we have five days
+
+    >>> manager.getControl('Add day').click()
+    >>> manager.getControl('Add day').click()
+    >>> manager.getControl('Add day').click()
+
+Make sure we have 4 periods
+
+    >>> manager.getControl('Add period').click()
+    >>> manager.getControl('Add period').click()
+
+    >>> manager.getControl(name='day1').value = 'Monday'
+    >>> manager.getControl(name='day1.period1').value = 'Period 1'
+    >>> manager.getControl(name='day1.period2').value = 'Period 2'
+    >>> manager.getControl(name='day1.period3').value = 'Period 3'
+    >>> manager.getControl(name='day1.period4').value = 'Period 4'
+
+    >>> manager.getControl(name='day2').value = 'Tuesday'
+    >>> manager.getControl(name='day2.period1').value = 'Period 1'
+    >>> manager.getControl(name='day2.period2').value = 'Period 2'
+    >>> manager.getControl(name='day2.period3').value = 'Period 3'
+    >>> manager.getControl(name='day2.period4').value = 'Period 4'
+
+    >>> manager.getControl(name='day3').value = 'Wednesday'
+    >>> manager.getControl(name='day3.period1').value = 'Period 1'
+    >>> manager.getControl(name='day3.period2').value = 'Period 2'
+    >>> manager.getControl(name='day3.period3').value = 'Period 3'
+    >>> manager.getControl(name='day3.period4').value = 'Period 4'
+
+    >>> manager.getControl(name='day4').value = 'Thursday'
+    >>> manager.getControl(name='day4.period1').value = 'Period 1'
+    >>> manager.getControl(name='day4.period2').value = 'Period 2'
+    >>> manager.getControl(name='day4.period3').value = 'Period 3'
+    >>> manager.getControl(name='day4.period4').value = 'Period 4'
+
+    >>> manager.getControl(name='day5').value = 'Friday'
+    >>> manager.getControl(name='day5.period1').value = 'Period 1'
+    >>> manager.getControl(name='day5.period2').value = 'Period 2'
+    >>> manager.getControl(name='day5.period3').value = 'Period 3'
+    >>> manager.getControl(name='day5.period4').value = 'Period 4'
+
+    >>> manager.getControl('Update', index=1).click()
+    >>> manager.getControl('Timetable day always coincides with the').click()
+
+    >>> manager.getControl(name='time1.day0').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day1').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day2').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day3').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day5').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day6').value = '9:00-9:45'
+
+    >>> manager.getControl(name='time2.day0').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day1').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day2').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day3').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day5').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day6').value = '10:00-10:45'
+
+    >>> manager.getControl(name='time3.day0').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day1').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day2').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day3').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day5').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day6').value = '11:00-11:45'
+
+    >>> manager.getControl(name='time4.day0').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day1').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day2').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day3').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day5').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day6').value = '12:00-12:45'
+
+    >>> manager.getControl('Duration').value = '45'
+    >>> manager.getControl('Create timetable schema').click()
+
+Now we see the newly created timetable schema in the list, it should
+be the default one:
+
+    >>> '<option selected="selected" value="weekly">' in manager.contents
+    True
+
+The unauthenticated user can also, surprisingly, see what is the
+default schema:
+
+    >>> anonymous = Browser()
+    >>> anonymous.handleErrors = False
+    >>> anonymous.open('http://localhost/ttschemas')
+
+    >>> print anonymous.contents
+    <BLANKLINE>
+    ...
+    <div class="row">
+      <label for="ttschema">Default Timetable Schema:</label>
+      <a href="http://localhost/ttschemas/weekly">weekly</a>
+    </div>
+    ...
+
+Lets add one more schema:
+
+    >>> manager.getLink('New Timetable').click()
+    >>> manager.getLink('advanced adding form').click()
+    >>> manager.getControl('Title').value = 'Schema 2'
+
+Add enough days
+
+    >>> manager.getControl('Add day').click()
+    >>> manager.getControl('Add day').click()
+    >>> manager.getControl('Add day').click()
+    >>> manager.getControl('Add day').click()
+
+Have enough periods
+
+    >>> manager.getControl('Add period').click()
+    >>> manager.getControl('Add period').click()
+    >>> manager.getControl('Add period').click()
+
+    >>> manager.getControl(name='day1').value = 'Monday'
+    >>> manager.getControl(name='day1.period1').value = 'Period 1'
+    >>> manager.getControl(name='day1.period2').value = 'Period 2'
+    >>> manager.getControl(name='day1.period3').value = 'Period 3'
+    >>> manager.getControl(name='day1.period4').value = 'Period 4'
+
+    >>> manager.getControl(name='day2').value = 'Tuesday'
+    >>> manager.getControl(name='day2.period1').value = 'Period 1'
+    >>> manager.getControl(name='day2.period2').value = 'Period 2'
+    >>> manager.getControl(name='day2.period3').value = 'Period 3'
+    >>> manager.getControl(name='day2.period4').value = 'Period 4'
+
+    >>> manager.getControl(name='day3').value = 'Wednesday'
+    >>> manager.getControl(name='day3.period1').value = 'Period 1'
+    >>> manager.getControl(name='day3.period2').value = 'Period 2'
+    >>> manager.getControl(name='day3.period3').value = 'Period 3'
+    >>> manager.getControl(name='day3.period4').value = 'Period 4'
+
+    >>> manager.getControl(name='day4').value = 'Thursday'
+    >>> manager.getControl(name='day4.period1').value = 'Period 1'
+    >>> manager.getControl(name='day4.period2').value = 'Period 2'
+    >>> manager.getControl(name='day4.period3').value = 'Period 3'
+    >>> manager.getControl(name='day4.period4').value = 'Period 4'
+
+    >>> manager.getControl(name='day5').value = 'Friday'
+    >>> manager.getControl(name='day5.period1').value = 'Period 1'
+    >>> manager.getControl(name='day5.period2').value = 'Period 2'
+    >>> manager.getControl(name='day5.period3').value = 'Period 3'
+    >>> manager.getControl(name='day5.period4').value = 'Period 4'
+
+    >>> manager.getControl('Update', index=1).click()
+    >>> manager.getControl('Timetable day always coincides with the').click()
+
+    >>> manager.getControl(name='time1.day0').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day1').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day2').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day3').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day5').value = '9:00-9:45'
+    >>> manager.getControl(name='time1.day6').value = '9:00-9:45'
+
+    >>> manager.getControl(name='time2.day0').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day1').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day2').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day3').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day5').value = '10:00-10:45'
+    >>> manager.getControl(name='time2.day6').value = '10:00-10:45'
+
+    >>> manager.getControl(name='time3.day0').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day1').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day2').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day3').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day5').value = '11:00-11:45'
+    >>> manager.getControl(name='time3.day6').value = '11:00-11:45'
+
+    >>> manager.getControl(name='time4.day0').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day1').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day2').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day3').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day5').value = '12:00-12:45'
+    >>> manager.getControl(name='time4.day6').value = '12:00-12:45'
+
+    >>> manager.getControl('Duration').value = '45'
+    >>> manager.getControl('Create timetable schema').click()
+
+It should appear on the list:
+
+    >>> '<option value="schema-2">' in manager.contents
+    True
+
+We can change the default ttschema if we want to:
+
+    >>> manager.getControl('Schema 2').click()
+    >>> manager.getControl('Change').click()
+
+    >>> '<option selected="selected" value="schema-2">' in manager.contents
+    True
+
+
+Simple timetable add view
+-------------------------
+
+Now let's try the simple timetable schema setup view:
+
+    >>> manager.getLink('New Timetable').click()
+    >>> manager.getLink('weekly timetable schema').click()
+    >>> manager.getControl('Title').value = 'other'
+
+    >>> manager.getControl(name='field.period_name_1').value = 'P1'
+    >>> manager.getControl(name='field.period_start_1').value = '9:00'
+    >>> manager.getControl(name='field.period_finish_1').value = '9:45'
+
+    >>> manager.getControl(name='field.period_name_2').value = 'P2'
+    >>> manager.getControl(name='field.period_start_2').value = '10:00'
+    >>> manager.getControl(name='field.period_finish_2').value = '10:45'
+
+    >>> manager.getControl(name='field.period_name_3').value = 'P3'
+    >>> manager.getControl(name='field.period_start_3').value = '11:00'
+    >>> manager.getControl(name='field.period_finish_3').value = '11:45'
+
+    >>> manager.getControl('Create').click()
+
+A new timetable schema appeared:
+
+    >>> '<option value="other">' in manager.contents
+    True
+
+
+Special days
+------------
+
+We need a term:
+
+    >>> manager.getLink('Terms').click()
+    >>> manager.getLink('New Term').click()
+
+    >>> manager.getControl('Title').value = '2005 Summer'
+    >>> manager.getControl('Start date').value = '2005-06-01'
+    >>> manager.getControl('End date').value = '2005-08-31'
+    >>> manager.getControl('Next').click()
+
+    >>> manager.getControl('Saturday').click()
+    >>> manager.getControl('Sunday').click()
+
+    >>> manager.getControl('Add term').click()
+
+We can shift the start and end times for periods for a certain day:
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('other').click()
+    >>> manager.getLink('Change Timetable for One Day').click()
+
+    >>> manager.getControl('Date').value = '2005-07-07'
+    >>> manager.getControl('Proceed').click()
+
+If we fill in this form, an exception day is posted:
+
+    >>> manager.getControl(name='P1_start').value = '8:00'
+    >>> manager.getControl(name='P1_end').value = '8:30'
+    >>> manager.getControl(name='P2_start').value = '8:45'
+    >>> manager.getControl(name='P2_end').value = '9:15'
+    >>> manager.getControl(name='P3_start').value = '9:30'
+    >>> manager.getControl(name='P3_end').value = '10:15'
+
+    >>> manager.getControl('Modify').click()
+
+If we look at the form again, we see the times have changed:
+
+    >>> manager.getLink('Change Timetable for One Day').click()
+    >>> manager.getControl('Date').value = '2005-07-07'
+    >>> manager.getControl('Proceed').click()
+
+    >>> manager.getControl(name='P1_start').value
+    '08:00'
+    >>> manager.getControl(name='P1_end').value
+    '08:30'
+    >>> manager.getControl(name='P2_start').value
+    '08:45'
+    >>> manager.getControl(name='P2_end').value
+    '09:15'
+    >>> manager.getControl(name='P3_start').value
+    '09:30'
+    >>> manager.getControl(name='P3_end').value
+    '10:15'
+
+
+Emergency Days
+--------------
+
+Now let's make 2005-07-07 an emergency day:
+
+    >>> manager.getLink('Terms').click()
+    >>> manager.getLink('2005 Summer').click()
+    >>> manager.getLink('Cancel School in Emergency').click()
+
+    >>> manager.getControl('Date').value = '2005-07-07'
+    >>> manager.getControl('Proceed').click()
+
+When we select the second date, the replacement day is registered:
+
+    >>> manager.getControl('Replacement').getControl('2005-09-01').click()
+    >>> manager.getControl('Proceed').click()
+
+Now all periods for this day are cancelled:
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('other').click()
+    >>> manager.getLink('Change Timetable for One Day').click()
+
+    >>> manager.getControl('Date').value = '2005-07-07'
+    >>> manager.getControl('Proceed').click()
+
+    >>> manager.getControl(name='P1_start').value
+    ''
+    >>> manager.getControl(name='P1_end').value
+    ''
+    >>> manager.getControl(name='P2_start').value
+    ''
+    >>> manager.getControl(name='P2_end').value
+    ''
+    >>> manager.getControl(name='P3_start').value
+    ''
+    >>> manager.getControl(name='P3_end').value
+    ''
+
+But the replacement day now contains periods all-right:
+
+    >>> manager.getLink('Change Timetable for One Day').click()
+
+    >>> manager.getControl('Date').value = '2005-09-01'
+    >>> manager.getControl('Proceed').click()
+
+    >>> manager.getControl(name='P1_start').value
+    '09:00'
+    >>> manager.getControl(name='P1_end').value
+    '09:45'
+    >>> manager.getControl(name='P2_start').value
+    '10:00'
+    >>> manager.getControl(name='P2_end').value
+    '10:45'
+    >>> manager.getControl(name='P3_start').value
+    '11:00'
+    >>> manager.getControl(name='P3_end').value
+    '11:45'
+
+Let's go back to the index of the school timetables:
+
+    >>> manager.getLink('School Timetables').click()
+
+Let's delete the new schema:
+
+    >>> manager.getControl(name='delete.schema-2').value = True
+    >>> manager.getControl('Delete').click()
+
+We get to the confirmation page:
+
+    >>> print manager.contents
+    <BLANKLINE>
+    ...
+    Are you sure you want to delete the selected school timetables?
+    ...
+            <input type="hidden" name="delete.schema-2" />
+            <a href="http://localhost/ttschemas/schema-2">Schema 2</a>.
+            This school timetable is used by 0 individual timetables.
+    ...
+
+Let's proceed:
+
+    >>> manager.getControl('Confirm').click()
+
+We get back to the school timetables index page:
+
+    >>> '<h1>School Timetables</h1>' in manager.contents
+    True
+
+But the deleted schema is not there:
+
+    >>> 'schema-2' not in manager.contents
+    True
+    >>> 'Schema 2' not in manager.contents
+    True
+
+The default schema selection is unset:
+
+    >>> 'selected' not in manager.contents
+    True
+
+
+Let's go back to the index of terms:
+
+    >>> manager.getLink('Terms').click()
+
+Let's delete the term:
+
+    >>> manager.getControl(name='delete.2005-summer').value = True
+    >>> manager.getControl('Delete').click()
+
+We get to the confirmation page:
+
+    >>> print manager.contents
+    <BLANKLINE>
+    ...
+    Are you sure you want to delete the selected terms?
+    ...
+            <input type="hidden" name="delete.2005-summer" />
+            <a href="http://localhost/terms/2005-summer">2005 Summer</a>.
+            This term is used by 0 individual timetables.
+    ...
+
+Let's proceed:
+
+    >>> manager.getControl('Confirm').click()
+
+We get back to the terms index page:
+
+    >>> '<h1>Terms</h1>' in manager.contents
+    True
+
+But the deleted term is not there:
+
+    >>> '2005-summer' not in manager.contents
+    True
+    >>> '2005 summer' not in manager.contents
+    True


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/ttschema.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/undead-calendar-overlays.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/undead-calendar-overlays.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/undead-calendar-overlays.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,71 @@
+Overlayed calendars of deleted objects
+======================================
+
+Regression test for http://issues.schooltool.org/issue369
+
+When you delete a person or a group, its calendar isn't removed from
+overlay lists of other persons, causing problems later on.
+
+
+Setup
+-----
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager_browser = Browser()
+    >>> manager_browser.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager_browser.handleErrors = False
+    >>> manager_browser.open('http://localhost/')
+    >>> "SchoolTool" in manager_browser.contents
+    True
+
+We will need a user and a group:
+
+    >>> manager_browser.getLink('Groups').click()
+    >>> manager_browser.getLink('New Group').click()
+    >>> manager_browser.getControl('Title').value = 'A Group'
+    >>> manager_browser.getControl('Add').click()
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Stephan Richter', 'srichter', 'foobar',
+    ...           groups=['a-group'])
+
+Let's log in as the new user:
+
+    >>> srichter_browser = Browser()
+    >>> srichter_browser.handleErrors = False
+    >>> srichter_browser.addHeader('Authorization', 'Basic srichter:foobar')
+
+Let's add the group's calendar to his calendar overlays:
+
+    >>> srichter_browser.open('http://localhost/persons/srichter/calendar')
+    >>> srichter_browser.getControl('More...').click()
+
+    >>> srichter_browser.getControl('A Group').selected = True
+    >>> srichter_browser.getControl('Apply').click()
+
+Test
+----
+
+We just added A Group to Stephan's overlays:
+
+    >>> srichter_browser.open('http://localhost/persons/srichter/calendar')
+    >>> 'http://localhost/groups/a-group/calendar' in srichter_browser.contents
+    True
+
+If we delete the group from the database:
+
+    >>> manager_browser.open('http://localhost/groups/')
+    >>> manager_browser.getControl(name='delete.a-group').value = True
+    >>> manager_browser.getControl('Delete').click()
+    >>> manager_browser.getControl('Confirm').click()
+
+It should disappear from the overlay list.
+
+    >>> srichter_browser.open('http://localhost/persons/srichter/calendar')
+    >>> 'http://localhost/groups/a-group/calendar' in srichter_browser.contents
+    False
+
+User should still be capable of modifying his overlay list:
+
+    >>> srichter_browser.getControl(name='my_timetable').value = False
+    >>> srichter_browser.getControl('Apply').click()


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/ftests/undead-calendar-overlays.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,121 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Interfaces for SchoolTool calendar browser views.
+
+$Id: interfaces.py 5827 2006-03-20 13:21:01Z faassen $
+"""
+
+from zope.schema import Object, Datetime, TextLine, Bool, URI
+from zope.interface import Interface, Attribute
+
+from schooltool.calendar.interfaces import ICalendar, ICalendarEvent
+
+
+class IEventForDisplay(ICalendarEvent):
+    """A decorated calendar event.
+
+    Calendar views have additional information that is not contained in event
+    objects.
+    """
+
+    context = Object(
+        title=u"The event being decorated",
+        schema=ICalendarEvent)
+
+    dtend = Datetime(
+        title=u"End",
+        readonly=True,
+        description=u"""
+        Date and time when the event ends.
+
+        dtend == dtstart + duration
+        """)
+
+    dtstarttz = Datetime(
+        title=u"Start (in user's timezone)",
+        readonly=True,
+        description=u"""
+        Date and time when the event starts, converted to the user's preferred
+        timezone.
+        """)
+
+    dtendtz = Datetime(
+        title=u"End (in user's timezone)",
+        readonly=True,
+        description=u"""
+        Date and time when the event ends, converted to the user's preferred
+        timezone.
+        """)
+
+    source = Object(
+        title=u"Source calendar",
+        schema=ICalendar,
+        description=u"""
+        The calendar the event came from.  A view may display events from
+        several overlaid calendars.
+        """)
+
+    color1 = TextLine(
+        title=u"Color used for display (1)",
+        description=u"""
+        One of the two colors used to distinguish events coming form 
+        sources.
+
+        These two colors should contrast enough so that one can be used
+        as text color when the other is used as a background color.
+
+        This attribute contains a string usable as a CSS color value.
+        """)
+
+    color2 = TextLine(
+        title=u"Color used for display (2)",
+        description=u"""
+        The other of the two colors used to distinguish events coming form
+        sources.
+
+        These two colors should contrast enough so that one can be used
+        as text color when the other is used as a background color.
+
+        This attribute contains a string usable as a CSS color value.
+        """)
+
+    shortTitle = TextLine(
+        title=u"Short Title",
+        description=u"""The title of the event, ellipsized if necessary.""")
+
+    cssClass = TextLine(
+        title=u"CSS Class",
+        description=u"""
+        Suggested event class name.  Currently it is always 'event'.
+        """)
+
+
+class ICalendarProvider(Interface):
+    """Calendar provider.
+
+    Subscription adapters providing this interface will be used to
+    combine the list of calendars that will be displayed.
+    """
+
+    def getCalendars():
+        """Gets a list of calendars to display.
+
+        Yields tuples (calendar, color1, color2).
+        """


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/overlay.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/overlay.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/overlay.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,232 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Calendar overlay views for the SchoolBell application.
+
+$Id: overlay.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import urllib
+from sets import Set
+
+from zope.publisher.browser import BrowserView
+from zope.traversing.api import getPath
+from zope.traversing.browser.absoluteurl import absoluteURL
+from zope.location.interfaces import ILocation
+from zope.security.proxy import removeSecurityProxy
+from zope.security.checker import canAccess
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.interfaces import IShowTimetables
+from schooltool.person.interfaces import IPerson
+
+
+class CalendarOverlayView(BrowserView):
+    """View for the calendar overlay portlet.
+
+    This view can be used with any context, but it gets rendered to an empty
+    string unless context is the calendar of the authenticated user.
+
+    Note that this view contains a self-posting form and handles submits that
+    contain 'OVERLAY_APPLY' or 'OVERLAY_MORE' in the request.
+    """
+
+    def show_overlay(self):
+        """Check whether the calendar overlay portlet needs to be rendered.
+
+            >>> from zope.app.testing import setup
+            >>> setup.placelessSetUp()
+            >>> setup.setUpAnnotations()
+
+            >>> from schooltool.testing import setup as sbsetup
+            >>> sbsetup.setUpCalendaring()
+
+        The portlet is only shown when an authenticated user is looking
+        at his/her calendar.
+
+        Anonymous user:
+
+            >>> from zope.publisher.browser import TestRequest
+            >>> from schooltool.person.person import Person
+            >>> request = TestRequest()
+            >>> person = Person()
+            >>> context = ISchoolToolCalendar(person)
+            >>> view = CalendarOverlayView(context, request)
+            >>> view.show_overlay()
+            False
+
+        Person that we're looking at
+
+            >>> from schooltool.app.security import Principal
+            >>> request.setPrincipal(Principal('id', 'title', person))
+            >>> view.show_overlay()
+            True
+
+        A different person:
+
+            >>> request.setPrincipal(Principal('id', 'title', Person()))
+            >>> view.show_overlay()
+            False
+
+       Cleanup:
+
+            >>> setup.placelessTearDown()
+
+        """
+        if not ILocation.providedBy(self.context):
+            return False
+        logged_in = removeSecurityProxy(IPerson(self.request.principal, None))
+        calendar_owner = removeSecurityProxy(self.context.__parent__)
+        return logged_in is calendar_owner
+
+    def items(self):
+        """Return items to be shown in the calendar overlay.
+
+        Does not include "my calendar".
+
+        Each item is a dict with the following keys:
+
+            'title' - title of the calendar
+
+            'calendar' - the calendar object
+
+            'color1', 'color2' - colors assigned to this calendar
+
+            'id' - identifier for form controls
+
+            'checked' - was this item checked for display (either "checked" or
+            None)?
+
+        """
+        person = IPerson(self.request.principal)
+        items = [(item.calendar.title,
+                  {'title': item.calendar.title,
+                   'id': getPath(item.calendar.__parent__),
+                   'calendar': item.calendar,
+                   'checked': item.show and "checked" or '',
+                   'color1': item.color1,
+                   'color2': item.color2})
+                 for item in person.overlaid_calendars
+                 if canAccess(item.calendar, '__iter__')]
+        items.sort()
+        return [i[-1] for i in items]
+
+    def update(self):
+        """Process form submission."""
+        if 'OVERLAY_MORE' in self.request:
+            person = IPerson(self.request.principal)
+            url = absoluteURL(person, self.request)
+            url += '/calendar_selection.html'
+            url += '?nexturl=%s' % urllib.quote(str(self.request.URL))
+            self.request.response.redirect(url)
+        if 'OVERLAY_APPLY' in self.request:
+            person = IPerson(self.request.principal)
+            selected = Set(self.request.get('overlay', []))
+            for item in person.overlaid_calendars:
+                item.show = getPath(item.calendar.__parent__) in selected
+            url = str(self.request.URL)
+            self.request.response.redirect(url)
+
+
+class CalendarSelectionView(BrowserView):
+    """A view for calendar selection.
+
+    This view can be used with any context, but always operates on the
+    currently authenticated user's list of overlaid calendars.
+    """
+
+    error = None
+    message = None
+
+    def getCalendars(self, container):
+        """List all calendars from a given container."""
+        user = removeSecurityProxy(IPerson(self.request.principal, None))
+        if user is None:
+            return []
+        app = getSchoolToolApplication()
+
+        result = []
+        for obj in app[container].values():
+            calendar = ISchoolToolCalendar(obj)
+            if obj is not user and canAccess(calendar, '__iter__'):
+                result.append(
+                    {'id': obj.__name__,
+                     'title': obj.title,
+                     'selected': calendar in user.overlaid_calendars,
+                     'calendar': calendar})
+        return result
+
+    def getApplicationCalendar(self):
+        """Return the application calendar.
+
+        Returns None if the user lacks sufficient permissions.
+        """
+        user = IPerson(self.request.principal, None)
+        if user:
+            app = getSchoolToolApplication()
+            calendar = ISchoolToolCalendar(app)
+            if canAccess(calendar, '__iter__'):
+                return {'title': app.title,
+                        'selected': calendar in user.overlaid_calendars,
+                        'calendar': calendar}
+        return {}
+
+    application = property(getApplicationCalendar)
+    persons = property(lambda self: self.getCalendars('persons'))
+    groups = property(lambda self: self.getCalendars('groups'))
+    resources = property(lambda self: self.getCalendars('resources'))
+
+    def update(self):
+        """Process forms."""
+        if 'CANCEL' in self.request:
+            nexturl = self.request.form.get('nexturl')
+            if nexturl:
+                self.request.response.redirect(nexturl)
+            return
+        user = IPerson(self.request.principal, None)
+        if user is None:
+            return
+        if 'UPDATE_SUBMIT' in self.request:
+            self._updateSelection(user)
+            self.message = _('Saved changes.')
+            nexturl = self.request.form.get('nexturl')
+            if nexturl:
+                self.request.response.redirect(nexturl)
+
+    def _updateSelection(self, user):
+        """Apply calendar selection changes  for `user`."""
+        for container in 'persons', 'groups', 'resources':
+            selected = Set(self.request.form.get(container, []))
+            for item in self.getCalendars(container):
+                if item['id'] in selected and not item['selected']:
+                    ovl_info = user.overlaid_calendars.add(item['calendar'])
+                    if container != 'persons':
+                        IShowTimetables(ovl_info).showTimetables = False
+                elif item['id'] not in selected and item['selected']:
+                    user.overlaid_calendars.remove(item['calendar'])
+        appcal = self.getApplicationCalendar().get('calendar')
+        if appcal is not None:
+            if ('application' in self.request and
+                    appcal not in user.overlaid_calendars):
+                user.overlaid_calendars.add(appcal)
+            elif ('application' not in self.request and
+                    appcal in user.overlaid_calendars):
+                user.overlaid_calendars.remove(appcal)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/overlay.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/pdfcal.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/pdfcal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/pdfcal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,407 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolBell calendar views.
+
+$Id: pdfcal.py 6017 2006-05-05 12:04:11Z gintas $
+"""
+
+import datetime
+from cStringIO import StringIO
+
+from zope.component import subscribers
+from zope.publisher.browser import BrowserView
+from zope.i18n import translate
+from zope.security.proxy import removeSecurityProxy
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.browser import ViewPreferences, same
+from schooltool.app.browser.interfaces import ICalendarProvider
+from schooltool.calendar.utils import parse_date, week_start
+from schooltool import SchoolToolMessage as _
+
+
+global disabled
+disabled = True
+
+SANS = 'Arial_Normal'
+SANS_OBLIQUE = 'Arial_Italic'
+SANS_BOLD = 'Arial_Bold'
+SERIF = 'Times_New_Roman'
+
+
+class PDFCalendarViewBase(BrowserView):
+    """The daily view of a calendar in PDF."""
+
+    # We do imports from reportlab locally to avoid a hard dependency.
+
+    __used_for__ = ISchoolToolCalendar
+
+    title = None # override this in subclasses
+
+    pdf_disabled_text = _("PDF support is disabled."
+                          "  It can be enabled by your administrator.")
+
+    def pdfdata(self):
+        """Return the PDF representation of a calendar."""
+        global disabled
+        if disabled:
+            return translate(self.pdf_disabled_text, context=self.request)
+
+        from reportlab.platypus import SimpleDocTemplate
+        if 'date' in self.request:
+            date = parse_date(self.request['date'])
+        else:
+            date = datetime.date.today()
+
+        datafile = StringIO()
+        doc = SimpleDocTemplate(datafile)
+
+        self.configureStyles()
+        story = self.buildStory(date)
+        doc.build(story)
+
+        data = datafile.getvalue()
+        self.setUpPDFHeaders(data)
+        return data
+
+    def buildStory(self, date):
+        """Build a platypus story that draws the PDF report."""
+        owner = self.context.__parent__
+        story = self.buildPageHeader(owner.title, date)
+
+        self.calendars = self.getCalendars()
+        event_tables = self.buildEventTables(date)
+        story.extend(event_tables)
+        return story
+
+    def getCalendars(self):
+        """Get a list of calendars to display."""
+        providers = subscribers((self.context, self.request), ICalendarProvider)
+
+        coloured_calendars = []
+        for provider in providers:
+            coloured_calendars += provider.getCalendars()
+
+        calendars = [calendar for (calendar, color1, color2)
+                     in coloured_calendars]
+        return calendars
+
+    def configureStyles(self):
+        """Store some styles in instance attributes.
+
+        These would be done in the class declaration if we could do a
+        global import of ParagraphStyle.
+        """
+        from reportlab.lib.styles import ParagraphStyle
+        from reportlab.lib.enums import TA_CENTER
+
+        self.normal_style = ParagraphStyle(name='Normal', fontName=SANS,
+                                           fontsize=10, leading=12)
+        self.title_style = ParagraphStyle(name='Title', fontName=SANS_BOLD,
+                                          parent=self.normal_style,
+                                          fontsize=18, leading=22,
+                                          alignment=TA_CENTER, spaceAfter=6)
+        self.subtitle_style = ParagraphStyle(name='Subtitle',
+                                             parent=self.title_style,
+                                             spaceBefore=16)
+        self.italic_style = ParagraphStyle(name='Italic',
+                                           parent=self.normal_style,
+                                           fontName=SANS_OBLIQUE)
+
+    def setUpPDFHeaders(self, data):
+        """Set up HTTP headers to serve data as PDF."""
+        response = self.request.response
+        response.setHeader('Content-Type', 'application/pdf')
+        response.setHeader('Content-Length', len(data))
+        # We don't really accept ranges, but Acrobat Reader will not show the
+        # report in the browser page if this header is not provided.
+        response.setHeader('Accept-Ranges', 'bytes')
+        # TODO: test reports with Acrobat Reader
+
+    def buildPageHeader(self, owner_title, date):
+        """Build a story that constructs the top of the first page."""
+        from reportlab.platypus import Paragraph
+        from reportlab.lib.units import cm
+
+        title = translate(self.title, context=self.request) % owner_title
+        date_title = self.dateTitle(date)
+
+        story = [Paragraph(title.encode('utf-8'), self.title_style),
+                 Paragraph(date_title.encode('utf-8'), self.title_style)]
+        return story
+
+    def buildDayTable(self, events):
+        """Return the platypus table that shows events."""
+        from reportlab.platypus import Paragraph
+        from reportlab.platypus import Table, TableStyle
+        from reportlab.lib import colors
+        from reportlab.lib.units import cm
+
+        rows = []
+        for event in events:
+            if event.allday:
+                time_cell_text = translate(_("all day"), context=self.request)
+            else:
+                start = event.dtstart.astimezone(self.getTimezone())
+                dtend = start + event.duration
+                time_cell_text = "%s-%s" % (start.strftime('%H:%M'),
+                                            dtend.strftime('%H:%M'))
+            time_cell = Paragraph(time_cell_text.encode('utf-8'),
+                                  self.italic_style)
+            text_cell = self.eventInfoCell(event)
+            rows.append([time_cell, text_cell])
+
+        tstyle = TableStyle([('BOX', (0, 0), (-1, -1), 0.25, colors.black),
+                       ('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
+                       ('VALIGN', (0, 0), (0, -1), 'TOP')])
+        table = Table(rows, colWidths=(2.5 * cm, 16 * cm), style=tstyle)
+        return table
+
+    def eventInfoCell(self, event):
+        """Return the contents of an event information cell."""
+        from reportlab.platypus import Paragraph
+        title = event.title.encode('utf-8')
+        paragraphs = [Paragraph(title, self.normal_style)]
+        if event.description:
+            description = event.description.encode('utf-8')
+            paragraphs.append(Paragraph(description, self.italic_style))
+        if event.location:
+            location_template = translate(
+                _('Location: %s'), context=self.request)
+            location = location_template % event.location
+            paragraphs.append(
+                Paragraph(location.encode('utf-8'), self.normal_style))
+        if event.resources:
+            resource_titles = [resource.title for resource in event.resources]
+            resource_str_template = translate(_('Booked resources: %s'),
+                                              context=self.request)
+            resources = resource_str_template % ', '.join(resource_titles)
+            paragraphs.append(Paragraph(resources.encode('utf-8'),
+                                        self.normal_style))
+        tags = self.eventTags(event)
+        if tags:
+            tags_text = '(' + ', '.join(tags) + ')'
+            paragraphs.append(Paragraph(tags_text.encode('utf-8'),
+                                        self.normal_style))
+        return paragraphs
+
+    def eventTags(self, event):
+        tags = []
+        if event.recurrence:
+            tags.append(translate(_("recurrent"), context=self.request))
+        if (not same(event.__parent__, self.context)
+            and event.__parent__ is not None):
+            # We have an event from an overlaid calendar.
+            tag = translate(_('overlaid from %s'), context=self.request)
+            # We assume that event.__parent__ is a Calendar which belongs to
+            # an object with a title.
+            tags.append(tag % event.__parent__.__parent__.title)
+        return tags
+
+    def getTimezone(self):
+        """Return the timezone for the PDF report."""
+        prefs = ViewPreferences(self.request)
+        return prefs.timezone
+
+    def dayEvents(self, date):
+        """Return a list of events that should be shown.
+
+        All-day events are placed in front.
+        """
+        allday_events = []
+        events = []
+        tz = self.getTimezone()
+        start = tz.localize(datetime.datetime.combine(date, datetime.time(0)))
+        end = start + datetime.timedelta(days=1)
+
+        for calendar in self.getCalendars():
+            for event in calendar.expand(start, end):
+                if (same(event.__parent__, self.context)
+                      and not same(calendar, self.context)):
+                    # We may have overlaid resource booking events appearing
+                    # twice (once for self.context and another time for the
+                    # other calendar).  We can recognize such dupes by
+                    # checking that their __parent__ does not match the
+                    # calendar they are coming from.
+                    continue
+                if event.allday:
+                    allday_events.append(event)
+                else:
+                    events.append(event)
+
+        allday_events.sort()
+        events.sort()
+        return allday_events + events
+
+    def daySubtitle(self, date):
+        """Return a readable representation of a date.
+
+        This is used in captions for individual days in views that
+        span multiple days.
+        """
+        # avoid recursive imports
+        from schooltool.app.browser.cal import day_of_week_names
+        day_of_week_msgid = day_of_week_names[date.weekday()]
+        day_of_week = translate(day_of_week_msgid, context=self.request)
+        return "%s, %s" % (date.isoformat(), day_of_week)
+
+    def buildEventTables(self, date): # override in subclasses
+        """Return the story that draws events in the current time period."""
+        raise NotImplementedError()
+
+    def dateTitle(self, date): # override in subclasses
+        """Return the title for the current time period.
+
+        Used at the top of the page.
+        """
+        raise NotImplementedError()
+
+
+class DailyPDFCalendarView(PDFCalendarViewBase):
+
+    title = _("Daily calendar for %s")
+
+    def buildEventTables(self, date):
+        events = self.dayEvents(date)
+        if events:
+            return [self.buildDayTable(events)]
+        else:
+            return []
+
+    dateTitle = PDFCalendarViewBase.daySubtitle
+
+
+class WeeklyPDFCalendarView(PDFCalendarViewBase):
+
+    title = _("Weekly calendar for %s")
+
+    def dateTitle(self, date):
+        year, week = date.isocalendar()[:2]
+        start = week_start(date, 0) # TODO: first_day_of_week
+        end = start + datetime.timedelta(weeks=1)
+        template = translate(_("Week %d (%s - %s), %d"), context=self.request)
+        return template % (week, start, end, year)
+
+    def buildEventTables(self, date):
+        from reportlab.platypus import Paragraph
+        story = []
+        start = week_start(date, 0) # TODO: first_day_of_week
+        for weekday in range(7):
+            day = start + datetime.timedelta(days=weekday)
+            events = self.dayEvents(day)
+            if events:
+                story.append(Paragraph(self.daySubtitle(day),
+                                       self.subtitle_style))
+                story.append(self.buildDayTable(events))
+        return story
+
+
+class MonthlyPDFCalendarView(PDFCalendarViewBase):
+
+    title = _("Monthly calendar for %s")
+
+    def dateTitle(self, date):
+        # TODO: take format from user preferences
+        # avoid recursive import
+        from schooltool.app.browser.cal import month_names
+        month_name = translate(month_names[date.month], context=self.request)
+        return "%s, %d" % (month_name, date.year)
+
+    def buildEventTables(self, date):
+        from reportlab.platypus import Paragraph
+        story = []
+        day = datetime.date(date.year, date.month, 1)
+        while day.month == date.month:
+            events = self.dayEvents(day)
+            if events:
+                # XXX bug: daySubtitle returns a Unicode string, platypus wants
+                #          UTF-8 -- http://issues.schooltool.org/issue438
+                #          When fixing look for other places like this!
+                story.append(Paragraph(self.daySubtitle(day),
+                                       self.subtitle_style))
+                story.append(self.buildDayTable(events))
+            day = day + datetime.timedelta(days=1)
+        return story
+
+
+# ------------------
+# Font configuration
+# ------------------
+
+def registerTTFont(fontname, filename):
+    """Register a TrueType font with ReportLab.
+
+    Clears up the incorrect straight-through mappings that ReportLab 1.19
+    unhelpfully gives us.
+    """
+    from reportlab.pdfbase import pdfmetrics
+    from reportlab.pdfbase.ttfonts import TTFont
+    import reportlab.lib.fonts
+
+    pdfmetrics.registerFont(TTFont(fontname, filename))
+    # For some reason pdfmetrics.registerFont for TrueType fonts explicitly
+    # calls addMapping with incorrect straight-through mappings, at least in
+    # reportlab version 1.19.  We thus need to stick our dirty fingers in
+    # reportlab's internal data structures and undo those changes so that we
+    # can call addMapping with correct values.
+    key = fontname.lower()
+    del reportlab.lib.fonts._tt2ps_map[key, 0, 0]
+    del reportlab.lib.fonts._tt2ps_map[key, 0, 1]
+    del reportlab.lib.fonts._tt2ps_map[key, 1, 0]
+    del reportlab.lib.fonts._tt2ps_map[key, 1, 1]
+    del reportlab.lib.fonts._ps2tt_map[key]
+
+
+# 'Arial' is predefined in ReportLab, so we use 'Arial_Normal'
+
+font_map = {'Arial_Normal': 'arial.ttf',
+            'Arial_Bold': 'arialbd.ttf',
+            'Arial_Italic': 'ariali.ttf',
+            'Arial_Bold_Italic': 'arialbi.ttf',
+            'Times_New_Roman': 'times.ttf',
+            'Times_New_Roman_Bold': 'timesbd.ttf',
+            'Times_New_Roman_Italic': 'timesi.ttf',
+            'Times_New_Roman_Bold_Italic': 'timesbi.ttf'}
+
+
+def setUpMSTTCoreFonts(directory):
+    """Set up ReportGen to use MSTTCoreFonts."""
+    import reportlab.rl_config
+    from reportlab.lib.fonts import addMapping
+
+    ttfpath = reportlab.rl_config.TTFSearchPath
+    ttfpath.append(directory)
+
+    reportlab.rl_config.warnOnMissingFontGlyphs = 0
+
+    for font_name, font_file in font_map.items():
+        registerTTFont(font_name, font_file)
+
+    addMapping('Arial_Normal', 0, 0, 'Arial_Normal')
+    addMapping('Arial_Normal', 0, 1, 'Arial_Italic')
+    addMapping('Arial_Normal', 1, 0, 'Arial_Bold')
+    addMapping('Arial_Normal', 1, 1, 'Arial_Bold_Italic')
+
+    addMapping('Times_New_Roman', 0, 0, 'Times_New_Roman')
+    addMapping('Times_New_Roman', 0, 1, 'Times_New_Roman_Italic')
+    addMapping('Times_New_Roman', 1, 0, 'Times_New_Roman_Bold')
+    addMapping('Times_New_Roman', 1, 1, 'Times_New_Roman_Bold_Italic')
+
+    global disabled
+    disabled = False


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/pdfcal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,24 @@
+CalWidget 1.0 - HTML based calendar widget
+-----------------------------------------------------------
+Copyright (c) 2004, Tribador Mediaworks, Brian Munroe <bmunroe at tribador.net>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.  No representations are made about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
+
+User Guide
+-----------------------------------------------------------
+Please see the file install.html for configuration and 
+installation instructions
+
+Current Version
+-----------------------------------------------------------
+The latest version of CalWidget can be found at:
+http://tribador.net/projects/calwidget/
+
+If you have any comments, questions, suggestions, please let 
+me know - bmunroe at tribador.net


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/calendar.css
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/calendar.css	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/calendar.css	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,118 @@
+/**
+* Calendar Widget Version 1.0
+* Copyright (c) 2004, Tribador Mediaworks,
+*
+* Brian Munroe <bmunroe at tribador.net
+*
+* calendar.css - Calendar Widget Standard Cascading Style Sheet
+*
+* Permission to use, copy, modify, distribute, and sell this software and its
+* documentation for any purpose is hereby granted without fee, provided that
+* the above copyright notice appear in all copies and that both that
+* copyright notice and this permission notice appear in supporting
+* documentation.  No representations are made about the suitability of this
+* software for any purpose.  It is provided "as is" without express or
+* implied warranty.
+*/
+
+.CalendarFrame {
+    border: 2px solid #c0c0c0;
+    border-collapse: collapse;
+}
+
+.DateControlFrame {
+    text-align: center;
+    padding: 3px;
+    border: 2px solid #c0c0c0;
+}
+
+.DateControls {
+    font-size: xx-small;
+}
+
+.CalHeader {
+    font-family: Arial, Helvetica;
+    font-size: small;
+    font-weight: bold;
+    width: 20px;
+    text-align: center;
+    border-top: 1px solid #c0c0c0;
+}
+
+.CellElement {
+    font-family: Arial, Helvetica;
+    font-size: small;
+    text-align: center;
+    cursor: pointer;
+    cursor: hand;
+    border: 1px solid #c0c0c0;
+    padding: 2px;
+}
+
+.CurrentCellElement {
+    font-family: Arial, Helvetica;
+    font-size: small;
+    background: #CCCC99;
+    color: #000;
+    text-align: center;
+    cursor: pointer;
+    cursor: hand;
+    border: 1px solid #c0c0c0;
+    padding: 2px;
+}
+
+.EmptyCell {
+    background: #eee;
+    font-family: Arial, Helvetica;
+    font-size: x-small;
+    padding: 2px;
+    border: 1px solid #c0c0c0;
+}
+
+.CloseControls {
+    font-family: Arial, Helvetica;
+    font-size: x-small;
+    text-align: center;
+    border-top: 1px solid #c0c0c0;
+    padding-top: 3px;
+    padding-bottom: 3px;
+}
+
+.close {
+    cursor: pointer;
+    cursor: hand;
+    color: #993333;
+}
+
+.cancel {
+    cursor: pointer;
+    cursor: hand;
+    color: #336699;
+}
+
+.today {
+    cursor: pointer;
+    cursor: hand;
+    color: #336699;
+}
+
+/* Date Widget Textbox */
+
+.DateField {
+    font-family: Arial, Helvetica;
+    font-size: x-small;
+    border: 1px solid;
+    background: #fff;
+    padding: 1px;
+    text-align: center;
+}
+
+/*  Popup Icon */
+
+.CalIcon {
+   vertical-align:middle; 
+    cursor: pointer;
+    cursor: hand;
+    height:18px;
+    width: 18px;
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/calendar.js
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/calendar.js	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/calendar.js	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,292 @@
+/**
+* Calendar Widget Version 1.0
+* Copyright (c) 2004, Tribador Mediaworks,
+*
+* Brian Munroe <bmunroe at tribador.net>
+*
+* calendar.js - Calendar Widget JavaScript Library
+*
+* Permission to use, copy, modify, distribute, and sell this software and its
+* documentation for any purpose is hereby granted without fee, provided that
+* the above copyright notice appear in all copies and that both that
+* copyright notice and this permission notice appear in supporting
+* documentation.  No representations are made about the suitability of this
+* software for any purpose.  It is provided "as is" without express or
+* implied warranty.
+*/
+
+function pageOffsetLeft(elem) {
+
+    if (elem.offsetParent) {
+        for(var offX = 0; elem.offsetParent; elem = elem.offsetParent){
+            offX += elem.offsetLeft;
+        }
+
+        return offX;
+    } else {
+        return elem.x;
+    }
+}
+
+function pageOffsetTop(elem) {
+
+    if (elem.offsetParent) {
+        for(var offY = 0; elem.offsetParent; elem = elem.offsetParent){
+            offY += elem.offsetTop;
+        }
+        return offY;
+    } else {
+        return elem.y;
+    }
+}
+
+function _isLeapYear(year) {
+    return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) ? 1 : 0;
+}
+
+function setCalendar(idtag,yyyy,mm,dd) {
+    y = document.getElementById(idtag);
+    // Zero pad months and days
+    if (mm < 10) {
+        mm = "0" + mm;
+    }
+    if (dd < 10) {
+        dd = "0" + dd;
+    }
+
+    // replace values in text fields, append them in textarea fields.
+    if (y.type == 'text' || y.value == ""){
+      y.value = yyyy + "-" + mm + "-" + dd;
+    } else if (y.type == 'textarea'){
+      y.value += "\n" + yyyy + "-" + mm + "-" + dd;
+    }
+    y = document.getElementById(idtag + "Div");
+    y.style.display = "none";
+}
+
+function closeCal(idtag) {
+    t = document.getElementById(idtag + "Div");
+    t.style.display = "none";
+}
+
+function closeCalNoDate(idtag) {
+    y = document.getElementById(idtag);
+    y.value = "";
+    t = document.getElementById(idtag + "Div");
+    t.style.display = "none";
+}
+
+function closeCalSetToday(idtag) {
+    var doDate = new Date();
+    var mm = doDate.getMonth()+1;
+    var dd = doDate.getDate();
+    var yyyy = doDate.getYear();
+
+    if (yyyy < 1000) {
+        yyyy = yyyy + 1900;
+    }
+
+    setCalendar(idtag,yyyy,mm,dd);
+}
+
+function redrawCalendar(idtag) {
+
+    var x = document.getElementById(idtag + "SelectMonth");
+    for (i = 0; i < x.options.length;i++){
+        if (x.options[i].selected) {
+            var mm = x.options[i].value;
+        }
+    }
+
+    var y = document.getElementById(idtag + "SelectYear");
+    for (i = 0; i < y.options.length; i++) {
+        if (y.options[i].selected) {
+            var yyyy = y.options[i].value;
+        }
+    }
+
+    // Who f-ing knows why you need this?
+    // If you don't cast it to an int,
+    // the browser goes into some kind of
+    // infinite loop, atleast in IE6.0/Win32
+    //
+    mm = mm*1;
+    yyyy = yyyy*1;
+
+    drawCalendar(idtag,yyyy,mm);
+}
+
+function _buildCalendarControls() {
+
+    var months = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
+    var nw = new Date();
+
+    (arguments[0] ? idtag = arguments[0] : idtag = "");
+    (arguments[1] ? yyyy = arguments[1] : yyyy = nw.getYear());
+    (arguments[2] ? mm = arguments[2] : mm = nw.getMonth());
+    (arguments[3] ? dd = arguments[3] : dd = nw.getDay());
+
+    // Mozilla hack,  I am sure there is a more elegent way, but I did it
+    // on a Friday to get a release out the door...
+    //
+    if (yyyy < 1000) {
+        yyyy = yyyy + 1900;
+    }
+
+    var monthArray = '<select class ="DateControls" id="' + idtag + 'SelectMonth" onChange="redrawCalendar(\'' + idtag + '\');">';
+    // First build the month selection box
+    for (i = 0; i < months.length; i++){
+        if (i == mm-1) {
+            monthArray = monthArray + '<option value="' + eval(i + 1) + '" selected="selected">' + months[i] + '</option>';
+        } else {
+            monthArray = monthArray + '<option value="' + eval(i + 1) + '">' + months[i] + '</option>';
+        }
+    }
+    monthArray = monthArray + "</select>";
+
+    var yearArray = '<select class ="DateControls" id="' + idtag + 'SelectYear" onChange="redrawCalendar(\'' + idtag + '\');">';
+    for (i=yyyy-4;i<= yyyy+4;i++){
+        if (i == yyyy) {
+            yearArray = yearArray + '<option value="' + i + '" selected="selected">' + i + '</option>';
+        } else {
+            yearArray = yearArray + '<option value="' + i + '">' + i + '</option>';
+        }
+    }
+    yearArray = yearArray + "</select>";
+    return(monthArray + " " + yearArray);
+}
+
+function clickWidgetIcon(idtag) {
+    (arguments[0] ? idtag = arguments[0] : idtag = "");
+
+    t = document.getElementById(idtag + "Div");
+    if (t.style.display == "none") {
+        drawCalendar(idtag);
+    } else {
+        closeCal(idtag);
+    }
+}
+
+function drawCalendar() {
+
+    (arguments[0] ? idtag = arguments[0] : idtag = "");
+    (arguments[1] ? yyyy = arguments[1] : yyyy = void(0));
+    (arguments[2] ? mm = arguments[2] : mm = void(0));
+    (arguments[3] ? dd = arguments[3] : dd = void(0));
+
+    if (!yyyy && !mm) {
+        x = document.getElementById(idtag);
+        if (x.value != "") {
+            var wholeValue = x.value;
+            var dateparts = wholeValue.split("-");
+            var yyyy = dateparts[0]*1;
+            var mm = dateparts[1]*1;
+            var dd = dateparts[2]*1;
+        } else {
+            var doDate = new Date();
+            var mm = doDate.getMonth()+1;
+            var dd = doDate.getDate();
+            var yyyy = doDate.getYear();
+        }
+    }
+
+    // Mozilla hack,  I am sure there is a more elegent way, but I did it
+    // on a Friday to get a release out the door...
+    if (yyyy < 1000) {
+        yyyy = yyyy + 1900;
+    }
+
+    var newDate = new Date(yyyy,mm-1,1);
+    var startDay = newDate.getDay();
+    var dom = [31,28,31,30,31,30,31,31,30,31,30,31];
+    var dateControls = '<tr><td class="DateControlFrame" colspan="7">' + _buildCalendarControls(idtag,yyyy,mm,dd) + '</td></tr>';
+    var beginTable = '<table class="CalendarFrame">';
+    var calHeader = '<tr><td class="CalHeader">Su</td><td class="CalHeader">Mo</td><td class="CalHeader">Tu</td><td class="CalHeader">We</td><td class="CalHeader">Th</td><td class="CalHeader">Fr</td><td class="CalHeader">Sa</td></tr>';
+    var closeControls = '<tr><td class="CloseControls" colspan="7"> <a class="close" onclick="closeCal(\'' + idtag + '\');">Close</a>  &nbsp;&nbsp;&nbsp; <a class="cancel" onclick="closeCalNoDate(\'' + idtag + '\');">No Date</a> &nbsp;&nbsp;&nbsp; <a class="today" onclick="closeCalSetToday(\'' + idtag + '\');">Today</a></td></tr></table>';
+    var curHTML = "";
+    var curDay = 1;
+    var endDay = 0;
+    var rowElement = 0;
+    var startFlag = 1;
+    var endFlag = 0;
+    var elementClick = "";
+    var celldata = "";
+
+    ((_isLeapYear(yyyy) && mm == 2) ? endDay = 29 : endDay = dom[mm-1]);
+
+    // calculate the lead gap
+    if (startDay != 0) {
+        curHTML = "<tr>";
+        for (i = 0; i < startDay; i++) {
+            curHTML = curHTML + '<td class="EmptyCell">&nbsp;</td>';
+            rowElement++;
+        }
+    }
+
+    for (i=1;i<=endDay;i++){
+        (dd == i ? celldata = "CurrentCellElement" : celldata = "CellElement");
+
+        if (rowElement == 0) {
+            curHTML = curHTML + '<tr>' + '<td class="' + celldata + '" onclick="setCalendar(\'' + idtag + '\','+ yyyy +',' + mm + ',' + i +');">' + i + '</td>';
+            rowElement++;
+            continue;
+        }
+
+        if (rowElement > 0 && rowElement < 6) {
+            curHTML = curHTML + '<td class="' + celldata + '" onclick="setCalendar(\'' + idtag + '\','+ yyyy +',' + mm + ',' + i +');">' + i + '</td>';
+            rowElement++;
+            continue;
+        }
+
+        if (rowElement == 6) {
+            curHTML = curHTML + '<td class="' + celldata + '" onclick="setCalendar(\'' + idtag + '\','+ yyyy +',' + mm + ',' + i +');">' + i + '</td></tr>';
+            rowElement = 0;
+            continue;
+        }
+    }
+
+    // calculate the end gap
+    if (rowElement != 0) {
+        for (i = rowElement; i <= 6; i++){
+            curHTML = curHTML + '<td class="EmptyCell">&nbsp;</td>';
+        }
+    }
+
+    curHTML = curHTML + "</tr>";
+    t = document.getElementById(idtag + "Div");
+    dateField = document.getElementById(idtag);
+    t.innerHTML = beginTable + dateControls + calHeader + curHTML + closeControls;
+
+    // need to write some better browser detection/positioning code here Also,
+    // there is a perceived stability issue where the calendar goes offscreen
+    // when the widget is right justified..Need some edge detection
+
+    var kitName = "applewebkit/";
+    var tempStr = navigator.userAgent.toLowerCase();
+    var pos = tempStr.indexOf(kitName);
+    var isAppleWebkit = (pos != -1);
+
+    t.style.left = pageOffsetLeft(dateField);
+    t.style.top = pageOffsetTop(dateField);
+    t.style.display = "";
+}
+
+function createCalendarWidget() {
+    (arguments[0] ? idtag = arguments[0] : idtag = "");
+    (arguments[1] ? isEditable = arguments[1] : isEditable = "EDIT");
+    (arguments[2] ? hasIcon = arguments[2] : hasIcon = "NO_ICON");
+    (arguments[3] ? iconPath = arguments[3] : hasIcon = "./OU812.gif");
+
+    (isEditable == "NO_EDIT" ? readOnly = 'readonly="readonly"' : readOnly = '');
+
+    if (hasIcon == "ICON") {
+        clicking = '';
+        icon = ' <img src="' + iconPath + '" class="CalIcon" id="' + idtag + 'Icon" onmousedown="clickWidgetIcon(\'' + idtag + '\');" />';
+    } else {
+        clicking = 'onclick="drawCalendar(\'' + idtag + '\')"';
+        icon = '';
+    }
+
+    // Edited to match SchoolBell styling
+    document.write('<input name="' + idtag + '" id="' + idtag + '" type="text" class="textType" size="20" value="" ' + readOnly + ' ' + clicking + ' />' +  icon + '<br /><div id="' + idtag + 'Div" style="background: #ffffff; position: absolute; display:none;"></div>');
+}

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/icon.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/calwidget/icon.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/day.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/day.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/month.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/month.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/week.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/week.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/year.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/resources/year.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/skin.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/skin.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/skin.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,87 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool skin.
+
+$Id: skin.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+from zope.interface import Interface
+from zope.interface import implements
+from zope.schema import Object
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.viewlet.interfaces import IViewletManager
+from zope.publisher.browser import applySkin
+from zope.traversing.browser.absoluteurl import absoluteURL
+
+from schooltool.app.browser.interfaces import IEventForDisplay
+from schooltool.skin.skin import OrderedViewletManager
+from schooltool.skin.skin import ISchoolToolSkin
+from schooltool.resource.interfaces import IBookingCalendarEvent
+
+
+class ICalendarEventViewletManager(IViewletManager):
+    """Provides a viewlet hook for daily calendar events."""
+
+
+class ICalendarEventContext(Interface):
+    """Schema for attributes required by CalendarEventViewletManager."""
+
+    event = Object(IEventForDisplay)
+
+
+class CalendarEventBookingViewlet(object):
+    """
+    This is the view class for the booking viewlet on the CalendarEventView
+    """
+
+    def bookingUrl(self, resource_id):
+        url = absoluteURL(self.context, self.request)
+        url = "%s/book_one_resource.html?resource_id=%s" % (url, resource_id)
+        event = self.manager.event.context
+        if IBookingCalendarEvent.providedBy(event):
+            url = "%s&event_id=%s" % (url, event.unique_id)
+        else:
+            url = "%s&start_date=%s&start_time=%s&title=%s&duration=%s" % (
+                url, event.dtstart.date(), event.dtstart.time(),
+                event.title, event.duration.seconds)
+
+        return url
+
+    def listResources(self):
+        return [{'id': resource.__name__, 'title': resource.title}
+                for resource in self.manager.event.context.resources]
+
+
+class CalendarEventViewletManager(OrderedViewletManager):
+    """Viewlet manager for displaying of additional event information."""
+
+    implements(ICalendarEventContext)
+
+
+# did not move this into schooltool.skin because this actually
+# enables the skin, doesn't define it.
+def schoolToolTraverseSubscriber(app, event):
+    """A subscriber to BeforeTraverseEvent.
+
+    Sets the SchoolBell skin if the object traversed is a SchoolBell
+    application instance.
+    """
+    if IBrowserRequest.providedBy(event.request):
+        applySkin(event.request, ISchoolToolSkin)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/skin.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/application_preferences.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/application_preferences.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/application_preferences.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,66 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Edit site preferences</title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <form action="." method="post" tal:attributes="action request/URL"
+        class="standalone" enctype="multipart/form-data">
+
+    <h3 i18n:translate="">Change site preferences</h3>
+
+    <div class="info" tal:condition="view/message" tal:content="view/message" />
+    <div class="error" tal:condition="view/error" tal:content="view/error" />
+
+    <fieldset>
+      <legend i18n:translate="">
+        General preferences
+      </legend>
+
+      <div class="row" tal:define="widget nocall:view/title_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/frontPageCalendar_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+    </fieldset>
+
+    <fieldset>
+      <legend i18n:translate="">
+        Calendar Preferences
+      </legend>
+
+      <div class="row" tal:define="widget nocall:view/timezone_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/timeformat_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/dateformat_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/weekstart_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+    </fieldset>
+
+    <div class="controls">
+        <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Apply"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+  <a href="@@site-preferences-codes.html" i18n:translate="">Edit attendance preferences</a>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/application_preferences.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_atom.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_atom.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_atom.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>
+<feed xmlns="http://purl.org/atom/ns#"
+      version="0.3"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      xmlns:dc="http://purl.org/dc/elements/1.1/"
+      i18n:domain="schooltool"
+      tal:define="days view/getCurrentWeek">
+
+  <div xmlns="http://www.w3.org/1999/xhtml">
+    <a xmlns="http://www.w3.org/1999/xhtml"
+      href=""
+      tal:attributes="href string:http://www.schooltool.org">
+      <img title="Schooltool" src="" alt="[Schooltool.org]" 
+           border="0" i18n:attributes="alt;title"
+           tal:attributes="src context/++resource++logo.png"/>
+    </a>
+  </div>
+
+  <title>
+    <span i18n:translate="">
+      Events for
+    </span>
+    <tal:block content="context/title"/>
+  </title>
+  <tagline tal:content="view/current"></tagline>
+  <modified tal:content="view/w3cdtf_datetime_now">
+    XXX Need schooltool.calendar.utils
+  </modified>
+  <link href="" rel="alternate" type="text/html" 
+        tal:attributes="href view/current"/>
+
+  <id tal:content="string:tag:${view/@@absolute_url}">
+    XXX Need unique ID generator
+  </id>
+  <generator url="http://www.schooltool.org/" version="1.0">
+    SchoolTool
+  </generator>
+
+  <info mode="xml" type="text/html">
+    <div xmlns="http://www.w3.org/1999/xhtml">
+    <span i18n:translate="atom_description">
+      This is an Atom formatted XML site feed. It is intended to be viewed
+      in a Newsreader or syndicated to another site. Please visit
+    </span>
+    <a href="http://www.atomenabled.org/" i18n:translate="atom_enabled">
+      Atom Enabled
+    </a>
+    <span i18n:translate="atom_more_info">
+      for more info.
+    </span>
+    <br xmlns="http://www.w3.org/1999/xhtml" />
+    <br xmlns="http://www.w3.org/1999/xhtml" />
+    <a xmlns="http://www.w3.org/1999/xhtml" href=""
+      tal:attributes="href string:http://www.atomenabled.org/feedvalidator/check.cgi?url=${view/@@absolute_url}/atom.xml">
+      <img title="Validate my Atom feed" width="88" height="31"
+           src="http://www.atomenabled.org/feedvalidator/images/valid-atom.png"
+           alt="[Valid Atom]" border="0px" i18n:attributes="alt;title"/>
+      </a>
+    </div>
+  </info>
+
+
+  <tal:loop repeat="day days">
+    <entry tal:repeat="event day/events">
+      <id tal:content="event/unique_id">
+        XXX Need unique ID generator
+      </id>
+      <title tal:content="event/title"></title>
+      <link rel="alternate" type="text/html" href=""
+            tal:attributes="href event/@@absolute_url" />
+      <content mode="escaped"
+               type="text/html"
+               xml:base=""
+               xml:space="preserve"
+               tal:content="event/description">
+      </content>
+      <author>
+        <name tal:content="context/title"></name>
+        <url tal:content="context/__parent__/@@absolute_url"></url>
+      </author>
+      <issued  tal:content="python:view.w3cdtf_datetime(event.dtstart)">
+        XXX Issued time
+      </issued>
+      <modified tal:content="python:view.w3cdtf_datetime(event.dtstart)">
+        XXX Modified time
+      </modified>
+    </entry>
+  </tal:loop>
+</feed>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_atom.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_daily.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_daily.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_daily.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,132 @@
+<tal:defs define="ignored_status view/update" />
+<html metal:use-macro="view/@@schooltool_macros/calendar/page" 
+      i18n:domain="schooltool">
+<metal:block fill-slot="calendar-body">
+
+<div id="events-allday">
+  <tal:loop repeat="event view/getAllDayEvents">
+    <div class="event-allday"
+         tal:attributes="style string:border: 1px ${event/color2} solid;;
+                         background: ${event/color1};;">
+      <h6>
+        <a tal:attributes="href event/viewLink"
+           tal:omit-tag="not:event/viewLink"
+           tal:content="event/title">(title)</a>
+      </h6>
+      <metal:block use-macro="template/macros/event-delete-button" />
+
+      <p tal:condition="event/description"
+         tal:content="structure event/description">
+        (description)
+      </p>
+    </div>
+  </tal:loop>
+</div>
+
+<div id="calendar-view-day"
+     tal:define="hours python:list(view.getHours());
+                 dayheight python: sum(h['height'] for h in hours);"
+     tal:attributes="style string:height: ${dayheight}em">
+
+<!-- Day grid -->
+<tal:each_row repeat="hour hours">
+    <div class="hour"
+         tal:condition="view/canAddEvents"
+         tal:define="active python: hour['active'] and ' active' or '';
+                     url python:view.eventAddLink(hour)"
+         tal:attributes="onclick url;
+                         style string:top: ${hour/top}em;; height: ${hour/height}em;; cursor: pointer;
+                         class string:hour ${repeat/hour/parity}${active}">
+      <a class="event-new" style="width:100%; height:100%;"
+         i18n:attributes="title"
+         tal:attributes="href url;
+                         title string:Add new event starting at ${hour/title}"
+         tal:content="hour/title">HH:MM</a>
+    </div>
+    <div class="hour"
+         tal:condition="not:view/canAddEvents"
+         tal:attributes="style string:top: ${hour/top}em;; height: ${hour/height}em;
+                         class string:hour ${repeat/hour/parity}">
+      <span class="event-new" style="width:100%; height:100%;" title=""
+         i18n:attributes="title"
+         tal:content="hour/title">HH:MM</span>
+    </div>
+</tal:each_row>
+
+<!-- Events -->
+<div class="events" tal:define="compress python:view.getColumns() > 2">
+  <tal:each_row repeat="hour hours">
+    <tal:each_column repeat="event hour/cols">
+      <tal:if_have_an_event condition="event">
+        <div class="event contracted"
+             onmouseover="this.className='event expanded'"
+             onmouseout="this.className='event contracted'"
+             tal:define="num repeat/event/index;
+                         unit python:compress and '%' or 'em';
+                         indent python:compress and 15 or 20.5;
+                         left python:num * indent;
+                         top python:view.eventTop(event);
+                         height python:view.eventHeight(event)"
+             tal:attributes="style string:background: ${event/color1};;
+                             min-height: ${height}em;;
+                             height: ${height}em;;
+                             margin-left: $left$unit;;
+                             top: ${top}em">
+          <metal:block use-macro="template/macros/event-title-bar" />
+          <metal:block use-macro="template/macros/event-delete-button" />
+          <div class="event-body">
+            <tal:block replace="structure provider:schooltool.CalendarEvent" />
+          </div>
+        </div>
+      </tal:if_have_an_event>
+    </tal:each_column>
+  </tal:each_row>
+</div>
+
+</div>
+</metal:block>
+</html>
+
+<tal:hide-macro-definitions-from-browser condition="nothing">
+
+<!-- Macro for the title bar of an event box.
+     Expects to find an EventForDisplay instance named 'event'
+  -->
+<metal:block define-macro="event-title-bar">
+  <h6 tal:attributes="style string:background: ${event/color2}">
+    <a tal:attributes="href event/viewLink; title event/title"
+       tal:omit-tag="not:event/viewLink">
+      <span tal:replace="event/shortTitle">(shortened title)</span>
+      <span class="start-end"
+            tal:define="start python:event.dtstarttz.strftime(view.time_fmt);
+                        end python:event.dtendtz.strftime(view.time_fmt)">
+        (<span tal:content="start">HH:MM</span>
+          - <span tal:content="end">HH:MM</span>)
+      </span>
+    </a>
+  </h6>
+</metal:block>
+
+<!-- Macro for the delete button in an event box.
+     Expects to find an EventForDisplay instance named 'event'
+
+     XXX mg: I suspect that
+               i18n:attributes="title"
+               tal:attributes="title string:Delete $foo"
+             will not work, as it might try to translate all the real titles
+             (such as "Delete Meeting With Friend"), which will never be
+             defined in the '.po' file.
+  -->
+<metal:block define-macro="event-delete-button">
+  <tal:if_can_remove_events condition="view/canRemoveEvents">
+    <a class="delete"
+       tal:condition="event/deleteLink"
+       tal:attributes="href event/deleteLink;
+                       title string:Delete ${event/title}"
+       i18n:attributes="title"
+      ><img alt="[X]" tal:attributes="src context/++resource++delete.png"
+            /></a>
+  </tal:if_can_remove_events>
+</metal:block>
+
+</tal:hide-macro-definitions-from-browser>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_daily.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_monthly.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_monthly.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_monthly.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,49 @@
+<tal:defs define="status view/update"/>
+<html metal:use-macro="view/@@schooltool_macros/calendar/page" 
+      i18n:domain="schooltool">
+  <metal:block metal:fill-slot="calendar-body">
+    <table id="calendar-view-month" cellpadding="0" cellspacing="0"
+           tal:define="weeks view/getCurrentMonth">
+      <tr>
+          <th>&nbsp;</th>
+          <th class="weekday"
+              tal:repeat="weekday python:weeks[0]"
+              tal:content="python:view.dayOfWeek(weekday.date)"
+              i18n:translate="" />
+        </tr>
+        <tr tal:repeat="week weeks">
+          <td class="weekno" width="30">
+            <a tal:content="python:week[0].date.isocalendar()[1]"
+                tal:attributes="href 
+                    python: view.calURL('weekly', week[0].date)"/>
+          </td>
+          <tal:block tal:repeat="day week">
+            <td class="day" width="70" valign="top"
+              tal:define="same_month python:day.date.month == view.cursor.month"
+              tal:attributes="class python:same_month and 'day' or 'day-other'">
+              <a tal:attributes="href python:view.calURL('daily', day.date)">
+                <span tal:content="day/date/day"
+                      tal:attributes="class day/today" />
+                <tal:loop repeat="event day/events">
+                  <tal:if condition="not:event/allday">
+                    <span tal:content="structure event/renderShort"
+                          tal:attributes="class event/cssClass;
+                                          style string:background: ${event/color1};;
+                                          border-color: ${event/color2}" />
+                  </tal:if>
+                  <tal:if condition="event/allday">
+                    <span tal:attributes="class event/cssClass;
+                                          style string:background: ${event/color1};;
+                                          border-color: ${event/color2}">
+                      <span tal:content="event/shortTitle"/>
+                      (<span i18n:translate="">All day</span>)
+                    </span>
+                  </tal:if>
+                </tal:loop>
+              </a>
+            </td>
+          </tal:block>
+        </tr>
+    </table>
+  </metal:block>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_monthly.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_weekly.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_weekly.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_weekly.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+<tal:defs define="status view/update" />
+<html metal:use-macro="view/@@schooltool_macros/calendar/page" 
+      i18n:domain="schooltool">
+<metal:block metal:fill-slot="calendar-body">
+  <table id="calendar-view-week" cellpadding="0" cellspacing="0" width="99%"
+         tal:define="days view/getCurrentWeek">
+    <tr>
+      <tal:loop repeat="day days">
+        <th class="day-title"
+            tal:define="start repeat/day/start"
+            tal:attributes="class python:' '.join(filter(None, ['day-title',
+                                                   start and 'first' or '',
+                                                   day.today()]))">
+          <a tal:content="day/date/@@fullDate"
+             tal:attributes="href python:view.calURL('daily', day.date)" />
+        </th>
+      </tal:loop>
+    </tr>
+    <tr>
+      <tal:loop repeat="day days">
+        <td valign="top" height="100"
+            tal:define="start repeat/day/start"
+            tal:attributes="class python:start and 'first' or ''">
+          <div tal:repeat="event day/events">
+            <a tal:attributes="
+                   start repeat/event/start;
+                   class python:start and 'first' or '';
+                   style string:background: ${event/color1};;
+                                border-color: ${event/color2};
+                   title event/title;
+                   href event/editLink">
+              <span tal:content="event/shortTitle"/>
+              <tal:if condition="not:event/allday">
+                (<span tal:content="
+                           python: event.dtstart.astimezone(
+                                       view.timezone).strftime(view.time_fmt)"
+                       /> - <span tal:content="
+                           python:event.dtend.astimezone(
+                                       view.timezone).strftime(view.time_fmt)"/>)
+              </tal:if>
+              <tal:if condition="event/allday">
+                (<span i18n:translate="">All day</span>)
+              </tal:if>
+            </a>
+          </div>
+        </td>
+      </tal:loop>
+    </tr>
+  </table>
+
+</metal:block>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_weekly.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_yearly.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_yearly.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_yearly.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,38 @@
+<tal:defs define="status view/update" />
+<html metal:use-macro="view/@@schooltool_macros/calendar/page" 
+      i18n:domain="schooltool">
+<metal:block metal:fill-slot="calendar-body">
+  <table id="calendar-view-year"
+         cellpadding="0" cellspacing="0"
+         tal:define="quarters python:view.getYear(view.cursor)">
+
+      <tr tal:repeat="quarter quarters">
+        <td class="month" valign="top"
+            tal:repeat="month quarter">
+          <table class="month" cellpadding="0" cellspacing="0">
+            <tr>
+              <th colspan="7" class="month-title"
+                  tal:define="mtit python:view.monthTitle(month[1][0].date)">
+                <a tal:content="mtit" i18n:translate=""
+                    tal:attributes="href python:view.calURL('monthly',
+                                    month[1][0].date);
+                                    title mtit"/>
+              </th>
+            </tr>
+            <tr>
+              <th class="month-weekday"
+                  width="14%"
+                  tal:repeat="weekday python:month[0]"
+                  tal:content="python:view.shortDayOfWeek(weekday.date)"
+                  i18n:translate="" />
+            </tr>
+            <tr tal:repeat="week month">
+              <td tal:replace="structure
+                  python:view.renderRow(week, month[1][0].date.month)" />
+            </tr>
+          </table>
+        </td>
+      </tr>
+    </table>
+  </metal:block>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/cal_yearly.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,253 @@
+<metal:block define-macro="navigation" i18n:domain="schooltool">
+  <div id="calendar-navigation-context">
+    <a id="calendar-navigation-context-previous" i18n:attributes="title"
+       tal:attributes="href view/prev;
+                       title string:Go to ${view/prev_title}">
+      <span tal:content="view/prev_title" i18n:translate="">
+        Previous
+      </span>
+    </a>
+    <a id="calendar-navigation-context-current" i18n:attributes="title"
+       tal:attributes="href view/current;
+                       title string:Go to ${view/current_title}">
+      <span tal:content="view/current_title" i18n:translate="">
+        Current
+      </span>
+    </a>
+    <a id="calendar-navigation-context-next" i18n:attributes="title"
+       tal:attributes="href view/next;
+                       title string:Go to ${view/next_title}">
+      <span tal:content="view/next_title" i18n:translate="">
+        Next
+      </span>
+    </a>
+  </div>
+</metal:block>
+
+<metal:block define-macro="mode" i18n:domain="schooltool">
+  <div id="calendar-navigation">
+    <a id="calendar-navigation-pdf"
+       tal:condition="view/pdfURL"
+       tal:attributes="href view/pdfURL"
+       title="Printable version"
+       i18n:attributes="title"
+       i18n:translate=""><img tal:attributes="
+                                   src context/++resource++printer.png"
+                          alt="Printable version" i18n:attributes="alt" /></a>
+    <a id="calendar-navigation-day"
+       tal:attributes="href python:view.calURL('daily')"
+       title="View daily calendar"
+       i18n:attributes="title"
+       i18n:translate=""><img tal:attributes="src context/++resource++day.png"
+                              alt="Daily" i18n:attributes="alt" /></a>
+    <a id="calendar-navigation-week"
+       tal:attributes="href python:view.calURL('weekly')"
+       title="View weekly calendar"
+       i18n:attributes="title"
+       i18n:translate=""><img tal:attributes="src context/++resource++week.png"
+                              alt="Weekly" i18n:attributes="alt" /></a>
+    <a id="calendar-navigation-month"
+       tal:attributes="href python:view.calURL('monthly')"
+       title="View monthly calendar"
+       i18n:attributes="title"
+       i18n:translate=""><img tal:attributes="src context/++resource++month.png"
+                              alt="Monthly" i18n:attributes="alt" /></a>
+    <a id="calendar-navigation-year"
+       tal:attributes="href python:view.calURL('yearly')"
+       title="View yearly calendar"
+       i18n:attributes="title"
+       i18n:translate=""><img tal:attributes="src context/++resource++year.png"
+                              alt="Yearly" i18n:attributes="alt" /></a>
+  </div>
+</metal:block>
+
+<metal:block define-macro="page" i18n:domain="schooltool">
+  <html metal:use-macro="view/@@standard_macros/page">
+
+    <title metal:fill-slot="title" i18n:translate="">
+        Calendar for <span tal:replace="context/title"
+            i18n:name="title" /> - <span i18n:name="calendar_title"
+                                         tal:replace="view/title" 
+                                         i18n:translate=""/>
+    </title>
+
+    <metal:block fill-slot="extrahead">
+      <link rel="service.feed" type="application/atom+xml"
+            title="Upcoming Events" href=""
+            tal:attributes="href string:${context/@@absolute_url}/atom.xml" />
+    </metal:block>
+
+    <metal:block fill-slot="content-header">
+      <h1 i18n:translate="">
+        Calendar for <span tal:replace="context/title"
+            i18n:name="title" /> - <span i18n:name="calendar_title"
+                                         tal:replace="view/title" 
+                                         i18n:translate=""/>
+      </h1>
+    </metal:block>
+
+    <metal:block fill-slot="navigation-box">
+      <tal:block define="app context/schooltool:app"
+                 condition="python:context.__parent__ == app">
+        <div metal:define-slot="navigation-box"
+             tal:replace="structure provider:schooltool.Navigation"/>
+       </tal:block>
+    </metal:block>
+
+    <metal:block fill-slot="column-left-extra">
+      <div id="column-left">
+        <div id="column-left-top"></div>
+        <div metal:use-macro="view/@@schooltool_macros/calendar/portlets"/>
+      </div>
+    </metal:block>
+    <metal:block fill-slot="content">
+      <div id="column-center" style="margin-left: 14em;">
+        <div id="content-header">
+          <metal:block define-slot="content-header"/>
+        </div>
+        <div id="content-body">
+         <div metal:use-macro="view/@@schooltool_macros/calendar/mode"/>
+         <div class="calcontent">
+           <div metal:use-macro="view/@@schooltool_macros/calendar/navigation" />
+           <div metal:define-slot="calendar-body"/>
+         </div>
+        </div>
+      </div>
+    </metal:block>
+  </html>
+</metal:block>
+
+<!-- BEGIN CALENDAR MACROS -->
+
+<metal:block define-macro="portlet-calendar-overlay" i18n:domain="schooltool">
+  <div tal:replace="structure context/@@calendar_overlay" />
+</metal:block>
+
+<metal:block define-macro="portlet-calendar-jumpto" i18n:domain="schooltool">
+  <div id="portlet-jumpto" class="portlet">
+
+    <h4 i18n:translate="">Jump To ...</h4>
+    <form class="center" action="">
+      <div>
+        <select name="jump" onChange="jumpTo(this);">
+          <option value="" i18n:translate="">Month</option>
+          <tal:loop repeat="month view/getJumpToMonths">
+            <option
+              tal:attributes="value month/href"
+              tal:content="month/label" i18n:translate="" />
+          </tal:loop>
+        </select>
+      </div>
+    </form>
+
+    <form class="center" action="">
+      <div>
+        <select name="jump" onChange="jumpTo(this);">
+          <option value='' i18n:translate="">Year</option>
+          <tal:loop repeat="year view/getJumpToYears">
+            <option value="" i18n:translate=""
+              tal:attributes="value year/href"
+              tal:content="year/label" />
+          </tal:loop>
+        </select>
+      </div>
+    </form>
+  </div>
+</metal:block>
+
+
+<metal:block define-macro="brief-month-view" i18n:domain="schooltool">
+  <table class="month" cellpadding="0" cellspacing="0">
+    <tr>
+      <th colspan="7" class="month-title"
+          tal:define="mtit python:view.monthTitle(month[1][0].date)">
+        <a tal:content="mtit" i18n:translate=""
+            tal:attributes="href python:view.calURL('monthly',
+                            month[1][0].date);
+                            title mtit"/>
+      </th>
+    </tr>
+    <tr tal:repeat="week month">
+      <td tal:replace="structure
+          python:view.renderRow(week, month[1][0].date.month)" />
+    </tr>
+
+  </table>
+
+</metal:block>
+
+<metal:block define-macro="portlet-calendar-view-month"
+             i18n:domain="schooltool">
+
+  <div id="portlet-calendar-view-month" class="portlet">
+
+      <tal:block define="month python:view.getMonth(view.prevMonth());">
+          <metal:block use-macro="
+              view/@@schooltool_macros/calendar/brief-month-view" />
+      </tal:block>
+
+      <tal:block define="month python:view.getMonth(view.cursor);">
+          <metal:block use-macro="
+              view/@@schooltool_macros/calendar/brief-month-view" />
+      </tal:block>
+
+      <tal:block define="month python:view.getMonth(view.nextMonth());">
+          <metal:block use-macro="
+              view/@@schooltool_macros/calendar/brief-month-view" />
+      </tal:block>
+
+  </div>
+
+</metal:block>
+
+<metal:block define-macro="portlet-tomorrow-events" i18n:domain="schooltool">
+
+  <tal:comment condition="nothing">
+       XXX: The on-error call is almost certainly a hack; someone who
+            really knows what's going on should check it out. I think
+            this might be due to the new METAL 1.1 standard.
+  </tal:comment>
+
+  <tal:block define="next view/nextDay;
+                     tomorrow python:next.today() + next.resolution;
+                     tevents python:view.dayEvents(tomorrow)">
+    <div id="portlet-next-day-events" class="portlet" tal:condition="tevents">
+      <h4 i18n:translate="">Tomorrow's Events</h4>
+      <ul>
+      <tal:loop tal:repeat="event tevents">
+        <li tal:condition="python: event.dtstart.date() == tomorrow">
+          <a href="" title=""
+             tal:attributes="title event/title;
+                             style string:color: ${event/color2};
+                             href event/context/@@absolute_url">
+            <strong tal:content="
+                python: event.dtstart.astimezone(
+                            view.timezone).strftime('%H:%M')" />
+            <span tal:replace="event/shortTitle">Event</span>
+          </a>
+        </li>
+      </tal:loop>
+      </ul>
+    </div>
+  </tal:block>
+
+</metal:block>
+
+<metal:block define-macro="portlets">
+
+  <metal:block use-macro="
+      view/@@schooltool_macros/calendar/portlet-tomorrow-events"/>
+
+  <metal:block use-macro="
+      view/@@schooltool_macros/calendar/portlet-calendar-overlay"/>
+
+  <metal:block use-macro="
+      view/@@schooltool_macros/calendar/portlet-calendar-jumpto"/>
+
+  <metal:block use-macro="
+      view/@@schooltool_macros/calendar/portlet-calendar-view-month"/>
+
+</metal:block>
+
+<!-- END CALENDAR MACROS -->
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_overlay.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_overlay.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_overlay.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+<div id="portlet-calendar-overlay" class="portlet"
+     i18n:domain="schooltool" tal:condition="view/show_overlay">
+
+  <h4 i18n:translate="">Calendars</h4>
+
+  <form method="post" action="" tal:attributes="action request/URL"
+        tal:define="dummy view/update">
+
+    <table class="overlays">
+
+      <tr>
+        <th style="text-align: center">
+          <acronym title="Personal calendar" i18n:attributes="title"
+                   i18n:translate="">Cal</acronym>
+        </th>
+        <th><acronym title="Timetable calendar" i18n:attributes="title"
+                     i18n:translate="">TT</acronym></th>
+        <th></th>
+        <th></th>
+      </tr>
+
+      <tr style="background: #9db8d2">
+        <td><input type="checkbox" checked="checked" disabled="disabled" /></td>
+        <td><input type="checkbox" name="my_timetable"
+                   tal:attributes="checked view/myTimetableShown" /></td>
+        <td style="width: 100%" i18n:translate="">My Calendar</td>
+        <td></td>
+      </tr>
+
+      <tr tal:repeat="item view/items"
+          tal:attributes="style string:background: ${item/color1}">
+        <td><input type="checkbox" name="overlay:list"
+            tal:attributes="value item/id; checked item/checked" /></td>
+        <td><input type="checkbox" name="overlay_timetables:list"
+          tal:attributes="value item/id; checked item/checked_tt" /></td>
+        <td style="width: 100%" tal:content="item/title" i18n:translate="">Title</td>
+        <td><a class="go"
+            tal:attributes="href item/calendar/@@absolute_url;
+            style string:background: ${item/color2};;
+            color: ${item/color2}"
+            >&nbsp;</a></td>
+    </tr>
+    </table>
+
+    <div class="controls">
+      <input name="OVERLAY_APPLY" type="submit" value="Apply"
+            i18n:attributes="value"/>
+      <input name="OVERLAY_MORE" type="submit" value="More..."
+            i18n:attributes="value"/>
+    </div>
+  </form>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_overlay.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_selection.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_selection.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_selection.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,94 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Select calendars to display
+  </title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <form action="." method="post" tal:attributes="action request/URL"
+        class="standalone" enctype="multipart/form-data">
+
+    <h3 i18n:translate="">
+      Select additional calendars to display
+    </h3>
+
+    <div class="info" tal:condition="view/message"
+         tal:content="view/message" i18n:translate="" />
+    <div class="error" tal:condition="view/error"
+         tal:content="view/error" i18n:translate="" />
+
+    <input type="hidden" name="nexturl"
+           tal:attributes="value request/nexturl|nothing" />
+
+    <p i18n:translate="">
+      Hold down Ctrl or Shift to select multiple calendars.
+    </p>
+
+    <fieldset tal:define="app view/application" tal:condition="app">
+      <legend i18n:translate="">Public Calendar</legend>
+      <label>
+        <input type="checkbox" name="application" value="application"
+            tal:attributes="checked app/selected"/>
+          <span tal:content="app/title"></span>
+          <span i18n:translate="">site-wide calendar</span>
+      </label>
+    </fieldset>
+
+    <fieldset class="inline" tal:define="persons view/persons">
+      <legend i18n:translate="">People</legend>
+      <p tal:condition="not:persons" i18n:translate="">
+        There are no persons with calendars accessible to you.
+      </p>
+      <select size=8 multiple="multiple" id="people" name="persons:list"
+              tal:condition="persons">
+        <option tal:repeat="person persons/sortby:title"
+                tal:attributes="value person/id;
+                                selected person/selected"
+                tal:content="person/title">Person</option>
+      </select>
+    </fieldset>
+
+    <fieldset class="inline" tal:define="groups view/groups">
+      <legend i18n:translate="">Groups</legend>
+      <p tal:condition="not:groups" i18n:translate="">
+        There are no groups with calendars accessible to you.
+      </p>
+      <select size=8 multiple="multiple" id="groups" name="groups:list"
+              tal:condition="groups">
+        <option tal:repeat="group groups/sortby:title"
+                tal:attributes="value group/id;
+                                selected group/selected"
+                tal:content="group/title">Group</option>
+      </select>
+    </fieldset>
+
+    <fieldset class="inline" tal:define="resources view/resources">
+      <legend i18n:translate="">Resources</legend>
+      <p tal:condition="not:resources" i18n:translate="">
+        There are no resources with calendars accessible to you.
+      </p>
+      <select size=8 multiple="multiple" id="resources" name="resources:list"
+              tal:condition="resources">
+        <option tal:repeat="resource resources/sortby:title"
+                tal:attributes="value resource/id;
+                                selected resource/selected"
+                tal:content="resource/title">Resource</option>
+      </select>
+    </fieldset>
+
+    <div class="controls">
+        <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Apply"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/calendar_selection.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/css_viewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/css_viewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/css_viewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2 @@
+<link type="text/css" rel="stylesheet" href="somestyle.css"
+      tal:attributes="href viewlet/getFileURL" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/css_viewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/edit_relationships.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/edit_relationships.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/edit_relationships.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,53 @@
+<tal:defs define="update view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="context/title" />
+</head>
+<body>
+<metal:block metal:fill-slot="body"
+             tal:define="batch view/available_table/batch">
+
+<form method="post" tal:attributes="action request/URL" class="standalone">
+<h3 i18n:translate="" tal:content="view/title" />
+<fieldset tal:define="items view/getSelectedItems">
+  <tal:if condition="items">
+    <legend i18n:translate="" tal:content="view/current_title" />
+    <tal:block replace="structure view/selected_table/render" />
+    <div class="controls">
+      <input type="submit" class="button-ok" name="REMOVE_ITEMS"
+        value="Remove"
+        title="Shortcut: Alt-R" accesskey="R"
+        i18n:attributes="value; accesskey" />
+    </div>
+  </tal:if>
+  <p tal:condition="not:items" i18n:translate="">
+    There are none.
+  </p>
+</fieldset>
+<fieldset>
+  <legend i18n:translate="" tal:content="view/available_title" />
+  <div class="item_list">
+    <tal:block replace="structure view/available_table/batch/render" />
+    <tal:block replace="structure view/available_table/filter_widget/render" />
+    <tal:block replace="structure view/available_table/render" />
+    <div class="controls">
+      <input type="submit" class="button-ok" name="ADD_ITEMS"
+             value="Add" tal:condition="batch"
+             title="Shortcut: Alt-A" accesskey="A"
+             i18n:attributes="value; accesskey" />
+    </div>
+    <p tal:condition="not:batch" i18n:translate="">
+      There are none to add.
+    </p>
+  </div>
+</fieldset>
+
+<div class="controls">
+  <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+         i18n:attributes="value cancel-button" />
+</div>
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/edit_relationships.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,88 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate=""
+         tal:content="context/title">Add/edit event</title>
+</head>
+<body>
+
+<metal:block fill-slot="content-header">
+  <h1>
+    <span tal:replace="context/title" />
+    -
+    <span tal:replace="view/day" />
+  </h1>
+  <tal:if condition="context/allday">
+    <div><strong i18n:translate="">All day event</strong></div>
+  </tal:if>
+
+  <p style="width:62%; font-size:85%" tal:content="structure context/description|nothing" />
+  <p tal:condition="context/recurrence">
+    <em i18n:translate="">
+      This is a recurring event.
+    </em>
+  </p>
+
+</metal:block>
+
+<metal:block metal:fill-slot="body"
+             tal:define="evdate python:context.dtstart.strftime('%Y-%m-%d')">
+
+  <tal:block replace="structure context/@@notes|nothing"/>
+
+  <div class="info-block">
+    <h5 i18n:translate="">Details</h5>
+    <table class="person-details">
+      <tal:if condition="not:context/allday">
+        <tr tal:condition="view/start">
+          <td class="dr" i18n:translate="">Starts</td>
+          <td>:&nbsp;</td>
+          <td class="dl" tal:content="view/start" />
+        </tr>
+        <tr tal:condition="view/end">
+          <td class="dr" i18n:translate="">Ends</td>
+          <td>:&nbsp;</td>
+          <td class="dl" tal:content="view/end" />
+        </tr>
+      </tal:if>
+      <tr tal:condition="context/location|nothing">
+        <td class="dr" i18n:translate="">Location</td>
+        <td>:&nbsp;</td>
+        <td class="dl" tal:content="context/location" />
+      </tr>
+    </table>
+    <a class="modify" href=""
+       title="Change the details of this event"
+       tal:attributes="href string:${context/@@absolute_url}/edit.html"
+       i18n:attributes="title"
+       i18n:translate="">
+       edit event
+    </a>
+  </div>
+
+  <div class="info-block"
+       tal:define="resources view/display/getBookedResources">
+    <h5 i18n:translate="">Scheduled resources</h5>
+    <ul tal:condition="resources">
+      <li tal:repeat="resource resources">
+        <a href=""
+           tal:attributes="href string:${resource/@@absolute_url}"
+           tal:content="resource/title" />
+      </li>
+    </ul>
+    <a class="modify" href=""
+      title="Change the resources scheduled for this event"
+      i18n:translate=""
+      tal:attributes="href string:${context/@@absolute_url}/booking.html?date=${evdate}">
+      edit resources
+    </a>
+  </div>
+
+  <a href="" class="modify destructive" title="Delete this event"
+    i18n:translate=""
+    tal:attributes="href string:${context/__parent__/@@absolute_url}/delete.html?event_id=${context/unique_id}&date=${evdate}">
+    delete event
+  </a>
+
+
+</metal:block>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_add.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_add.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_add.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,355 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate=""
+         tal:content="view/title">Add/edit event</title>
+  <script type="text/javascript" metal:fill-slot="extrahead">
+    function recurrence_changed() {
+        var recurrence = document.getElementById('field.recurrence');
+        var recurrence_box = document.getElementById('recurrence_box');
+        var update_box = document.getElementById('update_box');
+        if (recurrence.checked) {
+            recurrence_box.style.display = 'block';
+            update_box.style.display = 'block';
+        } else {
+            recurrence_box.style.display = 'none';
+            update_box.style.display = 'none';
+        }
+    }
+    function recurrence_type_changed() {
+        var form = document.getElementById('form');
+        var recurrence = document.getElementById('field.recurrence_type');
+        var weekly_row = document.getElementById('weekly_row');
+        var monthly_box = document.getElementById('monthly_box');
+        if (recurrence.value == 'weekly') {
+            weekly_row.style.display = 'block';
+            monthly_box.style.display = 'none';
+        } else if (recurrence.value == 'monthly') {
+            weekly_row.style.display = 'none';
+            monthly_box.style.display = 'block';
+        } else {
+            weekly_row.style.display = 'none';
+            monthly_box.style.display = 'none';
+        }
+    }
+
+    first_run = true;
+    stored_duration = null;
+    stored_duration_type = null;
+
+    function allday_changed() {
+        /// XXX: No effect in IE
+        var form = document.getElementById('form');
+        var allday = document.getElementById('field.allday');
+        var start_time = document.getElementById('field.start_time');
+        var duration = document.getElementById('field.duration');
+        var duration_type = document.getElementById('field.duration_type');
+
+        current_duration = duration.value;
+        current_duration_type = duration_type.value;
+
+        if (allday.checked) {
+            start_time.disabled = true;
+            duration_type.disabled = true;
+
+            if (!first_run) {
+                if (stored_duration) {
+                     duration.value = stored_duration;
+                }
+                else if (current_duration_type != 'days'){
+                     duration.value = 1;
+                }
+                duration_type.value = 'days';
+                stored_duration = current_duration;
+                stored_duration_type = current_duration_type;
+            }
+        } else {
+            start_time.disabled = false;
+            duration_type.disabled = false;
+
+            if (!first_run) {
+                if (stored_duration) {
+                     duration.value = stored_duration;
+                     duration_type.value = stored_duration_type;
+                }
+                stored_duration = current_duration;
+                stored_duration_type = current_duration_type;
+            }
+        }
+        first_run = false;
+    }
+    function range_changed() {
+        var range_c = document.getElementById('field.range_c');
+        var range_u = document.getElementById('field.range_u');
+        var count = document.getElementById('field.count');
+        var until = document.getElementById('field.until');
+        count.disabled = !range_c.checked;
+        until.disabled = !range_u.checked;
+    }
+    function onloadhook() {
+        if (!document.getElementById('recurrence_box'))
+            return;
+
+        recurrence_changed();
+        var recurrence = document.getElementById('field.recurrence');
+        addEvent(recurrence, "click", recurrence_changed);
+
+        range_changed();
+        var range_c = document.getElementById('field.range_c');
+        var range_u = document.getElementById('field.range_u');
+        var range_f = document.getElementById('field.range_f');
+        addEvent(range_c, "click", range_changed);
+        addEvent(range_u, "click", range_changed);
+        addEvent(range_f, "click", range_changed);
+
+        recurrence_type_changed();
+        var form = document.getElementById('form');
+        var recurrence_type = form['field.recurrence_type'];
+        addEvent(recurrence_type, "change", recurrence_type_changed);
+        addEvent(recurrence_type, "keyup", recurrence_type_changed);
+
+        /* Hide the help paragraphs if JavaScript is working */
+        var weekly_par = document.getElementById('weekly_par');
+        var monthly_par = document.getElementById('monthly_par');
+        monthly_par.style.display = 'none';
+        weekly_par.style.display = 'none';
+
+        allday_changed();
+        var allday = document.getElementById('field.allday');
+        addEvent(allday, "click", allday_changed);
+    }
+    function addEvent(obj, event, handler) {
+      if (obj.addEventListener) {
+          obj.addEventListener(event, handler, false);
+      } else if (obj.attachEvent) {
+          obj.attachEvent("on" + event, handler);
+      }
+    }
+    addEvent(window, "load", onloadhook);
+  </script>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+
+<metal:block metal:fill-slot="body">
+  <form id="form" class="standalone" method="post" enctype="multipart/form-data"
+        tal:attributes="action request/URL">
+    <h3 i18n:translate="">Event information</h3>
+
+    <div class="error" tal:condition="view/error" tal:content="view/error" />
+    <input type="hidden" tal:condition="request/date|nothing"
+           name="date" tal:attributes="value request/date" />
+    <fieldset>
+      <legend i18n:translate="">Event details</legend>
+
+      <div class="row" tal:define="widget nocall:view/title_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+      <div class="row" tal:define="widget nocall:view/start_date_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+      <div class="row" tal:define="widget nocall:view/allday_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+      <div class="row" tal:define="widget nocall:view/start_time_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row">
+        <tal:def define="widget nocall:view/duration_widget">
+          <div metal:use-macro="context/@@form_macros/widget_row" >
+            <metal:block fill-slot="extra">
+              <tal:comment condition="nothing">
+                Very similar to Repeat Every field
+              </tal:comment>
+              <select name="field.duration_type" size="1"
+                      id="field.duration_type"
+                      tal:define="duration_type python: view.duration_type_widget._getFormValue() or 'minutes'">
+                <option i18n:translate="" value="minutes"
+                    tal:attributes="selected python: duration_type == 'minutes'">
+                  Minutes</option>
+                <option i18n:translate="" value="hours"
+                    tal:attributes="selected python: duration_type == 'hours'">
+                  Hours
+                </option>
+                <option i18n:translate="" value="days"
+                    tal:attributes="selected python: duration_type == 'days'">
+                  Days
+                </option>
+              </select>
+            </metal:block>
+          </div>
+        </tal:def>
+
+      </div>
+      <div class="row" tal:define="widget nocall:view/location_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+      <div class="row" tal:define="widget nocall:view/description_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:condition="view/show_book_checkbox">
+        <div class="field">
+          <input class="hiddenType" id="field.book.used" name="field.book.used" type="hidden" value="" />
+          <input class="checkboxType" id="field.book" name="field.book" type="checkbox" value="on"
+                 tal:attributes="checked request/field.book|nothing" />
+          <label for="field.book" i18n:translate="">Book Resources</label>
+        </div>
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/recurrence_widget">
+        <div metal:use-macro="context/@@form_macros/checkbox_widget " />
+      </div>
+
+      <div id="recurrence_box">
+        <div class="controls" id="update_box">
+          <input class="button-ok" name="UPDATE" type="submit"
+            value="Update form" i18n:attributes="value" />
+        </div>
+        <!-- Repeat every [count] [freq [v]] -->
+        <div class="row">
+          <div class="row" tal:define="widget nocall:view/interval_widget">
+            <div metal:use-macro="context/@@form_macros/widget_row">
+              <metal:block fill-slot="extra">
+              <tal:comment condition="nothing">
+              <!-- Sadly, the Zope 3 SelectWidget is brain-dead:
+                   - no "id" attribute on the select element
+                   - renders two divs for no reason
+                   TODO: follow it up in Zope 3. -->
+              </tal:comment>
+              <select name="field.recurrence_type" size="1"
+                      id="field.recurrence_type"
+                      tal:define="recurrence_type python: view.recurrence_type_widget._getFormValue() or 'daily'">
+                <option i18n:translate="" tal:attributes="selected python:recurrence_type == 'daily'" value="daily">day</option>
+                <option i18n:translate="" tal:attributes="selected python:recurrence_type == 'weekly'" value="weekly">week</option>
+                <option i18n:translate="" tal:attributes="selected python:recurrence_type == 'monthly'" value="monthly">month</option>
+                <option i18n:translate="" tal:attributes="selected python:recurrence_type == 'yearly'" value="yearly">year</option>
+              </select>
+              </metal:block>
+            </div>
+          </div>
+        </div>
+        <!-- weekly box -->
+        <fieldset id="weekly_row">
+          <legend i18n:translate="">Weekly</legend>
+          <p id="weekly_par" i18n:translate="">
+            This section only applies when weekly recurrence is selected.
+          </p>
+          <input name="field.weekdays-empty-marker" type="hidden" value="1" />
+          <span tal:repeat="term view/weekdays_widget/vocabulary">
+            <input type="checkbox" name="field.weekdays:list"
+                   tal:attributes="
+                   id string:weekday_${term/token};
+                   value term/token;
+                   disabled python:view.weekdayDisabled(term.token);
+                   checked python:view.weekdayChecked(term.token)"
+                   />
+            <label class="plain"
+                   tal:attributes="for string:weekday_${term/token}"
+                   tal:content="python:view.weekdays_widget.textForValue(term)"
+                   i18n:translate=""/>
+          </span>
+        </fieldset>
+        <!-- monthly box -->
+        <fieldset id="monthly_box" class=""
+                  tal:define="monthly_value python:view.monthly_widget._getFormValue()">
+          <legend i18n:translate="">Monthly</legend>
+          <p id="monthly_par" i18n:translate="">
+            This section only applies when the monthly recurrence is selected.
+          </p>
+          <div class="row">
+            <input type="radio" name="field.monthly" value="monthday" id="monthly_m"
+              tal:attributes="checked python:monthly_value == 'monthday'"/>
+            <label for="monthly_m" class="plain" i18n:translate="">
+              Day <span tal:replace="view/getMonthDay" i18n:name="monthday"/> of
+              every month</label>
+          </div>
+          <div class="row">
+            <input type="radio" name="field.monthly" value="weekday" id="monthly_w"
+              tal:attributes="checked python:monthly_value == 'weekday'"/>
+            <label for="monthly_w" class="plain" i18n:translate="">
+              <span tal:replace="view/getWeekDay" i18n:translate="" i18n:name="weekday" /> of
+              every month</label>
+          </div>
+          <div class="row" tal:condition="view/getLastWeekDay">
+            <input type="radio" name="field.monthly" value="lastweekday" id="monthly_l"
+              tal:attributes="checked python:monthly_value == 'lastweekday'"/>
+            <label for="monthly_l" class="plain" i18n:translate="">
+              <span tal:replace="view/getLastWeekDay" i18n:translate="" i18n:name="" /> of
+              every month</label>
+          </div>
+        </fieldset>
+        <!-- Range selection -->
+        <fieldset tal:define="range_value
+                  python:view.range_widget._getFormValue() or 'forever'">
+          <div class="row">
+            <input type="radio" name="field.range" value="count" id="field.range_c"
+                   tal:attributes="checked python:range_value == 'count'"/>
+            <label for="field.range_c" class="plain" i18n:translate="">Repeat</label>
+            <input type="text" name="field.count" id="field.count" size="3"
+                   tal:attributes="value view/count_widget/_getFormValue" />
+            <tal:block i18n:translate="">times</tal:block>
+            <tal:block tal:define="widget nocall:view/count_widget">
+              <div class="error" tal:define="error widget/error"
+                   tal:condition="error" tal:content="structure error">
+                The Error
+              </div>
+            </tal:block>
+          </div>
+
+          <div class="row">
+            <input type="radio" name="field.range" value="until" id="field.range_u"
+                   tal:attributes="checked python:range_value == 'until'"/>
+            <label for="field.range_u" class="plain" i18n:translate="">Repeat until</label>
+            <input type="text" name="field.until" id="field.until"
+                   tal:attributes="value view/until_widget/_getFormValue"/>
+            <img class="CalIcon" onClick="clickWidgetIcon('field.until');"
+                 id="field.untilIcon" alt="[popup calendar]"
+                 i18n:attributes="alt"
+                 tal:attributes="src context/++resource++calwidget-icon.gif"/>
+            <div id="field.untilDiv"
+                 style="background: #fff; position: absolute; display: none;">
+            </div>
+
+            <tal:block tal:define="widget nocall:view/until_widget">
+              <div class="error" tal:define="error widget/error"
+                   tal:condition="error" tal:content="structure error">
+                The Error
+              </div>
+            </tal:block>
+          </div>
+          <div class="row">
+            <input type="radio" name="field.range" value="forever" id="field.range_f"
+                   tal:attributes="checked python:range_value == 'forever'"/>
+            <label for="field.range_f" class="plain" i18n:translate="">
+              Repeat forever</label>
+          </div>
+          <tal:block tal:define="widget nocall:view/range_widget">
+            <div class="error" tal:define="error widget/error"
+                 tal:condition="error" tal:content="structure error">
+              The Error
+            </div>
+          </tal:block>
+        </fieldset>
+        <div class="row" tal:define="widget nocall:view/exceptions_widget">
+          <div metal:use-macro="context/@@form_macros/datepicker_widget" />
+        </div>
+      </div>
+      <input type="hidden" tal:condition="request/cancel_url|nothing"
+             tal:attributes="value request/cancel_url"
+             name="cancel_url" />
+    </fieldset>
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT"
+             tal:attributes="value view/submit_button_title"
+             i18n:attributes="value" title="Shortcut: Alt-A" accesskey="A" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+      <a tal:condition="view/show_book_link"
+          tal:attributes="href string:${context/@@absolute_url}/booking.html"
+         i18n:translate="">Book resources</a>
+    </div>
+  </form>
+</metal:block>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_add.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_booking.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_booking.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_booking.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,76 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Resource Booking</title>
+</head>
+<body>
+<metal:block metal:fill-slot="body"
+            tal:define="batch view/batch">
+
+<form tal:attributes="action request/URL" method="post" class="standalone booking_form">
+  <h3 i18n:translate="">
+    Resource Booking for <span i18n:name="title"
+                               tal:replace="context/title">something</span>
+  </h3>
+
+  <fieldset>
+    <div>
+      <strong i18n:translate="">Title:</strong>
+      <span tal:replace="context/title">not_doe</span>
+    </div>
+    <div>
+      <strong i18n:translate="">Starts:</strong>
+      <span tal:replace="view/start"/>
+    </div>
+    <div>
+      <strong i18n:translate="">Ends:</strong>
+      <span tal:replace="view/end"/>
+    </div>
+    <div tal:condition="context/recurrence">
+      <strong i18n:translate="">This is a recurring event!</strong>
+    </div>
+  </fieldset>
+
+  <input type="hidden" tal:condition="request/date|nothing"
+         name="date" tal:attributes="value request/date" />
+
+    <fieldset tal:condition="view/hasBookedItems">
+      <legend i18n:translate="">Booked resources</legend>
+
+      <tal:block replace="structure view/renderBookedTable" />
+        <div class="controls">
+          <input type="submit" class="button-ok" name="UNBOOK"
+                 value="UnBook"
+                 title="Shortcut: Alt-A" accesskey="A"
+                 i18n:attributes="value; accesskey" />
+        </div>
+
+    </fieldset>
+
+    <fieldset>
+      <legend i18n:translate="">Available resources</legend>
+      <div class="item_list">
+        <tal:block replace="structure batch/render" />
+        <tal:block replace="structure view/filter_widget/render" />
+        <tal:block replace="structure view/renderAvailableTable" />
+        <div class="controls">
+          <input type="submit" class="button-ok" name="BOOK"
+                 value="Book" tal:condition="batch"
+                 title="Shortcut: Alt-A" accesskey="A"
+                 i18n:attributes="value; accesskey" />
+          <input type="submit" class="button-cancel" name="CANCEL"
+                 value="Cancel"
+                 title="Shortcut: Alt-C" accesskey="C"
+                 i18n:attributes="value; accesskey" />
+
+        </div>
+        <p tal:condition="not:batch" i18n:translate="">
+          There are none to add.
+        </p>
+      </div>
+    </fieldset>
+ 
+</form>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_booking.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_info_viewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_info_viewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_info_viewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,17 @@
+<div class="body"
+     i18n:domain="schooltool"
+     tal:define="event view/manager/event"
+     tal:attributes="style string:background: ${event/color1};">
+  <div class="title"
+       tal:condition="python: event.title != event.shortTitle"
+       tal:content="event/title">
+    (title, but only if it was shortened in the title bar)
+  </div>
+  <div i18n:translate="" tal:condition="event/location"
+       class="location">Location:
+    <span tal:content="event/location" i18n:name="location">(location)</span>
+  </div>
+  <div class="description" tal:content="structure event/description" i18n:translate="">
+    (Description)
+  </div>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/event_info_viewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/index.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/index.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/index.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,20 @@
+<tal:dummy define="dummy view/update"/>
+<html metal:use-macro="context/@@standard_macros/view"
+      i18n:domain="schooltool">
+<body>
+
+<h1 metal:fill-slot="content-header" 
+    i18n:translate="">Welcome to SchoolTool</h1>
+
+<div metal:fill-slot="body">
+
+<p><a href="persons" i18n:translate="">Persons</a></p>
+<p><a href="courses" i18n:translate="">Courses</a></p>
+<p><a href="groups" i18n:translate="">Groups</a></p>
+<p><a href="resources" i18n:translate="">Resources</a></p>
+<p><a href="levels" i18n:translate="">Levels</a></p>
+
+</div>
+</body>
+
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/index.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/javascript_viewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/javascript_viewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/javascript_viewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3 @@
+<script type="text/javascript" src="some-library.js"
+        tal:attributes="src viewlet/getFileURL">
+</script>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/javascript_viewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/login.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/login.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/login.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,64 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Login</title>
+</head>
+<body>
+<metal:block metal:fill-slot="body">
+
+  <div id="message" tal:condition="request/expired | nothing"
+    i18n:translate="">
+    Your session has expired.
+  </div>
+
+  <div id="message" tal:condition="request/forbidden | nothing"
+    i18n:translate="">
+    You are not allowed to access this page.  You can click on the back
+    button in your browser to go back, or ask a more privileged user to log
+    in.
+  </div>
+
+  <form action="." method="post" class="standalone"
+    tal:attributes="action string:${context/@@absolute_url}/@@login.html">
+
+    <h3 i18n:translate="">Please log in</h3>
+
+    <input type="hidden" name="nexturl"
+      tal:condition="request/nexturl | nothing"
+      tal:attributes="value request/nexturl" />
+
+    <p class="error" tal:condition="view/error"
+      tal:content="view/error" i18n:translate="">
+      Incorrect username or password.
+    </p>
+
+    <fieldset>
+      <legend i18n:translate="">User Information</legend>
+
+      <div class="row">
+        <label for="username" i18n:translate="">Username</label>
+        <input id="username" name="username" type="text" tabindex="1"
+          tal:attributes="value request/username|nothing" />
+      </div>
+
+      <div class="row">
+        <label for="password" i18n:translate="">Password</label>
+        <input id="password" name="password" type="password" tabindex="2" />
+      </div>
+
+      <!-- div class="row">
+        <input id="remember" name="remember" type="checkbox"
+        value="remember" />
+        <label for="remember" i18n:translate="">Remember Me</label>
+      </div -->
+
+    </fieldset>
+
+    <div class="controls">
+      <input class="button-ok" type="submit" value="Log in" accesskey="L" 
+        tabindex="3" i18n:attributes="value; accesskey" name="LOGIN" />
+    </div>
+  </form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/login.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/recevent_delete.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/recevent_delete.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/recevent_delete.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,57 @@
+<tal:defs define="event view/handleEvent"
+          condition="event">
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head >
+  <title metal:fill-slot="title" i18n:translate="">
+    Deleting a repeating event (<span tal:replace="event/title"
+                                      i18n:name="event_title" />)
+  </title>
+</head>
+<body>
+  <metal:block metal:fill-slot="body">
+
+  <form method="post" tal:attributes="action request/URL" class="standalone">
+
+    <h3 i18n:translate="">
+      Deleting a repeating event (<span tal:replace="event/title"
+                                        i18n:name="event_title" />)
+    </h3>
+
+    <fieldset>
+    <p i18n:translate="">
+    You are trying to delete a repeating event.
+    </p>
+
+    <p>You can choose to delete:</p>
+    <ul><li>only the <em>current</em> occurrence
+      (<strong tal:content="request/date">2005-02-15</strong>).<br />
+      An exception for the event will be created.</li>
+      <li>this and all <em>future</em> occurrences.<br />
+      The event recurrence's end date will be set.</li>
+      <li>all occurences of this event.<br />
+      The event will be deleted completely.
+      </li></ul>
+
+    <input type="hidden" name="event_id"
+           tal:attributes="value request/event_id" />
+    <input type="hidden" name="date"
+           tal:attributes="value request/date" />
+
+    </fieldset>
+
+    <div class="controls">
+      <input class="button" type="submit" name="CURRENT" value="Current"
+             i18n:attributes="value" />
+      <input class="button" type="submit" name="FUTURE" value="Future"
+             i18n:attributes="value" />
+      <input class="button" type="submit" name="ALL" value="All"
+             i18n:attributes="value" />
+      <input class="button" type="submit" name="CANCEL" value="Cancel"
+             i18n:attributes="value" />
+    </div>
+  </form>
+  </metal:block>
+
+</body>
+</html>
+</tal:defs>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/recevent_delete.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/timetables-csvimport.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates/timetables-csvimport.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates/timetables-csvimport.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,123 @@
+<tal:defs define="update view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <head>
+    <title metal:fill-slot="title" i18n:translate="">
+      Upload SchoolTool timetable as CSV
+    </title>
+  </head>
+  <body>
+    <metal:block metal:fill-slot="body">
+
+      <div class="info" tal:condition="view/success">
+        <p tal:repeat="msg view/success" tal:content="msg" i18n:translate="" />
+      </div>
+      <div class="error" tal:condition="view/errors"
+        tal:repeat="err view/errors" tal:content="err" i18n:translate="" />
+
+      <form method="POST" enctype="multipart/form-data" class="standalone"
+        tal:attributes="action request/URL">
+
+        <h3 i18n:translate="">
+          Import Timetable
+        </h3>
+
+        <p i18n:translate="">
+          You can create the CSV file in a spreadsheet and export it in CSV
+          (Comma-Separated Values) format.  The structure of the table is
+          described below.
+        </p>
+
+        <p i18n:translate="">
+          The first row of the file must contain the name of the
+          <strong>term</strong> and the <strong>timetable schema</strong> which
+          will be used for the new timetables.  The second row should be empty.
+          After that, several section descriptions may follow.  They are
+          separated by an empty line.
+        </p>
+
+        <p i18n:translate="">
+          Each section description's first row contains the <strong>course
+          id</strong> and the <strong>instructor id</strong> for the new
+          section.  Then a number of rows, each containing a <strong>day
+          id</strong> and a <strong>period id</strong>, follows.  The list of period
+          descriptions is terminated by three asterisks ('***') in the first
+          column.  After the terminator, any number of <strong>person
+          ids</strong> may follow, the denoted persons will be added to the
+          section as learners.
+        </p>
+
+        <p i18n:translate="">Example:</p>
+
+<pre i18n:translate="">
+"2005-fall","three-day"
+"","",""
+"philosophy","lorch"
+"Monday","A"
+"Monday","B"
+"Tuesday","C"
+"***"
+"johnny"
+"billy"
+""
+"literature","guzman"
+"Wednesday","B"
+"Wednesday","C"
+"***"
+"johnny"
+"pete"
+</pre>
+        <p i18n:translate="">
+          The above example will create two new sections, one for the
+          philosophy lecture and the other for the literature lecture.
+          The section for the philosophy lecture will have persons
+          with ids 'johnny' and 'billy' as learners, and its timetable
+          will contain three timetable activities, two on Monday.  The
+          literature section will be processed in a similar fashion.
+        </p>
+
+        <p i18n:translate="">
+          Note that only ids of objects are to be used in the file, not titles.
+          If a row ends with empty cells (e.g.,
+          <em>"philosophy","lorch","",""</em>), those cells will be discarded.
+          You may separate section descriptions by more than one line.  In the
+          list of learners, only the first column containing the person ids is
+          processed, the other columns are ignored.  You can import the same
+          data several times without any side effects.
+        </p>
+
+        <fieldset>
+          <legend i18n:translate="">Upload CSV File</legend>
+          <div class="row">
+            <label for="csvfile" i18n:translate="">CSV File</label>
+            <input id="csvfile" type="file" name="csvfile"/>
+          </div>
+
+          <div class="row">
+            <tal:block i18n:translate="">Charset:</tal:block>
+            <select name="charset">
+              <option value="UTF-8" i18n:translate="">Unicode (UTF-8)</option>
+              <option value="ISO-8859-1" i18n:translate="">Western (ISO-8859-1)</option>
+              <option value="ISO-8859-15" i18n:translate="">Western (ISO-8859-15)</option>
+              <option value="Windows-1252" i18n:translate="">Western (Windows-1252)</option>
+              <option value="other" i18n:translate="">Other (please specify)</option>
+            </select>
+          </div>
+          <div class="row" i18n:translate="">
+            Other charset: <input name="other_charset" type="text" i18n:name="other_charset" />
+          </div>
+        </fieldset>
+        <fieldset>
+          <legend i18n:translate="">Input CSV Data</legend>
+          <label for="csvtext" i18n:translate="">CSV Data</label>
+          <textarea name="csvtext" id="csvtext" cols="50" rows="10"
+                    tal:content="request/csvtext|nothing">
+          </textarea>
+        </fieldset>
+        <div class="controls">
+          <input name="UPDATE_SUBMIT" class="button-ok" type="submit"
+                 value="Submit" i18n:attributes="value submit-button" />
+        </div>
+      </form>
+    </metal:block>
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates/timetables-csvimport.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/templates.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/templates.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/templates.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,53 @@
+Rendering ordered lists in page templates
+=========================================
+
+schooltool.app defines a TALES path adapter ("thingy" for short) that lets
+you sort lists of objects directly in a page template by writing, for example,
+the following:
+
+    <tr tal:repeat="item context/values/sortby:title">
+      <td tal:content="item/title" />
+    </tr>
+
+Boring (or interesting, depending on your perspective) implementation details
+-----------------------------------------------------------------------------
+
+We register a path adapter 'sortby' and it becomes available in TALES
+path expressions.
+
+    >>> from zope.app.testing import setup
+    >>> setup.placelessSetUp()
+
+    >>> from zope.component import provideAdapter
+    >>> from zope.traversing.interfaces import IPathAdapter
+    >>> from schooltool.app.browser import SortBy
+    >>> provideAdapter(SortBy, name='sortby', provides=IPathAdapter)
+    >>> from zope.security.checker import defineChecker
+    >>> from zope.security.checker import NamesChecker
+    >>> defineChecker(SortBy, NamesChecker(['traverse']))
+
+Suppose we have a sequence of dicts that have a 'title' key.
+
+    >>> a_list = [{'id': 42, 'title': 'How to get ahead in navigation'},
+    ...           {'id': 11, 'title': 'The ultimate answer: 6 * 9'},
+    ...           {'id': 33, 'title': 'Alphabet for beginners'}]
+
+We can sort the list by title with TALES:
+
+    >>> from zope.app.pagetemplate.engine import Engine
+    >>> from zope.tales.tales import Context
+    >>> context = Context(Engine, {'a_list': a_list})
+
+    >>> bytecode = Engine.compile('a_list/sortby:title')
+    >>> for item in bytecode(context):
+    ...     print item['title']
+    Alphabet for beginners
+    How to get ahead in navigation
+    The ultimate answer: 6 * 9
+
+You can also sort lists of objects by attribute.  You can sort arbitrary
+iterables.  See the implementation and tests of `SortBy` for exhaustive
+examples.
+
+    >>> setup.placelessTearDown()
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/templates.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/testing.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/testing.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/testing.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,229 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Setup code for SchoolTool application browser unit tests
+
+$Id: testing.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import os.path
+import zope.component
+import transaction
+from zope.interface import implements, Interface
+from zope.app.testing import setup, ztapi
+from zope.app.form.interfaces import IInputWidget
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.schema.interfaces import \
+        IPassword, ITextLine, IText, IBytes, IBool, ISet, IList, IDate, \
+        IInt, IChoice, IIterableVocabulary, IVocabularyTokenized, \
+        ICollection
+from zope.app.form.browser import \
+        PasswordWidget, TextWidget, BytesWidget, CheckBoxWidget, \
+        DateWidget, IntWidget, ChoiceInputWidget, DropdownWidget, \
+        TextAreaWidget, ChoiceCollectionInputWidget, \
+        CollectionInputWidget, MultiSelectWidget, OrderedMultiSelectWidget
+from zope.app.form.interfaces import IWidgetInputError
+from zope.app.form.browser.interfaces import IWidgetInputErrorView
+from zope.app.form.browser.exception import WidgetInputErrorView
+from zope.traversing.interfaces import ITraversable
+from zope.traversing.namespace import view, resource
+from zope.traversing.interfaces import IPathAdapter
+from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
+from zope.app.basicskin.standardmacros import StandardMacros
+from zope.app.form.browser.macros import FormMacros
+from zope.app.publisher.browser.menu import MenuAccessView
+from zope.app.publisher.interfaces.browser import IBrowserMenu
+from zope.publisher.interfaces.browser import IBrowserView
+
+from schooltool.relationship.tests import setUpRelationships
+from schooltool.skin import breadcrumbs
+from schooltool.skin.macros import SchoolToolMacros
+
+from schooltool.app.browser import SchoolToolAPI, SortBy
+
+class BrowserMenuStub(object):
+    """A stub that fakes browser menu.
+
+    So we could display schooltool_actions menu in unit tests.
+    """
+
+    implements(IBrowserMenu)
+
+    id = None
+    title = None
+    description = None
+
+    def __init__(self, id, title=u'', description=u''):
+        self.id = id
+        self.title = title
+        self.description = description
+
+    def getMenuItems(self, object, request):
+        return []
+
+
+def setUp(test=None):
+    """Set up the test fixture for schooltool.app.browser doctests.
+
+    Performs what is called a "placeless setup" in the Zope 3 world, then sets
+    up annotations, relationships, and registers widgets as views for some
+    schema fields.
+
+    In effect, duplicates a subset of ZCML configuration -- just enough to
+    actually render our page templates in unit tests.
+    """
+    setup.placefulSetUp()
+    setup.setUpAnnotations()
+    setup.setUpTraversal()
+    # relationships
+    setUpRelationships()
+    # widgets
+    ztapi.browserViewProviding(IPassword, PasswordWidget, IInputWidget)
+    ztapi.browserViewProviding(ITextLine, TextWidget, IInputWidget)
+    ztapi.browserViewProviding(IText, TextAreaWidget, IInputWidget)
+    ztapi.browserViewProviding(IBytes, BytesWidget, IInputWidget)
+    ztapi.browserViewProviding(IBool, CheckBoxWidget, IInputWidget)
+    ztapi.browserViewProviding(IDate, DateWidget, IInputWidget)
+    ztapi.browserViewProviding(IInt, IntWidget, IInputWidget)
+    ztapi.browserViewProviding(IChoice, ChoiceInputWidget, IInputWidget)
+    ztapi.browserViewProviding(ICollection, CollectionInputWidget, IInputWidget)
+
+    ztapi.provideMultiView((IChoice, IIterableVocabulary), IBrowserRequest,
+                           IInputWidget, '', DropdownWidget)
+
+    ztapi.provideMultiView((ISet, IChoice), IBrowserRequest,
+                           IInputWidget, '', ChoiceCollectionInputWidget)
+    ztapi.provideMultiView((IList, IChoice), IBrowserRequest,
+                           IInputWidget, '', ChoiceCollectionInputWidget)
+    ztapi.provideMultiView((IList, IVocabularyTokenized), IBrowserRequest,
+                           IInputWidget, '', OrderedMultiSelectWidget)
+    # XXX MultiSelectWidget doesn't work with sets :/
+    #     http://www.zope.org/Collectors/Zope3-dev/360
+    ztapi.provideMultiView((ISet, IIterableVocabulary), IBrowserRequest,
+                           IInputWidget, '', MultiSelectWidget)
+
+    # errors in forms
+    ztapi.browserViewProviding(IWidgetInputError, WidgetInputErrorView,
+                               IWidgetInputErrorView)
+
+
+    # Now, the question is: does the speed of the tests run with the
+    # setup below justify this complex setup that duplicates the ZCML?
+    # For now, I say yes. -- not mg, perhaps alga or gintas
+
+    # ++view++
+    ztapi.provideView(None, None, ITraversable, 'view', view)
+    ztapi.provideView(None, None, ITraversable, 'resource', resource)
+
+    # schooltool: namespace in tal
+    ztapi.provideAdapter(None, IPathAdapter, SchoolToolAPI, 'schooltool')
+
+    # sortby: namespace in tal
+    ztapi.provideAdapter(None, IPathAdapter, SortBy, 'sortby')
+
+    # standard_macros, schooltool_macros and schooltool_navigation
+    ztapi.browserView(None, 'standard_macros', StandardMacros)
+    ztapi.browserView(None, 'view_macros',
+                      SimpleViewClass("../../skin/templates/view_macros.pt"))
+
+    ztapi.browserView(None, 'schooltool_macros', SchoolToolMacros)
+    ztapi.browserView(None, 'calendar_macros',
+                      SimpleViewClass("./templates/calendar_macros.pt"))
+    ztapi.browserView(None, 'generic_macros',
+                      SimpleViewClass("../../skin/templates/generic_macros.pt"))
+
+    # form macros
+    ztapi.browserView(None, 'form_macros', FormMacros)
+    import zope.app.form.browser
+    base = zope.app.form.browser.__path__[0]
+    ztapi.browserView(None, 'widget_macros',
+                      SimpleViewClass(os.path.join(base, 'widget_macros.pt')))
+
+    # resources
+    class ResourceStub:
+        def __init__(self, request):
+            pass
+        def __call__(self):
+            return "a dummy resource"
+
+    for name in ['layout.css', 'schooltool.css', 'schooltool.js',
+                 'logo.png', 'next.png', 'prev.png', 'favicon.ico',
+                 'calwidget-calendar.js', 'calwidget-calendar.css',
+                 'calwidget-icon.gif', 'mochikit.js']:
+        ztapi.browserResource(name, ResourceStub)
+
+    # menus
+    ztapi.browserView(None, 'view_get_menu', MenuAccessView)
+    ztapi.provideUtility(IBrowserMenu, BrowserMenuStub('zmi_views'),
+                         'zmi_views')
+    ztapi.provideUtility(IBrowserMenu, BrowserMenuStub('schooltool_actions'),
+                         'schooltool_actions')
+
+    # breadcrumbs
+    zope.component.provideAdapter(
+        breadcrumbs.Breadcrumbs,
+        (Interface, IDefaultBrowserLayer),
+        Interface,
+        name='breadcrumbs')
+
+    zope.component.provideAdapter(
+        breadcrumbs.GenericBreadcrumbInfo)
+
+    # `provider` TALES namespaces
+    from zope.app.pagetemplate import metaconfigure
+    from zope.contentprovider import tales
+    metaconfigure.registerType('provider', tales.TALESProviderExpression)
+
+    # viewlet manager registrations
+    from zope.viewlet import manager
+    from schooltool import skin
+    name = 'schooltool.Header'
+    zope.component.provideAdapter(
+        manager.ViewletManager(name, skin.IHeaderManager),
+        (Interface, IDefaultBrowserLayer, IBrowserView),
+        skin.IHeaderManager,
+        name=name)
+
+    name = 'schooltool.JavaScript'
+    zope.component.provideAdapter(
+        manager.ViewletManager(name, skin.IJavaScriptManager),
+        (Interface, IDefaultBrowserLayer, IBrowserView),
+        skin.IJavaScriptManager,
+        name=name)
+
+    name = 'schooltool.CSS'
+    zope.component.provideAdapter(
+        manager.ViewletManager(name, skin.ICSSManager),
+        (Interface, IDefaultBrowserLayer, IBrowserView),
+        skin.ICSSManager,
+        name=name)
+
+    name = 'schooltool.MenuBar'
+    zope.component.provideAdapter(
+        manager.ViewletManager(name, skin.skin.IMenuBarMenuManager),
+        (Interface, IDefaultBrowserLayer, IBrowserView),
+        skin.skin.IMenuBarMenuManager,
+        name=name)
+
+
+def tearDown(test=None):
+    """Tear down the test fixture for schooltool.app.browser doctests."""
+    transaction.abort()
+    setup.placefulTearDown()
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/testing.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_app.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_app.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_app.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,435 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool views.
+
+$Id: test_app.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import unittest
+from pprint import pprint
+
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app import zapi
+from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
+from zope.app.testing import setup, ztapi
+
+from schooltool.app.browser.testing import setUp, tearDown
+from schooltool.testing import setup as sbsetup
+
+
+def doctest_ApplicationView():
+    r"""Test for ApplicationView
+
+    Some setup
+
+        >>> sbsetup.setUpCalendaring()
+
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+        >>> ztapi.provideAdapter(ISchoolToolApplication,
+        ...                      IApplicationPreferences,
+        ...                      getApplicationPreferences)
+
+    Now let's create a view
+
+        >>> from schooltool.app.browser.app import ApplicationView
+        >>> request = TestRequest()
+        >>> view = ApplicationView(app, request)
+        >>> view.update()
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/calendar'
+
+    If we change a the front page preference, we should not be redirected
+
+        >>> IApplicationPreferences(app).frontPageCalendar = False
+        >>> request = TestRequest()
+        >>> view = ApplicationView(app, request)
+        >>> view.update()
+
+        >>> request.response.getStatus()
+        599
+
+    """
+
+
+def doctest_LoginView():
+    """
+
+    Some framework setup:
+
+        >>> setup.setUpAnnotations()
+
+        >>> def getCalendarWithNakedObject(obj):
+        ...     from schooltool.app.cal import getCalendar
+        ...     from zope.security.proxy import removeSecurityProxy
+        ...     return getCalendar(removeSecurityProxy(obj))
+
+        >>> from schooltool.app.interfaces import IHaveCalendar
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> ztapi.provideAdapter(IHaveCalendar, ISchoolToolCalendar,
+        ...                      getCalendarWithNakedObject)
+
+        >>> from schooltool.testing import registry
+        >>> registry.setupCalendarComponents()
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> ztapi.provideAdapter(ISchoolToolApplication,
+        ...                      IApplicationPreferences,
+        ...                      getApplicationPreferences)
+
+    We have to set up a security checker for person objects:
+
+        >>> from schooltool.person.person import Person
+        >>> from zope.security.checker import defineChecker, Checker
+        >>> defineChecker(Person, Checker({},{}))
+
+    Suppose we have a SchoolTool app and a person:
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> persons = app['persons']
+
+        >>> frog = Person('frog')
+        >>> persons[None] = frog
+        >>> frog.setPassword('pond')
+
+    We create our view:
+
+        >>> from schooltool.app.browser.app import LoginView
+        >>> request = TestRequest()
+        >>> from zope.app.authentication.interfaces import IPrincipal
+        >>> from zope.interface import implements
+        >>> class StubPrincipal(object):
+        ...     implements(IPrincipal)
+        ...     title = "Some user"
+        ...
+        >>> request.setPrincipal(StubPrincipal())
+        >>> View = SimpleViewClass('../templates/login.pt', bases=(LoginView,))
+        >>> view = View(app, request)
+
+    Render it with an empty request:
+
+        >>> content = view()
+        >>> '<h3>Please log in</h3>' in content
+        True
+
+    If we have authentication utility:
+
+        >>> from schooltool.app.security import SchoolToolAuthenticationUtility
+        >>> from zope.app.security.interfaces import IAuthentication
+        >>> auth = SchoolToolAuthenticationUtility()
+        >>> ztapi.provideUtility(IAuthentication, auth)
+        >>> auth.__parent__ = app
+        >>> sbsetup.setUpSessions()
+
+    It does not authenticate our session:
+
+        >>> auth.authenticate(request)
+
+    However, if we pass valid credentials, we get authenticated:
+
+        >>> request = TestRequest(form={'username': 'frog',
+        ...                             'password': 'pond',
+        ...                             'LOGIN': 'Log in'})
+        >>> request.setPrincipal(StubPrincipal())
+        >>> view = View(app, request)
+        >>> content = view()
+        >>> view.error
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/persons/frog/calendar'
+        >>> auth.authenticate(request)
+        <schooltool.app.security.Principal object at 0x...>
+
+    If we pass bad credentials, we get a nice error and a form.
+
+        >>> request = TestRequest(form={'username': 'snake',
+        ...                             'password': 'pw',
+        ...                             'LOGIN': 'Log in'})
+        >>> auth.setCredentials(request, 'frog', 'pond')
+        >>> request.setPrincipal(auth.authenticate(request))
+        >>> view = View(app, request)
+        >>> content = view()
+        >>> view.error
+        u'Username or password is incorrect'
+        >>> view.error in content
+        True
+        >>> 'Please log in' in content
+        True
+
+    The previous credentials are not lost if a new login fails:
+
+        >>> principal = auth.authenticate(request)
+        >>> principal
+        <schooltool.app.security.Principal object at 0x...>
+        >>> principal.id
+        'sb.person.frog'
+
+    We can specify the URL we want to go to after being authenticated:
+
+        >>> request = TestRequest(form={'username': 'frog',
+        ...                             'password': 'pond',
+        ...                             'nexturl': 'http://host/path',
+        ...                             'LOGIN': 'Log in'})
+        >>> request.setPrincipal(StubPrincipal())
+        >>> view = View(app, request)
+        >>> content = view()
+        >>> view.error
+        >>> request.response.getStatus()
+        302
+        >>> url = zapi.absoluteURL(app, request)
+        >>> request.response.getHeader('Location')
+        'http://host/path'
+
+    """
+
+
+def doctest_LogoutView():
+    """
+    Suppose we have a SchoolTool app and a person:
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> persons = app['persons']
+
+        >>> from schooltool.person.person import Person
+        >>> frog = Person('frog')
+        >>> persons[None] = frog
+        >>> frog.setPassword('pond')
+
+    Also, we have an authentication utility:
+
+        >>> from schooltool.app.security import SchoolToolAuthenticationUtility
+        >>> from zope.app.security.interfaces import IAuthentication
+        >>> auth = SchoolToolAuthenticationUtility()
+        >>> ztapi.provideUtility(IAuthentication, auth)
+        >>> auth.__parent__ = app
+        >>> sbsetup.setUpSessions()
+
+    We have a request in an authenticated session:
+
+        >>> request = TestRequest()
+        >>> auth.setCredentials(request, 'frog', 'pond')
+        >>> request.setPrincipal(auth.authenticate(request))
+
+    And we call the logout view:
+
+        >>> from schooltool.app.browser.app import LogoutView
+        >>> view = LogoutView(app, request)
+        >>> view()
+
+    Now, the session no longer has an authenticated user:
+
+        >>> auth.authenticate(request)
+
+    The user gets redirected to the front page:
+
+        >>> request.response.getStatus()
+        302
+        >>> url = zapi.absoluteURL(app, request)
+        >>> request.response.getHeader('Location') == url
+        True
+
+
+    The view also doesn't fail if the user was not logged in in the
+    first place:
+
+        >>> request = TestRequest()
+        >>> view = LogoutView(app, request)
+        >>> view()
+        >>> auth.authenticate(request)
+
+    """
+
+
+def doctest_hasPermissions():
+    r"""The Zope security machinery does not have tools to check
+    whether a random principal has some permission on some object.  So
+    we need to construct our own.
+
+    Set up for local grants:
+
+        >>> from zope.annotation.interfaces import IAnnotatable
+        >>> from zope.app.securitypolicy.interfaces import \
+        ...                         IPrincipalPermissionManager
+        >>> from zope.app.securitypolicy.principalpermission import \
+        ...                         AnnotationPrincipalPermissionManager
+        >>> setup.setUpAnnotations()
+        >>> setup.setUpTraversal()
+        >>> ztapi.provideAdapter(IAnnotatable, IPrincipalPermissionManager,
+        ...                      AnnotationPrincipalPermissionManager)
+
+
+    Let's set the Zope security policy:
+
+        >>> from zope.security.management import setSecurityPolicy
+        >>> from zope.app.securitypolicy.zopepolicy import ZopeSecurityPolicy
+        >>> old = setSecurityPolicy(ZopeSecurityPolicy)
+
+    Suppose we have a SchoolTool object:
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+    In it, we have a principal:
+
+        >>> from schooltool.person.person import Person
+        >>> app['persons']['1'] = Person('joe', title='Joe')
+
+    He does not have neither 'super' nor 'duper' permissions on our
+    schooltool app:
+
+        >>> from schooltool.app.browser.app import hasPermissions
+        >>> hasPermissions(['super', 'duper'], app, 'sb.person.joe')
+        [False, False]
+
+    However, we can add a local grant:
+
+        >>> perms = IPrincipalPermissionManager(app)
+        >>> perms.grantPermissionToPrincipal('super', 'sb.person.joe')
+
+    And everything changes!
+
+        >>> hasPermissions(['super', 'duper'], app, 'sb.person.joe')
+        [True, False]
+
+    The same works for subobjects:
+
+        >>> hasPermissions(['duper', 'super'], app['persons'], 'sb.person.joe')
+        [False, True]
+        >>> hasPermissions(['super', 'duper'], app['persons']['joe'], 'sb.person.joe')
+        [True, False]
+
+    Also, it works gracefully for None or random objects:
+
+        >>> hasPermissions(['super'], None, 'sb.person.joe')
+        [False]
+        >>> hasPermissions(['super'], object(), 'sb.person.joe')
+        [False]
+
+    """
+
+
+def doctest_ApplicationPreferencesView():
+    """Test for ApplicationPreferencesView.
+
+    We need to setup a SchoolToolApplication site and build our
+    ISchoolToolApplication adapter:
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+        >>> from schooltool.app.browser.app import ApplicationPreferencesView
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+
+        >>> setup.setUpAnnotations()
+        >>> ztapi.provideAdapter(ISchoolToolApplication,
+        ...                      IApplicationPreferences,
+        ...                      getApplicationPreferences)
+
+    Make sure we can create a view:
+
+        >>> request = TestRequest()
+        >>> view = ApplicationPreferencesView(app, request)
+
+    Now we can setup a post and set the site title:
+
+        >>> request = TestRequest(form={
+        ...     'UPDATE_SUBMIT': 'Update',
+        ...     'field.title': 'Company Calendars',
+        ...     'field.dateformat': '%m/%d/%y',
+        ...     'field.timeformat': '%I:%M %p',
+        ...     'field.weekstart': '0',
+        ...     'field.timezone': 'GMT'})
+        >>> view = ApplicationPreferencesView(app, request)
+
+        >>> view.update()
+
+        >>> prefs = getApplicationPreferences(app)
+        >>> prefs.title
+        u'Company Calendars'
+
+        >>> prefs.dateformat
+        '%m/%d/%y'
+
+        >>> prefs.timeformat
+        '%I:%M %p'
+
+        >>> prefs.weekstart
+        0
+
+        >>> prefs.timezone
+        'GMT'
+
+    """
+
+
+def doctest_RelationshipViewBase():
+    """Test for RelationshipViewBase.
+
+    Let's create the view first:
+
+        >>> from schooltool.app.browser.app import RelationshipViewBase
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> view = RelationshipViewBase(None, request)
+
+    Update method of our view should process the form and perform
+    necessary actions, like add items to the collections and most
+    importantly to set up available and selected item tables:
+
+        >>> from zope.testing.doctestunit import pprint
+        >>> def FakeTableSetUp(**kwargs):
+        ...     print "Setting up table:"
+        ...     pprint(kwargs)
+        >>> view.createTableFormatter = FakeTableSetUp
+        >>> view.getAvailableItems = lambda: "<Available Items>"
+        >>> view.getSelectedItems = lambda: "<Selected Items>"
+        >>> view.update()
+        Setting up table: {'ommit': '<Selected Items>',
+                           'prefix': 'add_item'}
+        Setting up table: {'batch_size': 0,
+                           'filter': <function <lambda> at ...>,
+                           'items': '<Selected Items>',
+                           'prefix': 'remove_item'}
+
+    """
+
+def test_suite():
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF
+                   | doctest.REPORT_ONLY_FIRST_FAILURE
+                   | doctest.NORMALIZE_WHITESPACE)
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=optionflags))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,412 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool views.
+
+$Id: test_browser.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import unittest
+
+from zope.interface import implements
+from zope.testing import doctest
+from zope.interface.verify import verifyObject
+from zope.location.interfaces import ILocation
+from zope.app.testing import ztapi, setup
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.dependable.interfaces import IDependable
+from zope.i18n import translate
+from zope.traversing.interfaces import ITraversable, IPathAdapter
+
+from schooltool.app.browser.testing import setUp, tearDown
+from schooltool.testing import setup as sbsetup
+
+
+class SomeAnnotatable(object):
+    implements(IAttributeAnnotatable)
+
+
+def doctest_SchoolToolAPI():
+    r"""Tests for SchoolToolAPI.
+
+        >>> from zope.tales.interfaces import ITALESFunctionNamespace
+        >>> from schooltool.app.browser import SchoolToolAPI
+        >>> context = object()
+        >>> ns = SchoolToolAPI(context)
+        >>> verifyObject(ITALESFunctionNamespace, ns)
+        True
+
+    """
+
+
+def doctest_SchoolToolAPI_aap():
+    r"""Tests for SchoolToolAPI.app.
+
+    'context/schooltool:app' returns the nearest ISchoolToolApplication
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+        >>> from schooltool.app.browser import SchoolToolAPI
+        >>> SchoolToolAPI(app['persons']).app is app
+        True
+
+    It does so even for objects that do not adapt to ISchoolToolApplication,
+    but are sublocations of SchoolToolApplication:
+
+        >>> class Adding:
+        ...     implements(ILocation)
+        ...     __parent__ = app['persons']
+        ...
+        >>> adding = Adding()
+        >>> SchoolToolAPI(adding).app is app
+        True
+
+    """
+
+
+def doctest_SchoolToolAPI_preferences():
+    r"""Tests for SchoolToolAPI.preferences.
+
+        >>> setup.setUpAnnotations()
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> ztapi.provideAdapter(ISchoolToolApplication,
+        ...                      IApplicationPreferences,
+        ...                      getApplicationPreferences)
+
+    'context/schooltool:preferences' returns an ApplicationPreferences object
+    for the nearest ISchoolToolApplication
+
+        >>> from schooltool.app.browser import SchoolToolAPI
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> preferences = SchoolToolAPI(app).preferences
+        >>> preferences.title
+        'SchoolTool'
+
+        >>> preferences is SchoolToolAPI(app['persons']).preferences
+        True
+
+    """
+
+
+def doctest_SchoolToolAPI_person():
+    r"""Tests for SchoolToolAPI.person.
+
+    'context/schooltool:person' adapts the context to IPerson:
+
+        >>> from schooltool.app.browser import SchoolToolAPI
+        >>> from schooltool.person.person import Person
+        >>> p = Person()
+
+        >>> SchoolToolAPI(p).person is p
+        True
+        >>> SchoolToolAPI(None).person is None
+        True
+
+    """
+
+
+def doctest_SchoolToolAPI_authenticated():
+    r"""Tests for SchoolToolAPI.authenticated.
+
+    'context/schooltool:authenticated' checks whether context is an
+    authenticated principal
+
+        >>> from zope.app.security.principalregistry \
+        ...     import Principal, UnauthenticatedPrincipal
+        >>> root = Principal('root', 'Admin', 'Supreme user', 'root', 'secret')
+        >>> anonymous = UnauthenticatedPrincipal('anonymous', 'Anonymous',
+        ...                             "Anyone who did not bother to log in")
+
+        >>> from schooltool.app.browser import SchoolToolAPI
+        >>> SchoolToolAPI(root).authenticated
+        True
+        >>> SchoolToolAPI(anonymous).authenticated
+        False
+
+        >>> from schooltool.person.person import Person
+        >>> SchoolToolAPI(Person()).authenticated
+        ... # doctest: +NORMALIZE_WHITESPACE, +ELLIPSIS
+        Traceback (most recent call last):
+          ...
+        TypeError: schooltool:authenticated can only be applied to a principal
+        but was applied on <schooltool.person.person.Person object at ...>
+
+    """
+
+
+def doctest_SchoolToolAPI_has_dependents():
+    r"""Tests for SchoolToolAPI.has_dependents.
+
+        >>> from schooltool.app.browser import SchoolToolAPI
+
+        >>> obj = object()
+        >>> SchoolToolAPI(obj).has_dependents
+        False
+
+        >>> obj = SomeAnnotatable()
+        >>> SchoolToolAPI(obj).has_dependents
+        False
+
+        >>> IDependable(obj).addDependent('foo')
+        >>> SchoolToolAPI(obj).has_dependents
+        True
+
+    """
+
+
+def doctest_SortBy():
+    """Tests for SortBy adapter.
+
+        >>> from schooltool.app.browser import SortBy
+        >>> adapter = SortBy([])
+
+        >>> verifyObject(IPathAdapter, adapter)
+        True
+        >>> verifyObject(ITraversable, adapter)
+        True
+
+    You can sort empty lists
+
+        >>> adapter.traverse('name')
+        []
+
+    You can sort lists of dicts
+
+        >>> a_list = [{'id': 42, 'title': 'How to get ahead in navigation'},
+        ...           {'id': 11, 'title': 'The ultimate answer: 6 * 9'},
+        ...           {'id': 33, 'title': 'Alphabet for beginners'}]
+        >>> for item in SortBy(a_list).traverse('title'):
+        ...     print item['title']
+        Alphabet for beginners
+        How to get ahead in navigation
+        The ultimate answer: 6 * 9
+
+    You can sort lists of objects by attribute
+
+        >>> class SomeObject:
+        ...     def __init__(self, name):
+        ...         self.name = name
+        >>> another_list = map(SomeObject, ['orange', 'apple', 'pear'])
+        >>> for item in SortBy(another_list).traverse('name'):
+        ...     print item.name
+        apple
+        orange
+        pear
+
+    You cannot mix and match objects and dicts in the same list, though.
+    Also, if you specify the name of a method, SortBy will not call that
+    method to get sort keys.
+
+    You can sort arbitrary iterables, in fact:
+
+        >>> import itertools
+        >>> iterable = itertools.chain(another_list, another_list)
+        >>> for item in SortBy(iterable).traverse('name'):
+        ...     print item.name
+        apple
+        apple
+        orange
+        orange
+        pear
+        pear
+
+    """
+
+
+def doctest_CanAccess():
+    """Tests for CanAccess adapter.
+
+        >>> from schooltool.app.browser import CanAccess
+        >>> context = object()
+
+    Let's create the adapter:
+
+        >>> adapter = CanAccess(context)
+        >>> adapter.context is context
+        True
+
+    The adapter's traverse() method simply calls canAccess on the context.
+    Its functionality is tested in functional tests already and is too much
+    trouble to unit test, so we just check the interface:
+
+        >>> verifyObject(ITraversable, adapter)
+        True
+        >>> verifyObject(IPathAdapter, adapter)
+        True
+
+    """
+
+
+def doctest_SortBy_security():
+    """Regression test for http://issues.schooltool.org/issue174
+
+        >>> from zope.security.management import newInteraction
+        >>> from zope.security.management import endInteraction
+        >>> from zope.publisher.browser import TestRequest
+        >>> endInteraction()
+        >>> newInteraction(TestRequest())
+
+    Fairly standard condition: a security wrapped object.
+
+        >>> class SacredObj:
+        ...     title = 'Ribbit!'
+        >>> obj = SacredObj()
+
+        >>> from zope.security.checker import NamesChecker
+        >>> from zope.security.checker import ProxyFactory
+        >>> checker = NamesChecker(['title'], 'schooltool.View')
+        >>> protected_obj = ProxyFactory(obj, checker)
+        >>> a_list = [protected_obj]
+
+    When we sort it, we should get Unauthorized for the 'title' attribute (as
+    opposed to ForbiddenAttribute for '__getitem__', which will happen if
+    hasattr hides the first error).
+
+        >>> from schooltool.app.browser import SortBy
+        >>> list(SortBy(a_list).traverse('title'))  # doctest: +ELLIPSIS
+        Traceback (most recent call last):
+          ...
+        Unauthorized: (<...SacredObj instance...>, 'title', 'schooltool.View')
+
+    Tear down:
+
+        >>> endInteraction()
+
+    """
+
+def doctest_SchoolToolSized():
+    """Unit tests for SchoolToolSized.
+
+      >>> from schooltool.app.browser import SchoolToolSized
+      >>> from schooltool.person.person import Person
+
+      >>> app = sbsetup.setUpSchoolToolSite()
+      >>> sized = SchoolToolSized(app)
+
+      >>> sized.sizeForSorting(), translate(sized.sizeForDisplay())
+      ((u'Persons', 0), u'0 persons')
+
+      >>> persons = app['persons']
+      >>> persons['gintas'] = Person(u'gintas')
+
+      >>> sized.sizeForSorting(), translate(sized.sizeForDisplay())
+      ((u'Persons', 1), u'1 person')
+
+      >>> persons['ignas'] = Person(u'ignas')
+      >>> persons['marius'] = Person(u'marius')
+
+      >>> sized.sizeForSorting(), translate(sized.sizeForDisplay())
+      ((u'Persons', 3), u'3 persons')
+
+    """
+
+
+def doctest_ViewPrefences():
+    r"""Unit tests for ViewPreferences.
+
+        >>> from zope.publisher.browser import TestRequest
+
+        >>> from schooltool.app.browser import ViewPreferences
+        >>> from schooltool.person.interfaces import IPerson
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> from schooltool.person.person import Person
+        >>> import calendar
+        >>> class PreferenceStub:
+        ...     weekstart = calendar.MONDAY
+        ...     timeformat = "%H:%M"
+        ...     dateformat = "%Y-%m-%d"
+        ...     timezone = 'UTC'
+        >>> class PersonStub:
+        ...     def __conform__(self, interface):
+        ...         if interface is IPersonPreferences:
+        ...             return PreferenceStub()
+        >>> class PrincipalStub:
+        ...     def __conform__(self, interface):
+        ...         if interface is IPerson:
+        ...             return PersonStub()
+        >>> request = TestRequest()
+        >>> request.setPrincipal(PrincipalStub())
+        >>> prefs = ViewPreferences(request)
+        >>> from datetime import datetime
+        >>> prefs.timezone.tzname(datetime.utcnow())
+        'UTC'
+        >>> prefs.timeformat
+        '%H:%M'
+        >>> prefs.dateformat
+        '%Y-%m-%d'
+        >>> prefs.first_day_of_week
+        0
+        >>> from pytz import utc
+        >>> prefs.renderDatetime(datetime(2005, 1, 7, 14, 15, tzinfo=utc))
+        '2005-01-07 14:15'
+        
+    We have no principal (anonymous user) and no SchoolTool site (test
+    environment):
+
+        >>> request = TestRequest()
+        >>> prefs = ViewPreferences(request)
+        >>> from datetime import datetime
+        >>> prefs.timezone.tzname(datetime.utcnow())
+        'UTC'
+        >>> prefs.timeformat
+        '%H:%M'
+        >>> prefs.dateformat
+        '%Y-%m-%d'
+        >>> prefs.first_day_of_week
+        0
+
+    Let's set up a SchoolTool site:
+
+        >>> setup.setUpAnnotations()
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> ztapi.provideAdapter(ISchoolToolApplication,
+        ...                      IApplicationPreferences,
+        ...                      getApplicationPreferences)
+        >>> aprefs = IApplicationPreferences(app)
+        >>> aprefs.timezone = 'Europe/Moscow'
+        >>> aprefs.dateformat = '%m/%d/%y'
+        >>> aprefs.timeformat = '%I:%M %p'
+        >>> aprefs.weekstart = calendar.SUNDAY
+        >>> request = TestRequest()
+        >>> prefs = ViewPreferences(request)
+        >>> prefs.timezone.tzname(datetime.utcnow())
+        'MMT'
+        >>> prefs.timeformat
+        '%I:%M %p'
+        >>> prefs.dateformat
+        '%m/%d/%y'
+        >>> prefs.first_day_of_week
+        6
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown))
+    suite.addTest(doctest.DocTestSuite('schooltool.app.browser'))
+    suite.addTest(doctest.DocFileSuite('../templates.txt'))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_cal.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_cal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_cal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5490 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for SchoolTool-specific calendar views.
+
+$Id: test_cal.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import unittest
+import calendar
+from datetime import datetime, date, timedelta, time
+from pytz import timezone, utc
+from schooltool.app.browser.cal import DailyCalendarView
+
+from zope.i18n import translate
+from zope.interface import Interface
+from zope.interface import directlyProvides, implements
+from zope.component import provideSubscriptionAdapter
+from zope.interface.verify import verifyObject
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
+from zope.publisher.browser import BrowserView
+from zope.traversing.interfaces import IContainmentRoot
+from zope.app.session.interfaces import ISession
+from zope.publisher.interfaces.http import IHTTPRequest
+
+import schooltool.app # sacrifice to appease circular import gods
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.common import parse_datetime
+from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+from schooltool.timetable import SequentialDaysTimetableModel
+from schooltool.timetable.schema import TimetableSchema
+from schooltool.testing.util import NiceDiffsMixin
+from schooltool.app.interfaces import ISchoolToolCalendarEvent
+
+# Used in defining CalendarEventAddTestView
+from schooltool.app.browser.cal import CalendarEventAddView
+from schooltool.app.browser.cal import ICalendarEventAddForm
+from schooltool.app.cal import CalendarEvent, Calendar
+from schooltool.app.interfaces import ISchoolToolCalendar
+
+# Used in defining CalendarEventEditTestView
+from schooltool.app.browser.cal import CalendarEventEditView
+from schooltool.app.browser.cal import ICalendarEventEditForm
+from schooltool.app.browser.testing import setUp as browserSetUp, tearDown
+from schooltool.testing import setup as sbsetup
+
+# Used for the PrincipalStub
+# XXX: Bad, it depends on the person package.
+from schooltool.person.person import Person, PersonContainer
+from schooltool.person.interfaces import IPerson
+from schooltool.person.preference import getPersonPreferences
+from schooltool.person.interfaces import IPersonPreferences
+
+# Used when registering CalendarProvider subscribers/stubs
+from schooltool.app.browser.cal import CalendarListSubscriber
+from schooltool.app.browser.interfaces import ICalendarProvider
+
+
+class PrincipalStub:
+
+    _person = Person()
+
+    def __conform__(self, interface):
+        if interface is IPerson:
+            return self._person
+
+
+def dt(timestr):
+    dt = parse_datetime('2004-11-05 %s:00' % timestr)
+    return dt.replace(tzinfo=utc)
+
+
+class ApplicationStub(object):
+    implements(ISchoolToolApplication, IContainmentRoot)
+    def __init__(self, context):
+        pass
+
+
+def setUp(test=None):
+    browserSetUp(test)
+    sbsetup.setUpCalendaring()
+    sbsetup.setUpSessions()
+
+    ztapi.provideAdapter(Interface, ISchoolToolApplication,
+                         ApplicationStub)
+
+
+class EventStub(object):
+
+    implements(ISchoolToolCalendarEvent)
+
+    dtstart = datetime(2006, 4, 20, 20, 7, tzinfo=utc)
+    duration = timedelta(1)
+    title = "Ordinary event"
+
+    def __init__(self, unique_id='uid', owner=None, resources=()):
+        self.__parent__ = ISchoolToolCalendar(Person())
+        self.owner = owner
+        self.resources = resources
+        self.unique_id = unique_id
+        self.__name__ = unique_id[::-1]
+
+
+def doctest_ToCalendarTraverser():
+    """Tests for CalendarOwnerTraverser.
+
+    CalendarOwnerTraverser allows you to traverse directly to the calendar
+    of a calendar owner.
+
+        >>> from schooltool.app.browser.cal import ToCalendarTraverser
+        >>> person = Person()
+        >>> request = TestRequest()
+        >>> traverser = ToCalendarTraverser(person, request)
+        >>> traverser.context is person
+        True
+        >>> traverser.request is request
+        True
+
+    The traverser should implement IBrowserPublisher:
+
+        >>> from zope.publisher.interfaces.browser import IBrowserPublisher
+        >>> verifyObject(IBrowserPublisher, traverser)
+        True
+
+    Let's check that browserDefault suggests 'index.html':
+
+        >>> context, path = traverser.browserDefault(request)
+        >>> context is person
+        True
+        >>> path
+        ('index.html',)
+
+    The whole point of this class is that we can ask for the calendar:
+
+        >>> calendar = ISchoolToolCalendar(person)
+        >>> traverser.publishTraverse(request, 'calendar') is calendar
+        True
+
+    We can also get the calendar as iCalendar:
+
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> ztapi.browserView(ISchoolToolCalendar, 'calendar.ics', BrowserView)
+        >>> view = traverser.publishTraverse(request, 'calendar.ics')
+        >>> view.context is ISchoolToolCalendar(traverser.context)
+        True
+        >>> view.request is traverser.request
+        True
+
+    If we try to look up a nonexistent view, we should get a NotFound error:
+
+        >>> traverser.publishTraverse(request,
+        ...                           'nonexistent.html') # doctest: +ELLIPSIS
+        Traceback (most recent call last):
+        ...
+        NotFound: Object: <...Person object at ...>, name: 'nonexistent.html'
+
+    """
+
+def doctest_CalendarTraverser():
+    """Tests for CalendarTraverser.
+
+    CalendarTraverser allows you to traverse directly various calendar views:
+
+        >>> from schooltool.app.browser.cal import CalendarTraverser
+        >>> from schooltool.app.cal import Calendar
+        >>> cal = Calendar(None)
+        >>> request = TestRequest()
+        >>> traverser = CalendarTraverser(cal, request)
+        >>> traverser.context is cal
+        True
+        >>> traverser.request is request
+        True
+
+    The traverser should implement IBrowserPublisher:
+
+        >>> from zope.publisher.interfaces.browser import IBrowserPublisher
+        >>> verifyObject(IBrowserPublisher, traverser)
+        True
+
+    Let's check that browserDefault suggests 'daily.html':
+
+        >>> context, path = traverser.browserDefault(request)
+        >>> context is cal
+        True
+        >>> path
+        ('daily.html',)
+
+    The traverser is smart enough to parse date-like URLs.  It will choose
+    the right view and add the 'date' argument to the request.
+
+        >>> def queryMultiStub((context, request), name):
+        ...     print name
+        >>> traverser.queryMultiAdapter = queryMultiStub
+
+        >>> view = traverser.publishTraverse(request, '2003')
+        yearly.html
+        >>> request['date']
+        '2003-01-01'
+
+        >>> view = traverser.publishTraverse(request, '2004-05.pdf')
+        monthly.pdf
+        >>> request['date']
+        '2004-05-01'
+
+    The getViewByDate() method is responsible for recognizing dates.  It
+    may return a view if it recognizes a date, or None.
+
+    The yearly view is returned when only a year is provided:
+
+        >>> traverser.getViewByDate(request, '2002', 'foo')
+        'yearly.foo'
+        >>> request['date']
+        '2002-01-01'
+
+    The monthly view is supported too:
+
+        >>> traverser.getViewByDate(request, '2002-07', 'foo')
+        'monthly.foo'
+        >>> request['date']
+        '2002-07-01'
+
+    The weekly view can be accessed by adding 'w' in front of the week number:
+
+        >>> traverser.getViewByDate(request, '2002-w11', 'foo')
+        'weekly.foo'
+        >>> request['date']
+        '2002-03-11'
+
+    The daily view is supported too:
+
+        >>> traverser.getViewByDate(request, '2002-07-03', 'foo')
+        'daily.foo'
+        >>> request['date']
+        '2002-07-03'
+
+    Invalid dates are not touched:
+
+        >>> for name in ['', 'abc', 'index.html', '', '200a', '2004-1a',
+        ...              '2001-02-03-04', '2001/02/03', '2001-w3a', 'a-w2',
+        ...              '1000', '3000']:
+        ...     assert traverser.getHTMLViewByDate(request, name) is None
+        ...     assert traverser.getViewByDate(request, name, '') is None
+
+    getPDFViewByDate is similar to getHTMLViewByDate but returns PDF views
+    for the dates.
+
+        >>> traverser.getPDFViewByDate(request, '2002-07.pdf')
+        'monthly.pdf'
+        >>> request['date']
+        '2002-07-01'
+
+    We do not have a yearly PDF view (that could be huge!):
+
+        >>> print traverser.getPDFViewByDate(request, '2002.pdf')
+        None
+
+    It only handles view names ending with '.pdf' and ignores invalid dates:
+
+        >>> del request.form['date']
+        >>> print traverser.getPDFViewByDate(request, '2002-07-03.quux')
+        None
+        >>> 'date' in request
+        False
+        >>> print traverser.getPDFViewByDate(request, '2002-1a-01.pdf')
+        None
+        >>> 'date' in request
+        False
+
+    If we try to look up a nonexistent view, we should get a NotFound error:
+
+        >>> traverser.publishTraverse(request,
+        ...                           'nonexistent.html') # doctest: +ELLIPSIS
+        Traceback (most recent call last):
+        ...
+        NotFound: Object: <...Calendar object at ...>, name: 'nonexistent.html'
+
+    You can traverse into calendar events by their unique id:
+
+        >>> from schooltool.app.cal import CalendarEvent
+        >>> event = CalendarEvent(datetime(2002, 2, 2, 2, 2),
+        ...                       timedelta(hours=2), "Some event",
+        ...                       unique_id="it's me!")
+        >>> cal.addEvent(event)
+        >>> event.__name__
+        'aXQncyBtZSE='
+        >>> traverser.publishTraverse(request, 'aXQncyBtZSE=') is event
+        True
+
+    """
+
+
+def doctest_EventForDisplay():
+    """A wrapper for calendar events.
+
+        >>> from schooltool.app.browser.cal import EventForDisplay
+        >>> from schooltool.resource.resource import Resource
+        >>> person = Person("p1")
+        >>> calendar = ISchoolToolCalendar(person)
+        >>> event = createEvent('2004-01-02 14:45:50', '5min', 'yawn')
+        >>> calendar.addEvent(event)
+        >>> request = TestRequest()
+        >>> e1 = EventForDisplay(event, request, 'red', 'green', calendar, utc)
+
+    EventForDisplay lets us access all the usual attributes
+
+        >>> e1.dtstart.date()
+        datetime.date(2004, 1, 2)
+        >>> e1.dtstart.time()
+        datetime.time(14, 45, 50)
+        >>> e1.dtstart.tzname()
+        'UTC'
+        >>> e1.title
+        'yawn'
+        >>> e1.source_calendar is calendar
+        True
+        >>> e1.allday
+        False
+
+    If event is an allday event EventForDisplay has its allday attribute set:
+
+        >>> event.allday = True
+        >>> allday_efd = EventForDisplay(event, request, 'red', 'green',
+        ...                              calendar, utc)
+        >>> allday_efd.allday
+        True
+        >>> event.allday = False
+
+    It adds some additional attributes
+
+        >>> e1.dtend.date()
+        datetime.date(2004, 1, 2)
+        >>> e1.dtend.time()
+        datetime.time(14, 50, 50)
+        >>> e1.dtend.tzname()
+        'UTC'
+        >>> e1.color1
+        'red'
+        >>> e1.color2
+        'green'
+
+
+        >>> e1.shortTitle
+        'yawn'
+
+    shortTitle is ellipsized if the title is long
+
+        >>> e2 = createEvent('2004-01-02 12:00:00', '15min',
+        ...                  'sleeping for a little while because I was tired')
+        >>> e2 = EventForDisplay(e2, request, 'blue', 'yellow', calendar, utc)
+        >>> e2.shortTitle
+        'sleeping for a ...'
+
+    Lists of EventForDisplay objects can be sorted by start time
+
+        >>> e1 > e2
+        True
+
+    You can specify the timezone you want the events to appear in
+
+        >>> e3 = createEvent('2004-01-02 12:00:00', '15min',
+        ...                  'sleeping for a little while because I was tired')
+        >>> e3utc = EventForDisplay(e3, request, 'blue', 'yellow', calendar,
+        ...                         utc)
+        >>> print e3utc.dtstarttz
+        2004-01-02 12:00:00+00:00
+        >>> print e3utc.dtendtz
+        2004-01-02 12:15:00+00:00
+
+        >>> e3cairo = EventForDisplay(e3, request, 'blue', 'yellow', calendar,
+        ...                           timezone('Africa/Cairo'))
+        >>> print e3cairo.dtstarttz
+        2004-01-02 14:00:00+02:00
+        >>> print e3cairo.dtendtz
+        2004-01-02 14:15:00+02:00
+
+    Europe/Vilnius is a good test case, since the definiton of the zone has
+    changed over the years, and if you use the wrong datetime API, you'll
+    get a wrong UTC offset.
+
+        >>> e3vilnius = EventForDisplay(e3, request, 'blue', 'yellow',
+        ...                             calendar, timezone('Europe/Vilnius'))
+        >>> print e3vilnius.dtstarttz
+        2004-01-02 14:00:00+02:00
+        >>> print e3vilnius.dtendtz
+        2004-01-02 14:15:00+02:00
+
+    """
+
+
+def doctest_EventForDisplay_getBooker_getBookedResources():
+    """Test for EventForDisplay.getBooker and getBookedResources.
+
+        >>> from schooltool.app.browser.cal import EventForDisplay
+        >>> class EFD(EventForDisplay):
+        ...     def __init__(self):
+        ...         self.context = EventStub(resources=['res1', 'res2'],
+        ...                                  owner='Jonas')
+
+    getBookedResources plainly returns the list of resources of the
+    event:
+
+        >>> efd = EFD()
+        >>> sorted(efd.getBookedResources())
+        ['res1', 'res2']
+
+    getBooker returns the owner of the event:
+
+        >>> print efd.getBooker()
+        Jonas
+
+    """
+
+
+def doctest_EventForDisplay_renderShort():
+    """Test for EventForDisplay.renderShort.
+
+        >>> from schooltool.app.browser.cal import EventForDisplay
+        >>> e = createEvent('2004-01-02 14:00:00', '90min',
+        ...                 'sleeping for a little while because I was tired')
+        >>> request = None
+        >>> calendar = Calendar(None)
+        >>> efd = EventForDisplay(e, request, 'blue', 'yellow', calendar, utc)
+
+    The `renderShort` method is used to render the event in the monthly
+    calendar view.
+
+        >>> print efd.renderShort().replace('&ndash;', '--')
+        sleeping for a ... (14:00--15:30)
+
+    The same CalendarEvent can be renderered for display in a particular
+    timezone.
+
+        >>> efd = EventForDisplay(e, request, 'blue', 'yellow', calendar,
+        ...                       timezone=timezone('US/Eastern'))
+        >>> print efd.renderShort().replace('&ndash;', '--')
+        sleeping for a ... (09:00--10:30)
+
+    If the event crosses a day boundary, both dates are shown explicitly
+
+        >>> efd = EventForDisplay(e, request, 'blue', 'yellow', calendar,
+        ...                       timezone=timezone('Asia/Tokyo'))
+        >>> print efd.renderShort().replace('&ndash;', '--').replace('&nbsp;', ' ')
+        sleeping for a ... (Jan 02--Jan 03)
+
+    """
+
+
+def doctest_EventForDisplay_viewLink():
+    """Test for EventForDisplay.viewLink.
+
+        >>> from schooltool.app.browser.cal import EventForDisplay
+        >>> event = createEvent('2005-12-12 22:50:00', '20min', 'drive home',
+        ...                     unique_id='xyzzy')
+        >>> request = TestRequest()
+        >>> color1 = color2 = None
+        >>> calendar = Calendar(None)
+        >>> directlyProvides(calendar, IContainmentRoot)
+
+    Some events are not viewable (dynamically created events, such as timetable
+    events, that have no URLs):
+
+        >>> e = EventForDisplay(event, request, color1, color2, calendar, utc)
+        >>> print e.viewLink()
+        None
+
+    Other events are
+
+        >>> calendar.addEvent(event)
+        >>> e = EventForDisplay(event, request, color1, color2, calendar, utc)
+        >>> print e.viewLink()
+        http://127.0.0.1/calendar/eHl6enk%3D
+
+    """
+
+
+def doctest_EventForDisplay_editLink():
+    """Test for EventForDisplay.editLink.
+
+        >>> from schooltool.app.browser.cal import EventForDisplay
+        >>> from schooltool.app.cal import Calendar, CalendarEvent
+        >>> event = CalendarEvent(datetime(2005, 9, 26, 21, 2),
+        ...                       timedelta(hours=1), "Clickety-click",
+        ...                       unique_id='xyzzy')
+        >>> request = TestRequest()
+        >>> color1 = color2 = None
+        >>> calendar = Calendar(None)
+
+    Some events are not editable.
+
+        >>> e = EventForDisplay(event, request, color1, color2, calendar, utc)
+        >>> print e.editLink()
+        None
+
+    Other events are
+
+        >>> calendar.addEvent(event)
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> e = EventForDisplay(event, request, color1, color2, calendar, utc)
+        >>> print e.editLink()
+        http://127.0.0.1/calendar/eHl6enk%3D/edit.html?date=2005-09-26
+
+    Note that if you're in a different time zone, the date may be different
+
+        >>> e = EventForDisplay(event, request, color1, color2, calendar,
+        ...                     timezone('Asia/Tokyo'))
+        >>> print e.editLink()
+        http://127.0.0.1/calendar/eHl6enk%3D/edit.html?date=2005-09-27
+
+    """
+
+
+def doctest_EventForDisplay_deleteLink():
+    """Test for EventForDisplay.deleteLink.
+
+        >>> from schooltool.app.browser.cal import EventForDisplay
+        >>> event = createEvent('2005-12-12 22:50:00', '20min', 'drive home',
+        ...                     unique_id='xyzzy')
+        >>> request = TestRequest()
+        >>> color1 = color2 = None
+        >>> calendar = Calendar(None)
+        >>> directlyProvides(calendar, IContainmentRoot)
+
+    Some events are not deletable.
+
+        >>> e = EventForDisplay(event, request, color1, color2, calendar, utc)
+        >>> print e.deleteLink()
+        None
+
+    Other events are
+
+        >>> calendar.addEvent(event)
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> e = EventForDisplay(event, request, color1, color2, calendar, utc)
+        >>> print e.deleteLink()
+        http://127.0.0.1/calendar/delete.html?event_id=xyzzy&date=2005-12-12
+
+    Note that if you're in a different time zone, the date may be different
+
+        >>> e = EventForDisplay(event, request, color1, color2, calendar,
+        ...                     timezone('Asia/Tokyo'))
+        >>> print e.deleteLink()
+        http://127.0.0.1/calendar/delete.html?event_id=xyzzy&date=2005-12-13
+
+    """
+
+
+def doctest_EventForDisplay_bookingLink():
+    """Test for EventForDisplay.bookingLink.
+
+        >>> from schooltool.app.browser.cal import EventForDisplay
+        >>> event = createEvent('2005-12-12 22:50:00', '20min', 'drive home',
+        ...                     unique_id='xyzzy')
+        >>> request = TestRequest()
+        >>> color1 = color2 = None
+        >>> calendar = Calendar(None)
+        >>> directlyProvides(calendar, IContainmentRoot)
+
+    Some events are not bookable.
+
+        >>> e = EventForDisplay(event, request, color1, color2, calendar, utc)
+        >>> print e.bookingLink()
+        None
+
+    Other events are
+
+        >>> calendar.addEvent(event)
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> e = EventForDisplay(event, request, color1, color2, calendar, utc)
+        >>> print e.bookingLink()
+        http://127.0.0.1/calendar/eHl6enk%3D/booking.html?date=2005-12-12
+
+    Note that if you're in a different time zone, the date may be different
+
+        >>> e = EventForDisplay(event, request, color1, color2, calendar,
+        ...                     timezone('Asia/Tokyo'))
+        >>> print e.bookingLink()
+        http://127.0.0.1/calendar/eHl6enk%3D/booking.html?date=2005-12-13
+
+    """
+
+
+def doctest_EventForBookingDisplay():
+    """A wrapper for calendar events.
+
+        >>> from schooltool.app.browser.cal import EventForBookingDisplay
+        >>> e1 = createEvent('2004-01-02 14:45:50', '5min', 'yawn',
+        ...                  unique_id='uid0')
+        >>> e1 = EventForBookingDisplay(e1)
+
+    EventForBookingDisplay lets us access all the usual attributes
+
+        >>> e1.dtend.date()
+        datetime.date(2004, 1, 2)
+        >>> e1.dtend.time()
+        datetime.time(14, 50, 50)
+        >>> e1.dtend.tzname()
+        'UTC'
+        >>> e1.title
+        'yawn'
+        >>> e1.unique_id
+        'uid0'
+
+    It adds some additional attributes
+
+        >>> e1.dtend.date()
+        datetime.date(2004, 1, 2)
+        >>> e1.dtend.time()
+        datetime.time(14, 50, 50)
+        >>> e1.dtend.tzname()
+        'UTC'
+        >>> e1.shortTitle
+        'yawn'
+
+    shortTitle is ellipsized if the title is long
+
+        >>> e2 = createEvent('2004-01-02 12:00:00', '15min',
+        ...                  'sleeping for a little while because I was tired')
+        >>> e2 = EventForBookingDisplay(e2)
+        >>> e2.shortTitle
+        'sleeping for a ...'
+
+    """
+
+
+def doctest_CalendarDay():
+    """A calendar day is a set of events that took place on a particular day.
+
+        >>> from schooltool.app.browser.cal import CalendarDay
+        >>> day1 = CalendarDay(date(2004, 8, 5))
+        >>> day1.date
+        datetime.date(2004, 8, 5)
+        >>> day1.events
+        []
+
+        >>> day2 = CalendarDay(date(2004, 7, 15), ["abc", "def"])
+        >>> day2.date
+        datetime.date(2004, 7, 15)
+        >>> day2.events
+        ['abc', 'def']
+
+    You can sort a list of CalendarDay objects.
+
+        >>> day1 > day2 and not day1 < day2
+        True
+        >>> day2 == CalendarDay(date(2004, 7, 15))
+        True
+
+    You can test a calendar day to see if its date is today
+
+        >>> day = CalendarDay(date.today())
+        >>> day.today()
+        'today'
+
+        >>> day = CalendarDay(date.today() - date.resolution)
+        >>> day.today()
+        ''
+
+    """
+
+
+def createEvent(dtstart, duration, title, **kw):
+    """Create a CalendarEvent.
+
+      >>> from schooltool.app.cal import CalendarEvent
+      >>> e1 = createEvent('2004-01-02 14:45:50', '5min', 'title')
+      >>> e1 == CalendarEvent(datetime(2004, 1, 2, 14, 45, 50),
+      ...                timedelta(minutes=5), 'title', unique_id=e1.unique_id)
+      True
+
+      >>> e2 = createEvent('2004-01-02 14:45', '3h', 'title')
+      >>> e2 == CalendarEvent(datetime(2004, 1, 2, 14, 45),
+      ...                timedelta(hours=3), 'title', unique_id=e2.unique_id)
+      True
+
+      >>> e3 = createEvent('2004-01-02', '2d', 'title')
+      >>> e3 == CalendarEvent(datetime(2004, 1, 2),
+      ...                timedelta(days=2), 'title', unique_id=e3.unique_id)
+      True
+
+    createEvent is very strict about the format of it arguments, and terse in
+    error reporting, but it's OK, as it is only used in unit tests.
+    """
+    from schooltool.app.cal import CalendarEvent
+    from schooltool.calendar.utils import parse_datetimetz
+    if dtstart.count(':') == 0:         # YYYY-MM-DD
+        dtstart = parse_datetimetz(dtstart+' 00:00:00') # add hh:mm:ss
+    elif dtstart.count(':') == 1:       # YYYY-MM-DD HH:MM
+        dtstart = parse_datetimetz(dtstart+':00') # add seconds
+    else:                               # YYYY-MM-DD HH:MM:SS
+        dtstart = parse_datetimetz(dtstart)
+    dur = timedelta(0)
+    for part in duration.split('+'):
+        part = part.strip()
+        if part.endswith('d'):
+            dur += timedelta(days=int(part.rstrip('d')))
+        elif part.endswith('h'):
+            dur += timedelta(hours=int(part.rstrip('h')))
+        elif part.endswith('sec'):
+            dur += timedelta(seconds=int(part.rstrip('sec')))
+        else:
+            dur += timedelta(minutes=int(part.rstrip('min')))
+    return CalendarEvent(dtstart, dur, title, **kw)
+
+
+def registerCalendarSubscribers():
+    """Register subscription adapter for listing calendars to display."""
+    provideSubscriptionAdapter(CalendarListSubscriber,
+                               (ISchoolToolCalendar, IHTTPRequest),
+                               ICalendarProvider)
+
+
+def registerCalendarHelperViews():
+    """Register the real DailyCalendarRowsView for use by other views."""
+    from schooltool.app.browser.cal import DailyCalendarRowsView
+    from schooltool.app.interfaces import ISchoolToolCalendar
+    ztapi.browserView(ISchoolToolCalendar, 'daily_calendar_rows',
+                      DailyCalendarRowsView)
+
+
+def getDaysStub(start, end):
+    """Stub for CalendarViewBase.getDays."""
+    from schooltool.app.browser.cal import CalendarDay
+    days = []
+    day = start
+    while day < end:
+        days.append(CalendarDay(day))
+        day += timedelta(1)
+    return days
+
+
+class TestCalendarViewBase(unittest.TestCase):
+    # Legacy unit tests from SchoolTool.
+
+    def setUp(self):
+        setup.placefulSetUp()
+
+        sbsetup.setUpSessions()
+        registerCalendarHelperViews()
+        registerCalendarSubscribers()
+
+        # Usually registered for IHavePreferences
+        ztapi.provideAdapter(IPerson, IPersonPreferences,
+                             getPersonPreferences)
+
+    def tearDown(self):
+        setup.placefulTearDown()
+
+    def test_initDayCache(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        view = CalendarViewBase(None, TestRequest())
+
+        view.cursor = date(2005, 6, 9)
+        view.first_day_of_week = calendar.SUNDAY
+        view._initDaysCache()
+        self.assertEquals(view._days_cache.expensive_getDays, view._getDays)
+        self.assertEquals(view._days_cache.cache_first, date(2005, 5, 1))
+        self.assertEquals(view._days_cache.cache_last, date(2005, 8, 7))
+
+        view.cursor = date(2005, 6, 9)
+        view.first_day_of_week = calendar.MONDAY
+        view._initDaysCache()
+        self.assertEquals(view._days_cache.expensive_getDays, view._getDays)
+        self.assertEquals(view._days_cache.cache_first, date(2005, 4, 25))
+        self.assertEquals(view._days_cache.cache_last, date(2005, 8, 1))
+
+    def test_update_today_by_default(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        request = TestRequest()
+        view = CalendarViewBase(None, request)
+        view.update()
+        self.assertEquals(view.cursor, date.today())
+
+    def test_update_explicit_date(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        request = TestRequest(form={'date': '2005-03-04'})
+        view = CalendarViewBase(None, request)
+        view.update()
+        self.assertEquals(view.cursor, date(2005, 3, 4))
+
+    def test_update_date_from_session(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        request = TestRequest()
+        ISession(request)['calendar']['last_visited_day'] = date(2005, 1, 2)
+        view = CalendarViewBase(None, request)
+        view.inCurrentPeriod = lambda dt: False
+        view.update()
+        self.assertEquals(view.cursor, date(2005, 1, 2))
+
+    # update is also tested in doctest_CalendarViewBase
+
+    def test_update_initializes_days_cache(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        request = TestRequest(form={'date': '2005-03-04'})
+        view = CalendarViewBase(None, request)
+        view.update()
+        self.assert_(view._days_cache is not None)
+        first, last = view._days_cache.cache_first, view._days_cache.cache_last
+        self.assert_(first <= view.cursor <= last)
+
+    def test_dayTitle(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+
+        # Usually registered for IHavePreferences
+        ztapi.provideAdapter(IPerson, IPersonPreferences,
+                             getPersonPreferences)
+
+        from zope.publisher.interfaces import IRequest
+        import zope.component
+        from zope.interface import Interface
+        class TestDateFormatterFullView( BrowserView ):
+            """
+            A Stub view for formating the date
+            """
+            def __call__(self):
+                return unicode(self.context.strftime("%A, %B%e, %Y"))
+
+        zope.component.provideAdapter(TestDateFormatterFullView,
+                                      [date, IRequest], Interface,
+                                      name='fullDate')
+
+
+        request1 = TestRequest()
+        request1.setPrincipal(PrincipalStub())
+        view1 = CalendarViewBase(None, request1)
+        dt = datetime(2004, 7, 1)
+        self.assertEquals(view1.dayTitle(dt), u'Thursday, July 1, 2004')
+
+        request2 = TestRequest()
+        request2.setPrincipal(PrincipalStub())
+        self.assertEquals(view1.timezone.tzname(datetime.utcnow()), 'UTC')
+
+    def test_prev_next(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+
+        request = TestRequest()
+        view = CalendarViewBase(None, request)
+
+        view.cursor = date(2004, 8, 18)
+        self.assertEquals(view.prevMonth(), date(2004, 7, 1))
+        self.assertEquals(view.nextMonth(), date(2004, 9, 1))
+        self.assertEquals(view.prevDay(), date(2004, 8, 17))
+        self.assertEquals(view.nextDay(), date(2004, 8, 19))
+
+    def test_getWeek(self):
+        import calendar as pycalendar
+        from schooltool.app.browser.cal import CalendarViewBase, CalendarDay
+        from schooltool.app.cal import Calendar
+
+        request = TestRequest()
+        request.setPrincipal(PrincipalStub())
+
+        cal = Calendar(None)
+        view = CalendarViewBase(cal, request)
+        self.assertEquals(view.first_day_of_week, 0) # Monday by default
+        self.assertEquals(view.time_fmt, '%H:%M')
+
+        # change our preferences
+        prefs = IPersonPreferences(request.principal._person)
+        prefs.weekstart = pycalendar.SUNDAY
+        prefs.timeformat = "%I:%M %p"
+
+        view_sunday = CalendarViewBase(cal, request)
+        self.assertEquals(view_sunday.first_day_of_week, 6)
+        self.assertEquals(view_sunday.time_fmt, "%I:%M %p")
+
+        def getDaysStub(start, end):
+            return [CalendarDay(start), CalendarDay(end)]
+        view.getDays = getDaysStub
+
+        for dt in (date(2004, 8, 9), date(2004, 8, 11), date(2004, 8, 15)):
+            week = view.getWeek(dt)
+            self.assertEquals(week,
+                              [CalendarDay(date(2004, 8, 9)),
+                               CalendarDay(date(2004, 8, 16))])
+
+        dt = date(2004, 8, 16)
+        week = view.getWeek(dt)
+        self.assertEquals(week,
+                          [CalendarDay(date(2004, 8, 16)),
+                           CalendarDay(date(2004, 8, 23))])
+
+    def test_getWeek_first_day_of_week(self):
+        from schooltool.app.browser.cal import CalendarViewBase, CalendarDay
+        from schooltool.app.cal import Calendar
+
+        request = TestRequest()
+
+        cal = Calendar(None)
+        view = CalendarViewBase(cal, request)
+        view.first_day_of_week = 2 # Wednesday
+
+        def getDaysStub(start, end):
+            return [CalendarDay(start), CalendarDay(end)]
+        view.getDays = getDaysStub
+
+        for dt in (date(2004, 8, 11), date(2004, 8, 14), date(2004, 8, 17)):
+            week = view.getWeek(dt)
+            self.assertEquals(week, [CalendarDay(date(2004, 8, 11)),
+                                     CalendarDay(date(2004, 8, 18))],
+                              "%s: %s -- %s"
+                              % (dt, week[0].date, week[1].date))
+
+        dt = date(2004, 8, 10)
+        week = view.getWeek(dt)
+        self.assertEquals(week,
+                          [CalendarDay(date(2004, 8, 4)),
+                           CalendarDay(date(2004, 8, 11))])
+
+        dt = date(2004, 8, 18)
+        week = view.getWeek(dt)
+        self.assertEquals(week,
+                          [CalendarDay(date(2004, 8, 18)),
+                           CalendarDay(date(2004, 8, 25))])
+
+    def test_getMonth(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        from schooltool.app.cal import Calendar
+        cal = Calendar(None)
+        request = TestRequest()
+        view = CalendarViewBase(cal, request)
+        view.getDays = getDaysStub
+        self.do_test_getMonth(view)
+
+    def test_getMonth_with_caching(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        cal = Calendar(None)
+        request = TestRequest()
+        view = CalendarViewBase(cal, request)
+
+        # We can pass a list of CalendarDays to getMonth to speed it up.
+        # This list must contain consecutive days only!
+        days = getDaysStub(date(2004, 1, 1), date(2004, 12, 31))
+
+        # The view now never needs to call self.getDays, so we might
+        # just as well get rid of it
+        def dontCallUsWellCallYou(*args):
+            raise NotImplementedError, "don't call us, we'll call you"
+        view.getDays = dontCallUsWellCallYou
+
+        self.do_test_getMonth(view, days)
+
+    def test_getMonth_caching_corner_cases(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        view = CalendarViewBase(None, TestRequest())
+        days = getDaysStub(date(2004, 7, 27), date(2004, 12, 31))
+        self.assertRaises(AssertionError,
+                          view.getMonth, date(2004, 8, 11), days=days)
+        days = getDaysStub(date(2004, 1, 1), date(2004, 9, 5))
+        self.assertRaises(AssertionError,
+                          view.getMonth, date(2004, 8, 11), days=days)
+        days = getDaysStub(date(2004, 7, 26), date(2004, 9, 6))
+        view.getMonth(date(2004, 8, 11), days=days)
+
+    def do_test_getMonth(self, view, days=None):
+        """Test basic functionality of getMonth.
+
+        We want to test getMonth with the same data set irrespective
+        of whether caching is used or not.
+        """
+        weeks = view.getMonth(date(2004, 8, 11), days=days)
+        self.assertEquals(len(weeks), 6)
+        bounds = [(week[0].date, week[-1].date) for week in weeks]
+        self.assertEquals(bounds,
+                          [(date(2004, 7, 26), date(2004, 8, 1)),
+                           (date(2004, 8, 2), date(2004, 8, 8)),
+                           (date(2004, 8, 9), date(2004, 8, 15)),
+                           (date(2004, 8, 16), date(2004, 8, 22)),
+                           (date(2004, 8, 23), date(2004, 8, 29)),
+                           (date(2004, 8, 30), date(2004, 9, 5))])
+
+        # October 2004 ends with a Sunday, so we use it to check that
+        # no days from the next month are included.
+        weeks = view.getMonth(date(2004, 10, 1), days=days)
+        bounds = [(week[0].date, week[-1].date) for week in weeks]
+        self.assertEquals(bounds[4],
+                          (date(2004, 10, 25), date(2004, 10, 31)))
+
+        # Same here, just check the previous month.
+        weeks = view.getMonth(date(2004, 11, 1), days=days)
+        bounds = [(week[0].date, week[-1].date) for week in weeks]
+        self.assertEquals(bounds[0],
+                          (date(2004, 11, 1), date(2004, 11, 7)))
+
+    def test_getYear(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+
+        request = TestRequest()
+
+        view = CalendarViewBase(None, request)
+        view.getDays = getDaysStub
+
+        def getMonthStub(dt, days=None):
+            # Check that boundaries of `days` are ones that we expect
+            self.assertEquals(days[0].date, date(2003, 12, 29))
+            self.assertEquals(days[-1].date, date(2005, 1, 2))
+            return dt
+        view.getMonth = getMonthStub
+
+        year = view.getYear(date(2004, 3, 4))
+        self.assertEquals(len(year), 4)
+        months = []
+        for quarter in year:
+            self.assertEquals(len(quarter), 3)
+            months.extend(quarter)
+        for i, month in enumerate(months):
+            self.assertEquals(month, date(2004, i+1, 1))
+
+    def test_getYear_when_sunday(self):
+        # Regression test for http://issues.schooltool.org/issue449
+        from schooltool.app.browser.cal import CalendarViewBase
+        view = CalendarViewBase(None, TestRequest())
+        view.getDays = getDaysStub
+        view.first_day_of_week = calendar.SUNDAY
+        def getMonthStub(dt, days=None):
+            # Check that boundaries of `days` are ones that we expect
+            self.assertEquals(days[0].date, date(2003, 12, 28))
+            self.assertEquals(days[-1].date, date(2005, 1, 1))
+            return dt
+        view.getMonth = getMonthStub
+        year = view.getYear(date(2004, 3, 4))
+        self.assertEquals(len(year), 4)
+        months = []
+        for quarter in year:
+            self.assertEquals(len(quarter), 3)
+            months.extend(quarter)
+        for i, month in enumerate(months):
+            self.assertEquals(month, date(2004, i+1, 1))
+
+    def assertEqualEventLists(self, result, expected):
+        fmt = lambda x: '[%s]' % ', '.join([e.title for e in x])
+        self.assertEquals(result, expected,
+                          '%s != %s' % (fmt(result), fmt(expected)))
+
+    def doctest_eventAddLink(self):
+        """Tests for CalendarViewBase.eventAddLink.
+
+            >>> from schooltool.app.browser.cal import CalendarViewBase
+            >>> from schooltool.app.cal import Calendar
+
+            >>> setup.placefulSetUp()
+            >>> app = sbsetup.setUpSchoolToolSite()
+            >>> directlyProvides(app, IContainmentRoot)
+            >>> ztapi.provideAdapter(Interface, ISchoolToolApplication,
+            ...                      lambda x: app)
+            >>> from schooltool.resource.interfaces import IBookingCalendar
+            >>> from schooltool.resource.interfaces import IResourceContainer
+            >>> from schooltool.resource.booking import ResourceBookingCalendar
+            >>> ztapi.provideAdapter(IResourceContainer, IBookingCalendar,
+            ...                      ResourceBookingCalendar)
+
+            >>> app['persons']['john'] = person = Person("john")
+            >>> calendar = Calendar(person)
+            >>> vb = CalendarViewBase(calendar, TestRequest())
+
+        For persons or groups the link points to the add event view of
+        the calendar you are looking at:
+
+            >>> vb.cursor = date(2005, 1, 1)
+            >>> vb.eventAddLink({'time': '5:00', 'duration': 45})
+            'http://127.0.0.1/persons/john/calendar/add.html?field.start_date=2005-01-01&field.start_time=5:00&field.duration=45'
+
+        The link should be quite different if this calendar belongs to
+        a resource rather than a person. The link points to the
+        resource booking calendar:
+
+            >>> from schooltool.resource.resource import Resource
+            >>> app['resources']['chair'] = resource = Resource("chair")
+            >>> calendar = Calendar(resource)
+            >>> vb = CalendarViewBase(calendar, TestRequest())
+
+            >>> vb.cursor = date(2005, 1, 1)
+            >>> vb.eventAddLink({'time': '5:00', 'duration': 45})
+            u'http://127.0.0.1/resources/booking/book_one_resource.html?resource_id=chair&start_date=2005-01-01&start_time=5:00:00&title=Unnamed Event&duration=2700'
+
+        """
+
+    def doctest_pigeonhole(self):
+        r"""Test for CalendarViewBase.pigeonhole().
+
+        Our pigeonholer operates on date intervals and CalendarDays:
+
+            >>> from schooltool.app.browser.cal import CalendarViewBase
+            >>> from schooltool.app.cal import Calendar
+
+            >>> setup.placefulSetUp()
+            >>> app = sbsetup.setUpSchoolToolSite()
+            >>> setup.setUpAnnotations()
+            >>> registerCalendarHelperViews()
+            >>> registerCalendarSubscribers()
+            >>> sbsetup.setUpTimetabling()
+
+            >>> calendar = Calendar(Person())
+            >>> vb = CalendarViewBase(calendar, TestRequest())
+
+        Pigeonholer returns an empty list if the interval list is empty:
+
+            >>> vb.pigeonhole([], [])
+            []
+
+        It returns a list of (empty) lists if we will pass it a
+        non-empty list of intervals and an empty list of CalendarDays:
+
+        An interval is a tuple of 2 dates (start and end; the former
+        is inclusive while the latter is exclusive):
+
+            >>> intervals = [(date(2005, 1, 1),
+            ...               date(2005, 1, 8)),
+            ...              (date(2005, 1, 8),
+            ...               date(2005, 1, 15))]
+            >>> vb.pigeonhole(intervals, [])
+            [[], []]
+
+        Let's pigeonhole a couple of days' worth of events into
+        intervals:
+
+            >>> days = vb._getDays(date(2005, 1, 7),
+            ...                    date(2005, 1, 9))
+
+            >>> weeks = vb.pigeonhole(intervals, days)
+            >>> [day.date for day in weeks[0]]
+            [datetime.date(2005, 1, 7)]
+            >>> [day.date for day in weeks[1]]
+            [datetime.date(2005, 1, 8)]
+
+        If intervals overlap, then common days should be included in
+        all of them:
+
+            >>> intervals = [(date(2005, 1, 1),
+            ...               date(2005, 1, 9)),
+            ...              (date(2005, 1, 7),
+            ...               date(2005, 1, 15))]
+
+            >>> weeks = vb.pigeonhole(intervals, days)
+            >>> [day.date for day in weeks[0]]
+            [datetime.date(2005, 1, 7), datetime.date(2005, 1, 8)]
+            >>> [day.date for day in weeks[1]]
+            [datetime.date(2005, 1, 7), datetime.date(2005, 1, 8)]
+
+        """
+
+    def doctest_getCalendars(self):
+        """Test for CalendarViewBase.getCalendars().
+
+            >>> setup.placelessSetUp()
+
+        getCalendars() only delegates the task to a ICalendarProvider
+        subscriber.  We will provide a stub subscriber to test the
+        method.
+
+            >>> class CalendarListSubscriberStub(object):
+            ...     def __init__(self, context, request):
+            ...         pass
+            ...     def getCalendars(self):
+            ...         return ['some calendar', 'another calendar']
+            >>> provideSubscriptionAdapter(CalendarListSubscriberStub,
+            ...                            (ISchoolToolCalendar, IHTTPRequest),
+            ...                            ICalendarProvider)
+
+            >>> from schooltool.app.cal import Calendar
+            >>> from schooltool.app.browser.cal import CalendarViewBase
+            >>> view = CalendarViewBase(Calendar(None), TestRequest())
+
+        Now, if we call the method, the output of our stub will be returned:
+
+            >>> view.getCalendars()
+            ['some calendar', 'another calendar']
+
+        We're done:
+
+            >>> setup.placelessTearDown()
+
+        """
+
+    def doctest_getCalendars_cache(self):
+        """Test for CalendarViewBase.getCalendars() caching.
+
+        Let's set up needed stubs:
+
+            >>> class CalendarListSubscriberStub(object):
+            ...     def __init__(self, context, request):
+            ...         pass
+            ...     def getCalendars(self):
+            ...         return ['some calendar', 'another calendar']
+            >>> provideSubscriptionAdapter(CalendarListSubscriberStub,
+            ...                            (ISchoolToolCalendar, IHTTPRequest),
+            ...                            ICalendarProvider)
+
+        The cache for calendar list is None by default:
+
+            >>> from schooltool.app.cal import Calendar
+            >>> from schooltool.app.browser.cal import CalendarViewBase
+            >>> from schooltool.person.person import Person
+            >>> view = CalendarViewBase(Calendar(Person()), TestRequest())
+
+            >>> view._calendars is None
+            True
+
+        When we get the list of calendars for the first time it gets
+        set:
+
+            >>> view.getCalendars()
+            ['some calendar', 'another calendar']
+            >>> view._calendars
+            ['some calendar', 'another calendar']
+
+        Next call of getCalendars will return the cached value:
+
+            >>> view._calendars.append('random calendar')
+            >>> view.getCalendars()
+            ['some calendar', 'another calendar', 'random calendar']
+
+        """
+
+    def doctest_getEvents(self):
+        """Test for CalendarViewBase.getEvents
+
+            >>> setup.placefulSetUp()
+            >>> app = sbsetup.setUpSchoolToolSite()
+            >>> setup.setUpAnnotations()
+            >>> registerCalendarHelperViews()
+            >>> registerCalendarSubscribers()
+            >>> sbsetup.setUpSessions()
+            >>> sbsetup.setUpTimetabling()
+
+        CalendarViewBase.getEvents returns a list of wrapped calendar
+        events.
+
+            >>> from schooltool.app.browser.cal import CalendarViewBase
+            >>> from schooltool.app.cal import Calendar
+            >>> cal1 = Calendar(Person())
+            >>> cal1.addEvent(createEvent('2005-02-26 19:39', '1h', 'code'))
+            >>> cal1.addEvent(createEvent('2005-02-20 16:00', '1h', 'walk'))
+            >>> view = CalendarViewBase(cal1, TestRequest())
+            >>> view.inCurrentPeriod = lambda dt: False
+            >>> for e in view.getEvents(datetime(2005, 2, 21, tzinfo=utc),
+            ...                         datetime(2005, 3, 1, tzinfo=utc)):
+            ...     print e.title
+            ...     print e.dtstarttz
+            code
+            2005-02-26 19:39:00+00:00
+
+        We will stub view.getCalendars to simulate overlayed calendars
+
+            >>> cal2 = Calendar(None)
+            >>> cal2.addEvent(createEvent('2005-02-27 12:00', '1h', 'rest'))
+            >>> view.getCalendars = lambda:[(cal1, 'r', 'g'), (cal2, 'b', 'y')]
+            >>> for e in view.getEvents(datetime(2005, 2, 21, tzinfo=utc),
+            ...                         datetime(2005, 3, 1, tzinfo=utc)):
+            ...     print e.title, '(%s)' % e.color1
+            code (r)
+            rest (b)
+
+            >>> view.timezone.tzname(datetime.now())
+            'UTC'
+
+            >>> from schooltool.app.cal import CalendarEvent
+            >>> for i in range(0, 24):
+            ...     cal1.addEvent(CalendarEvent(datetime(2002, 2, 1, i),
+            ...                       timedelta(minutes=59), "day1-" + str(i)))
+            ...     cal1.addEvent(CalendarEvent(datetime(2002, 2, 2, i),
+            ...                       timedelta(minutes=59), "day2-" + str(i)))
+            ...     cal1.addEvent(CalendarEvent(datetime(2002, 2, 3, i),
+            ...                       timedelta(minutes=59), "day3-" + str(i)))
+
+        Let's get some events in the interval between two dates:
+
+            >>> titles = []
+            >>> for e in view.getEvents(datetime(2002, 2, 2, tzinfo=utc),
+            ...                         datetime(2002, 2, 3, tzinfo=utc)):
+            ...     titles.append(e.title)
+            >>> titles.sort()
+            >>> for title in  titles:
+            ...     print title
+            day2-0
+            day2-1
+            day2-10
+            day2-11
+            day2-12
+            day2-13
+            day2-14
+            day2-15
+            day2-16
+            day2-17
+            day2-18
+            day2-19
+            day2-2
+            day2-20
+            day2-21
+            day2-22
+            day2-23
+            day2-3
+            day2-4
+            day2-5
+            day2-6
+            day2-7
+            day2-8
+            day2-9
+
+        We're done:
+
+            >>> setup.placefulSetUp()
+
+        """
+
+    def test_getDays_cache(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        view = CalendarViewBase(None, TestRequest())
+        view._getDays = lambda *args: ['got some computed days']
+
+        start = date(2004, 8, 10)
+        end = date(2004, 8, 16)
+
+        assert view._days_cache is None
+        days = view.getDays(start, end)
+        self.assertEquals(days, ['got some computed days'])
+
+        class DaysCacheStub:
+            def getDays(self, start, end):
+                return ['got some cached days here']
+        view._days_cache = DaysCacheStub()
+
+        days = view.getDays(start, end)
+        self.assertEquals(days, ['got some cached days here'])
+
+    def test_getDays(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        from schooltool.app.cal import Calendar
+        app = sbsetup.setUpSchoolToolSite()
+        sbsetup.setUpTimetabling()
+
+        e0 = createEvent('2004-08-10 11:00', '1h', "e0")
+        e2 = createEvent('2004-08-11 11:00', '1h', "e2")
+        e3 = createEvent('2004-08-12 23:00', '4h', "e3")
+        e4 = createEvent('2004-08-15 11:00', '1h', "e4")
+        e5 = createEvent('2004-08-10 09:00', '3d', "e5")
+        e6 = createEvent('2004-08-13 00:00', '1d', "e6")
+        e7 = createEvent('2004-08-12 00:00', '1d+1sec', "e7")
+        e8 = createEvent('2004-08-15 00:00', '0sec', "e8")
+
+        cal = Calendar(Person())
+        for e in [e0, e2, e3, e4, e5, e6, e7, e8]:
+            cal.addEvent(e)
+
+        request = TestRequest()
+        view = CalendarViewBase(cal, request)
+
+        start = date(2004, 8, 10)
+        days = view._getDays(start, start)
+        self.assertEquals(len(days), 0)
+
+        start = date(2004, 8, 10)
+        end = date(2004, 8, 16)
+        days = view._getDays(start, end)
+
+        self.assertEquals(len(days), 6)
+        for i, day in enumerate(days):
+            self.assertEquals(day.date, date(2004, 8, 10 + i))
+
+        self.assertEqualEventLists(days[0].events, [e5, e0])            # 10
+        self.assertEqualEventLists(days[1].events, [e5, e2])            # 11
+        self.assertEqualEventLists(days[2].events, [e5, e7, e3])        # 12
+        self.assertEqualEventLists(days[3].events, [e5, e7, e3, e6])    # 13
+        self.assertEqualEventLists(days[4].events, [])                  # 14
+        self.assertEqualEventLists(days[5].events, [e8, e4])            # 15
+
+        start = date(2004, 8, 11)
+        end = date(2004, 8, 12)
+        days = view._getDays(start, end)
+        self.assertEquals(len(days), 1)
+        self.assertEquals(days[0].date, start)
+        self.assertEqualEventLists(days[0].events, [e5, e2])
+
+    def test_getDays_in_timezones(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        from schooltool.app.cal import Calendar
+        app = sbsetup.setUpSchoolToolSite()
+        sbsetup.setUpTimetabling()
+
+        e0 = createEvent('2004-08-10 22:00', '30m', "e0")
+        e1 = createEvent('2004-08-11 02:00', '1h', "e1")
+        e2 = createEvent('2004-08-11 12:00', '1h', "e2")
+        e3 = createEvent('2004-08-11 22:00', '1h', "e3")
+        e4 = createEvent('2004-08-12 02:00', '1h', "e4")
+
+        cal = Calendar(Person())
+        for e in [e0, e1, e2, e3, e4]:
+            cal.addEvent(e)
+
+        request = TestRequest()
+        view = CalendarViewBase(cal, request)
+
+        start = date(2004, 8, 11)
+        days = view._getDays(start, start)
+        self.assertEquals(len(days), 0)
+
+        start = date(2004, 8, 11)
+        end = date(2004, 8, 12)
+        days = view._getDays(start, end)
+
+        self.assertEquals(len(days), 1)
+        self.assertEquals(days[0].date, date(2004, 8, 11))
+
+        self.assertEqualEventLists(days[0].events, [e1, e2, e3])
+
+        view.timezone = timezone('US/Eastern')
+        days = view._getDays(start, end)
+
+        self.assertEquals(len(days), 1)
+        self.assertEquals(days[0].date, date(2004, 8, 11))
+
+        self.assertEqualEventLists(days[0].events, [e2, e3, e4])
+
+        view.timezone = timezone('Europe/Vilnius')
+        days = view._getDays(date(2004, 8, 11), date(2004, 8, 12))
+
+        self.assertEquals(len(days), 1)
+        self.assertEquals(days[0].date, date(2004, 8, 11))
+
+        self.assertEqualEventLists(days[0].events, [e0, e1, e2])
+
+        days = view._getDays(date(2004, 8, 12), date(2004, 8, 13))
+        self.assertEquals(len(days), 1)
+        self.assertEquals(days[0].date, date(2004, 8, 12))
+
+        self.assertEqualEventLists(days[0].events, [e3, e4])
+
+        view.timezone = timezone('US/Eastern')
+        start = date(2004, 8, 12)
+        end = date(2004, 8, 13)
+        days = view._getDays(start, end)
+
+        self.assertEquals(len(days), 1)
+        self.assertEquals(days[0].date, date(2004, 8, 12))
+
+        self.assertEqualEventLists(days[0].events, [])
+
+        view.timezone = timezone('Europe/Vilnius')
+        days = view._getDays(start, end)
+
+        self.assertEquals(len(days), 1)
+        self.assertEquals(days[0].date, date(2004, 8, 12))
+
+        self.assertEqualEventLists(days[0].events, [e3, e4])
+
+    def test_getDays_allday(self):
+        from schooltool.app.browser.cal import CalendarViewBase
+        from schooltool.app.cal import Calendar
+        app = sbsetup.setUpSchoolToolSite()
+        sbsetup.setUpTimetabling()
+
+        event = createEvent('2004-08-10', "1d", "e0", allday=True)
+
+        cal = Calendar(Person())
+        cal.addEvent(event)
+
+        request = TestRequest()
+        view = CalendarViewBase(cal, request)
+
+        days = view._getDays(date(2004, 8, 9), date(2004, 8, 10))
+        self.assertEquals(len(days[0].events), 0)
+
+        days = view._getDays(date(2004, 8, 10), date(2004, 8, 11))
+        self.assertEquals(len(days[0].events), 1)
+
+        days = view._getDays(date(2004, 8, 11), date(2004, 8, 12))
+        self.assertEquals(len(days[0].events), 0)
+
+        view.timezone = timezone('Europe/Vilnius')
+
+        days = view._getDays(date(2004, 8, 9), date(2004, 8, 10))
+        self.assertEquals(len(days[0].events), 0)
+
+        days = view._getDays(date(2004, 8, 10), date(2004, 8, 11))
+        self.assertEquals(len(days[0].events), 1)
+
+        days = view._getDays(date(2004, 8, 11), date(2004, 8, 12))
+        self.assertEquals(len(days[0].events), 0)
+
+    def test_getJumpToYears(self):
+        from schooltool.app.cal import Calendar
+        from schooltool.app.browser.cal import CalendarViewBase
+        cal = Calendar(Person())
+        directlyProvides(cal, IContainmentRoot)
+
+        first_year = datetime.today().year - 2
+        last_year = datetime.today().year + 2
+
+        view = CalendarViewBase(cal, TestRequest())
+
+        displayed_years = view.getJumpToYears()
+
+        self.assertEquals(displayed_years[0]['label'], first_year)
+        self.assertEquals(displayed_years[0]['href'],
+                          'http://127.0.0.1/calendar/%s' % first_year)
+        self.assertEquals(displayed_years[-1]['label'], last_year)
+        self.assertEquals(displayed_years[-1]['href'],
+                          'http://127.0.0.1/calendar/%s' % last_year)
+
+    def test_getJumpToMonths(self):
+        from schooltool.app.cal import Calendar
+        from schooltool.app.browser.cal import CalendarViewBase
+        cal = Calendar(Person())
+        directlyProvides(cal, IContainmentRoot)
+
+        view = CalendarViewBase(cal, TestRequest())
+        view.cursor = date(2005, 3, 1)
+
+        displayed_months = view.getJumpToMonths()
+
+        self.assertEquals(displayed_months[0]['href'],
+                          'http://127.0.0.1/calendar/2005-01')
+        self.assertEquals(displayed_months[-1]['href'],
+                          'http://127.0.0.1/calendar/2005-12')
+
+
+class CalendarEventAddTestView(CalendarEventAddView):
+    """Class for testing CalendarEventAddView.
+
+    We extend CalendarEventAddView so we could supply arguments normaly
+    provided in ZCML.
+    """
+
+    schema = ICalendarEventAddForm
+    _factory = CalendarEvent
+    _arguments = []
+    _keyword_arguments = ['title', 'start_date', 'start_time', 'duration',
+                          'recurrence', 'location', 'recurrence_type',
+                          'interval', 'range', 'until', 'count', 'exceptions',
+                          'allday']
+    _set_before_add = []
+    _set_after_add = []
+
+def doctest_CalendarEventView():
+    r"""Tests for CalendarEventView.
+
+    We'll create a simple event view.
+
+        >>> from schooltool.app.cal import CalendarEvent
+        >>> from schooltool.app.cal import Calendar
+        >>> from schooltool.app.browser.cal import CalendarEventView
+        >>> from schooltool.app.browser.cal import makeRecurrenceRule
+        >>> cal = Calendar(Person())
+        >>> event = CalendarEvent(datetime(2002, 2, 3, 12, 30),
+        ...                       timedelta(minutes=59), "Event")
+        >>> cal.addEvent(event)
+        >>> request = TestRequest()
+        >>> view = CalendarEventView(event, request)
+
+        >>> view.start
+        '12:30'
+        >>> view.end
+        '13:29'
+
+    Our view has a display attribute with an EventForDisplay object of this
+    event.
+
+        >>> type(view.display)
+        <class 'schooltool.app.browser.cal.EventForDisplay'>
+
+    The display's dtstarttz and dtendtz should be datetime representations of
+    view.start and view.end.
+
+        >>> view.display.dtstarttz.time()
+        datetime.time(12, 30)
+        >>> view.display.dtendtz.time()
+        datetime.time(13, 29)
+
+    The display knows about booked resources, currently there are none.
+
+        >>> view.display.getBookedResources()
+        ()
+
+        >>> from schooltool.resource.resource import Resource
+        >>> resource = Resource("r1")
+        >>> event.bookResource(resource)
+        >>> [r.title for r in view.display.getBookedResources()]
+        ['r1']
+
+    The view has a day attribute the provides the date and day of week:
+
+        >>> view.day
+        u'Sunday, 2002-02-03'
+
+        >>> event2 = CalendarEvent(datetime(2004, 2, 3, 12, 30),
+        ...                       timedelta(minutes=59), "Event")
+        >>> cal.addEvent(event2)
+        >>> request = TestRequest()
+        >>> view = CalendarEventView(event2, request)
+        >>> view.day
+        u'Tuesday, 2004-02-03'
+
+    """
+
+
+def doctest_CalendarEventAddView_add_allday():
+    r"""Adding an allday event with a duration.
+
+    When creating an allday event we were not using the duration
+    field, now that should be fixed:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'NonHacking',
+        ...           'field.start_date': '2005-02-27',
+        ...           'field.allday': 'on',
+        ...           'field.duration': '15',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+
+        >>> event = list(calendar)[0]
+        >>> event.allday
+        True
+        >>> event.duration.days
+        15
+
+    And even if the user will manage to set some other duration units
+    (not days), that input will be ignored:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2005-02-27',
+        ...           'field.allday': 'on',
+        ...           'field.duration': '13',
+        ...           'field.duration_type': 'minutes',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> event = list(calendar)[0]
+        >>> event.allday
+        True
+        >>> event.duration.days
+        13
+
+    """
+
+
+def doctest_CalendarEventAddView_add_mark_for_booking():
+    r"""Tests for CalendarEventAddView.add.
+
+        >>> class CalendarStub(object):
+        ...     def addEvent(self, e):
+        ...         pass
+        >>> request = TestRequest()
+        >>> view = CalendarEventAddTestView(CalendarStub(), request)
+
+    Let's add an event:
+
+        >>> evt = view.add(EventStub('uid1'))
+
+    Its id should have landed in the session:
+
+        >>> session_data = ISession(request)['schooltool.calendar']
+        >>> sorted(session_data['added_event_uids'])
+        ['uid1']
+
+    Let's try another one:
+
+        >>> evt2 = view.add(EventStub('uid2'))
+        >>> sorted(session_data['added_event_uids'])
+        ['uid1', 'uid2']
+
+    """
+
+
+def doctest_CalendarEventAddView_add():
+    r"""Tests for CalendarEventAddView adding of new event.
+
+    First, let's simply render the CalendarEventAddTestView.
+
+        >>> view = CalendarEventAddTestView(Calendar(Person()), TestRequest())
+        >>> view.update()
+
+    Let's try to add an event:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> len(calendar)
+        1
+        >>> event = list(calendar)[0]
+        >>> event.title
+        u'Hacking'
+        >>> event.dtstart.date()
+        datetime.date(2004, 8, 13)
+        >>> event.dtstart.time()
+        datetime.time(15, 30)
+        >>> event.duration
+        datetime.timedelta(0, 3000)
+        >>> event.location is None
+        True
+
+    We should have been redirected to the calendar view:
+
+        >>> view.request.response.getStatus()
+        302
+        >>> view.request.response.getHeader('Location')
+        'http://127.0.0.1/calendar'
+
+    We can cowardly run away if we decide so, i.e., cancel our request.
+    In that case we are redirected to today's calendar.
+
+        >>> request = TestRequest(form={'CANCEL': 'Cancel'})
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+        >>> view.request.response.getStatus()
+        302
+        >>> location = view.request.response.getHeader('Location')
+        >>> expected = 'http://127.0.0.1/calendar'
+        >>> (location == expected) or location
+        True
+
+    Let's try to add an event with an optional location field:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'field.location': 'Moon',
+        ...           'field.weekdays-empty-marker': '1',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> len(calendar)
+        1
+        >>> event = list(calendar)[0]
+        >>> event.location
+        u'Moon'
+
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '50',
+        ...           'field.recurrence_type': 'daily',})
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.title_widget.getInputValue()
+        u'Hacking'
+        >>> view.location_widget.getInputValue()
+        u'Kitchen'
+        >>> view.start_date_widget.getInputValue()
+        datetime.date(2004, 8, 13)
+        >>> view.start_time_widget.getInputValue()
+        u'15:30'
+        >>> view.duration_widget.getInputValue()
+        50
+
+   Lets change our timezone to US/Eastern.
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'East Coast',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'field.location': 'East Coast',
+        ...           'field.weekdays-empty-marker': '1',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> eastern = timezone('US/Eastern')
+        >>> view.timezone = eastern
+        >>> view.update()
+        ''
+
+   We handle this by taking the date and time the user enters,
+
+        >>> request.form['field.start_date']
+        '2004-08-13'
+        >>> request.form['field.start_time']
+        '15:30'
+
+   We use parse_time to create a naive time object.
+
+        >>> from schooltool.calendar.utils import parse_time
+        >>> st = parse_time(request.form['field.start_time'])
+        >>> sdt = datetime.combine(date(2004, 2, 13), st)
+        >>> sdt = eastern.localize(sdt)
+        >>> sdt.tzname()
+        'EST'
+        >>> sdt.time()
+        datetime.time(15, 30)
+
+    then we replace the start time with the same time in UTC, and create the
+    event with the UTC version of the start time.
+
+        >>> sdt = sdt.astimezone(utc)
+        >>> sdt.tzname()
+        'UTC'
+
+    EST is -05:00 so our time stored is 5 hours greater.
+
+        >>> sdt.time()
+        datetime.time(20, 30)
+
+    If we set the event during DST, the offset is -04:00
+
+        >>> sdt = datetime.combine(date(2004, 5, 31), st)
+        >>> sdt = eastern.localize(sdt)
+        >>> sdt.tzname()
+        'EDT'
+        >>> sdt.time()
+        datetime.time(15, 30)
+
+        >>> sdt = sdt.astimezone(utc)
+        >>> sdt.tzname()
+        'UTC'
+
+        >>> sdt.time()
+        datetime.time(19, 30)
+
+    """
+
+
+def doctest_CalendarEventAddView_add_validation():
+    r"""Tests for CalendarEventAddView form validation.
+
+    Let's try to add an event without a required field:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+
+        >>> print view.errors
+        MissingInputError: ('field.start_time', u'Time', None)
+        >>> print view.error
+        None
+        >>> len(calendar)
+        0
+
+        >>> request = TestRequest(
+        ...     form={'field.title': '',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '50',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.errors
+        WidgetInputError: ('title', u'Title', )
+        >>> view.error is None
+        True
+
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-31-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '50',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.errors                                # doctest: +ELLIPSIS
+        ConversionError: (u'Invalid datetime data', <...>)
+        >>> view.error is None
+        True
+
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '100h',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.errors                                # doctest: +ELLIPSIS
+        ConversionError: (u'Invalid integer data', <...>)
+        >>> view.error is None
+        True
+
+        >>> request = TestRequest(
+        ...     form={'field.title': '',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '1530',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '60',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.errors
+        WidgetInputError: ('title', u'Title', )
+        ConversionError: (u'Invalid time', None)
+        >>> view.error is None
+        True
+
+        >>> request = TestRequest(
+        ...     form={'field.title': '',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '1530',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '60',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE': 'update'})
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.errors
+        WidgetInputError: ('title', u'Title', )
+        ConversionError: (u'Invalid time', None)
+        >>> view.error is None
+        True
+
+    """
+
+
+def doctest_CalendarEventAddView_add_recurrence():
+    r"""Tests for CalendarEventAddView adding of recurring event.
+
+    Let's try to add a recurring event:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.location': 'Moon',
+        ...           'field.recurrence': 'on',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'field.interval': '1',
+        ...           'field.range': 'forever',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> len(calendar)
+        1
+        >>> event = list(calendar)[0]
+        >>> event.recurrence
+        DailyRecurrenceRule(1, None, None, ())
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> len(calendar)
+        1
+        >>> event = list(calendar)[0]
+        >>> event.title
+        u'Hacking'
+        >>> event.location
+        u'Kitchen'
+        >>> event.dtstart.date()
+        datetime.date(2004, 8, 13)
+        >>> event.dtstart.time()
+        datetime.time(15, 30)
+        >>> event.dtstart.tzname()
+        'UTC'
+        >>> event.duration
+        datetime.timedelta(0, 3000)
+
+        >>> event.recurrence is None
+        True
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '50',
+        ...           'field.recurrence': 'on',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'field.interval': '2',
+        ...           'field.range': 'forever',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> len(calendar)
+        1
+        >>> event = list(calendar)[0]
+        >>> event.title
+        u'Hacking'
+        >>> event.location
+        u'Kitchen'
+        >>> event.dtstart.date()
+        datetime.date(2004, 8, 13)
+        >>> event.dtstart.time()
+        datetime.time(15, 30)
+        >>> event.dtstart.tzname()
+        'UTC'
+        >>> event.duration
+        datetime.timedelta(0, 3000)
+        >>> event.recurrence
+        DailyRecurrenceRule(2, None, None, ())
+
+    """
+
+
+def doctest_CalendarEventAddView_recurrence_exceptions():
+    r"""Tests for CalendarEventAddView adding of new event.
+
+    Lets add a simple even with some exceptions:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '50',
+        ...           'field.recurrence': 'on',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'field.interval': '1',
+        ...           'field.range': 'forever',
+        ...           'field.exceptions': '2004-08-14\n2004-08-19\n2004-08-20',
+        ...           'UPDATE_SUBMIT': 'Add'})
+
+
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> len(calendar)
+        1
+        >>> event = list(calendar)[0]
+        >>> event.recurrence
+        DailyRecurrenceRule(1, None, None, (datetime.date(2004, 8, 14), datetime.date(2004, 8, 19), datetime.date(2004, 8, 20)))
+
+    We should skip additional newlines when parsing the input:
+
+        >>> request.form['field.exceptions'] = '2004-08-14\n\n2004-08-19\n\n\n2004-08-20'
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        ''
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> len(calendar)
+        1
+        >>> event = list(calendar)[0]
+        >>> event.recurrence
+        DailyRecurrenceRule(1, None, None, (datetime.date(2004, 8, 14), datetime.date(2004, 8, 19), datetime.date(2004, 8, 20)))
+
+    If the any of the lines contains an invalid date - ConversionError
+    is signaled:
+
+        >>> request.form['field.exceptions'] = '2004-08-14\n2004'
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+
+        >>> view.errors
+        ConversionError: (u'Invalid date.  Please specify YYYY-MM-DD, one per line.', None)
+        >>> len(calendar)
+        0
+
+    """
+
+
+def doctest_CalendarEventAddView_getMonthDay():
+    r"""Tests for CalendarEventAddView.getMonthDay().
+
+        >>> calendar = Calendar(Person())
+        >>> request = TestRequest()
+        >>> request.form['field.start_date'] = u''
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.getMonthDay()
+        '??'
+        >>> request.form['field.start_date'] = u'2005-02-21'
+        >>> view.getMonthDay()
+        '21'
+        >>> request.form['field.start_date'] = u''
+        >>> view.getMonthDay()
+        '??'
+
+    """
+
+
+def doctest_CalendarEventAddView_weekdayChecked():
+    r"""Tests for CalendarEventAddView.weekdayChecked().
+
+        >>> calendar = Calendar(Person())
+        >>> request = TestRequest()
+        >>> request.form['field.start_date'] = u''
+        >>> view = CalendarEventAddTestView(calendar, request)
+
+    When the form is empty, no days are checked.
+
+        >>> [day for day in range(7) if view.weekdayChecked(str(day))]
+        []
+
+        >>> request.form['field.start_date'] = u''
+        >>> [day for day in range(7) if view.weekdayChecked(str(day))]
+        []
+
+    February 21, 2005 is a Monday.
+
+        >>> request.form['field.start_date'] = u'2005-02-21'
+        >>> [day for day in range(7) if view.weekdayChecked(str(day))]
+        [0]
+
+    Also checked are those weekdays that appear in the form
+
+        >>> request.form['field.weekdays'] = [u'5', u'6']
+        >>> [day for day in range(7) if view.weekdayChecked(str(day))]
+        [0, 5, 6]
+
+    """
+
+
+def doctest_CalendarEventAddView_weekdayDisabled():
+    r"""Tests for CalendarEventAddView.weekdayDisabled().
+
+        >>> calendar = Calendar(Person())
+        >>> request = TestRequest()
+        >>> request.form['field.start_date'] = u''
+        >>> view = CalendarEventAddTestView(calendar, request)
+
+    When the form is empty, no days are disabled.
+
+        >>> [day for day in range(7) if view.weekdayDisabled(str(day))]
+        []
+
+        >>> request.form['field.start_date'] = u''
+        >>> [day for day in range(7) if view.weekdayDisabled(str(day))]
+        []
+
+    February 21, 2005 is a Monday.
+
+        >>> request.form['field.start_date'] = u'2005-02-21'
+        >>> [day for day in range(7) if view.weekdayDisabled(str(day))]
+        [0]
+
+    Other weekdays are always enabled.
+
+        >>> request.form['field.weekdays'] = [u'5', u'6']
+        >>> [day for day in range(7) if view.weekdayDisabled(str(day))]
+        [0]
+
+    """
+
+
+def doctest_CalendarEventAddView_getWeekDay():
+    r"""Tests for CalendarEventAddView.getWeekDay().
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-10-01',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '50',
+        ...           'field.recurrence': 'on',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'field.interval': '2',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> calendar = Calendar(Person())
+        >>> view = CalendarEventAddTestView(calendar, request)
+
+        >>> request.form['field.start_date'] = "2004-10-01"
+        >>> view.getWeekDay()
+        u'1st Friday'
+
+        >>> request.form['field.start_date'] = "2004-10-13"
+        >>> view.getWeekDay()
+        u'2nd Wednesday'
+
+        >>> request.form['field.start_date'] = "2004-10-16"
+        >>> view.getWeekDay()
+        u'3rd Saturday'
+
+        >>> request.form['field.start_date'] = "2004-10-26"
+        >>> view.getWeekDay()
+        u'4th Tuesday'
+
+        >>> request.form['field.start_date'] = "2004-10-28"
+        >>> view.getWeekDay()
+        u'4th Thursday'
+
+        >>> request.form['field.start_date'] = "2004-10-29"
+        >>> view.getWeekDay()
+        u'5th Friday'
+
+        >>> request.form['field.start_date'] = "2004-10-31"
+        >>> view.getWeekDay()
+        u'5th Sunday'
+
+        >>> request.form['field.start_date'] = ""
+        >>> view.getWeekDay()
+        u'same weekday'
+
+        >>> del request.form['field.start_date']
+        >>> view.getWeekDay()
+        u'same weekday'
+
+    """
+
+
+def doctest_CalendarEventAddView_getLastWeekDay():
+    r"""Tests for CalendarEventAddView.getLastWeekDay().
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-10-01',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '50',
+        ...           'field.recurrence': 'on',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'field.interval': '2',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> calendar = Calendar(Person())
+
+        >>> request.form['field.start_date'] = ""
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> translate(view.getLastWeekDay())
+        u'last weekday'
+
+        >>> request.form['field.start_date'] = "2004-10-24"
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.getLastWeekDay() is None
+        True
+
+        >>> request.form['field.start_date'] = "2004-10-25"
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> translate(view.getLastWeekDay())
+        u'Last Monday'
+
+        >>> request.form['field.start_date'] = "2004-10-31"
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> translate(view.getLastWeekDay())
+        u'Last Sunday'
+
+    """
+
+
+def doctest_CalendarEventAddView_cross_validation():
+    r"""Tests for CalendarEventAddView cross validation.
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Foo',
+        ...     'field.start_date': '2003-12-01',
+        ...     'field.start_time': '15:30',
+        ...     'field.location': 'Kitchen',
+        ...     'field.duration': '59',
+        ...     'field.recurrence': 'on',
+        ...     'field.recurrence_type': 'daily',
+        ...     'field.interval': '',
+        ...     'field.range': 'count',
+        ...     'field.count': '6',
+        ...     'field.until': '2004-01-01',
+        ...     'UPDATE_SUBMIT': 'Add'})
+        >>> calendar = Calendar(Person())
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.errors
+        WidgetInputError: ('interval', u'Repeat every', )
+        >>> view.error is None
+        True
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Foo',
+        ...           'field.start_date': '2003-12-01',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '59',
+        ...           'field.recurrence': 'on',
+        ...           'field.recurrence_type' : 'daily',
+        ...           'field.interval': '1',
+        ...           'field.range': 'until',
+        ...           'field.until': '2002-01-01',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> calendar = Calendar(Person())
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.errors
+        WidgetInputError: ('until', u'Repeat until', End date is earlier than start date)
+        >>> view.error is None
+        True
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'Hacking',
+        ...           'field.start_date': '2004-08-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.location': 'Kitchen',
+        ...           'field.duration': '100',
+        ...           'field.recurrence': 'on',
+        ...           'field.recurrence_type' : 'daily',
+        ...           'field.range': 'until',
+        ...           'field.count': '23',
+        ...           'UPDATE_SUBMIT': 'Add'})
+        >>> calendar = Calendar(Person())
+        >>> view = CalendarEventAddTestView(calendar, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.errors
+        MissingInputError: ('field.interval', u'Repeat every', None)
+        MissingInputError: ('field.until', u'Repeat until', None)
+        >>> view.error is None
+        True
+
+    """
+
+
+class CalendarEventEditTestView(CalendarEventEditView):
+    """Class for testing CalendarEventEditView.
+
+    We extend CalendarEventEditView so we could supply arguments normaly
+    provided in ZCML.
+    """
+
+    schema = ICalendarEventEditForm
+    _factory = CalendarEvent
+    _arguments = []
+    _keyword_arguments = ['title', 'start_date', 'start_time', 'duration',
+                          'recurrence', 'location', 'recurrence_type',
+                          'interval', 'range', 'until', 'count', 'exceptions',
+                          'allday']
+    _set_before_add = []
+    _set_after_add = []
+
+
+def doctest_CalendarEventEditView_edit():
+    r"""Tests for CalendarEventEditView editing of an event.
+
+    Let's create an event:
+
+        >>> import datetime
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=60))
+
+    Let's try to edit the event:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'NonHacking',
+        ...           'field.start_date': '2004-09-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Edit'})
+
+        >>> directlyProvides(event, IContainmentRoot)
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.update()
+        u'Updated on ${date_time}'
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+
+        >>> event.title
+        u'NonHacking'
+        >>> event.dtstart.date()
+        datetime.date(2004, 9, 13)
+        >>> event.dtstart.time()
+        datetime.time(15, 30)
+        >>> event.dtstart.tzname()
+        'UTC'
+        >>> event.duration
+        datetime.timedelta(0, 3000)
+        >>> event.location is None
+        True
+
+     Now a recurring event:
+
+        >>> from schooltool.app.browser.cal import makeRecurrenceRule
+        >>> rule = makeRecurrenceRule(recurrence_type='yearly', interval=2,
+        ...                           range='until', until='2004-01-02')
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=60),
+        ...                       recurrence=rule)
+        >>> request = TestRequest(
+        ...     form={'field.title': 'NonHacking',
+        ...           'field.start_date': '2004-09-19',
+        ...           'field.start_time': '15:35',
+        ...           'field.duration': '50',
+        ...           'field.location': 'Kitchen',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Edit'})
+
+        >>> directlyProvides(event, IContainmentRoot)
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.update()
+        u'Updated on ${date_time}'
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+
+        >>> event.title
+        u'NonHacking'
+        >>> event.dtstart.date()
+        datetime.date(2004, 9, 19)
+        >>> event.dtstart.time()
+        datetime.time(15, 35)
+        >>> event.dtstart.tzname()
+        'UTC'
+        >>> event.duration
+        datetime.timedelta(0, 3000)
+        >>> event.location
+        u'Kitchen'
+
+    We have succesfully removed the recurrence:
+
+        >>> event.recurrence is None
+        True
+
+    Now lets add a new recurrence to the existing event:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'NonHacking',
+        ...           'field.start_date': '2004-09-19',
+        ...           'field.start_time': '15:35',
+        ...           'field.duration': '50',
+        ...           'field.location': 'Kitchen',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence': 'on',
+        ...           'field.recurrence_type' : 'daily',
+        ...           'field.range': 'count',
+        ...           'field.count': '23',
+        ...           'field.interval': '2',
+        ...           'UPDATE_SUBMIT': 'Edit'})
+
+        >>> directlyProvides(event, IContainmentRoot)
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.update()
+        u'Updated on ${date_time}'
+
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+
+        >>> event.title
+        u'NonHacking'
+        >>> event.dtstart.date()
+        datetime.date(2004, 9, 19)
+        >>> event.dtstart.time()
+        datetime.time(15, 35)
+        >>> event.dtstart.tzname()
+        'UTC'
+        >>> event.duration
+        datetime.timedelta(0, 3000)
+        >>> event.location
+        u'Kitchen'
+        >>> event.recurrence
+        DailyRecurrenceRule(2, 23, None, ())
+
+   """
+
+def doctest_CalendarEventEditView_nextURL():
+    r"""Tests nextURL of CalendarEventEditView.
+
+    Let's create an event:
+
+        >>> import datetime
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=60))
+        >>> calendar.addEvent(event)
+
+    Let's try to edit the event:
+
+        >>> request = TestRequest(
+        ...     form={'date': '2004-08-13',
+        ...           'field.title': 'NonHacking',
+        ...           'field.start_date': '2004-09-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Edit'})
+
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.update()
+        u'Updated on ${date_time}'
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1/calendar'
+
+    Let's try to cancel the editing event:
+
+        >>> request = TestRequest(
+        ...     form={'date': '2004-08-13',
+        ...           'field.title': 'NonHacking',
+        ...           'field.start_date': '2004-09-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'CANCEL': 'Cancel'})
+
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.update()
+        ''
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1/calendar'
+
+    If the date stays unchanged - we should be redirected to the date
+    that was set in the request:
+
+        >>> request = TestRequest(
+        ...     form={'date': '2004-08-13',
+        ...           'field.title': 'NonHacking',
+        ...           'field.start_date': '2004-09-13',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE_SUBMIT': 'Edit'})
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.update()
+        u'Updated on ${date_time}'
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1/calendar'
+
+    """
+
+def doctest_CalendarEventEditView_updateForm():
+    r"""Tests for CalendarEventEditView updateForm.
+
+    Let's create an event:
+
+        >>> import datetime
+        >>> event = CalendarEvent(title=u"Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=60))
+
+    Let's try to update the form after changing some values:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'NonHacking',
+        ...           'field.start_date': '2005-02-27',
+        ...           'field.start_time': '15:30',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE': 'Update'})
+
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.update()
+        ''
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+
+    Original event should stay unmodified:
+
+        >>> event.title
+        u'Hacking'
+        >>> event.dtstart.date()
+        datetime.date(2004, 8, 13)
+        >>> event.dtstart.time()
+        datetime.time(20, 0)
+        >>> event.dtstart.tzname()
+        'UTC'
+        >>> event.duration
+        datetime.timedelta(0, 3600)
+        >>> event.location is None
+        True
+
+    Yet the view should use the new start_date:
+
+    2005-02-27 is a Sunday:
+
+        >>> [day for day in range(7) if view.weekdayDisabled(str(day))]
+        [6]
+
+    If we submit an invalid form - errors should be generated:
+
+        >>> request = TestRequest(
+        ...     form={'field.title': 'NonHacking',
+        ...           'field.start_date': '',
+        ...           'field.start_time': '',
+        ...           'field.duration': '50',
+        ...           'field.recurrence.used': '',
+        ...           'field.recurrence_type': 'daily',
+        ...           'UPDATE': 'Update'})
+
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.update()
+        u'An error occurred.'
+        >>> print view.errors
+        WidgetInputError: ('start_date', u'Date', )
+        WidgetInputError: ('start_time', u'Time', )
+        >>> print view.error
+        None
+
+    """
+
+def doctest_CalendarEventEditView_getInitialData():
+    r"""Tests for CalendarEventEditView editing of new event.
+
+    Let's create an event:
+
+        >>> import datetime
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=61),
+        ...                       location="Kitchen")
+
+    And a view for the event:
+
+        >>> request = TestRequest()
+        >>> view = CalendarEventEditTestView(event, request)
+
+    Let's check whether the default values are set properly:
+
+        >>> view.title_widget._getFormValue()
+        'Hacking'
+
+        >>> view.start_date_widget._getFormValue()
+        datetime.date(2004, 8, 13)
+
+        >>> view.start_time_widget._getFormValue()
+        '20:00'
+
+        >>> view.duration_widget._getFormValue()
+        61
+
+        >>> view.location_widget._getFormValue()
+        'Kitchen'
+
+        >>> view.recurrence_widget._getFormValue()
+        ''
+
+    Regression test for events with duration longer than 24 hours:
+
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(days=2),
+        ...                       location="Kitchen")
+
+        >>> view = CalendarEventEditTestView(event, request)
+        >>> view.duration_widget._getFormValue()
+        2
+
+        >>> view.duration_type_widget._getFormValue()
+        'days'
+
+    As users don't really measure all the times in minutes it would be
+    kind of nice to show units in hours if minutes divide up by 60:
+
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(hours=2),
+        ...                       location="Kitchen")
+
+        >>> view = CalendarEventEditTestView(event, request)
+
+        >>> view.duration_widget._getFormValue()
+        2
+
+        >>> view.duration_type_widget._getFormValue()
+        'hours'
+
+    Let's create a recurrent event:
+
+        >>> from schooltool.app.browser.cal import makeRecurrenceRule
+        >>> rule = makeRecurrenceRule(recurrence_type='yearly', interval=2,
+        ...                           range='until', until='2004-01-02')
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=61),
+        ...                       location="Kitchen", recurrence=rule)
+
+    And a view for the event:
+
+        >>> request = TestRequest()
+        >>> view = CalendarEventEditTestView(event, request)
+
+    Let's check whether the default values are set properly:
+
+        >>> view.recurrence_widget._getFormValue()
+        'on'
+
+        >>> view.interval_widget._getFormValue()
+        2
+
+        >>> view.recurrence_type_widget._getFormValue()
+        'yearly'
+
+        >>> view.range_widget._getFormValue()
+        'until'
+
+        >>> view.until_widget._getFormValue()
+        '2004-01-02'
+
+    Let's create a weekly recurrent event with exceptions:
+
+        >>> from schooltool.app.browser.cal import makeRecurrenceRule
+        >>> exceptions = (date(2004, 8, 14), date(2004, 8, 15))
+        >>> rule = makeRecurrenceRule(recurrence_type='weekly', interval=1,
+        ...                           weekdays=[1, 2, 3, 4, 5, 6],
+        ...                           exceptions=exceptions,
+        ...                           range="count",
+        ...                           count=20)
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=61),
+        ...                       location="Kitchen", recurrence=rule)
+
+    And a view for the event:
+
+        >>> request = TestRequest()
+        >>> view = CalendarEventEditTestView(event, request)
+
+    Let's check whether the default values are set properly:
+
+        >>> view.recurrence_widget._getFormValue()
+        'on'
+
+        >>> view.interval_widget._getFormValue()
+        1
+
+        >>> view.recurrence_type_widget._getFormValue()
+        'weekly'
+
+        >>> view.range_widget._getFormValue()
+        'count'
+
+        >>> view.count_widget._getFormValue()
+        20
+
+        >>> view.exceptions_widget._getFormValue()
+        '2004-08-14\r\n2004-08-15'
+
+    The days should have shifted to a later date:
+
+        >>> view.weekdays_widget._getFormValue()
+        [1, 2, 3, 4, 5, 6]
+
+
+    Let's create another recurrent event:
+
+        >>> from schooltool.app.browser.cal import makeRecurrenceRule
+        >>> rule = makeRecurrenceRule(recurrence_type='daily', interval=2,
+        ...                           range="count",
+        ...                           count=5)
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=61),
+        ...                       location="Kitchen", recurrence=rule)
+
+    And a view for the event:
+
+        >>> request = TestRequest()
+        >>> view = CalendarEventEditTestView(event, request)
+
+
+    The count should be set:
+
+        >>> view.count_widget._getFormValue()
+        5
+
+    As well as the range:
+
+        >>> view.range_widget._getFormValue()
+        'count'
+
+    Now one more event:
+
+        >>> rule = makeRecurrenceRule(recurrence_type='monthly', interval=2,
+        ...                           range="count", count=5, monthly="weekday")
+
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=61),
+        ...                       location="Kitchen", recurrence=rule)
+
+    And a view for the event:
+
+        >>> request = TestRequest()
+        >>> view = CalendarEventEditTestView(event, request)
+
+    """
+
+
+def doctest_CalendarEventEditView_getStartDate():
+    """Tests for CalendarEventEditView getStartDate().
+
+    Let's create an event:
+
+        >>> import datetime
+        >>> event = CalendarEvent(title="Hacking",
+        ...                       dtstart=datetime.datetime(2004, 8, 13, 20, 0),
+        ...                       duration=datetime.timedelta(minutes=61),
+        ...                       location="Kitchen")
+
+    And a view for the event:
+
+        >>> request = TestRequest()
+        >>> view = CalendarEventEditTestView(event, request)
+
+    If the date is not passed in the request we should get the date of the event:
+
+        >>> view.getStartDate()
+        datetime.date(2004, 8, 13)
+
+    If the timezone of the view shifts the event into the different
+    day, the date changes:
+
+        >>> view.timezone = timezone('Australia/Canberra')
+        >>> view.getStartDate()
+        datetime.date(2004, 8, 14)
+
+    If the date is passed in request but has no sane value we should get None:
+
+        >>> request.form = {'field.start_date': "200"}
+        >>> view = CalendarEventEditTestView(event, request)
+        >>> view.getStartDate() is None
+        True
+
+    If the field in the form is left blang we should return None too:
+
+        >>> request.form = {'field.start_date': ""}
+        >>> view = CalendarEventEditTestView(event, request)
+        >>> view.getStartDate() is None
+        True
+
+    """
+
+class TestGetRecurrenceRule(unittest.TestCase):
+
+    def test_getRecurrenceRule(self):
+        from schooltool.calendar.recurrent import DailyRecurrenceRule
+        from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+        from schooltool.calendar.recurrent import MonthlyRecurrenceRule
+        from schooltool.calendar.recurrent import YearlyRecurrenceRule
+        from schooltool.app.browser.cal import makeRecurrenceRule
+
+        # Rule is not returned when the checkbox is unchecked
+
+        rule = makeRecurrenceRule(recurrence_type='daily', interval=1)
+        self.assertEquals(rule, DailyRecurrenceRule(interval=1))
+
+        rule = makeRecurrenceRule(recurrence_type='daily', interval=2)
+        self.assertEquals(rule, DailyRecurrenceRule(interval=2))
+
+        rule = makeRecurrenceRule(recurrence_type='weekly', interval=3)
+        self.assertEquals(rule, WeeklyRecurrenceRule(interval=3))
+
+        rule = makeRecurrenceRule(recurrence_type='monthly', interval=1)
+        self.assertEquals(rule, MonthlyRecurrenceRule(interval=1))
+
+        rule = makeRecurrenceRule(recurrence_type='yearly')
+        self.assertEquals(rule, YearlyRecurrenceRule(interval=1))
+
+        rule = makeRecurrenceRule(recurrence_type='yearly', interval=1,
+                                  until=date(2004, 01, 02), count=3,
+                                  range="until")
+        self.assertEquals(rule, YearlyRecurrenceRule(interval=1,
+                                                     until=date(2004, 1, 2)))
+
+        rule = makeRecurrenceRule(recurrence_type='yearly',
+                                  interval=1, until='2004-01-02',
+                                  count=3, range="count")
+        self.assertEquals(rule, YearlyRecurrenceRule(interval=1, count=3),
+                          rule.__dict__)
+
+        rule = makeRecurrenceRule(recurrence_type='yearly', interval=1,
+                                  until='2004-01-02', count=3, range="forever")
+        self.assertEquals(rule, YearlyRecurrenceRule(interval=1))
+
+        rule = makeRecurrenceRule(recurrence_type='yearly', interval=1,
+                                  until='2004-01-02', count=3)
+        self.assertEquals(rule, YearlyRecurrenceRule(interval=1))
+
+        dates = (date(2004, 1, 1), date(2004, 1, 2))
+        rule = makeRecurrenceRule(recurrence_type='daily', interval=1,
+                                  exceptions=dates)
+        self.assertEquals(rule, DailyRecurrenceRule(interval=1,
+                                                    exceptions=dates))
+
+        rule = makeRecurrenceRule(recurrence_type='weekly', interval=1,
+                                  weekdays=(2,))
+        self.assertEquals(rule, WeeklyRecurrenceRule(interval=1,
+                                                     weekdays=(2, )))
+
+        rule = makeRecurrenceRule(recurrence_type='weekly', interval=1,
+                        weekdays=[1, 2])
+        self.assertEquals(rule, WeeklyRecurrenceRule(interval=1,
+                                                     weekdays=(1, 2)))
+
+        rule = makeRecurrenceRule(recurrence_type='monthly', interval=1,
+                                  monthly="monthday")
+        self.assertEquals(rule, MonthlyRecurrenceRule(interval=1,
+                                                      monthly="monthday"))
+
+        rule = makeRecurrenceRule(recurrence_type='monthly', interval=1,
+                                  monthly="weekday")
+        self.assertEquals(rule, MonthlyRecurrenceRule(interval=1,
+                                                      monthly="weekday"))
+
+        rule = makeRecurrenceRule(recurrence_type='monthly', interval=1,
+                                  monthly="lastweekday")
+        self.assertEquals(rule, MonthlyRecurrenceRule(interval=1,
+                                                      monthly="lastweekday"))
+
+
+def doctest_convertWeekdaysList():
+    """A test for convertWeekdaysList
+
+       >>> from schooltool.app.browser.cal import convertWeekdaysList
+
+    When it's 1:00 AM in Vilnius, it's still yesterday in London:
+
+       >>> vilnius = timezone('Europe/Vilnius')
+       >>> london = timezone('Europe/London')
+       >>> dt = vilnius.localize(datetime(2006, 5, 5, 1, 0))
+       >>> convertWeekdaysList(dt, vilnius, london, (0, ))
+       [6]
+       >>> convertWeekdaysList(dt, vilnius, london, (5, 6))
+       [4, 5]
+
+    And vice versa:
+
+       >>> convertWeekdaysList(dt, london, vilnius, (0, ))
+       [1]
+       >>> convertWeekdaysList(dt, london, vilnius, (5, 6))
+       [6, 0]
+
+    Let's look at the time that is the same day in Vilnius and London:
+
+       >>> dt = vilnius.localize(datetime(2006, 5, 5, 23, 0))
+       >>> convertWeekdaysList(dt, london, vilnius, (0, ))
+       [0]
+       >>> convertWeekdaysList(dt, london, vilnius, (5, 6))
+       [5, 6]
+
+    """
+
+def doctest_TestCalendarEventBookingView():
+    r"""A test for the resource booking view.
+
+    We must have a schooltool application with some resources, a
+    person and his calendar with an event:
+
+        >>> from schooltool.app.browser.cal import CalendarEventBookingView
+        >>> from schooltool.resource.resource import Resource
+        >>> from schooltool.app.cal import CalendarEvent
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+        >>> from zope.security.checker import defineChecker, Checker
+        >>> defineChecker(Calendar,
+        ...               Checker({'addEvent': 'zope.Public'},
+        ...                       {'addEvent': 'zope.Public'}))
+
+
+        >>> person = Person(u'ignas')
+        >>> app['persons']['ignas'] = person
+
+        >>> for i in range(10):
+        ...     app['resources']['res' + str(i)] = Resource('res' + str(i))
+
+        >>> event = CalendarEvent(datetime(2002, 2, 2, 2, 2),
+        ...                       timedelta(hours=2), "Some event",
+        ...                       unique_id="ev1")
+        >>> ISchoolToolCalendar(person).addEvent(event)
+
+    Now let's create a view for the event:
+
+        >>> request = TestRequest()
+        >>> view = CalendarEventBookingView(event, request)
+        >>> class StubResourceContainer(object):
+        ...     def filter(self, list):
+        ...         return list
+        ...     def values(self):
+        ...         return []
+        >>> def stubItemsContainer():
+        ...     return StubResourceContainer()
+        >>> view.getAvailableItemsContainer = stubItemsContainer
+        >>> view.filter = lambda list: list
+        >>> view.update()
+        >>> view.errors
+        ()
+
+    We should see all the resources in the form:
+
+        >>> [resource.title for resource in view.availableResources]
+        ['res0', 'res1', 'res2', 'res3', 'res4', 'res5', 'res6', 'res7', 'res8', 'res9']
+
+    But if event belongs to a resource it should not see its owner in the list:
+
+        >>> r_event = CalendarEvent(datetime(2002, 2, 2, 2, 2),
+        ...                       timedelta(hours=2), "Some event",
+        ...                       unique_id="rev")
+        >>> ISchoolToolCalendar(app['resources']['res3']).addEvent(r_event)
+        >>> view.context = r_event
+
+        >>> [resource.title for resource in view.availableResources]
+        ['res0', 'res1', 'res2', 'res4', 'res5', 'res6', 'res7', 'res8', 'res9']
+
+        >>> view.context = event
+
+    All the resources should be unbooked:
+
+        >>> [resource.title for resource in view.availableResources
+        ...                 if not view.hasBooked(resource)]
+        ['res0', 'res1', 'res2', 'res3', 'res4', 'res5', 'res6', 'res7', 'res8', 'res9']
+
+    Now let's book some resources for our event:
+
+        >>> request = TestRequest(form={'add_item.res2': '1',
+        ...                             'add_item.res4': '1',
+        ...                             'BOOK': 'Set'})
+        >>> view = CalendarEventBookingView(event, request)
+        >>> view.getAvailableItemsContainer = stubItemsContainer
+        >>> view.filter = lambda list: list
+        >>> view.update()
+        ''
+
+    A couple of resources should be booked now:
+
+        >>> sorted([resource.title for resource in view.getBookedItems()])
+        ['res2', 'res4']
+
+
+    Now let's unbook a resource and book a new one:
+
+        >>> request = TestRequest(form={'add_item.res3': '1',
+        ...                             'add_item.res4': '1',
+        ...                             'BOOK': 'Set'})
+
+        >>> view = CalendarEventBookingView(event, request)
+        >>> view.getAvailableItemsContainer = stubItemsContainer
+        >>> view.filter = lambda list: list
+        >>> view.update()
+        ''
+        >>> sorted([resource.title for resource in view.getBookedItems()])
+        ['res2', 'res3', 'res4']
+
+        >>> request = TestRequest(form={'remove_item.res2':'1',
+        ...                            'UNBOOK': 'Set'})
+        >>> view = CalendarEventBookingView(event, request)
+        >>> view.getAvailableItemsContainer = stubItemsContainer
+        >>> view.filter = lambda list: list
+        >>> view.update()
+        ''
+
+    We should see resource 3 in the list now:
+
+        >>> sorted([resource.title for resource in view.getBookedItems()])
+        ['res3', 'res4']
+
+    If you don't feel very brave, use the Cancel button:
+
+        >>> request = TestRequest(form={'marker-res0': '1',
+        ...                             'marker-res1': '1',
+        ...                             'marker-res2': '1',
+        ...                             'marker-res3': '1',
+        ...                             'marker-res4': '1',
+        ...                             'marker-res5': '1',
+        ...                             'res5': 'booked',
+        ...                             'marker-res6': '1',
+        ...                             'marker-res7': '1',
+        ...                             'marker-res8': '1',
+        ...                             'marker-res9': '1',
+        ...                             'CANCEL': 'Cancel'})
+
+        >>> view = CalendarEventBookingView(event, request)
+        >>> view.getAvailableItemsContainer = stubItemsContainer
+        >>> view.filter = lambda list: list
+        >>> view.update()
+
+    Nothing has changed, see?
+
+        >>> sorted([resource.title for resource in view.getBookedItems()])
+        ['res3', 'res4']
+
+    And you have been redirected back to the calendar:
+
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/persons/ignas/calendar'
+
+    The view also follows PersonPreferences timeformat and dateformat settings.
+    To demonstrate these we need to setup PersonPreferences:
+
+        >>> setup.setUpAnnotations()
+
+        # Usually registered for IHavePreferences
+        >>> ztapi.provideAdapter(IPerson, IPersonPreferences,
+        ...                      getPersonPreferences)
+        >>> request.setPrincipal(person)
+        >>> view = CalendarEventBookingView(event, request)
+        >>> view.getAvailableItemsContainer = stubItemsContainer
+        >>> view.filter = lambda list: list
+        >>> view.update()
+
+    Without the preferences set, we get the default start and end time
+    formatting:
+
+        >>> view.start
+        u'2002-02-02 - 02:02'
+        >>> view.end
+        u'2002-02-02 - 04:02'
+
+    We'll change the date and time formatting in the preferences and create a
+    new view.  Note that we need to create a new view because 'start' and 'end'
+    are set in __init__:
+
+        >>> prefs = IPersonPreferences(person)
+        >>> prefs.timeformat = '%I:%M %p'
+        >>> prefs.dateformat = '%d %B, %Y'
+        >>> view = CalendarEventBookingView(event, request)
+
+    Now we can see the changes:
+
+        >>> view.start
+        u'02 February, 2002 - 02:02 AM'
+        >>> view.end
+        u'02 February, 2002 - 04:02 AM'
+
+    """
+
+
+def doctest_CalendarEventBookingView_justAddedThisEvent():
+    """Test for CalendarEventBookingView.justAddedThisEvent
+
+        >>> context = EventStub('uid1')
+        >>> request = TestRequest()
+
+        >>> from schooltool.app.browser.cal import CalendarEventBookingView
+        >>> view = CalendarEventBookingView(context, request)
+
+    At this moment the view knows nothing about adding this event:
+
+        >>> view.justAddedThisEvent()
+        False
+
+    Let's register a different event as added:
+
+        >>> session_data = ISession(request)['schooltool.calendar']
+        >>> session_data['added_event_uids'] = set(['uid2'])
+
+    The view still refuses to acknowledge that you have added the event:
+
+        >>> view.justAddedThisEvent()
+        False
+
+    Ok, that's enough.  We really *did* add the event:
+
+        >>> session_data['added_event_uids'] = set(['uid1', 'uid2'])
+
+    This time the view is not so stubborn:
+
+        >>> view.justAddedThisEvent()
+        True
+
+    """
+
+
+def doctest_CalendarEventBookingView_clearJustAddedStatus():
+    """Test for CalendarEventBookingView.clearJustAddedStatus
+
+        >>> context = EventStub('uid1')
+        >>> request = TestRequest()
+
+        >>> from schooltool.app.browser.cal import CalendarEventBookingView
+        >>> view = CalendarEventBookingView(context, request)
+
+    This method should not break even if the list of added events is
+    not initialized.
+
+        >>> view.clearJustAddedStatus()
+
+    Let's register an event as added:
+
+        >>> session_data = ISession(request)['schooltool.calendar']
+        >>> session_data['added_event_uids'] = set(['uid3'])
+
+    The view will not delete this registration, because it's not ours:
+
+        >>> view.clearJustAddedStatus()
+        >>> session_data['added_event_uids']
+        set(['uid3'])
+
+    Ok, that's enough.  We really *did* add the event:
+
+        >>> session_data['added_event_uids'] = set(['uid1', 'uid2'])
+
+    This time the other registration remains, but uid1 is removed.
+
+        >>> view.clearJustAddedStatus()
+        >>> session_data['added_event_uids']
+        set(['uid2'])
+
+    """
+
+
+def doctest_CalendarEventBookingView_getConflictingEvents():
+    """Test for CalendarEventBookingView.getConflictingEvents
+
+        >>> from schooltool.app.browser.cal import CalendarEventBookingView
+
+        >>> class CalendarStub(object):
+        ...     def __init__(self, title, events):
+        ...         self.events = events
+        ...         self.title = title
+        ...     def expand(self, dtstart, dtend):
+        ...         print "%s.expand(%s, %s)" % (self.title, dtstart, dtend)
+        ...         return self.events
+
+    Let's give ourselves the permission to access the calendar events:
+
+        >>> from zope.security.checker import defineChecker
+        >>> from zope.security.checker import Checker
+        >>> defineChecker(CalendarStub,
+        ...               Checker({'expand': 'zope.Public'},
+        ...                       {'expand': 'zope.Public'}))
+
+        >>> class TimetableStub(object):
+        ...     def makeTimetableCalendar(self):
+        ...         return CalendarStub("timetable", [EventStub("tt")])
+
+        >>> from schooltool.timetable.interfaces import ICompositeTimetables
+        >>> class ResourceStub(object):
+        ...     calendar = CalendarStub("calendar", [EventStub("cal")])
+        ...     def __conform__(self, iface):
+        ...         if iface is ISchoolToolCalendar:
+        ...             return self.calendar
+        ...         elif iface is ICompositeTimetables:
+        ...             return TimetableStub()
+
+        >>> context = EventStub("evt")
+        >>> view = CalendarEventBookingView(context, TestRequest())
+
+        >>> resource = ResourceStub()
+        >>> conflicts = view.getConflictingEvents(resource)
+        calendar.expand(2006-04-20 20:07:00+00:00, 2006-04-21 20:07:00+00:00)
+        timetable.expand(2006-04-20 20:07:00+00:00, 2006-04-21 20:07:00+00:00)
+
+    All conflicting events are returned:
+
+        >>> [evt.unique_id for evt in conflicts]
+        ['cal', 'tt']
+
+    If the event that is booking the resources is ignored:
+
+        >>> resource.calendar = CalendarStub("calendar", [context])
+        >>> conflicts = view.getConflictingEvents(resource)
+        calendar.expand(2006-04-20 20:07:00+00:00, 2006-04-21 20:07:00+00:00)
+        timetable.expand(2006-04-20 20:07:00+00:00, 2006-04-21 20:07:00+00:00)
+
+        >>> [evt.unique_id for evt in conflicts]
+        ['tt']
+
+    """
+
+
+def doctest_getEvents_booking():
+    """Test for CalendarViewBase.getEvents when booking is involved
+
+    CalendarViewBase.getEvents returns a list of wrapped calendar
+    events.
+
+        >>> from schooltool.app.browser.cal import CalendarViewBase
+        >>> from schooltool.app.cal import Calendar
+        >>> from schooltool.resource.resource import Resource
+
+        >>> person = Person(u"frog")
+        >>> calendar = ISchoolToolCalendar(person)
+        >>> resource = Resource(u"mud")
+
+        >>> event = createEvent('2005-02-26 19:39', '1h', 'code')
+        >>> calendar.addEvent(event)
+        >>> event.bookResource(resource)
+
+    We will stub view.getCalendars to simulate overlayed calendars
+
+    We can see only one instance of the event:
+
+        >>> view = CalendarViewBase(calendar, TestRequest())
+        >>> view.getCalendars = lambda: [
+        ...     (calendar, 'r', 'g'),
+        ...     (ISchoolToolCalendar(resource), 'b', 'y')]
+        >>> for e in view.getEvents(datetime(2005, 2, 21, tzinfo=utc),
+        ...                         datetime(2005, 3, 1, tzinfo=utc)):
+        ...     print e.title, '(%s)' % e.color1
+        code (r)
+
+    Let toad book the same resource:
+
+        >>> toad = Person(u"toad")
+        >>> event = createEvent('2005-02-26 9:39', '1h', 'swim')
+        >>> ISchoolToolCalendar(toad).addEvent(event)
+        >>> event.bookResource(resource)
+
+    We should see only one box for code, yet we should see swim twice:
+
+        >>> view.getCalendars = lambda:[
+        ...     (calendar, 'r', 'g'),
+        ...     (ISchoolToolCalendar(resource), 'b', 'y'),
+        ...     (ISchoolToolCalendar(toad), 'm', 'c')]
+        >>> for e in view.getEvents(datetime(2005, 2, 21, tzinfo=utc),
+        ...                         datetime(2005, 3, 1, tzinfo=utc)):
+        ...     print e.title, '(%s)' % e.color1
+        code (r)
+        swim (b)
+        swim (m)
+
+    """
+
+class TestDailyCalendarView(unittest.TestCase):
+
+    def setUp(self):
+        setup.placefulSetUp()
+        self.app = sbsetup.setUpSchoolToolSite()
+        registerCalendarHelperViews()
+        registerCalendarSubscribers()
+        sbsetup.setUpSessions()
+        sbsetup.setUpTimetabling()
+        sbsetup.setUpCalendaring()
+
+    def tearDown(self):
+        setup.placefulTearDown()
+
+    def test_title(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        view = DailyCalendarView(ISchoolToolCalendar(Person()), TestRequest())
+        view.update()
+        self.assertEquals(view.cursor, date.today())
+
+        from zope.publisher.interfaces import IRequest
+        import zope.component
+        from zope.interface import Interface
+
+        class TestDateFormatterFullView( BrowserView ):
+            """
+            A Stub view for formating the date
+            """
+            def __call__(self):
+                return unicode(self.context.strftime("%A, %B%e, %Y"))
+
+        zope.component.provideAdapter(TestDateFormatterFullView, 
+                                          [date, IRequest], Interface, name='fullDate')
+
+        view.request = TestRequest(form={'date': '2005-01-06'})
+        view.update()
+        self.assertEquals(view.title(), u'Thursday, January 6, 2005')
+        view.request = TestRequest(form={'date': '2005-01-07'})
+        view.update()
+        self.assertEquals(view.title(), u'Friday, January 7, 2005')
+
+    def test__setRange(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        person = Person("Da Boss")
+        cal = ISchoolToolCalendar(person)
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 16)
+
+        def do_test(events, expected):
+            view.starthour, view.endhour = 8, 19
+            view._setRange(events)
+            self.assertEquals((view.starthour, view.endhour), expected)
+
+        do_test([], (8, 19))
+
+        events = [createEvent('2004-08-16 7:00', '1min', 'workout')]
+        do_test(events, (7, 19))
+
+        events = [createEvent('2004-08-15 8:00', '1d', "long workout")]
+        do_test(events, (0, 19))
+
+        events = [createEvent('2004-08-16 20:00', '30min', "late workout")]
+        do_test(events, (8, 21))
+
+        events = [createEvent('2004-08-16 20:00', '5h', "long late workout")]
+        do_test(events, (8, 24))
+
+    def test__setRange_timezones(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        london = timezone('Europe/London')
+        vilnius = timezone('Europe/Vilnius')
+        eastern = timezone('US/Eastern')
+
+        person = Person("Da Boss")
+        cal = ISchoolToolCalendar(person)
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 16)
+
+        def do_test(events, expected):
+            view.starthour, view.endhour = 8, 19
+            view._setRange(events)
+            self.assertEquals((view.starthour, view.endhour), expected)
+
+        for tz in (utc, london, vilnius, eastern):
+            view.timezone = tz
+            do_test([], (8, 19))
+
+        view.timezone = vilnius
+        events = [createEvent('2004-08-16 5:00', '60min', 'First Class')]
+        do_test(events, (8, 19))
+
+        events = [createEvent('2004-08-16 4:00', '60min', 'Before School')]
+        do_test(events, (7, 19))
+
+        view.timezone = eastern
+        do_test(events, (0, 19))
+
+        view.timezone = london
+        do_test(events, (5, 19))
+
+        view.timezone = utc
+        do_test(events, (4, 19))
+
+        events = [createEvent('2004-08-16 4:00', '60min', 'Before School'),
+                    createEvent('2004-08-16 18:00', '60min', 'Last Class')]
+        do_test(events, (4, 19))
+
+        view.timezone = vilnius
+        do_test(events, (7, 22))
+
+        view.timezone = eastern
+        do_test(events, (0, 19))
+
+        view.timezone = london
+        do_test(events, (5, 20))
+
+        view.timezone = vilnius
+        events = [createEvent('2004-08-16 4:00', '60min', 'Before School'),
+                    createEvent('2004-08-16 18:00', '61min', 'Running Late')]
+        do_test(events, (7, 23))
+
+        view.timezone = eastern
+        do_test(events, (0, 19))
+
+        view.timezone = london
+        do_test(events, (5, 21))
+
+        events = []
+        for tz in (utc, london, vilnius, eastern):
+            view.timezone = tz
+            do_test([], (8, 19))
+
+        view.timezone = utc
+        events = [createEvent('2004-08-16 22:00', '30min', "late workout")]
+        do_test(events, (8, 23))
+
+        # after midnight
+        view.timezone = vilnius
+        do_test(events, (8, 19))
+
+        # before 19:00
+        view.timezone = eastern
+        do_test(events, (8, 19))
+
+        # between 19:00 and Midnight
+        view.timezone = london
+        do_test(events, (8, 24))
+
+        view.timezone = utc
+        events = [createEvent('2004-08-16 22:00', '180min', "long workout")]
+        do_test(events, (8, 24))
+
+        # start after midnight
+        view.timezone = vilnius
+        do_test(events, (8, 19))
+
+        # end between 19:00 and midnight
+        view.timezone = eastern
+        do_test(events, (8, 21))
+
+        # end after Midnight
+        view.timezone = london
+        do_test(events, (8, 24))
+
+    def test_dayEvents(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        ev1 = createEvent('2004-08-12 12:00', '2h', "ev1")
+        ev2 = createEvent('2004-08-12 13:00', '2h', "ev2")
+        ev3 = createEvent('2004-08-12 14:00', '2h', "ev3")
+        ev4 = createEvent('2004-08-11 14:00', '3d', "ev4")
+        cal = ISchoolToolCalendar(Person())
+        for e in [ev1, ev2, ev3, ev4]:
+            cal.addEvent(e)
+        view = DailyCalendarView(cal, TestRequest())
+        view.request = TestRequest()
+        result = view.dayEvents(date(2004, 8, 12))
+        expected = [ev4, ev1, ev2, ev3]
+        fmt = lambda x: '[%s]' % ', '.join([e.title for e in x])
+        self.assertEquals(result, expected,
+                          '%s != %s' % (fmt(result), fmt(expected)))
+
+    def test_dayEvents_cache(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+        from schooltool.app.interfaces import ISchoolToolCalendar
+        from schooltool.person.person import Person
+
+        ev1 = createEvent('2004-08-12 12:00', '2h', "ev1")
+        ev2 = createEvent('2004-08-12 13:00', '2h', "ev2")
+        ev3 = createEvent('2004-08-12 14:00', '2h', "ev3")
+        ev4 = createEvent('2004-08-11 14:00', '3d', "ev4")
+        cal = ISchoolToolCalendar(Person())
+        for e in [ev1, ev2, ev3, ev4]:
+            cal.addEvent(e)
+        view = DailyCalendarView(cal, TestRequest())
+        view.request = TestRequest()
+        # Cache is set to None when view is created
+        self.assertEquals(view._day_events, None)
+        result = view.dayEvents(date(2004, 8, 12))
+        # Each day you look at is added to the cache
+        self.assertEquals(len(view._day_events), 1)
+        cached_result = view._day_events[date(2004, 8, 12)].events
+
+        fmt = lambda x: '[%s]' % ', '.join([e.title for e in x])
+        self.assertEquals(result, cached_result,
+                          '%s != %s' % (fmt(result), fmt(cached_result)))
+
+        result = view.dayEvents(date(2004, 8, 11))
+        cached_result = view._day_events[
+            date(2004, 8, 11)].events
+        self.assertEquals(len(view._day_events), 2)
+        self.assertEquals(result, cached_result,
+                          '%s != %s' % (fmt(result), fmt(cached_result)))
+
+        # If we call the function with the same arguments - we should
+        # get the list that was stored in the cache
+        view._day_events[date(2004, 8, 11)].events.append(ev1)
+        result = view.dayEvents(date(2004, 8, 11))
+        expected = [ev4, ev1]
+        self.assertEquals(result, expected,
+                          '%s != %s' % (fmt(result), fmt(expected)))
+
+    def test_getColumns(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        person = Person(title="Da Boss")
+        cal = ISchoolToolCalendar(person)
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 12)
+
+        self.assertEquals(view.getColumns(), 1)
+
+        cal.addEvent(createEvent('2004-08-12 12:00', '2h', "Meeting"))
+        self.assertEquals(view.getColumns(), 1)
+
+        #
+        #  Three events:
+        #
+        #  12 +--+
+        #  13 |Me|+--+    <--- overlap
+        #  14 +--+|Lu|+--+
+        #  15     +--+|An|
+        #  16         +--+
+        #
+        #  Expected result: 2
+
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 12)
+        cal.addEvent(createEvent('2004-08-12 13:00', '2h', "Lunch"))
+        cal.addEvent(createEvent('2004-08-12 14:00', '2h', "Another meeting"))
+        self.assertEquals(view.getColumns(), 2)
+
+        #
+        #  Four events:
+        #
+        #  12 +--+
+        #  13 |Me|+--+    +--+ <--- overlap
+        #  14 +--+|Lu|+--+|Ca|
+        #  15     +--+|An|+--+
+        #  16         +--+
+        #
+        #  Expected result: 3
+
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 12)
+        cal.addEvent(createEvent('2004-08-12 13:00', '2h',
+                                 "Call Mark during lunch"))
+        self.assertEquals(view.getColumns(), 3)
+
+        #
+        #  Events that do not overlap in real life, but overlap in our view
+        #
+        #    +-------------+-------------+-------------+
+        #    | 12:00-12:30 | 12:30-13:00 | 12:00-12:00 |
+        #    +-------------+-------------+-------------+
+        #
+        #  Expected result: 3
+
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 12)
+        cal.clear()
+        cal.addEvent(createEvent('2004-08-12 12:00', '30min', "a"))
+        cal.addEvent(createEvent('2004-08-12 12:30', '30min', "b"))
+        cal.addEvent(createEvent('2004-08-12 12:00', '0min', "c"))
+        self.assertEquals(view.getColumns(), 3)
+
+    def test_getColumns_periods(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+        from schooltool.calendar.utils import parse_datetimetz
+
+        person = Person(title="Da Boss")
+        cal = ISchoolToolCalendar(person)
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 12)
+        view.calendarRows = lambda: iter([
+            ("B", parse_datetimetz('2004-08-12 10:00:00'), timedelta(hours=3)),
+            ("C", parse_datetimetz('2004-08-12 13:00:00'), timedelta(hours=2)),
+             ])
+        cal.addEvent(createEvent('2004-08-12 09:00', '2h', "Whatever"))
+        cal.addEvent(createEvent('2004-08-12 11:00', '2m', "Phone call"))
+        cal.addEvent(createEvent('2004-08-12 11:10', '2m', "Phone call"))
+        cal.addEvent(createEvent('2004-08-12 12:00', '2m', "Phone call"))
+        cal.addEvent(createEvent('2004-08-12 12:30', '3h', "Nap"))
+        self.assertEquals(view.getColumns(), 5)
+
+    def test_calendarRows(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        person = Person(title="Da Boss")
+        cal = ISchoolToolCalendar(person)
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 12)
+        view.starthour = 10
+        view.endhour = 16
+        result = list(view.calendarRows())
+        expected = [('%d:00' % hr, datetime(2004, 8, 12, hr, tzinfo=utc),
+                     timedelta(0, 3600)) for hr in range(10, 16)]
+        self.assertEquals(result, expected)
+
+    def test_getHours(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        person = Person(title="Da Boss")
+        cal = ISchoolToolCalendar(person)
+        def createView():
+            view = DailyCalendarView(cal, TestRequest())
+            view.cursor = date(2004, 8, 12)
+            view.starthour = 10
+            view.endhour = 16
+            return view
+        view = createView()
+        result = list(view.getHours())
+        self.assertEquals(result,
+                          [{'duration': 60, 'time': '10:00',
+                            'title': '10:00', 'cols': (None,),
+                            'top': 0.0, 'height': 4.0,
+                            'active': False},
+                           {'duration': 60, 'time': '11:00',
+                            'title': '11:00', 'cols': (None,),
+                            'top': 4.0, 'height': 4.0,
+                            'active': False},
+                           {'duration': 60, 'time': '12:00',
+                            'title': '12:00', 'cols': (None,),
+                            'top': 8.0, 'height': 4.0,
+                            'active': False},
+                           {'duration': 60, 'time': '13:00',
+                            'title': '13:00', 'cols': (None,),
+                            'top': 12.0, 'height': 4.0,
+                            'active': False},
+                           {'duration': 60, 'time': '14:00',
+                            'title': '14:00', 'cols': (None,),
+                            'top': 16.0, 'height': 4.0,
+                            'active': False},
+                           {'duration': 60, 'time': '15:00',
+                            'title': '15:00', 'cols': (None,),
+                            'top': 20.0, 'height': 4.0,
+                            'active': False},
+                            ])
+
+        ev1 = createEvent('2004-08-12 12:00', '2h', "Meeting")
+        cal.addEvent(ev1)
+        view = createView()
+        result = list(view.getHours())
+
+        def clearMisc(l):
+            for d in l:
+                del d['time']
+                del d['duration']
+                del d['top']
+                del d['height']
+                del d['active']
+            return l
+
+        result = clearMisc(result)
+        self.assertEquals(result,
+                          [{'title': '10:00', 'cols': (None,)},
+                           {'title': '11:00', 'cols': (None,)},
+                           {'title': '12:00', 'cols': (ev1,)},
+                           {'title': '13:00', 'cols': ('',)},
+                           {'title': '14:00', 'cols': (None,)},
+                           {'title': '15:00', 'cols': (None,)}])
+
+        #
+        #  12 +--+
+        #  13 |Me|+--+
+        #  14 +--+|Lu|
+        #  15 |An|+--+
+        #  16 +--+
+        #
+
+        ev2 = createEvent('2004-08-12 13:00', '2h', "Lunch")
+        ev3 = createEvent('2004-08-12 14:00', '2h', "Another meeting")
+        cal.addEvent(ev2)
+        cal.addEvent(ev3)
+
+        view = createView()
+        result = list(view.getHours())
+        self.assertEquals(clearMisc(result),
+                          [{'title': '10:00', 'cols': (None, None)},
+                           {'title': '11:00', 'cols': (None, None)},
+                           {'title': '12:00', 'cols': (ev1, None)},
+                           {'title': '13:00', 'cols': ('', ev2)},
+                           {'title': '14:00', 'cols': (ev3, '')},
+                           {'title': '15:00', 'cols': ('', None)},])
+
+        ev4 = createEvent('2004-08-11 14:00', '3d', "Visit")
+        cal.addEvent(ev4)
+
+        view = createView()
+        result = list(view.getHours())
+        self.assertEquals(clearMisc(result),
+                          [{'title': '0:00', 'cols': (ev4, None, None)},
+                           {'title': '1:00', 'cols': ('', None, None)},
+                           {'title': '2:00', 'cols': ('', None, None)},
+                           {'title': '3:00', 'cols': ('', None, None)},
+                           {'title': '4:00', 'cols': ('', None, None)},
+                           {'title': '5:00', 'cols': ('', None, None)},
+                           {'title': '6:00', 'cols': ('', None, None)},
+                           {'title': '7:00', 'cols': ('', None, None)},
+                           {'title': '8:00', 'cols': ('', None, None)},
+                           {'title': '9:00', 'cols': ('', None, None)},
+                           {'title': '10:00', 'cols': ('', None, None)},
+                           {'title': '11:00', 'cols': ('', None, None)},
+                           {'title': '12:00', 'cols': ('', ev1, None)},
+                           {'title': '13:00', 'cols': ('', '', ev2)},
+                           {'title': '14:00', 'cols': ('', ev3, '')},
+                           {'title': '15:00', 'cols': ('', '', None)},
+                           {'title': '16:00', 'cols': ('', None, None)},
+                           {'title': '17:00', 'cols': ('', None, None)},
+                           {'title': '18:00', 'cols': ('', None, None)},
+                           {'title': '19:00', 'cols': ('', None, None)},
+                           {'title': '20:00', 'cols': ('', None, None)},
+                           {'title': '21:00', 'cols': ('', None, None)},
+                           {'title': '22:00', 'cols': ('', None, None)},
+                           {'title': '23:00', 'cols': ('', None, None)}])
+
+    def test_getHours_allday_events(self):
+        from schooltool.app.interfaces import ISchoolToolCalendar
+        from schooltool.app.browser.cal import DailyCalendarView
+        from schooltool.person.person import Person
+
+        person = Person(title="Da Boss")
+        cal = ISchoolToolCalendar(person)
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 12)
+        view.starthour = 0
+        view.endhour = 23
+        no_allday_events = list(view.getHours())
+
+        ev1 = createEvent('2004-08-12 14:00', '5min', "My Birthday")
+        ev1.allday = True
+        cal.addEvent(ev1)
+        result = list(view.getHours())
+
+        self.assertEquals(result, no_allday_events)
+
+    def test_getHoursActivePeriod(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        # Some setup.
+        person = Person(title="Da Boss")
+        cal = ISchoolToolCalendar(person)
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 1, 1)
+        view._getCurrentTime = lambda: utc.localize(datetime(2004, 1, 1, 13, 0))
+        ev1 = createEvent('2004-01-01 00:01', '5min', "Start of the day")
+        ev2 = createEvent('2004-01-01 23:30', '5min', "End of the day")
+
+        cal.addEvent(ev1)
+        cal.addEvent(ev2)
+
+        result = list(view.getHours())
+        self.assert_(len(result) == 24)
+        self.assertEquals([hour for hour in result
+                           if hour['active'] is True],
+                          [{'title': '13:00',
+                            'top': 52.0,
+                            'cols': (None, None),
+                            'height': 4.0,
+                            'duration': 60,
+                            'time': '13:00',
+                            'active': True}])
+
+    def test_getHours_short_periods(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+
+        # Some setup.
+        person = Person(title="Da Boss")
+        cal = ISchoolToolCalendar(person)
+        view = DailyCalendarView(cal, TestRequest())
+        view.cursor = date(2004, 8, 12)
+
+        # Patch in a custom simpleCalendarRows method to test short periods.
+
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        rows_view = DailyCalendarRowsView(view.context, view.request)
+
+        def simpleCalendarRows():
+            today = datetime.combine(view.cursor, time(13, tzinfo=utc))
+            durations = [0, 1800, 1351, 1349, 600, 7200]
+            row_ends = [today + timedelta(seconds=sum(durations[:i+1]))
+                        for i in range(1, len(durations))]
+
+            start = today + timedelta(hours=view.starthour)
+            for end in row_ends:
+                duration = end - start
+                yield (rows_view.rowTitle(start.hour, start.minute),
+                       start, duration)
+                start = end
+
+        view.calendarRows = simpleCalendarRows
+
+        result = list(view.getHours())
+        # clean up the result
+        for rowinfo in result:
+            for key in rowinfo.keys():
+                if key not in ('height', 'title'):
+                    del rowinfo[key]
+                rowinfo['height'] = round(rowinfo['height'], 4)
+
+        expected = [{'title': '21:00', 'height': 66.0},
+                    {'title': '13:30', 'height': 1.5011},
+                    {'title': '', 'height': 1.4989},
+                    {'title': '', 'height': 0.6667},
+                    {'title': '14:25', 'height': 8.0}]
+        self.assertEquals(result, expected)
+
+    def doctest_snapToGrid(self):
+        """Tests for DailyCalendarView.snapToGrid
+
+        DailyCalendarView displays events in a grid.  The grid starts
+        at view.starthour and ends at view.endhour, both on the same
+        day (view.cursor).  Gridlines are spaced at 15 minute intervals.
+
+            >>> from schooltool.app.browser.cal import DailyCalendarView
+            >>> view = DailyCalendarView(None, TestRequest())
+            >>> view.starthour = 8
+            >>> view.endhour = 18
+            >>> view.cursor = date(2004, 8, 1)
+
+        snapToGrid returns a (floating point) postition in the grid.  Topmost
+        gridline is number 0 and it corresponds to starthour.
+
+            >>> view.snapToGrid(datetime(2004, 8, 1, 8, 0, tzinfo=utc))
+            0.0
+
+            >>> view.snapToGrid(datetime(2004, 8, 1, 8, 1, tzinfo=utc))
+            0.066...
+            >>> view.snapToGrid(datetime(2004, 8, 1, 8, 7, tzinfo=utc))
+            0.466...
+            >>> view.snapToGrid(datetime(2004, 8, 1, 8, 8, tzinfo=utc))
+            0.533...
+            >>> view.snapToGrid(datetime(2004, 8, 1, 8, 15, tzinfo=utc))
+            1.0
+
+        Timestamps before starthour are clipped to 0
+
+            >>> view.snapToGrid(datetime(2004, 8, 1, 7, 30, tzinfo=utc))
+            0.0
+            >>> view.snapToGrid(datetime(2004, 7, 30, 16, 30, tzinfo=utc))
+            0.0
+
+        Timestamps after endhour are clipped to the bottom
+
+            >>> view.snapToGrid(datetime(2004, 8, 1, 18, 0, tzinfo=utc))
+            40.0
+            >>> view.snapToGrid(datetime(2004, 8, 1, 18, 20, tzinfo=utc))
+            40.0
+            >>> view.snapToGrid(datetime(2004, 8, 2, 10, 40, tzinfo=utc))
+            40.0
+
+        Corner case: starthour == 0, endhour == 24
+
+            >>> view.starthour = 0
+            >>> view.endhour = 24
+
+            >>> view.snapToGrid(datetime(2004, 8, 1, 0, 0, tzinfo=utc))
+            0.0
+            >>> view.snapToGrid(datetime(2004, 8, 1, 2, 0, tzinfo=utc))
+            8.0
+            >>> view.snapToGrid(datetime(2004, 7, 30, 16, 30, tzinfo=utc))
+            0.0
+            >>> view.snapToGrid(datetime(2004, 8, 1, 23, 55, tzinfo=utc))
+            95.666...
+            >>> view.snapToGrid(datetime(2004, 8, 2, 10, 40, tzinfo=utc))
+            96.0
+
+        """
+
+    def test_eventTop(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+        view = DailyCalendarView(None, TestRequest())
+        view.starthour = 8
+        view.endhour = 18
+        view.cursor = date(2004, 8, 12)
+        view.request = TestRequest()
+
+        def check(dt, duration, expected):
+            top = view.eventTop(createEvent(dt, duration, ""))
+            self.assert_(abs(top - expected) < 0.001,
+                         "%s != %s" % (top, expected))
+
+        check('2004-08-12 08:00', '1h', 0)
+        check('2004-08-12 09:00', '1h', 4)
+        check('2004-08-12 10:00', '1h', 8)
+        check('2004-08-12 10:15', '1h', 9)
+        check('2004-08-12 10:30', '1h', 10)
+        check('2004-08-12 10:45', '1h', 11)
+        check('2004-08-12 10:46', '1h', 11+1/15.)
+        check('2004-08-12 10:44', '1h', 11-1/15.)
+        check('2004-08-11 10:00', '24h', 0)
+        check('2004-08-12 14:30', '1h', 26)
+        check('2004-08-12 16:30', '1h', 34)
+
+        #If we change the view timezone, we shif the event's on the page.
+        view.timezone = timezone('US/Eastern')
+        check('2004-08-12 14:30', '1h', 10)
+        check('2004-08-12 16:30', '1h', 18)
+
+    def test_eventHeight(self):
+        from schooltool.app.browser.cal import DailyCalendarView
+        view = DailyCalendarView(None, TestRequest())
+        view.starthour = 8
+        view.endhour = 18
+        view.cursor = date(2004, 8, 12)
+        view.request = TestRequest()
+
+        def check(dt, duration, expected):
+            height = view.eventHeight(createEvent(dt, duration, ""),
+                                      minheight=1)
+            self.assert_(abs(height - expected) < 0.001,
+                         "%s != %s" % (height, expected))
+
+        check('2004-08-12 09:00', '0', 1)
+        check('2004-08-12 09:00', '14m', 1)
+        check('2004-08-12 09:00', '1h', 4)
+        check('2004-08-12 10:00', '2h', 8)
+        check('2004-08-12 10:00', '2h+15m', 9)
+        check('2004-08-12 10:00', '2h+30m', 10)
+        check('2004-08-12 10:00', '2h+45m', 11)
+        check('2004-08-12 10:00', '2h+46m', 11 + 1/15.)
+        check('2004-08-12 10:00', '2h+44m', 11 - 1/15.)
+        check('2004-08-12 10:02', '2h+44m', 11 - 1/15.)
+        check('2004-08-12 10:00', '24h+44m', 32)
+        check('2004-08-11 10:00', '48h+44m', 40)
+        check('2004-08-11 10:00', '24h', 8)
+
+    def test_getAllDayEvents(self):
+        """Test for DailyCalendarView.getAllDayEvents
+
+            >>> setup.placefulSetUp()
+            >>> app = sbsetup.setUpSchoolToolSite()
+            >>> setup.setUpAnnotations()
+            >>> registerCalendarHelperViews()
+            >>> registerCalendarSubscribers()
+            >>> sbsetup.setUpSessions()
+            >>> sbsetup.setUpTimetabling()
+
+        DailyCalendarView.getAllDayEvents returns a list of wrapped
+        all-day calendar events for the date of the view cursor.
+
+            >>> from schooltool.app.browser.cal import DailyCalendarView
+            >>> from schooltool.app.cal import Calendar
+            >>> from schooltool.person.person import Person
+            >>> cal = Calendar(Person())
+            >>> cal.addEvent(createEvent('2005-02-20 16:00', '1h',
+            ...      'A Birthday', allday=True))
+            >>> cal.addEvent(createEvent('2005-02-20 16:00', '1h', 'walk'))
+            >>> view = DailyCalendarView(cal, TestRequest())
+
+        Only all-day events are returned
+
+            >>> view.cursor = date(2005, 2, 20)
+            >>> for e in view.getAllDayEvents():
+            ...     print e.title
+            ...     print e.dtstarttz
+            A Birthday
+            2005-02-20 16:00:00+00:00
+
+        Only events that happen on the day specified by the cursor are
+        displayed:
+
+            >>> view.cursor = date(2005, 2, 22)
+            >>> [e for e in view.getAllDayEvents()]
+            []
+
+        We're done:
+
+            >>> setup.placelessTearDown()
+
+        """
+
+
+def doctest_CalendarViewBase():
+    """Tests for CalendarViewBase.
+
+        >>> sbsetup.setUpSessions()
+
+        >>> from schooltool.app.browser.cal import CalendarViewBase
+        >>> from schooltool.app.cal import Calendar
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+
+    Set up the checkers for canEdit/canView on events:
+
+        >>> from schooltool.app.cal import CalendarEvent
+        >>> from zope.security.checker import defineChecker, Checker
+        >>> defineChecker(CalendarEvent,
+        ...               Checker({'description': 'zope.Public'},
+        ...                       {'description': 'zope.Public'}))
+
+    CalendarViewBase has a method calURL used for forming links to other
+    calendar views on other dates.
+
+        >>> request = TestRequest()
+        >>> view = CalendarViewBase(calendar, request)
+        >>> view.inCurrentPeriod = lambda dt: False
+        >>> view.cursor = date(2005, 2, 3)
+
+        >>> view.calURL("daily")
+        'http://127.0.0.1/calendar/2005-02-03'
+        >>> view.calURL("monthly")
+        'http://127.0.0.1/calendar/2005-02'
+        >>> view.calURL("yearly")
+        'http://127.0.0.1/calendar/2005'
+
+        >>> view.calURL("daily", date(2005, 12, 13))
+        'http://127.0.0.1/calendar/2005-12-13'
+        >>> view.calURL("monthly", date(2005, 12, 13))
+        'http://127.0.0.1/calendar/2005-12'
+        >>> view.calURL("yearly", date(2007, 11, 13))
+        'http://127.0.0.1/calendar/2007'
+
+    The weekly links need some special attention:
+
+        >>> view.calURL("weekly")
+        'http://127.0.0.1/calendar/2005-w05'
+        >>> view.calURL("weekly", date(2003, 12, 31))
+        'http://127.0.0.1/calendar/2004-w01'
+        >>> view.calURL("weekly", date(2005, 1, 1))
+        'http://127.0.0.1/calendar/2004-w53'
+
+        >>> view.calURL("quarterly")
+        Traceback (most recent call last):
+        ...
+        ValueError: quarterly
+
+    pdfURL generates links to PDFs.  It only works when calendar generation
+    is enabled:
+
+        >>> from schooltool.app.browser import pdfcal
+        >>> real_pdfcal_disabled = pdfcal.disabled
+
+        >>> pdfcal.disabled = True
+        >>> print view.pdfURL()
+        None
+
+        >>> pdfcal.disabled = False
+
+    It should only be called on subclasses which have cal_type set, so we
+    will temporarily do that.
+
+        >>> view.cal_type = 'weekly'
+        >>> view.pdfURL()
+        'http://127.0.0.1/calendar/2005-w05.pdf'
+        >>> del view.cal_type
+
+        >>> pdfcal.disabled = real_pdfcal_disabled
+
+    update() sets the cursor for the view.  If it does not find a date in
+    request or the session, it defaults to the current day:
+
+        >>> view.update()
+        >>> view.cursor == date.today()
+        True
+
+    The date can be provided in the request:
+
+        >>> request.form['date'] = '2005-01-02'
+        >>> view.update()
+        >>> view.cursor
+        datetime.date(2005, 1, 2)
+
+    update() stores the last visited day in the session:
+
+        >>> from zope.app.session.interfaces import ISession
+        >>> ISession(view.request)['calendar']['last_visited_day']
+        datetime.date(2005, 1, 2)
+
+    If not given a date, update() will try the last visited one from the
+    session:
+
+        >>> view.cursor = None
+        >>> del request.form['date']
+        >>> view.update()
+        >>> view.cursor
+        datetime.date(2005, 1, 2)
+
+    It will not update the session data if inCurrentPeriod() returns True:
+
+        >>> view.inCurrentPeriod = lambda dt: True
+        >>> request.form['date'] = '2005-01-01'
+        >>> view.update()
+        >>> ISession(view.request)['calendar']['last_visited_day']
+        datetime.date(2005, 1, 2)
+
+    canAddEvents checks to see if the current user has addEvent permission on
+    the context:
+
+        >>> defineChecker(Calendar,
+        ...               Checker({'addEvent': 'zope.Public'},
+        ...                       {'addEvent': 'zope.Public'}))
+        >>> view.canAddEvents()
+        True
+
+    """
+
+
+def doctest_DailyCalendarView():
+    r"""Tests for DailyCalendarView.
+
+        >>> from schooltool.app.browser.cal import DailyCalendarView
+
+        >>> from schooltool.app.cal import Calendar
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = DailyCalendarView(calendar, TestRequest())
+
+    prev(), current() and next() return links for adjacent days:
+
+        >>> view.cursor = date(2004, 8, 18)
+        >>> view.prev()
+        'http://127.0.0.1/calendar/2004-08-17'
+        >>> view.next()
+        'http://127.0.0.1/calendar/2004-08-19'
+        >>> view.current() == 'http://127.0.0.1/calendar/%s' % date.today()
+        True
+
+    inCurrentPeriod returns True for the same day only:
+
+        >>> view.inCurrentPeriod(date(2004, 8, 18))
+        True
+        >>> view.inCurrentPeriod(date(2004, 8, 19))
+        False
+        >>> view.inCurrentPeriod(date(2004, 8, 17))
+        False
+
+    """
+
+
+def doctest_WeeklyCalendarView():
+    """Tests for WeeklyCalendarView.
+
+        >>> from schooltool.app.browser.cal import WeeklyCalendarView
+
+        >>> from schooltool.app.cal import Calendar
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = WeeklyCalendarView(calendar, TestRequest())
+
+    title() forms a nice title for the calendar:
+
+        >>> view.cursor = date(2005, 2, 3)
+        >>> translate(view.title())
+        u'February, 2005 (week 5)'
+
+    prev(), current() and next() return links for adjacent weeks:
+
+        >>> view.cursor = date(2004, 8, 18)
+        >>> view.prev()
+        'http://127.0.0.1/calendar/2004-w33'
+        >>> view.next()
+        'http://127.0.0.1/calendar/2004-w35'
+        >>> fmt = 'http://127.0.0.1/calendar/%04d-w%02d'
+        >>> view.current() == fmt % date.today().isocalendar()[:2]
+        True
+
+    getCurrentWeek is a shortcut for view.getWeek(view.cursor)
+
+        >>> view.cursor = "works"
+        >>> view.getWeek = lambda x: "really " + x
+        >>> view.getCurrentWeek()
+        'really works'
+
+    inCurrentPeriod returns True for the same week only:
+
+        >>> view.cursor = date(2004, 8, 18)
+        >>> view.inCurrentPeriod(date(2004, 8, 16))
+        True
+        >>> view.inCurrentPeriod(date(2004, 8, 22))
+        True
+        >>> view.inCurrentPeriod(date(2004, 8, 23))
+        False
+        >>> view.inCurrentPeriod(date(2004, 8, 15))
+        False
+
+    """
+
+
+def doctest_MonthlyCalendarView():
+    """Tests for MonthlyCalendarView.
+
+        >>> from schooltool.app.browser.cal import MonthlyCalendarView
+
+        >>> from schooltool.app.cal import Calendar
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = MonthlyCalendarView(calendar, TestRequest())
+
+    title() forms a nice title for the calendar:
+
+        >>> view.cursor = date(2005, 2, 3)
+        >>> translate(view.title())
+        u'February, 2005'
+
+    Some helpers for are provided for use in the template:
+
+        >>> view.dayOfWeek(date(2005, 5, 17))
+        u'Tuesday'
+
+        >>> translate(view.weekTitle(date(2005, 5, 17)))
+        u'Week 20'
+
+    prev(), current and next() return links for adjacent months:
+
+        >>> view.cursor = date(2004, 8, 18)
+        >>> view.prev()
+        'http://127.0.0.1/calendar/2004-07'
+        >>> view.next()
+        'http://127.0.0.1/calendar/2004-09'
+        >>> dt = date.today().strftime("%Y-%m")
+        >>> view.current() == 'http://127.0.0.1/calendar/%s' % dt
+        True
+
+    getCurrentWeek is a shortcut for view.getMonth(view.cursor)
+
+        >>> view.cursor = "works"
+        >>> view.getMonth = lambda x: "really " + x
+        >>> view.getCurrentMonth()
+        'really works'
+
+    inCurrentPeriod returns True for the same month only:
+
+        >>> view.cursor = date(2004, 8, 18)
+        >>> view.inCurrentPeriod(date(2004, 8, 18))
+        True
+        >>> view.inCurrentPeriod(date(2004, 8, 1))
+        True
+        >>> view.inCurrentPeriod(date(2004, 7, 31))
+        False
+        >>> view.inCurrentPeriod(date(2003, 8, 18))
+        False
+
+    """
+
+
+def doctest_YearlyCalendarView():
+    r"""Tests for YearlyCalendarView.
+
+        >>> from schooltool.app.browser.cal import YearlyCalendarView
+
+        >>> from schooltool.app.cal import Calendar
+        >>> calendar = Calendar(Person())
+        >>> directlyProvides(calendar, IContainmentRoot)
+        >>> view = YearlyCalendarView(calendar, TestRequest())
+
+    Stub out view.getCalendars so that we do not need to worry about view
+    registration:
+
+        >>> view.getCalendars = lambda: []
+
+    title() forms a nice title for the calendar:
+
+        >>> view.cursor = date(2005, 2, 3)
+        >>> view.title()
+        u'2005'
+
+    monthTitle() returns names of months:
+
+        >>> view.monthTitle(date(2005, 2, 3))
+        u'February'
+        >>> view.monthTitle(date(2005, 8, 3))
+        u'August'
+
+    dayOfWeek() returns short names of weekdays:
+
+        >>> view.shortDayOfWeek(date(2005, 2, 3))
+        u'Thu'
+        >>> view.shortDayOfWeek(date(2005, 8, 3))
+        u'Wed'
+
+    prev(), current() and next() return links for adjacent years:
+
+        >>> view.cursor = date(2004, 8, 18)
+        >>> view.prev()
+        'http://127.0.0.1/calendar/2003'
+        >>> view.next()
+        'http://127.0.0.1/calendar/2005'
+        >>> expected = 'http://127.0.0.1/calendar/%d' % date.today().year
+        >>> view.current() == expected
+        True
+
+    renderRow() renders HTML for one week of events.  It is implemented
+    in python for performance reasons.
+
+        >>> week = view.getWeek(date(2004, 2, 4))[2:4]
+        >>> print view.renderRow(week, 2)
+        <td class="cal_yearly_day">
+        <a href="http://127.0.0.1/calendar/2004-02-04" class="cal_yearly_day">4</a>
+        </td>
+        <td class="cal_yearly_day">
+        <a href="http://127.0.0.1/calendar/2004-02-05" class="cal_yearly_day">5</a>
+        </td>
+
+    If the week includes today, that is indicated in a class attribute:
+
+        >>> week = view.getWeek(date.today())
+        >>> print view.renderRow(week, date.today().month)
+        <td...class="cal_yearly_day today">...
+
+    inCurrentPeriod returns True for the same year only:
+
+        >>> view.cursor = date(2004, 8, 18)
+        >>> view.inCurrentPeriod(date(2004, 8, 18))
+        True
+        >>> view.inCurrentPeriod(date(2004, 1, 1))
+        True
+        >>> view.inCurrentPeriod(date(2003, 12, 31))
+        False
+        >>> view.inCurrentPeriod(date(2005, 1, 1))
+        False
+
+    pdfURL always returns None because yearly PDF calendars are not available.
+
+        >>> print view.pdfURL()
+        None
+
+    """
+
+
+def doctest_YearlyCalendarView_initDaysCache():
+    r"""Tests for YearlyCalendarView._initDaysCache.
+
+        >>> from schooltool.app.browser.cal import YearlyCalendarView
+        >>> view = YearlyCalendarView(None, TestRequest())
+
+    _initDaysCache designates the year of self.cursor (padded to week
+    boundaries) as the time for caching
+
+        >>> view.cursor = date(2005, 6, 12)
+        >>> view.first_day_of_week = calendar.SUNDAY
+        >>> view._initDaysCache()
+        >>> view._days_cache.expensive_getDays == view._getDays
+        True
+        >>> print view._days_cache.cache_first, view._days_cache.cache_last
+        2004-12-26 2006-01-01
+
+        >>> view.first_day_of_week = calendar.MONDAY
+        >>> view._initDaysCache()
+        >>> print view._days_cache.cache_first, view._days_cache.cache_last
+        2004-12-27 2006-01-02
+
+    When the cursor is close to the beginning/end of the year, we also have
+    to include the surrounding three months (for the calendar portlet)
+
+        >>> view.cursor = date(2005, 1, 1)
+        >>> view.first_day_of_week = calendar.SUNDAY
+        >>> view._initDaysCache()
+        >>> print view._days_cache.cache_first, view._days_cache.cache_last
+        2004-11-28 2006-01-01
+
+    """
+
+
+def doctest_AtomCalendarView():
+    r"""Tests for AtomCalendarView.
+
+    Some setup:
+
+        >>> setup.placefulSetUp()
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> sbsetup.setUpTimetabling()
+        >>> registerCalendarHelperViews()
+        >>> registerCalendarSubscribers()
+
+        >>> from schooltool.app.browser.cal import AtomCalendarView
+
+        >>> from schooltool.app.cal import Calendar
+        >>> from schooltool.app.browser.cal import CalendarDay
+        >>> person = Person()
+        >>> calendar = Calendar(person)
+        >>> directlyProvides(person, IContainmentRoot)
+
+    Populate the calendar:
+
+        >>> lastweek = CalendarEvent(datetime.now().replace(hour=12) -
+        ...                          timedelta(8),
+        ...                          timedelta(hours=3), "Last Week")
+        >>> monday_date = (datetime.now().replace(hour=12) -
+        ...                timedelta(datetime.now().weekday()))
+        >>> tuesday_date = monday_date + timedelta(1)
+        >>> monday = CalendarEvent(monday_date,
+        ...                        timedelta(hours=3), "Today")
+        >>> tuesday = CalendarEvent(tuesday_date,
+        ...                         timedelta(hours=3), "Tomorrow")
+        >>> calendar.addEvent(lastweek)
+        >>> calendar.addEvent(monday)
+        >>> calendar.addEvent(tuesday)
+
+        >>> view = AtomCalendarView(calendar, TestRequest())
+        >>> events = []
+        >>> for day in view.getCurrentWeek():
+        ...     for event in day.events:
+        ...         events.append(event)
+
+    getCurrentWeek() returns the current week as CalendarDays.  The even
+    lastweek should not show up here.
+
+        >>> isinstance(view.getCurrentWeek()[0], CalendarDay)
+        True
+        >>> len(events)
+        2
+
+    create ISO8601 date format for Atom spec
+    TODO: this should probably go in schooltool.calendar.utils
+
+        >>> dt = datetime(2005, 03, 29, 15, 33, 22, tzinfo=utc)
+        >>> view.w3cdtf_datetime(dt)
+        '2005-03-29T15:33:22Z'
+
+    this is a tricky thing to test, it should return datetime.now() in ISO8601
+
+        >>> len(view.w3cdtf_datetime_now())
+        20
+
+    for now, we know its always UTC so it should end with Z
+
+        >>> view.w3cdtf_datetime_now()[-1]
+        'Z'
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_EventDeleteView():
+    r"""Tests for EventDeleteView.
+
+    We'll need a little context here:
+
+        >>> from schooltool.app.cal import Calendar, CalendarEvent
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+        >>> container = PersonContainer()
+        >>> directlyProvides(container, IContainmentRoot)
+        >>> person = container['person'] = Person('person')
+        >>> cal = Calendar(person)
+        >>> dtstart = datetime(2005, 2, 3, 12, 15)
+        >>> martyr = CalendarEvent(dtstart, timedelta(hours=3), "Martyr",
+        ...                        unique_id="killme")
+        >>> cal.addEvent(martyr)
+
+        >>> innocent = CalendarEvent(dtstart, timedelta(hours=3), "Innocent",
+        ...                          unique_id="leavemealone")
+        >>> cal.addEvent(innocent)
+
+    In order to deal with overlaid calendars, request.principal is adapted
+    to IPerson.  To make the adaptation work, we will define a simple stub.
+
+        >>> class ConformantStub:
+        ...     def __init__(self, obj):
+        ...         self.obj = obj
+        ...     def __conform__(self, interface):
+        ...         if interface is IPerson:
+        ...             return self.obj
+
+    EventDeleteView can get rid of events for you.  Just ask:
+
+        >>> from schooltool.app.browser.cal import EventDeleteView
+        >>> request = TestRequest(form={'event_id': 'killme',
+        ...                             'date': '2005-02-03'})
+        >>> view = EventDeleteView(cal, request)
+        >>> view.handleEvent()
+
+        >>> martyr in cal
+        False
+        >>> innocent in cal
+        True
+
+    As a side effect, you will be shown your way to the calendar view:
+
+        >>> def redirected(request, person='person'):
+        ...     if view.request.response.getStatus() != 302:
+        ...         return False
+        ...     location = view.request.response.getHeader('Location')
+        ...     expected = 'http://127.0.0.1/%s/calendar' % (person, )
+        ...     assert location == expected, location
+        ...     return True
+        >>> redirected(request)
+        True
+
+    Invalid requests to delete events will be ignored, and you will be bounced
+    back to where you came from:
+
+        >>> request = TestRequest(form={'event_id': 'idontexist',
+        ...                             'date': '2005-02-03'})
+        >>> request.setPrincipal(ConformantStub(None))
+        >>> view = EventDeleteView(cal, request)
+        >>> view.handleEvent()
+
+        >>> redirected(request)
+        True
+
+    That was easy.  Now the hard part: recurrent events.  Let's create one.
+
+        >>> dtstart = datetime(2005, 2, 3, 12, 15)
+        >>> exceptions = [date(2005, 2, 4), date(2005, 2, 6)]
+        >>> rrule = DailyRecurrenceRule(exceptions=exceptions)
+        >>> recurrer = CalendarEvent(dtstart, timedelta(hours=3), "Recurrer",
+        ...                          unique_id='rec', recurrence=rrule)
+        >>> cal.addEvent(recurrer)
+
+    Now, if we try to delete this event, the view will not know what to do,
+    so it will return an event to be shown for the user.
+
+        >>> request = TestRequest(form={'event_id': 'rec',
+        ...                             'date': '2005-02-05'})
+        >>> view = EventDeleteView(cal, request)
+        >>> event = view.handleEvent()
+        >>> event is recurrer
+        True
+        >>> redirected(request)
+        False
+
+    The event has not been touched, because we did not issue a command.  We'll
+    just check that no exceptions have been added:
+
+        >>> cal.find('rec').recurrence.exceptions
+        (datetime.date(2005, 2, 4), datetime.date(2005, 2, 6))
+
+    We can easily return back to the daily view:
+
+        >>> request.form['CANCEL'] = 'Cancel'
+        >>> view.handleEvent()
+        >>> redirected(request)
+        True
+        >>> del request.form['CANCEL']
+
+    OK.  First, let's try and delete only the current recurrence:
+
+        >>> request.form['CURRENT'] = 'Current'
+        >>> view.handleEvent()
+        >>> redirected(request)
+        True
+
+    As a result, a new exception date should have been added:
+
+        >>> cal.find('rec').recurrence.exceptions[-1]
+        datetime.date(2005, 2, 5)
+
+    Now, if we decide to remove all exceptions in the future, the recurrence
+    rule's until argument will be updated:
+
+        >>> del request.form['CURRENT']
+        >>> request.form['FUTURE'] = 'Future'
+        >>> view.handleEvent()
+        >>> redirected(request)
+        True
+
+        >>> cal.find('rec').recurrence.until
+        datetime.date(2005, 2, 4)
+
+    Finally, let's remove the event altogether.
+
+        >>> del request.form['FUTURE']
+        >>> request.form['ALL'] = 'All'
+        >>> view.handleEvent()
+
+    The event has kicked the bucket:
+
+        >>> cal.find('rec')
+        Traceback (most recent call last):
+        ...
+        KeyError: 'rec'
+
+    We will need one more short-lived event:
+
+        >>> rrule = recurrer.recurrence
+        >>> evt = CalendarEvent(dtstart, timedelta(hours=3), "Butterfly",
+        ...                     unique_id='butterfly', recurrence=rrule)
+        >>> cal.addEvent(evt)
+
+    If we try to modify the event's recurrence rule and the event never
+    occurs as a result, the event is removed from the calendar.  For example,
+    as our event only occurs until Februrary 4th (which is an exception
+    anyway), when we add an exception for the 3rd too, the event should be
+    gone with the wind.
+
+        >>> request.form = {'event_id': 'butterfly', 'date': '2005-02-03',
+        ...                 'CURRENT': 'Current'}
+        >>> view.handleEvent()
+        >>> cal.find('butterfly')
+        Traceback (most recent call last):
+        ...
+        KeyError: 'butterfly'
+
+    There is also a catch with deleting future events -- both `count`
+    and `until` can not be set.
+
+        >>> rrule = DailyRecurrenceRule(count=5)
+        >>> evt = CalendarEvent(dtstart, timedelta(hours=3), "Butterfly",
+        ...                     unique_id='counted', recurrence=rrule)
+        >>> cal.addEvent(evt)
+
+        >>> request.form = {'event_id': 'counted', 'date': '2005-02-08',
+        ...                 'FUTURE': 'Future'}
+        >>> view.handleEvent()
+        >>> cal.find('counted').recurrence
+        DailyRecurrenceRule(1, None, datetime.date(2005, 2, 7), ())
+
+    Overlaid events should have their removal links pointing to their
+    source calendars so they are not handled:
+
+        >>> cal2 = Calendar(Person()) # a dummy calendar
+        >>> owner = container['friend'] = Person('friend')
+        >>> info = owner.overlaid_calendars.add(cal)
+        >>> info = owner.overlaid_calendars.add(cal2)
+        >>> request = TestRequest(form={'event_id': 'counted',
+        ...                             'date': '2005-02-03'})
+        >>> request.setPrincipal(ConformantStub(owner))
+
+        >>> view = EventDeleteView(ISchoolToolCalendar(owner), request)
+        >>> print view.handleEvent()
+        None
+
+
+    Note that if the context calendar's parent is different from the
+    principal's calendar, overlaid events are not even scanned.
+
+        >>> foe = container['foe'] = Person('foe')
+        >>> view.context.__parent__ = foe
+
+        >>> print view.handleEvent()
+        None
+
+    """
+
+
+class TestDailyCalendarRowsView(NiceDiffsMixin, unittest.TestCase):
+
+    def setUp(self):
+        setUp()
+        sbsetup.setUpCalendaring()
+
+        # set up adaptation (the view checks user preferences)
+        from schooltool.person.preference import getPersonPreferences
+        from schooltool.person.interfaces import IPersonPreferences
+        from schooltool.person.person import Person
+        ztapi.provideAdapter(Person, IPersonPreferences, getPersonPreferences)
+
+        # set up the site
+        app = sbsetup.setUpSchoolToolSite()
+
+        self.person = app['persons']['person'] = Person('person')
+
+        # set up the timetable schema
+        days = ['A', 'B', 'C']
+        schema = self.createSchema(days,
+                                   ['1', '2', '3', '4'],
+                                   ['1', '2', '3', '4'],
+                                   ['1', '2', '3', '4'])
+        schema.timezone = 'Europe/London'
+        template = SchooldayTemplate()
+        template.add(SchooldaySlot(time(8, 0), timedelta(hours=1)))
+        template.add(SchooldaySlot(time(10, 15), timedelta(hours=1)))
+        template.add(SchooldaySlot(time(11, 30), timedelta(hours=1)))
+        template.add(SchooldaySlot(time(12, 30), timedelta(hours=2)))
+        schema.model = SequentialDaysTimetableModel(days, {None: template})
+
+        app['ttschemas']['default'] = schema
+
+        # set up terms
+        from schooltool.term.term import Term
+        app['terms']['term'] = term = Term("Some term", date(2004, 9, 1),
+                                           date(2004, 12, 31))
+        term.add(date(2004, 11, 5))
+
+    def tearDown(self):
+        tearDown()
+
+    def createSchema(self, days, *periods_for_each_day):
+        """Create a timetable schema."""
+        from schooltool.timetable.schema import TimetableSchema
+        from schooltool.timetable.schema import TimetableSchemaDay
+        schema = TimetableSchema(days, title="A Schema")
+        for day, periods in zip(days, periods_for_each_day):
+            schema[day] = TimetableSchemaDay(list(periods))
+        return schema
+
+    def test_calendarRows(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        from schooltool.app.security import Principal
+
+        request = TestRequest()
+        principal = Principal('person', 'Some person', person=self.person)
+        request.setPrincipal(principal)
+        view = DailyCalendarRowsView(ISchoolToolCalendar(self.person), request)
+        result = list(view.calendarRows(date(2004, 11, 5), 8, 19))
+
+        expected = [("1", dt('08:00'), timedelta(hours=1)),
+                    ("9:00", dt('09:00'), timedelta(hours=1)),
+                    ("10:00", dt('10:00'), timedelta(minutes=15)),
+                    ("2", dt('10:15'), timedelta(hours=1)),
+                    ("11:15", dt('11:15'), timedelta(minutes=15)),
+                    ("3", dt('11:30'), timedelta(hours=1)),
+                    ("4", dt('12:30'), timedelta(hours=2)),
+                    ("14:30", dt('14:30'), timedelta(minutes=30)),
+                    ("15:00", dt('15:00'), timedelta(hours=1)),
+                    ("16:00", dt('16:00'), timedelta(hours=1)),
+                    ("17:00", dt('17:00'), timedelta(hours=1)),
+                    ("18:00", dt('18:00'), timedelta(hours=1))]
+
+        self.assertEquals(result, expected)
+
+    def test_calendarRows_otherTZ(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        from schooltool.app.security import Principal
+
+        request = TestRequest()
+        principal = Principal('person', 'Some person', person=self.person)
+        request.setPrincipal(principal)
+        view = DailyCalendarRowsView(ISchoolToolCalendar(self.person), request)
+
+        km = timezone('Asia/Kamchatka')
+        view.getPersonTimezone = lambda: km
+
+        result = list(view.calendarRows(date(2004, 11, 5), 8, 19))
+
+        kmdt = lambda arg: km.localize(parse_datetime('2004-11-05 %s:00' %
+                                                      arg))
+
+        expected = [('8:00', kmdt('8:00'), timedelta(0, 3600)),
+                    ('9:00', kmdt('9:00'), timedelta(0, 3600)),
+                    ('10:00', kmdt('10:00'),timedelta(0, 3600)),
+                    ('11:00', kmdt('11:00'),timedelta(0, 3600)),
+                    ('12:00', kmdt('12:00'),timedelta(0, 3600)),
+                    ('13:00', kmdt('13:00'),timedelta(0, 3600)),
+                    ('14:00', kmdt('14:00'),timedelta(0, 3600)),
+                    ('15:00', kmdt('15:00'),timedelta(0, 3600)),
+                    ('16:00', kmdt('16:00'),timedelta(0, 3600)),
+                    ('17:00', kmdt('17:00'),timedelta(0, 3600)),
+                    ('18:00', kmdt('18:00'),timedelta(0, 3600)),
+                    ('19:00', kmdt('19:00'),timedelta(0, 3600)),
+                    ('1',  kmdt("20:00"), timedelta(0, 3600)),
+                    ('21:00', kmdt("21:00"), timedelta(0, 4500)),
+                    ('2',  kmdt("22:15"), timedelta(0, 3600)),
+                    ('23:15', kmdt("23:15"), timedelta(0, 900)),
+                    ('3', kmdt("23:30"), timedelta(0, 1800))]
+
+        self.assertEquals(result, expected)
+
+    def test_calendarRows_no_periods(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        from schooltool.person.preference import getPersonPreferences
+        from schooltool.app.security import Principal
+
+        prefs = getPersonPreferences(self.person)
+        prefs.cal_periods = False # do not show periods
+        request = TestRequest()
+        principal = Principal('person', 'Some person', person=self.person)
+        request.setPrincipal(principal)
+        view = DailyCalendarRowsView(ISchoolToolCalendar(self.person), request)
+
+        result = list(view.calendarRows(date(2004, 11, 5), 8, 19))
+
+        expected = [("%d:00" % i, dt('%d:00' % i), timedelta(hours=1))
+                    for i in range(8, 19)]
+        self.assertEquals(result, expected)
+
+    def test_calendarRows_default(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+
+        request = TestRequest()
+        # do not set the principal
+        view = DailyCalendarRowsView(ISchoolToolCalendar(self.person), request)
+        result = list(view.calendarRows(date(2004, 11, 5), 8, 19))
+
+        # the default is not to show periods
+        expected = [("%d:00" % i, dt('%d:00' % i), timedelta(hours=1))
+                    for i in range(8, 19)]
+        self.assertEquals(result, expected)
+
+    def test_getPersonTimezone(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        request = TestRequest()
+        view = DailyCalendarRowsView(ISchoolToolCalendar(self.person), request)
+
+        # when there is no principal - the default timezone should be
+        # returned
+        self.assertEquals(view.getPersonTimezone(), timezone('UTC'))
+
+        # but when there is one, we should return his prefered timezone
+        request.setPrincipal(self.person)
+        prefs = IPersonPreferences(self.person)
+        prefs.timezone = 'Europe/Vilnius'
+
+        self.assertEquals(view.getPersonTimezone(), timezone('Europe/Vilnius'))
+
+    def test_getPeriods(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        request = TestRequest()
+        view = DailyCalendarRowsView(ISchoolToolCalendar(self.person), request)
+
+        # if no user has logged we should get an empty list
+        self.assertEquals(view.getPeriods(date(2005, 1, 1)), [])
+
+        # same if our user doesn't want to see periods in his calendar
+        request.setPrincipal(self.person)
+        IPersonPreferences(self.person).cal_periods = False
+        self.assertEquals(view.getPeriods(date(2005, 1, 1)), [])
+
+        # if currently logged in user wants to see periods, the
+        # parameter is passed to getPeriodsForDay method.
+        view.getPeriodsForDay = lambda cursor: ("Yep", cursor)
+        IPersonPreferences(self.person).cal_periods = True
+        self.assertEquals(view.getPeriods(date(2005, 1, 1)),
+                          ("Yep", date(2005, 1, 1)))
+
+
+class TestDailyCalendarRowsView_getPeriodsForDay(NiceDiffsMixin,
+                                                 unittest.TestCase):
+
+    def setUp(self):
+        setup.placefulSetUp()
+        app = sbsetup.setUpSchoolToolSite()
+
+        from schooltool.term.term import Term
+        self.term1 = Term('Sample', date(2004, 9, 1), date(2004, 12, 20))
+        self.term1.schooldays = [('A', time(9,0), timedelta(minutes=115)),
+                                 ('B', time(11,0), timedelta(minutes=115)),
+                                 ('C', time(13,0), timedelta(minutes=115)),
+                                 ('D', time(15,0), timedelta(minutes=115)),]
+        self.term2 = Term('Sample', date(2005, 1, 1), date(2005, 6, 1))
+        self.term2.schooldays = []
+        app["terms"]['2004-fall'] = self.term1
+        app["terms"]['2005-spring'] = self.term2
+
+        class TimetableModelStub:
+            def periodsInDay(this, schooldays, ttschema, date):
+                if date not in schooldays:
+                    raise "This date is not in the current term!"
+                if ttschema == self.tt:
+                    return schooldays.schooldays
+                else:
+                    return []
+
+        tt = TimetableSchema([])
+        tt.model = TimetableModelStub()
+        tt.timezone = 'Europe/London'
+        self.tt = tt
+        app["ttschemas"]['default'] = tt
+        self.app = app
+
+    def tearDown(self):
+        setup.placefulTearDown()
+
+    def test_getPeriodsForDay_sameTZ(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        view = DailyCalendarRowsView(None, TestRequest())
+        uk = timezone('Europe/London')
+        view.getPersonTimezone = lambda: uk
+        delta = timedelta(minutes=115)
+        ukdt = lambda *args: uk.localize(datetime(*args))
+        self.assertEquals(view.getPeriodsForDay(date(2004, 10, 14)),
+                          [('A', ukdt(2004, 10, 14,  9, 0), delta),
+                           ('B', ukdt(2004, 10, 14, 11, 0), delta),
+                           ('C', ukdt(2004, 10, 14, 13, 0), delta),
+                           ('D', ukdt(2004, 10, 14, 15, 0), delta)])
+
+        # However, if there is no time period, we return []
+        self.assertEquals(view.getPeriodsForDay(date(2005, 10, 14)),
+                          [])
+
+        # If there is no timetable schema, we return []
+        self.app["ttschemas"].default_id = None
+        self.assertEquals(view.getPeriodsForDay(date(2004, 10, 14)),
+                          [])
+
+    def test_getPeriodsForDay_otherTZ(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        view = DailyCalendarRowsView(None, TestRequest())
+        # Auckland is 12h ahead of London
+        view.getPersonTimezone = lambda: timezone('Pacific/Auckland')
+        uk = timezone('Europe/London')
+
+        delta = timedelta(minutes=115)
+        td = timedelta
+        ukdt = lambda *args: uk.localize(datetime(*args))
+        self.assertEquals(view.getPeriodsForDay(date(2004, 10, 14)),
+                          [('B', ukdt(2004, 10, 13, 12, 0), td(minutes=55)),
+                           ('C', ukdt(2004, 10, 13, 13, 0), delta),
+                           ('D', ukdt(2004, 10, 13, 15, 0), delta),
+                           ('A', ukdt(2004, 10, 14, 9, 0), delta),
+                           ('B', ukdt(2004, 10, 14, 11, 0), td(minutes=60))])
+
+        # However, if there is no time period, we return []
+        self.assertEquals(view.getPeriodsForDay(date(2005, 10, 14)),
+                          [])
+
+        # If there is no timetable schema, we return []
+        self.app["ttschemas"].default_id = None
+        self.assertEquals(view.getPeriodsForDay(date(2004, 10, 14)),
+                          [])
+
+    def test_getPeriodsForLastDayOfTerm(self):
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        view = DailyCalendarRowsView(None, TestRequest())
+        # We need the start date and the end date different
+        view.getPersonTimezone = lambda: timezone('America/Chicago')
+        self.assertEquals(view.getPeriodsForDay(date(2005, 6, 1)), [])
+
+    def test_getPeriodsForDayBetweenTerms(self):
+        from schooltool.term.term import Term
+        term3 = Term('Sample', date(2005, 6, 2), date(2005, 8, 1))
+        self.app["terms"]['2005-autumn'] = term3
+        term3.schooldays = [('A', time(9,0), timedelta(minutes=115))]
+        self.term2.schooldays = [('B', time(10,0), timedelta(minutes=115))]
+
+        from schooltool.app.browser.cal import DailyCalendarRowsView
+        view = DailyCalendarRowsView(None, TestRequest())
+        # We need the start date and the end date different
+        view.getPersonTimezone = lambda: timezone('America/Chicago')
+        self.assertEquals(len(view.getPeriodsForDay(date(2005, 6, 1))), 1)
+
+
+def doctest_CalendarSTOverlayView():
+    r"""Tests for CalendarSTOverlayView
+
+     Some setup:
+
+        >>> sbsetup.setUpCalendaring()
+
+        >>> from zope.component import provideAdapter
+        >>> from schooltool.app.app import ShowTimetables
+        >>> provideAdapter(ShowTimetables)
+
+        >>> from zope.interface import classImplements
+        >>> from zope.annotation.interfaces import IAttributeAnnotatable
+        >>> from schooltool.app.overlay import CalendarOverlayInfo
+        >>> classImplements(CalendarOverlayInfo, IAttributeAnnotatable)
+
+        >>> from schooltool.app.browser.cal import CalendarSTOverlayView
+        >>> View = SimpleViewClass('../templates/calendar_overlay.pt',
+        ...                        bases=(CalendarSTOverlayView,))
+
+    CalendarOverlayView is a view on anything.
+
+        >>> context = object()
+        >>> request = TestRequest()
+        >>> view = View(context, request)
+
+    It renders to an empty string unless its context is the calendar of the
+    authenticated user
+
+        >>> view()
+        u'\n'
+
+    If you are an authenticated user looking at your own calendar, this view
+    renders a calendar selection portlet.
+
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.course.course import Course
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.app.security import Principal
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> person = app['persons']['whatever'] = Person('fred')
+        >>> group1 = app['groups']['g1'] = Group(title="Group 1")
+        >>> group2 = app['groups']['g2'] = Group(title="Group 2")
+        >>> history = app['courses']['c1'] = Course(title="History")
+        >>> section = app['sections']['s1'] = Section()
+        >>> history.sections.add(section)
+
+        >>> from schooltool.app.interfaces import IShowTimetables
+        >>> info = person.overlaid_calendars.add(
+        ...     ISchoolToolCalendar(group1), show=True)
+        >>> IShowTimetables(info).showTimetables = False
+        >>> info = person.overlaid_calendars.add(
+        ...     ISchoolToolCalendar(group2), show=False)
+        >>> info = person.overlaid_calendars.add(
+        ...     ISchoolToolCalendar(section), show=False)
+
+        >>> request = TestRequest()
+        >>> request.setPrincipal(Principal('id', 'title', person))
+        >>> view = View(ISchoolToolCalendar(person), request)
+
+        >>> print view()
+        <div id="portlet-calendar-overlay" class="portlet">
+        ...
+        ...<input type="checkbox" checked="checked" disabled="disabled" />...
+        ...<input type="checkbox" name="my_timetable"
+                  checked="checked" />...
+        ...My Calendar...
+        ...
+        ...<input type="checkbox" name="overlay:list"
+                  checked="checked" value="/groups/g1" />...
+        ...<input type="checkbox"
+                  name="overlay_timetables:list"
+                  value="/groups/g1" />...
+        ...
+        ...<input type="checkbox" name="overlay:list"
+                  value="/groups/g2" />...
+        ...<input type="checkbox" name="overlay_timetables:list"
+                  checked="checked" value="/groups/g2" />...
+        ...<td style="width: 100%">Group 2</td>...
+        ...
+        ...<input type="checkbox" name="overlay:list"
+                  value="/sections/s1" />...
+        ...<input type="checkbox" name="overlay_timetables:list"
+                  checked="checked" value="/sections/s1" />...
+        ...<td style="width: 100%"> -- History</td>...
+        ...
+        </div>
+
+    If the request has 'OVERLAY_APPLY', CalendarOverlayView applies your
+    changes
+
+        >>> request.form['overlay'] = [u'/groups/g2']
+        >>> request.form['overlay_timetables'] = [u'/groups/g1']
+        >>> request.form['OVERLAY_APPLY'] = u"Apply"
+        >>> print view()
+        <div id="portlet-calendar-overlay" class="portlet">
+        ...
+        ...<input type="checkbox" checked="checked" disabled="disabled" />...
+        ...<input type="checkbox" name="my_timetable" />...
+        ...My Calendar...
+        ...
+        ...<input type="checkbox" name="overlay:list"
+                  value="/groups/g1" />...
+        ...<input type="checkbox"
+                  name="overlay_timetables:list"
+                  checked="checked" value="/groups/g1" />...
+        ...
+        ...<input type="checkbox" name="overlay:list"
+                  checked="checked" value="/groups/g2" />...
+        ...<input type="checkbox" name="overlay_timetables:list"
+                  value="/groups/g2" />...
+        ...
+        </div>
+
+    It also redirects you to request.URL:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    There are two reasons for the redirect: first, part of the page template
+    just rendered might have become invalid when calendar overlay selection
+    changed, second, this lets the user refresh the page without having to
+    experience confirmation dialogs that say "Do you want to POST this form
+    again?".
+
+    If the request has 'OVERLAY_MORE', CalendarOverlayView redirects to
+    calendar_selection.html
+
+        >>> request = TestRequest()
+        >>> request.setPrincipal(Principal('id', 'title', person))
+        >>> request.form['OVERLAY_MORE'] = u"More..."
+        >>> view = View(ISchoolToolCalendar(person), request)
+        >>> content = view()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/persons/fred/calendar_selection.html?nexturl=http%3A//127.0.0.1'
+
+    """
+
+
+def doctest_CalendarListSubscriber(self):
+    """Tests for CalendarListSubscriber.
+
+    This subscriber only has the getCalendars() method.
+
+    This subscriber lists timetable calendars and overlaid calendars
+    as well as the context calendar.  The color of each timetable
+    calendar is the same as of the corresponding personal calendar.
+
+    CalendarListSubscriber.getCalendars returns a list of calendars that
+    should be displayed.  This list always includes the context of
+    the subscriber, but it may also include other calendars as well.
+
+    Some initial setup:
+
+        >>> sbsetup.setUpCalendaring()
+
+    A handful of useful stubs:
+
+        >>> class CalendarStub:
+        ...     def __init__(self, title):
+        ...         self.title = title
+        ...     def _getParent(self):
+        ...         return PersonStub(self.title, self)
+        ...     __parent__ = property(_getParent)
+
+        >>> from zope.interface import implements
+        >>> from schooltool.app.interfaces import IShowTimetables
+        >>> class OverlayInfoStub:
+        ...     implements(IShowTimetables)
+        ...
+        ...     def __init__(self, title, color1, color2,
+        ...                  show=True, showTimetables=True):
+        ...         self.calendar = CalendarStub(title)
+        ...         self.color1 = color1
+        ...         self.color2 = color2
+        ...         self.show = show
+        ...         self.showTimetables = showTimetables
+
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> from schooltool.app.interfaces import IHaveCalendar
+        >>> from schooltool.app.cal import CALENDAR_KEY
+        >>> from zope.interface import implements
+        >>> from zope.annotation.interfaces import IAttributeAnnotatable
+        >>> from schooltool.timetable.interfaces import ICompositeTimetables
+        >>> class PersonStub:
+        ...     implements(IAttributeAnnotatable, IHaveCalendar,
+        ...                ICompositeTimetables)
+        ...     def __init__(self, title, calendar=None):
+        ...         self.title = title
+        ...         self.__annotations__= {CALENDAR_KEY: calendar}
+        ...     def makeTimetableCalendar(self):
+        ...         return CalendarStub(self.title + ' (timetable)')
+        ...     def __conform__(self, interface):
+        ...         if interface is IPersonPreferences:
+        ...             return PreferenceStub()
+        ...     overlaid_calendars = [
+        ...         OverlayInfoStub('Other Calendar', 'red', 'blue',
+        ...                         True, False),
+        ...         OverlayInfoStub('Another Calendar', 'green', 'red',
+        ...                         False, True),
+        ...         OverlayInfoStub('Interesting Calendar', 'yellow', 'white',
+        ...                         True, True),
+        ...         OverlayInfoStub('Boring Calendar', 'brown', 'magenta',
+        ...                         False, False)]
+
+        >>> class PreferenceStub:
+        ...     def __init__(self):
+        ...         self.weekstart = pycalendar.MONDAY
+        ...         self.timeformat = "%H:%M"
+        ...         self.dateformat = "YYYY-MM-DD"
+        ...         self.timezone = 'UTC'
+
+    A simple check:
+
+        >>> from schooltool.app.browser.cal import CalendarListSubscriber
+        >>> import calendar as pycalendar
+        >>> calendar = CalendarStub('My Calendar')
+        >>> request = TestRequest()
+        >>> subscriber = CalendarListSubscriber(calendar, request)
+        >>> for c, col1, col2 in subscriber.getCalendars():
+        ...     print '%s (%s, %s)' % (c.title, col1, col2)
+        My Calendar (#9db8d2, #7590ae)
+        My Calendar (timetable) (#9db8d2, #7590ae)
+
+    If the authenticated user is looking at his own calendar, then
+    a list of overlaid calendars is taken into consideration
+
+        >>> from schooltool.person.interfaces import IPerson
+        >>> class PrincipalStub:
+        ...     def __init__(self):
+        ...         self.person = PersonStub('x', calendar=calendar)
+        ...     def __conform__(self, interface):
+        ...         if interface is IPerson:
+        ...             return self.person
+        >>> principal = PrincipalStub()
+        >>> request.setPrincipal(principal)
+
+        >>> for c, col1, col2 in subscriber.getCalendars():
+        ...     print '%s (%s, %s)' % (c.title, col1, col2)
+        My Calendar (#9db8d2, #7590ae)
+        My Calendar (timetable) (#9db8d2, #7590ae)
+        Other Calendar (red, blue)
+        Another Calendar (timetable) (green, red)
+        Interesting Calendar (yellow, white)
+        Interesting Calendar (timetable) (yellow, white)
+
+    If the person has the current timetable display unchecked, the composite
+    timetable calendar is not included in the list:
+
+        >>> from zope.annotation.interfaces import IAnnotations
+        >>> annotations = IAnnotations(principal.person)
+        >>> from schooltool.app.browser.cal import CalendarSTOverlayView
+        >>> annotations[CalendarSTOverlayView.SHOW_TIMETABLE_KEY] = False
+
+        >>> for c, col1, col2 in subscriber.getCalendars():
+        ...     print '%s (%s, %s)' % (c.title, col1, col2)
+        My Calendar (#9db8d2, #7590ae)
+        Other Calendar (red, blue)
+        Another Calendar (timetable) (green, red)
+        Interesting Calendar (yellow, white)
+        Interesting Calendar (timetable) (yellow, white)
+
+        >>> annotations[CalendarSTOverlayView.SHOW_TIMETABLE_KEY] = True
+
+    Only the timetable is overlaid if the user is looking at someone else's
+    calendar:
+
+        >>> subscriber = CalendarListSubscriber(CalendarStub('Some Calendar'),
+        ...                                     request)
+        >>> for c, col1, col2 in subscriber.getCalendars():
+        ...     print '%s (%s, %s)' % (c.title, col1, col2)
+        Some Calendar (#9db8d2, #7590ae)
+        Some Calendar (timetable) (#9db8d2, #7590ae)
+
+    """
+
+
+def doctest_DaysCache():
+    """Unit tests for DaysCache.
+
+    We will need a pretend expensive computation function that returns
+    a list of dates.  Since it is expensive, we want to see when exactly
+    it gets called.
+
+        >>> from schooltool.app.browser.cal import CalendarDay
+        >>> def expensive_getDays(first, last):
+        ...     print "Computing days from %s to %s" % (first, last)
+        ...     return getDaysStub(first, last)
+
+    Let's create a DaysCache and specify an initial date range for caching.
+
+        >>> from schooltool.app.browser.cal import DaysCache
+        >>> cache = DaysCache(expensive_getDays, date(2005, 6, 7),
+        ...                   date(2005, 7, 9))
+
+        >>> print cache.cache_first, cache.cache_last
+        2005-06-07 2005-07-09
+
+    Extending by the same interval changes nothing
+
+        >>> cache.extend(date(2005, 6, 7), date(2005, 7, 9))
+        >>> print cache.cache_first, cache.cache_last
+        2005-06-07 2005-07-09
+
+    We can extend it by a few days on both ends
+
+        >>> cache.extend(date(2005, 6, 3), date(2005, 7, 4))
+        >>> print cache.cache_first, cache.cache_last
+        2005-06-03 2005-07-09
+
+        >>> cache.extend(date(2005, 6, 11), date(2005, 7, 12))
+        >>> print cache.cache_first, cache.cache_last
+        2005-06-03 2005-07-12
+
+    If we call getDays for a range outside the caching range, the expensive
+    function gets called and its result is returned.
+
+        >>> days = cache.getDays(date(2005, 6, 1), date(2005, 6, 3))
+        Computing days from 2005-06-01 to 2005-06-03
+        >>> [str(day.date) for day in days]
+        ['2005-06-01', '2005-06-02']
+
+    If we do call getDays for a subset of the caching range, the expensive
+    function gets called (once) for the whole range, and subsequent calls
+    do not invoke any expensive computations.
+
+        >>> days = cache.getDays(date(2005, 6, 7), date(2005, 6, 9))
+        Computing days from 2005-06-03 to 2005-07-12
+        >>> [str(day.date) for day in days]
+        ['2005-06-07', '2005-06-08']
+
+        >>> days = cache.getDays(date(2005, 7, 7), date(2005, 7, 9))
+        >>> [str(day.date) for day in days]
+        ['2005-07-07', '2005-07-08']
+
+    Corner case: the whole range
+
+        >>> days = cache.getDays(date(2005, 6, 3), date(2005, 7, 12))
+        >>> [str(day.date) for day in days[:2] + days[-2:]]
+        ['2005-06-03', '2005-06-04', '2005-07-10', '2005-07-11']
+
+    We can we call getDays for a range outside the caching range, if we
+    need to.
+
+        >>> days = cache.getDays(date(2005, 7, 12), date(2005, 7, 14))
+        Computing days from 2005-07-12 to 2005-07-14
+        >>> [str(day.date) for day in days]
+        ['2005-07-12', '2005-07-13']
+
+    You can also call getDays with date ranges overlapping the caching
+    interval, but you'll get no benefit from that.
+
+        >>> days = cache.getDays(date(2005, 6, 1), date(2005, 6, 4))
+        Computing days from 2005-06-01 to 2005-06-04
+        >>> [str(day.date) for day in days]
+        ['2005-06-01', '2005-06-02', '2005-06-03']
+
+        >>> days = cache.getDays(date(2005, 7, 11), date(2005, 7, 14))
+        Computing days from 2005-07-11 to 2005-07-14
+        >>> [str(day.date) for day in days]
+        ['2005-07-11', '2005-07-12', '2005-07-13']
+
+    You will get an assertion error if you try to pass in an invalid date range
+
+        >>> cache.getDays(date(2005, 7, 12), date(2005, 7, 11))
+        Traceback (most recent call last):
+          ...
+        AssertionError: invalid date range: 2005-07-12..2005-07-11
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestCalendarViewBase))
+    suite.addTest(unittest.makeSuite(TestDailyCalendarView))
+    suite.addTest(unittest.makeSuite(TestGetRecurrenceRule))
+    suite.addTest(unittest.makeSuite(TestDailyCalendarRowsView))
+    suite.addTest(unittest.makeSuite(TestDailyCalendarRowsView_getPeriodsForDay))
+    suite.addTest(doctest.DocTestSuite(
+        setUp=setUp, tearDown=tearDown,
+        optionflags=doctest.ELLIPSIS|doctest.REPORT_NDIFF|
+                    doctest.NORMALIZE_WHITESPACE|
+                    doctest.REPORT_ONLY_FIRST_FAILURE))
+    suite.addTest(doctest.DocTestSuite('schooltool.app.browser.cal'))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_cal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_csvimport.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_csvimport.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_csvimport.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,768 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2004 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.browser.csvimport
+
+$Id: test_csvimport.py 6047 2006-05-11 18:31:03Z mg $
+"""
+import unittest
+import datetime
+from StringIO import StringIO
+
+from zope.i18n import translate
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app.testing import ztapi
+
+from schooltool.app.browser.testing import setUp as testSetUp, tearDown
+from schooltool.person.person import Person
+from schooltool.testing import setup
+
+from schooltool.app.browser.csvimport import InvalidCSVError
+from schooltool.common import dedent
+from schooltool.course.course import Course
+from schooltool.course.section import Section
+from schooltool.timetable.interfaces import ITimetables
+
+__metaclass__ = type
+
+
+def setUp(test=None):
+    testSetUp(test)
+
+    from zope.annotation.interfaces import IAttributeAnnotatable
+    from schooltool.timetable import TimetablesAdapter
+    ztapi.provideAdapter(IAttributeAnnotatable, ITimetables,
+                         TimetablesAdapter)
+
+
+def doctest_BaseCSVImporter():
+    r"""Test for BaseCSVImporter
+
+    Set up
+
+        >>> from schooltool.app.browser.csvimport import BaseCSVImporter
+        >>> importer = BaseCSVImporter(None)
+
+    Subclasses need to define the createAndAdd method
+
+        >>> importer.createAndAdd(None)
+        Traceback (most recent call last):
+        ...
+        NotImplementedError: Please override this method in subclasses
+
+    When given a list of CSV rows parseCSVRows should return a list of lists
+
+        >>> data = ["one, two, three", "four, five, six"]
+        >>> importer.parseCSVRows(data)
+        [['one', 'two', 'three'], ['four', 'five', 'six']]
+
+    parseCSVRows can also set errors should they occur
+
+        >>> data = ["one, \xff"]
+        >>> importer.charset = 'UTF-8'
+        >>> importer.parseCSVRows(data)
+        >>> translate(importer.errors.generic[0])
+        u'Conversion to unicode failed in line 1'
+
+    Moving on, importFromCSV calls createAndAdd which we have not defined
+
+        >>> csvdata = "one, two, three\nfour, five, six"
+        >>> importer.importFromCSV(csvdata)
+        Traceback (most recent call last):
+        ...
+        NotImplementedError: Please override this method in subclasses
+
+    We need to make a subclass to test this properly
+
+        >>> class TestCSVImporter(BaseCSVImporter):
+        ...     def __init__(self):
+        ...         BaseCSVImporter.__init__(self, None, 'UTF-8')
+        ...     def createAndAdd(self, data, True):
+        ...         pass
+
+        >>> myimporter = TestCSVImporter()
+
+    importFromCSV just returns True if everything goes well
+
+        >>> myimporter.importFromCSV(csvdata)
+        True
+
+    False is returned if there are errors
+
+        >>> myimporter.importFromCSV("one, two\nthree, \xff")
+        False
+        >>> translate(myimporter.errors.generic[0])
+        u'Conversion to unicode failed in line 2'
+
+    """
+
+
+def doctest_ImportErrorCollection():
+    r"""
+    Make the class
+
+        >>> from schooltool.app.browser.csvimport import ImportErrorCollection
+        >>> errors = ImportErrorCollection()
+        >>> errors
+        <ImportErrorCollection {'generic': [], 'fields': []}>
+
+    anyErrors returns True if there are errors and False if not
+
+        >>> errors.anyErrors()
+        False
+        >>> errors.fields.append('A Sample Error Message')
+        >>> errors.anyErrors()
+        True
+
+    """
+
+
+class TestTimetableCSVImportView(unittest.TestCase):
+
+    def setUp(self):
+        setUp()
+        self.app = setup.setUpSchoolToolSite()
+
+        from schooltool.timetable.schema import TimetableSchema
+        from schooltool.timetable.schema import TimetableSchemaDay
+        ttschema = TimetableSchema(["1","2","3"])
+        for day in range(1, 4):
+            ttschema[str(day)] = TimetableSchemaDay([str(day)])
+        self.app['ttschemas']['three-day'] = ttschema
+
+        from schooltool.term.term import Term
+        self.app['terms']['fall'] = Term("Fall term",
+                                         datetime.datetime(2004, 1, 1),
+                                         datetime.datetime(2004, 5, 1))
+
+    def tearDown(self):
+        tearDown()
+
+    def createView(self, form=None):
+        from schooltool.app.browser.csvimport import TimetableCSVImportView
+        if form is None:
+            form = {}
+        request = TestRequest(form=form)
+        return TimetableCSVImportView(self.app, request)
+
+    def test_getCharset(self):
+        view = self.createView(form={'charset': 'UTF-8',
+                                     'other_charset': ''})
+        self.assertEquals(view.getCharset(), 'UTF-8')
+        self.failIf(view.errors)
+
+        view = self.createView(form={'charset': 'other',
+                                     'other_charset': 'ISO-8859-1'})
+        self.assertEquals(view.getCharset(), 'ISO-8859-1')
+        self.failIf(view.errors)
+
+        view = self.createView(form={'charset': 'bogus-charset',
+                                     'other_charset': ''})
+        self.assertEquals(view.getCharset(), None)
+        self.assertEquals(view.errors, ['Unknown charset'])
+
+        view = self.createView(form={'charset': 'other',
+                                     'other_charset': 'bogus-charset'})
+        self.assertEquals(view.getCharset(), None)
+        self.assertEquals(view.errors, ['Unknown charset'])
+
+    def test_dummy_update(self):
+        view = self.createView()
+        view.update()
+        self.failIf(view.errors)
+        self.failIf(view.success)
+
+    def test_POST_csvfile(self):
+        tt_csv_text = '"fall","three-day"\n""\n""'
+        tt_csv = StringIO(tt_csv_text)
+        view = self.createView(form={'csvfile': tt_csv,
+                                     'csvtext': tt_csv_text,
+                                     'charset': 'UTF-8',
+                                     'UPDATE_SUBMIT': 'Submit'})
+        view.update()
+        self.assertEquals(view.success,
+                          ["CSV file imported successfully.",
+                           "CSV text imported successfully."],
+                          view.errors)
+        self.assertEquals(view.errors, [])
+
+    def test_POST_empty(self):
+        view = self.createView(form={'timetable.csv': '',
+                                     'roster.txt': '',
+                                     'charset': 'UTF-8',
+                                     'UPDATE_SUBMIT': 'Submit'})
+        view.update()
+        self.assertEquals(view.errors, ['No data provided'])
+
+    def test_POST_invalid_charset(self):
+        tt_csv = StringIO('"A","\xff","C","D"')
+        view = self.createView(form={'csvfile': tt_csv,
+                                     'charset': 'UTF-8',
+                                     'UPDATE_SUBMIT': 'Submit'})
+        view.update()
+        self.assertEquals(view.errors, ["Could not convert data to Unicode"
+                                        " (incorrect charset?)."])
+
+    def test_POST_utf8(self):
+        ttschema = self.app["ttschemas"][u'three-day']
+        self.app["ttschemas"][u'three-day \u263b'] = ttschema
+        tt_csv = StringIO('"fall","three-day \xe2\x98\xbb"\n""\n""')
+        view = self.createView(form={'csvfile': tt_csv,
+                                     'charset': 'UTF-8',
+                                     'UPDATE_SUBMIT': 'Submit'})
+        view.update()
+        self.assertEquals(view.success, ['CSV file imported successfully.'])
+
+
+class TestTimetableCSVImporter(unittest.TestCase):
+
+    days = ("Monday", "Tuesday", "Wednesday")
+    periods = ("A", "B", "C")
+
+    def setUp(self):
+        setUp()
+
+        # Set up a name chooser to pick names for new sections.
+        from schooltool.course.interfaces import ISectionContainer
+        from schooltool.app.app import SimpleNameChooser
+        from zope.app.container.interfaces import INameChooser
+        ztapi.provideAdapter(ISectionContainer, INameChooser,
+                             SimpleNameChooser)
+
+        self.app = app = setup.setUpSchoolToolSite()
+
+        self.course = app['courses']['philosophy'] = Course(title="Philosophy")
+        self.section = app['sections']['section'] = Section(title="Something")
+
+        # set a timetable schema
+        from schooltool.timetable.schema import TimetableSchema
+        from schooltool.timetable.schema import TimetableSchemaDay
+        ttschema = TimetableSchema(self.days)
+        for day in self.days:
+            ttschema[day] = TimetableSchemaDay(self.periods)
+        self.app["ttschemas"]['three-day'] = ttschema
+
+        from schooltool.term.term import Term
+        term = Term("Summer term",
+                    datetime.datetime(2004, 1, 1),
+                    datetime.datetime(2004, 5, 1))
+        self.app["terms"]["summer"] = term
+
+        term2 = Term("Fall term",
+                    datetime.datetime(2004, 1, 1),
+                    datetime.datetime(2004, 5, 1))
+        self.app["terms"]["fall"] = term2
+
+        # add some people and groups
+        for title in ['Curtin', 'Lorch', 'Guzman']:
+            name = title.lower()
+            self.app['persons'][name] = Person(name, title)
+        for title in ['Math1', 'Math2', 'Math3',
+                      'English1', 'English2', 'English3']:
+            name = title.lower()
+            self.app['courses'][name] = Course(title)
+
+    def tearDown(self):
+        tearDown()
+
+    def createImporter(self, term=None, ttschema=None, charset=None):
+        from schooltool.app.browser.csvimport import TimetableCSVImporter
+        importer = TimetableCSVImporter(self.app['sections'], charset=charset)
+        if term is not None:
+            importer.term = self.app['terms'][term]
+        if ttschema is not None:
+            importer.ttschema = self.app['ttschemas'][ttschema]
+        return importer
+
+    def test_importSections(self):
+        imp = self.createImporter()
+
+        log = []
+        imp.importHeader = lambda row: log.append(('header', row))
+        imp.importChunks = lambda row, dry_run: \
+                                    log.append(('chunks', row, dry_run))
+
+        sections_csv = '"1"\n""\n"3"\n"4"\n'
+        imp.importSections(sections_csv)
+        self.assertEquals(log,
+                          [('header', ['1']),
+                           ('chunks', [['3'], ['4']], True),
+                           ('chunks', [['3'], ['4']], False)])
+
+    def test_importSections_errors(self):
+        # empty CSV
+        imp = self.createImporter()
+        self.assertRaises(InvalidCSVError, imp.importSections, '')
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "No data provided")
+
+        self.assertRaises(InvalidCSVError, imp.importSections, '"foo"')
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "No data provided")
+
+        # invalid CSV
+        imp = self.createImporter()
+        self.assertRaises(InvalidCSVError, imp.importSections,
+                          '\n'.join(['"invalid"', '"csv"', '"follows']))
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "Error in timetable CSV data, line 3")
+
+        # Data on second line
+        imp = self.createImporter()
+        self.assertRaises(InvalidCSVError, imp.importSections,
+                          '\n'.join(['"ok"', '"not here!"', '"ok"']))
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "Row 2 is not empty")
+
+        def b0rker(*args, **kwarsg): imp.errors.anyErrors = lambda: True
+        def k1ller(*args, **kwarsg): raise InvalidCSVError()
+        def w1nner(*args, **kwarsg): return [1, 2, 3]
+
+        imp.parseCSVRows = k1ller
+        self.assertRaises(InvalidCSVError, imp.importSections, '\n')
+        imp.errors.anyErrors = lambda: False
+
+        imp.parseCSVRows = w1nner
+        imp.importHeader = b0rker
+        self.assertRaises(InvalidCSVError, imp.importSections, '\n')
+        imp.errors.anyErrors = lambda: False
+
+        imp.importHeader = w1nner
+        imp.importChunks = b0rker
+        self.assertRaises(InvalidCSVError, imp.importSections, '\n')
+
+    def test_importSections_functional(self):
+        imp = self.createImporter()
+        data = dedent("""\
+            "summer","three-day"
+            "","",""
+            "philosophy","lorch"
+            "Monday","A"
+            "Monday","B"
+            "Tuesday","C"
+            "***"
+            "guzman"
+            "curtin"
+            ""
+            "philosophy","guzman",""
+            "Wednesday","B",""
+            "Wednesday","C"
+            "***"
+            "curtin"
+            "lorch"
+        """)
+        imp.importSections(data)
+
+        # Let's do a little snooping around.  We don't have to be very
+        # verbose as this test mostly checks integration; the components
+        # are tested well individually.
+
+        persons = self.app['persons']
+        sections = self.app['sections']
+
+        # Check out the created sections.
+        philosophy_lorch = sections['philosophy--lorch']
+        philosophy_guzman = sections['philosophy--guzman']
+
+        self.assertEquals(list(philosophy_lorch.instructors),
+                          [persons['lorch']])
+        self.assert_(persons['guzman'] in philosophy_lorch.members)
+        self.assert_(persons['curtin'] in philosophy_lorch.members)
+        self.assert_(persons['lorch'] not in philosophy_lorch.members)
+
+        self.assertEquals(list(philosophy_guzman.instructors),
+                          [persons['guzman']])
+        self.assert_(persons['guzman'] not in philosophy_guzman.members)
+        self.assert_(persons['curtin'] in philosophy_guzman.members)
+        self.assert_(persons['lorch'] in philosophy_guzman.members)
+
+        # Look at the timetables of the sections
+        lorch_tt = ITimetables(philosophy_lorch).timetables['summer.three-day']
+        self.assertEquals(len(list(lorch_tt.activities())), 3)
+        # Look at a couple of periods.
+        self.assertEquals(len(lorch_tt['Monday']['B']), 1)
+        self.assertEquals(len(lorch_tt['Monday']['C']), 0)
+
+        # Look closer into an activity.
+        activity = list(lorch_tt['Monday']['A'])[0]
+        self.assert_(activity.owner is philosophy_lorch)
+
+        # Finally, let's make sure that we can import the same data
+        # several times without crashing.
+        imp.importSections(data)
+
+    def test_importHeader(self):
+        # too many fields on first row
+        imp = self.createImporter()
+        imp.importHeader(["too", "many", "fields"])
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "The first row of the CSV file must contain"
+                          " the term id and the timetable schema id.")
+
+        # nonexistent term
+        imp = self.createImporter()
+        imp.importHeader(["winter", "three-day"])
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "The term winter does not exist.")
+
+        # nonexistent timetable schema
+        imp = self.createImporter()
+        imp.importHeader(["summer", "four-day"])
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "The timetable schema four-day does not exist.")
+
+    def test_importChunks(self):
+        lines = [[]]
+        imp = self.createImporter()
+
+        importchunk_calls = []
+        def importChunkStub(rows, line, dry_run=True):
+            importchunk_calls.append((rows, line, dry_run))
+        imp.importChunk = importChunkStub
+
+        # no input
+        # TODO we might want to raise an error in this case
+        lines = []
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls, [])
+        importchunk_calls = []
+
+        # trivial case: one single-line entry
+        lines = [['hi']]
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls, [([['hi']], 3, True)])
+        importchunk_calls = []
+
+        # another trivial case: one chunk
+        lines = [['hi'], ['yadda'], ['yadda'], ['bye']]
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls, [(lines, 3, True)])
+        importchunk_calls = []
+
+        # two one-line chunks separated by an empty line
+        lines = [['hi'], [], ['bye']]
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls,
+                          [([['hi']], 3, True),
+                           ([['bye']], 5, True)])
+        importchunk_calls = []
+
+        # two one-line chunks separated by several empty lines
+        lines = [['hi'], [], [], [], ['bye']]
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls,
+                          [([['hi']], 3, True),
+                           ([['bye']], 7, True)])
+        importchunk_calls = []
+
+        # two several-line chunks separated by several empty lines
+        lines = [['hi'], ['foo'], [], [], [], ['bye'], ['really!']]
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls,
+                          [([['hi'], ['foo']], 3, True),
+                           ([['bye'], ['really!']], 8, True)])
+        importchunk_calls = []
+
+        # leading empty lines
+        lines = [[], [], [], ['hi']]
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls, [([['hi']], 6, True)])
+        importchunk_calls = []
+
+        # trailing empty lines
+        lines = [['hi'], [], [], []]
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls, [([['hi']], 3, True)])
+        importchunk_calls = []
+
+        # several empty lines only
+        # TODO we might want to raise an error in this case
+        lines = [[], [], []]
+        imp.importChunks(lines, dry_run=True)
+        self.assertEquals(importchunk_calls, [])
+        importchunk_calls = []
+
+    def test_createSection(self):
+        imp = self.createImporter(term='fall', ttschema='three-day')
+
+        course = self.app['courses']['philosophy']
+        instructor = self.app['persons']['lorch']
+        periods = [('Monday', 'A'),
+                   ('Tuesday', 'C')]
+
+        # dry run
+        section = imp.createSection(course, instructor,
+                                    periods=periods, dry_run=True)
+        self.assert_(section is None)
+
+        # real run
+        section = imp.createSection(course, instructor,
+                                    periods=periods, dry_run=False)
+
+        # Check name
+        self.assertEquals(section.__name__, 'philosophy--lorch')
+
+        # Check links
+        self.assert_(course in section.courses)
+        self.assert_(instructor in section.instructors)
+
+        # Check timetable
+        tt = ITimetables(section).timetables['fall.three-day']
+        self.assertEquals(len(tt.activities()), 2)
+
+        # Check activities in timetable
+        acts = tt['Monday']['A']
+        self.assertEquals(len(acts), 1)
+        act = list(acts)[0]
+        self.assertEquals(act.title, course.title)
+        self.assert_(act.owner is section)
+        self.assert_(act.timetable is tt)
+
+        acts = tt['Tuesday']['C']
+        self.assertEquals(len(acts), 1)
+        act = list(acts)[0]
+        self.assertEquals(act.title, course.title)
+        self.assert_(act.owner is section)
+
+        # If the same data is imported a second time, nothing should change.
+        section2 = imp.createSection(course, instructor,
+                                     periods=periods, dry_run=False)
+        self.assert_(section2 is section)
+        self.assert_(ITimetables(section).timetables['fall.three-day'] is tt)
+        self.assertEquals(len(tt.activities()), 2)
+
+    def test_createSection_existing(self):
+        imp = self.createImporter(term='fall', ttschema='three-day')
+
+        course = self.app['courses']['philosophy']
+        instructor = self.app['persons']['lorch']
+        periods = [('Monday', 'A'),
+                   ('Tuesday', 'C')]
+
+        title = 'Philosophy - Lorch'
+        section = self.app['sections']['oogabooga'] = Section(title=title)
+        tt = imp.ttschema.createTimetable()
+        ITimetables(section).timetables['fall.three-day'] = tt
+
+        # real run
+        section2 = imp.createSection(course, instructor,
+                                     periods=periods, dry_run=False)
+
+        self.assert_(section is section2)
+        self.assert_(ITimetables(section).timetables['fall.three-day'] is tt)
+
+    def test_importChunk(self):
+        imp = self.createImporter(term='fall', ttschema='three-day')
+
+        lines = [['philosophy', 'curtin'],
+                 ['Monday', 'A'],
+                 ['Wednesday', 'B'],
+                 ['***'],
+                 ['lorch'],
+                 ['guzman']]
+
+        imp.importChunk(lines, 5, dry_run=False)
+        self.failIf(imp.errors.anyErrors(), imp.errors)
+
+        philosophy_curtin = self.app['sections']['philosophy--curtin']
+        tt = ITimetables(philosophy_curtin).timetables['fall.three-day']
+        activities = tt.activities()
+        self.assertEquals(len(activities), 2)
+
+        # Let's stub out createSection and importPersons and make sure that the
+        # right arguments are passed.
+        imp = self.createImporter(term='fall', ttschema='three-day')
+        section_log = []
+        stub_section = self.section
+        def createSectionStub(course, instructor, periods, dry_run=True):
+            section_log.append((course, instructor, periods, dry_run))
+            return stub_section
+        imp.createSection = createSectionStub
+        persons_log = []
+        def importPersonsStub(person_data, section, dry_run=True):
+            persons_log.append((person_data, section, dry_run))
+        imp.importPersons = importPersonsStub
+
+        # invoke the method
+        imp.importChunk(lines, 5, dry_run=False)
+        self.failIf(imp.errors.anyErrors(), imp.errors)
+
+        # check the logs
+        philosophy = self.course
+        curtin = self.app['persons']['curtin']
+        expected_periods = [('Monday', 'A'),
+                            ('Wednesday', 'B')]
+        self.assertEquals(section_log,
+                          [(philosophy, curtin, expected_periods, False)])
+        lines_expected = [['lorch'], ['guzman']]
+        self.assertEquals(persons_log, [(lines_expected, stub_section, False)])
+
+    def test_importChunk_errors_top(self):
+        # only provide the top row
+        lines = [['relativity_theory', 'einstein']]
+        imp = self.createImporter()
+        imp.importChunk(lines, line=5)
+        self.assertEquals(imp.errors.courses, ['relativity_theory'])
+        self.assertEquals(imp.errors.persons, ['einstein'])
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          'Incomplete section description on line 5')
+
+    def test_importChunk_errors_wrong_header(self):
+        # only provide the top row
+        lines = [['relativity_theory']]
+        imp = self.createImporter()
+        imp.importChunk(lines, line=5)
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          u'Wrong section header on line 5 (it should contain'
+                          ' a course id and an instructor id)')
+
+    def test_importChunk_errors_period(self):
+        # provide a row for a period too
+        lines = [['relativity_theory', 'einstein'],
+                 ['day x', 'period y']]
+        imp = self.createImporter(term='fall', ttschema='three-day')
+        imp.importChunk(lines, line=5)
+        self.assertEquals(imp.errors.day_ids, ['day x'])
+        self.assertEquals(imp.errors.periods, [])
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          'Incomplete section description on line 5')
+
+    def test_importChunk_errors_wrong_period_descr(self):
+        # miss out on the period id
+        lines = [['relativity_theory', 'einstein'],
+                 ['Monday'],
+                 ['Saturday', 'is', 'my', 'favourite', 'day']]
+        imp = self.createImporter(term='fall', ttschema='three-day')
+        imp.importChunk(lines, line=5)
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          'Malformed line 6 (it should contain a day id and'
+                          ' a period id)')
+        self.assertEquals(translate(imp.errors.generic[1]),
+                          'Malformed line 7 (it should contain a day id and'
+                          ' a period id)')
+
+    def test_importChunk_errors_persons(self):
+        # an extra row for a period and a terminator -- the section is still
+        # malformed
+        lines = [['relativity_theory', 'einstein'],
+                 ['day x', 'ZZZ'],
+                 ['Tuesday', 'ZZZ'],
+                 ['***']]
+        imp = self.createImporter(term='fall', ttschema='three-day')
+        imported_person_data = []
+        def importPersonsStub(person_data, section, dry_run):
+            imported_person_data.append((person_data, section, dry_run))
+        imp.importPersons = importPersonsStub
+
+        imp.importChunk(lines, line=5)
+        self.assertEquals(imp.errors.day_ids, ['day x'])
+        self.assertEquals(imp.errors.periods, ['ZZZ'])
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          'No students in section (line 9)')
+        # importPersons did not get called
+        self.assertEquals(imported_person_data, [])
+
+        # add a bogus person, and importPersons will get called
+        lines.append(['bogus_person', 'extra', 'stuff'])
+        imp = self.createImporter(term='fall', ttschema='three-day')
+        imp.importPersons = importPersonsStub
+        imp.importChunk(lines, line=5)
+        self.assertEquals(imported_person_data,
+                          [([['bogus_person', 'extra', 'stuff']], None, True)])
+
+    def test_importPersons(self):
+        imp = self.createImporter(term='fall', ttschema='three-day')
+        lines = [['curtin'], ['lorch']]
+        imp.importPersons(lines, self.section, dry_run=False)
+        self.failIf(imp.errors.anyErrors(), imp.errors)
+
+        persons = self.app['persons']
+        self.assert_(persons['curtin'] in self.section.members)
+        self.assert_(persons['lorch'] in self.section.members)
+        self.assert_(persons['guzman'] not in self.section.members)
+
+        # Try the same import a second time.
+        imp.importPersons(lines, self.section, dry_run=False)
+        self.failIf(imp.errors.anyErrors(), imp.errors)
+
+        self.assert_(persons['curtin'] in self.section.members)
+        self.assert_(persons['lorch'] in self.section.members)
+        self.assert_(persons['guzman'] not in self.section.members)
+
+    def test_importPersons_errors(self):
+        lines = [['007'], # nonexistent person
+                 ['curtin'],
+                 ['007'], # duplicate
+                 ['008']]
+        imp = self.createImporter(term='fall', ttschema='three-day')
+        imp.importPersons(lines, None, dry_run=True)
+        self.assertEquals(imp.errors.generic, [])
+        self.assertEquals(imp.errors.persons, ['007', '008'])
+
+    def test_parseCSVRows(self):
+        # simple case
+        imp = self.createImporter()
+        result = imp.parseCSVRows(['"some "," stuff"', '"here"'])
+        self.assertEquals(result, [["some", "stuff"], ["here"]])
+        self.failIf(imp.errors.anyErrors(), imp.errors)
+
+        # invalid CSV
+        imp = self.createImporter()
+        self.assertRaises(InvalidCSVError,
+                          imp.parseCSVRows, ['"invalid"', '"csv"', '"follows'])
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "Error in timetable CSV data, line 3")
+
+        # test conversion to unicode
+        imp = self.createImporter(charset='UTF-8')
+        result = imp.parseCSVRows(['"Weird stuff: \xe2\x98\xbb"'])
+        self.assertEquals(result, [[u"Weird stuff: \u263b"]])
+
+        # test invalid charset
+        imp = self.createImporter(charset='UTF-8')
+        self.assertRaises(InvalidCSVError,
+                          imp.parseCSVRows, ['"B0rken stuff: \xe2"'])
+        self.assertEquals(translate(imp.errors.generic[0]),
+                          "Conversion to unicode failed in line 1")
+
+        # test string sanitization
+        imp = self.createImporter(charset='UTF-8')
+        result = imp.parseCSVRows(['', ',', '"",""', 'hi', '"some ","data"',
+                                   '"two",""," \t ","elements"',
+                                   '"cut","","the","tail",,,""'])
+        self.failIf(imp.errors.anyErrors(), imp.errors)
+        self.assertEquals(result, [[], [], [], ['hi'], ['some', 'data'],
+                                   ['two', '', '', 'elements'],
+                                   ['cut', '', 'the', 'tail']])
+
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestTimetableCSVImportView))
+    suite.addTest(unittest.makeSuite(TestTimetableCSVImporter))
+    suite.addTest(doctest.DocTestSuite(
+        setUp=setUp, tearDown=tearDown,
+        optionflags=doctest.ELLIPSIS|doctest.REPORT_NDIFF))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_csvimport.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_overlay.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_overlay.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_overlay.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,515 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool views.
+
+$Id: test_overlay.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+
+from zope.testing import doctest
+from zope.interface import classImplements
+from zope.publisher.browser import TestRequest
+from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.testing import ztapi
+
+from schooltool.app.browser.testing import setUp as browserSetUp, tearDown
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.testing import setup
+
+
+def setUp(test=None):
+    browserSetUp(test)
+    setup.setUpCalendaring()
+
+    from schooltool.app.overlay import CalendarOverlayInfo
+    from schooltool.app.interfaces import IShowTimetables
+    from schooltool.app.app import ShowTimetables
+    ztapi.provideAdapter(CalendarOverlayInfo, IShowTimetables, ShowTimetables)
+    classImplements(CalendarOverlayInfo, IAttributeAnnotatable)
+
+
+def doctest_CalendarOverlayView():
+    r"""Tests for CalendarOverlayView
+
+    Some initial setup:
+
+        >>> from schooltool.app.browser.cal import CalendarSTOverlayView
+        >>> View = SimpleViewClass('../templates/calendar_overlay.pt',
+        ...                        bases=(CalendarSTOverlayView,))
+
+    CalendarOverlayView is a view on anything.
+
+        >>> context = object()
+        >>> request = TestRequest()
+        >>> view = View(context, request)
+
+    It renders to an empty string unless its context is the calendar of the
+    authenticated user
+
+        >>> view()
+        u'\n'
+
+    If you are an authenticated user looking at your own calendar, this view
+    renders a calendar selection portlet.
+
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.app.security import Principal
+        >>> app = setup.setUpSchoolToolSite()
+        >>> person = app['persons']['whatever'] = Person('fred')
+        >>> group1 = app['groups']['g1'] = Group(title="Group 1")
+        >>> group2 = app['groups']['g2'] = Group(title="Group 2")
+        >>> person.overlaid_calendars.add(ISchoolToolCalendar(group1))
+        <...CalendarOverlayInfo object at ...>
+        >>> person.overlaid_calendars.add(ISchoolToolCalendar(group2),
+        ...                               show=False)
+        <...CalendarOverlayInfo object at ...>
+
+        >>> request = TestRequest()
+        >>> request.setPrincipal(Principal('id', 'title', person))
+        >>> view = View(ISchoolToolCalendar(person), request)
+
+        >>> print view()
+        <div id="portlet-calendar-overlay" class="portlet">
+        ...
+        <td><input type="checkbox" name="overlay:list"
+               checked="checked" value="/groups/g1" /></td>
+        ...
+        <td><input type="checkbox" name="overlay:list"
+               value="/groups/g2" /></td>
+        ...
+        </div>
+
+    If the request has 'OVERLAY_APPLY', CalendarOverlayView applies your
+    changes
+
+        >>> request.form['overlay'] = [u'/groups/g2']
+        >>> request.form['OVERLAY_APPLY'] = u"Apply"
+        >>> print view()
+        <div id="portlet-calendar-overlay" class="portlet">
+        ...
+        <td><input type="checkbox" name="overlay:list"
+               value="/groups/g1" /></td>
+        ...
+        <td><input type="checkbox" name="overlay:list"
+               checked="checked" value="/groups/g2" /></td>
+        ...
+        </div>
+
+    It also redirects you to request.URL:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    There are two reasons for the redirect: first, part of the page template
+    just rendered might have become invalid when calendar overlay selection
+    changed, second, this lets the user refresh the page without having to
+    experience confirmations dialogs that say "Do you want to POST this form
+    again?".
+
+    If the request has 'OVERLAY_MORE', CalendarOverlayView redirects to
+    calendar_selection.html
+
+        >>> request = TestRequest()
+        >>> request.setPrincipal(Principal('id', 'title', person))
+        >>> request.form['OVERLAY_MORE'] = u"More..."
+        >>> view = View(ISchoolToolCalendar(person), request)
+        >>> content = view()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/persons/fred/calendar_selection.html?nexturl=http%3A//127.0.0.1'
+
+    """
+
+
+def doctest_CalendarOverlayView_items():
+    """Tests for CalendarOverlayView.items().
+
+        >>> from schooltool.app.browser.overlay import CalendarOverlayView
+
+    We will need some persons and groups for the demonstration.
+
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person
+        >>> app = setup.setUpSchoolToolSite()
+        >>> person = app['persons']['p1'] = Person('p1', title="Person")
+        >>> group1 = app['groups']['g1'] = Group(title="Group 1")
+        >>> group2 = app['groups']['g2'] = Group(title="Group 2")
+
+    When the person has no calendars in his overlay list, items returns
+    an empty list
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> from schooltool.app.security import Principal
+        >>> request = TestRequest()
+        >>> request.setPrincipal(Principal('', '', person))
+        >>> context = ISchoolToolCalendar(person)
+        >>> view = CalendarOverlayView(context, request)
+        >>> view.items()
+        []
+
+    When the person has calendars in his overlay list
+
+        >>> person.overlaid_calendars.add(ISchoolToolCalendar(group2))
+        <...CalendarOverlayInfo object at ...>
+        >>> person.overlaid_calendars.add(ISchoolToolCalendar(group1),
+        ...                               show=False)
+        <...CalendarOverlayInfo object at ...>
+
+        >>> from zope.testing.doctestunit import pprint
+        >>> pprint(view.items())
+        [{'calendar': <schooltool.app.cal.Calendar object at ...>,
+          'checked': '',
+          'color1': '#eed680',
+          'color2': '#d1940c',
+          'id': u'/groups/g1',
+          'title': 'Group 1'},
+         {'calendar': <schooltool.app.cal.Calendar object at ...>,
+          'checked': 'checked',
+          'color1': '#e0b6af',
+          'color2': '#c1665a',
+          'id': u'/groups/g2',
+          'title': 'Group 2'}]
+
+    """
+
+
+def doctest_CalendarSelectionView():
+    """Tests for CalendarSelectionView
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> from zope.app.testing import ztapi
+        >>> ztapi.provideAdapter(ISchoolToolApplication,
+        ...                      IApplicationPreferences,
+        ...                      getApplicationPreferences)
+        >>> from schooltool.app.browser.overlay import CalendarSelectionView
+        >>> View = SimpleViewClass('../templates/calendar_selection.pt',
+        ...                        bases=(CalendarSelectionView,))
+
+    CalendarSelectionView is a view on IPerson
+
+        >>> from schooltool.resource.resource import Resource
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.app.security import Principal
+        >>> app = setup.setUpSchoolToolSite()
+        >>> persons = app['persons']
+        >>> groups = app['groups']
+        >>> resources = app['resources']
+        >>> fred = persons['fred'] = Person('fred', 'Fred F.')
+        >>> eric = persons['eric'] = Person('eric', 'Eric Bjornsen')
+        >>> igor = persons['igor'] = Person('igor', 'Igor')
+        >>> admins = groups['admins'] = Group('Administrators')
+        >>> car = resources['car'] = Resource('Company car')
+        >>> request = TestRequest()
+        >>> request.setPrincipal(Principal('fred', '', fred))
+        >>> view = View(fred, request)
+
+    It lists Eric's, Igor's calendars and the site-wide calendar as available
+    for selection
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+            Select calendars to display
+        ...
+              <legend>Public Calendar</legend>
+              <label>
+                <input type="checkbox" name="application"
+                       value="application" />
+        ...
+            <fieldset class="inline">
+              <legend>People</legend>
+              <select size="8" multiple="multiple" id="people"
+                      name="persons:list">
+                <option value="eric">Eric Bjornsen</option>
+                <option value="igor">Igor</option>
+              </select>
+            </fieldset>
+        <BLANKLINE>
+            <fieldset class="inline">
+              <legend>Groups</legend>
+              <select size="8" multiple="multiple" id="groups"
+                      name="groups:list">
+                <option value="admins">Administrators</option>
+              </select>
+            </fieldset>
+        <BLANKLINE>
+            <fieldset class="inline">
+              <legend>Resources</legend>
+              <select size="8" multiple="multiple" id="resources"
+                      name="resources:list">
+                <option value="car">Company car</option>
+              </select>
+            </fieldset>
+        ...
+
+    If a person's calendar is added to your overlaid calendars list, you
+    can see that in the form.
+
+        >>> fred.overlaid_calendars.add(ISchoolToolCalendar(eric), show=False)
+        <...CalendarOverlayInfo object at ...>
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+              <select size="8" multiple="multiple" id="people"
+                      name="persons:list">
+                <option selected="selected" value="eric">Eric Bjornsen</option>
+                <option value="igor">Igor</option>
+              </select>
+        ...
+
+    Note that the user does not see his own calendar in that list:
+
+        >>> 'value="fred"' in view()
+        False
+
+    We can submit that form
+
+        >>> request.form["persons"] = [u"eric", u"igor"]
+        >>> request.form["groups"] = [u"admins"]
+        >>> request.form["resources"] = [u"car"]
+        >>> request.form["UPDATE_SUBMIT"] = u"Apply"
+        >>> print view()
+        <BLANKLINE>
+        ...
+              <select size="8" multiple="multiple" id="people"
+                      name="persons:list">
+                <option selected="selected" value="eric">Eric Bjornsen</option>
+                <option selected="selected" value="igor">Igor</option>
+              </select>
+        ...
+
+    We can see that the calendars we selected were added to the list
+
+        >>> ISchoolToolCalendar(igor) in fred.overlaid_calendars
+        True
+        >>> ISchoolToolCalendar(admins) in fred.overlaid_calendars
+        True
+        >>> ISchoolToolCalendar(car) in fred.overlaid_calendars
+        True
+
+    We can also remove calendars
+
+        >>> request.form["persons"] = [u"igor"]
+        >>> request.form["UPDATE_SUBMIT"] = u"Apply"
+        >>> print view()
+        <BLANKLINE>
+        ...
+              <select size="8" multiple="multiple" id="people"
+                      name="persons:list">
+                <option value="eric">Eric Bjornsen</option>
+                <option selected="selected" value="igor">Igor</option>
+              </select>
+        ...
+
+        >>> ISchoolToolCalendar(eric) in fred.overlaid_calendars
+        False
+
+    When you submit the form, you are redirected back to the original view
+
+        >>> request.form["nexturl"] = 'http://localhost/persons/fred/calendar'
+        >>> request.form["UPDATE_SUBMIT"] = u"Apply"
+        >>> output = view()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://localhost/persons/fred/calendar'
+
+    The same thing happens if you press Cancel:
+
+        >>> request = TestRequest()
+        >>> request.form["nexturl"] = 'http://localhost/persons/fred/calendar'
+        >>> request.form["CANCEL"] = u"Cancel"
+        >>> view = View(fred, request)
+        >>> output = view()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://localhost/persons/fred/calendar'
+
+    Regression test for issue328 (traceback when adding overlays).  This was
+    caused by getApplicationCalendar returning None if it could not access the
+    application calendar.  To solve this we now return an empty dict and check
+    the result in update()
+
+        >>> view.getApplicationCalendar()
+        {}
+        >>> view.update()
+
+    """
+
+
+def doctest_CalendarSelectionView_updateSelection():
+    """Test for CalendarSelectionView._updateSelection
+
+        >>> from schooltool.app.browser.overlay import CalendarSelectionView
+        >>> from schooltool.app.interfaces import IShowTimetables
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.resource.resource import Resource
+        >>> from schooltool.app.cal import Calendar
+        >>> request = TestRequest()
+        >>> context = None
+        >>> view = CalendarSelectionView(context, request)
+        >>> user = Person()
+        >>> book = Resource('A book')
+        >>> beamer = Resource('A beamer')
+        >>> friends = Group('Friends')
+        >>> joe = Person(title='Joe')
+        >>> appcal = Calendar(Resource('Application'))
+
+        >>> def stub_getCalendars(container):
+        ...     if container == 'persons':
+        ...         return [{'id': 'joe',
+        ...                  'title': 'Joe',
+        ...                  'selected': ISchoolToolCalendar(joe)
+        ...                                 in user.overlaid_calendars,
+        ...                  'calendar': ISchoolToolCalendar(joe)}]
+        ...     elif container == 'groups':
+        ...         return [{'id': 'friends',
+        ...                  'title': 'Friends',
+        ...                  'selected': ISchoolToolCalendar(friends)
+        ...                                 in user.overlaid_calendars,
+        ...                  'calendar': ISchoolToolCalendar(friends)}]
+        ...     elif container == 'resources':
+        ...         return [{'id': 'book',
+        ...                  'title': 'The book',
+        ...                  'selected': ISchoolToolCalendar(book)
+        ...                                 in user.overlaid_calendars,
+        ...                  'calendar': ISchoolToolCalendar(book)},
+        ...                 {'id': 'beamer',
+        ...                  'title': 'A beamer',
+        ...                  'selected': ISchoolToolCalendar(beamer)
+        ...                                 in user.overlaid_calendars,
+        ...                  'calendar': ISchoolToolCalendar(beamer)}]
+        ...     else:
+        ...         return []
+        >>> view.getCalendars = stub_getCalendars
+        >>> def stub_getApplicationCalendar():
+        ...     return {'title': 'Applcation',
+        ...             'selected': appcal in user.overlaid_calendars,
+        ...             'calendar': appcal}
+        >>> view.getApplicationCalendar = stub_getApplicationCalendar
+
+        >>> def print_overlays(user=user):
+        ...     l = [(cal.calendar.title, cal)
+        ...          for cal in user.overlaid_calendars]
+        ...     l.sort()
+        ...     for title, info in l:
+        ...         showtt = IShowTimetables(info).showTimetables
+        ...         print '[%s][%s] %s' % (info.show and '+' or '-',
+        ...                                showtt and '+' or '-',
+        ...                                title)
+
+    So, we have two calendars available for selection, but we choose none of
+    them.  Nothing happens.
+
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+
+    We can choose one, and it appears in the overlay list.
+
+        >>> request.form['resources'] = ['beamer']
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+        [+][-] A beamer
+
+    Note that the calendar overlay is visible by default (indicated by '+' in
+    the first checkbox), but the timetable is hidden (indicated by '-' in the
+    second checkbox).
+
+    We can choose both
+
+        >>> request.form['resources'] = ['beamer', 'book']
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+        [+][-] A beamer
+        [+][-] A book
+
+    We can choose one again, and the other disappears
+
+        >>> request.form['resources'] = ['book']
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+        [+][-] A book
+
+    It works with persons and groups as well
+
+        >>> request.form['persons'] = ['joe']
+        >>> request.form['groups'] = ['friends']
+        >>> request.form['resources'] = []
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+        [+][-] Friends
+        [+][+] Joe
+
+    Note that for persons (and only for persons), both the calendar, and the
+    timetable are visible.
+
+        >>> request.form['persons'] = []
+        >>> request.form['groups'] = []
+        >>> request.form['resources'] = []
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+
+    You can choose the application calendar as well
+
+        >>> request.form['application'] = ''
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+        [+][+] Application
+
+    Avoid duplicate additions:
+
+        >>> request.form['application'] = ''
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+        [+][+] Application
+
+    And remove it
+
+        >>> del request.form['application']
+        >>> view._updateSelection(user)
+        >>> print_overlays()
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=doctest.ELLIPSIS|
+                                            doctest.REPORT_NDIFF|
+                                            doctest.NORMALIZE_WHITESPACE))
+    suite.addTest(doctest.DocTestSuite('schooltool.app.browser.overlay'))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_overlay.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_pdfcal.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_pdfcal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_pdfcal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,845 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for SchoolBell calendaring views.
+
+$Id: test_pdfcal.py 6457 2006-10-31 12:02:07Z ignas $
+"""
+
+import os
+import sys
+import unittest
+import calendar
+from datetime import datetime, date, timedelta
+
+from zope.testing import doctest
+from zope.publisher.browser import TestRequest
+from zope.app.testing import setup, ztapi
+from zope.publisher.browser import BrowserView
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app.cal import CalendarEvent
+from schooltool.app.browser.pdfcal import PDFCalendarViewBase
+from schooltool.app.browser.pdfcal import setUpMSTTCoreFonts
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.person.person import Person
+from schooltool.person.interfaces import IPerson
+from schooltool.person.interfaces import IPersonPreferences
+from schooltool.resource.resource import Resource
+from schooltool.testing import setup as sbsetup
+
+
+def pdfSetUp(test=None):
+    setup.placefulSetUp()
+    sbsetup.setUpCalendaring()
+
+
+def pdfTearDown(test=None):
+    setup.placefulTearDown()
+
+
+class StubbedBaseView(PDFCalendarViewBase):
+    """A subclass of PDFCalendarViewBase for use in tests."""
+
+    title = _("Calendar for %s")
+
+    def getCalendars(self):
+        return [self.context]
+
+    def buildEventTables(self, date):
+        events = self.dayEvents(date)
+        return events and [self.buildDayTable(events)] or []
+
+    def dateTitle(self, date):
+        return date.isoformat()
+
+
+def doctest_PDFCalendarViewBase():
+    """Tests for PDFCalendarViewBase.
+
+        >>> request = TestRequest(form={'date': '2005-07-08'})
+        >>> person = Person(title="Mr. Smith")
+        >>> view = StubbedBaseView(ISchoolToolCalendar(person), request)
+
+        >>> print view.pdfdata()
+        %PDF-1.3...
+        ...
+
+        >>> request.response.getHeader('Content-Type')
+        'application/pdf'
+        >>> request.response.getHeader('Accept-Ranges')
+        'bytes'
+
+    If we do not specify a date, today is taken by default:
+
+        >>> request = TestRequest()
+        >>> view = StubbedBaseView(ISchoolToolCalendar(person), request)
+
+        >>> print view.pdfdata()
+        %PDF-1.3...
+        ...
+
+    """
+
+
+def doctest_PDFCalendarViewBase_getTimezone():
+    """Tests for PDFCalendarViewBase.getTimezone.
+
+    We need some extra setup here:
+
+        >>> from schooltool.person.interfaces import IPerson
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> from schooltool.person.preference import getPersonPreferences
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> setup.setUpAnnotations()
+        >>> ztapi.provideAdapter(IPerson, IPersonPreferences,
+        ...                      getPersonPreferences)
+
+        >>> request = TestRequest(form={'date': '2005-07-08'})
+        >>> person = Person(title="Mr. Smith")
+        >>> view = StubbedBaseView(ISchoolToolCalendar(person), request)
+        >>> view.getTimezone()
+        <UTC>
+
+        >>> from schooltool.app.browser.tests.test_cal import PrincipalStub
+        >>> principal = PrincipalStub()
+        >>> IPersonPreferences(IPerson(principal)).timezone = "Europe/Vilnius"
+        >>> request.setPrincipal(principal)
+
+        >>> from pytz import timezone
+        >>> view.getTimezone() == timezone('Europe/Vilnius')
+        True
+
+    """
+
+
+def doctest_PDFCalendarViewBase_buildStory():
+    r"""Tests for PDFCalendarViewBase.buildStory.
+
+    buildStory returns a list of platypus objects.
+
+        >>> calendar = ISchoolToolCalendar(Person(title="Mr. Smith"))
+        >>> request = TestRequest(form={'date': '2005-07-08'})
+        >>> view = StubbedBaseView(calendar, request)
+
+        >>> view.configureStyles()
+        >>> view.buildStory(date(2005, 7, 8))
+        [...
+        ...
+        ...]
+
+        >>> evt = CalendarEvent(datetime(2005, 7, 8, 9, 10),
+        ...                     timedelta(minutes=72), "Some event")
+        >>> calendar.addEvent(evt)
+        >>> rsrc = Resource(title='Some resource')
+        >>> evt.bookResource(rsrc)
+
+        >>> story = view.buildStory(date(2005, 7, 8))
+        >>> len(story)
+        3
+        >>> story[0].text
+        'Calendar for Mr. Smith'
+        >>> story[1].text
+        '2005-07-08'
+        >>> story[2]._cellvalues[0][0].text
+        '09:10-10:22'
+        >>> evt_info = story[2]._cellvalues[0][1]
+        >>> len(evt_info)
+        2
+        >>> evt_info[0].text
+        'Some event'
+        >>> evt_info[1].text
+        'Booked resources: Some resource'
+
+    """
+
+
+def doctest_PDFCalendarViewBase_buildStory_unicode():
+    r"""Tests for PDFCalendarViewBase.buildStory.
+
+    Unicode text is treated properly:
+
+        >>> person = Person(title=u"\u0105 person")
+        >>> calendar = ISchoolToolCalendar(person)
+        >>> evt = CalendarEvent(datetime(2005, 7, 8, 9, 10),
+        ...                     timedelta(hours=5), u"\u0105 event")
+        >>> calendar.addEvent(evt)
+        >>> rsrc = Resource(title=u"\u0105 resource")
+        >>> evt.bookResource(rsrc)
+
+        >>> request = TestRequest(form={'date': '2005-07-08'})
+        >>> view = StubbedBaseView(calendar, request)
+        >>> view.configureStyles()
+        >>> story = view.buildStory(date(2005, 7, 8))
+
+        >>> len(story)
+        3
+        >>> story[0].text
+        'Calendar for \xc4\x85 person'
+        >>> story[1].text
+        '2005-07-08'
+        >>> evt_info = story[2]._cellvalues[0][1]
+        >>> len(evt_info)
+        2
+        >>> evt_info[0].text
+        '\xc4\x85 event'
+        >>> evt_info[1].text
+        'Booked resources: \xc4\x85 resource'
+
+    """
+
+
+def test_buildPageHeader():
+    r"""Tests for PDFCalendarViewBase.buildPageHeader.
+
+        >>> request = TestRequest(form={'date': '2005-07-08'})
+        >>> view = StubbedBaseView(ISchoolToolCalendar(Person()), request)
+
+        >>> view.configureStyles()
+        >>> paras = view.buildPageHeader(u'\0105n owner', date(2005, 7, 3))
+
+        >>> len(paras)
+        2
+        >>> paras[0].text
+        'Calendar for \x085n owner'
+        >>> paras[1].text
+        '2005-07-03'
+
+    """
+
+
+def test_disabled():
+    """Test for PDFCalendarViewBase in disabled state.
+
+        >>> from schooltool.app.browser import pdfcal
+        >>> real_pdfcal_disabled = pdfcal.disabled
+
+    Reset the disabled flag to True for the moment:
+
+        >>> pdfcal.disabled = True
+
+    The PDFCalendarViewBase.pdfdata returns a message:
+
+        >>> view = pdfcal.PDFCalendarViewBase(object(), TestRequest())
+        >>> view.pdfdata()
+        u'PDF support is disabled.  It can be enabled by your administrator.'
+
+    Clean up:
+
+        >>> pdfcal.disabled = real_pdfcal_disabled
+
+    """
+
+
+def doctest_PDFCalendarViewBase_dayEvents():
+    """Event listing tests.
+
+        >>> calendar = ISchoolToolCalendar(Person(title="Mr. Smith"))
+        >>> resource = Resource()
+        >>> calendar2 = ISchoolToolCalendar(resource)
+        >>> request = TestRequest(form={'date': '2005-07-08'})
+        >>> view = StubbedBaseView(calendar, request)
+        >>> view.getCalendars = lambda: [calendar, calendar2]
+
+    First check the simple case when the calendar is empty:
+
+        >>> view.dayEvents(date(2005, 7, 8))
+        []
+
+    Let's add one event.
+
+        >>> evt = CalendarEvent(datetime(2005, 7, 8, 9, 10),
+        ...                     timedelta(hours=5), "evt")
+        >>> calendar.addEvent(evt)
+
+    The event should appear in the result
+
+        >>> view.dayEvents(date(2005, 7, 8)) == [evt]
+        True
+
+        >>> view.dayEvents(date(2005, 7, 9))
+        []
+
+    We will add some events to the other calendar to test overlaying.
+    If several events occur, they should be returned sorted by start time:
+
+        >>> evt2 = CalendarEvent(datetime(2005, 7, 8, 9, 12),
+        ...                      timedelta(hours=5), "evt2")
+        >>> calendar2.addEvent(evt2)
+
+    Let's add a recurring event to check expansion:
+
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+        >>> evt3 = CalendarEvent(datetime(2005, 7, 5, 9, 3),
+        ...                      timedelta(hours=2), "evt3",
+        ...                      recurrence=DailyRecurrenceRule())
+        >>> calendar2.addEvent(evt3)
+
+        >>> result = view.dayEvents(date(2005, 7, 8))
+        >>> [event.title for event in result]
+        ['evt3', 'evt', 'evt2']
+
+    All-day events always appear in front:
+
+        >>> ad_evt = CalendarEvent(datetime(2005, 7, 8, 20, 3),
+        ...                        timedelta(hours=2), "allday", allday=True)
+        >>> calendar.addEvent(ad_evt)
+
+        >>> result = view.dayEvents(date(2005, 7, 8))
+        >>> [event.title for event in result]
+        ['allday', 'evt3', 'evt', 'evt2']
+
+    Booked event dupes are eliminated:
+
+        >>> evt.bookResource(resource)
+        >>> result = view.dayEvents(date(2005, 7, 8))
+        >>> [event.title for event in result]
+        ['allday', 'evt3', 'evt', 'evt2']
+
+    """
+
+def doctest_PDFCalendarViewBase_dayEvents_timezone():
+    """Let's test that dayEvents handles timezones correctly.
+
+    First' let's someone setup the user a timezone:
+
+        >>> from schooltool.person.interfaces import IPerson
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> from schooltool.person.preference import getPersonPreferences
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> setup.setUpAnnotations()
+        >>> ztapi.provideAdapter(IPerson, IPersonPreferences,
+        ...                      getPersonPreferences)
+        >>> from schooltool.app.browser.tests.test_cal import PrincipalStub
+        >>> principal = PrincipalStub()
+        >>> IPersonPreferences(IPerson(principal)).timezone = "Europe/Vilnius"
+
+    Let's create a calendar and a view:
+
+        >>> calendar = ISchoolToolCalendar(Person(title="Mr. Smith"))
+        >>> request = TestRequest()
+        >>> request.setPrincipal(principal)
+        >>> view = StubbedBaseView(calendar, request)
+
+    Let's add several edge-case events to the user's calendar:
+
+        >>> from pytz import utc
+        >>> calendar.addEvent(
+        ...     CalendarEvent(datetime(2005, 7, 7, 20, 0, tzinfo=utc),
+        ...                   timedelta(minutes=10), '20Z'))
+        >>> calendar.addEvent(
+        ...     CalendarEvent(datetime(2005, 7, 7, 21, 0, tzinfo=utc),
+        ...                   timedelta(minutes=10), '21Z'))
+        >>> calendar.addEvent(
+        ...     CalendarEvent(datetime(2005, 7, 7, 22, 0, tzinfo=utc),
+        ...                   timedelta(minutes=10), '22Z'))
+
+        >>> calendar.addEvent(
+        ...     CalendarEvent(datetime(2005, 7, 8, 19, 0, tzinfo=utc),
+        ...                   timedelta(minutes=10), '19Z+1d'))
+        >>> calendar.addEvent(
+        ...     CalendarEvent(datetime(2005, 7, 8, 20, 0, tzinfo=utc),
+        ...                   timedelta(minutes=10), '20Z+1d'))
+        >>> calendar.addEvent(
+        ...     CalendarEvent(datetime(2005, 7, 8, 21, 0, tzinfo=utc),
+        ...                   timedelta(minutes=10), '21Z+1d'))
+
+    We should get only the events that fall into July 8 in Vilnius
+    timezone:
+
+        >>> result = view.dayEvents(date(2005, 7, 8))
+        >>> [event.title for event in result]
+        ['21Z', '22Z', '19Z+1d', '20Z+1d']
+
+
+    """
+
+def doctest_PDFCalendarViewBase_buildEventTable():
+    """Tests for buildEventTable.
+
+        >>> from schooltool.person.interfaces import IPerson
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> from schooltool.person.preference import getPersonPreferences
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> setup.setUpAnnotations()
+        >>> ztapi.provideAdapter(IPerson, IPersonPreferences,
+        ...                      getPersonPreferences)
+        >>> from schooltool.app.browser.tests.test_cal import PrincipalStub
+        >>> principal = PrincipalStub()
+        >>> IPersonPreferences(IPerson(principal)).timezone = "Europe/Vilnius"
+
+        >>> calendar = ISchoolToolCalendar(Person(title="Mr. Smith"))
+        >>> request = TestRequest(form={'date': '2005-07-08'})
+        >>> request.setPrincipal(principal)
+        >>> view = StubbedBaseView(calendar, request)
+        >>> view.configureStyles()
+
+    Let's check the representation of an ordinary event:
+
+        >>> from pytz import utc
+        >>> evt = CalendarEvent(datetime(2005, 7, 8, 9, 10, tzinfo=utc),
+        ...                     timedelta(hours=2), "Some event")
+        >>> calendar.addEvent(evt)
+
+        >>> table = view.buildDayTable([evt])
+        >>> table._cellvalues[0][0].text
+        '12:10-14:10'
+        >>> table._cellvalues[0][1][0].text
+        'Some event'
+
+    All-day events are identified as such.
+
+        >>> evt = CalendarEvent(datetime(2005, 7, 8, 9, 10),
+        ...                     timedelta(hours=2), "evt3", allday=True)
+        >>> calendar.addEvent(evt)
+
+        >>> table = view.buildDayTable([evt])
+        >>> table._cellvalues[0][0].text
+        'all day'
+
+    """
+
+
+def doctest_PDFCalendarViewBase_eventInfoCell():
+    r"""Tests for buildEventTable.
+
+        >>> calendar = ISchoolToolCalendar(Person(title="Mr. Smith"))
+        >>> request = TestRequest(form={'date': '2005-07-08'})
+        >>> view = StubbedBaseView(calendar, request)
+        >>> view.configureStyles()
+
+    In case of a simple event, only the title is shown:
+
+        >>> evt = CalendarEvent(datetime(2005, 7, 8, 9, 10),
+        ...                     timedelta(hours=2), "Some event")
+        >>> calendar.addEvent(evt)
+        >>> paragraphs = view.eventInfoCell(evt)
+        >>> len(paragraphs)
+        1
+        >>> paragraphs[0].text
+        'Some event'
+
+    If the event is recurrent, it is flagged.  The location, if provided,
+    is also indicated.
+
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+        >>> evt = CalendarEvent(datetime(2005, 7, 8, 9, 10),
+        ...                     timedelta(hours=2), "Some event",
+        ...                     location=u"\u0105 location",
+        ...                     recurrence=DailyRecurrenceRule())
+        >>> calendar.addEvent(evt)
+        >>> paragraphs = view.eventInfoCell(evt)
+        >>> len(paragraphs)
+        3
+        >>> paragraphs[1].text
+        'Location: \xc4\x85 location'
+        >>> paragraphs[2].text
+        '(recurrent)'
+
+    Overlaid events are also recognized.
+
+        >>> calendar2 = ISchoolToolCalendar(Person(title='Mr. X'))
+        >>> evt.__parent__ = calendar2
+        >>> paragraphs = view.eventInfoCell(evt)
+        >>> paragraphs[2].text
+        '(recurrent, overlaid from Mr. X)'
+
+    """
+
+
+def doctest_DailyPDFCalendarView():
+    r"""Tests for DailyPDFCalendarView.
+
+        >>> from schooltool.app.browser.pdfcal import DailyPDFCalendarView
+        >>> calendar = ISchoolToolCalendar(Person())
+        >>> request = TestRequest(form={'date': '2005-07-01'})
+        >>> view = DailyPDFCalendarView(calendar, request)
+        >>> view.getCalendars = lambda: [calendar]
+
+    The view's dateTitle method returns the representation of the date shown:
+
+        >>> view.dateTitle(date(2005, 7, 1))
+        u'2005-07-01, Friday'
+
+    First, let's make sure that an empty calendar is rendered properly:
+
+        >>> print view.pdfdata()
+        %PDF-1.3...
+        ...
+
+    In this case buildEventTables should return an empty list:
+
+        >>> view.buildEventTables(date(2005, 7, 1))
+        []
+
+    Let's add a few events and make sure that no crashes occur:
+
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 7, 1, 9, 10),
+        ...                                 timedelta(hours=2), "Some event"))
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 7, 1, 9, 50),
+        ...                                 timedelta(hours=3), u"An event"))
+
+        >>> print view.pdfdata()
+        %PDF-1.3...
+        ...
+
+    buildEventTables now returns one table.
+
+        >>> tables = view.buildEventTables(date(2005, 7, 1))
+        >>> len(tables)
+        1
+        >>> tables[0]
+        Table(...
+        ...
+
+    """
+
+
+def doctest_WeeklyPDFCalendarView():
+    r"""Tests for WeeklyPDFCalendarView.
+
+        >>> from schooltool.app.browser.pdfcal import WeeklyPDFCalendarView
+        >>> calendar = ISchoolToolCalendar(Person())
+        >>> request = TestRequest(form={'date': '2005-07-01'})
+        >>> view = WeeklyPDFCalendarView(calendar, request)
+        >>> view.getCalendars = lambda: [calendar]
+
+    The view's dateTitle method returns the representation of the date shown:
+
+        >>> view.dateTitle(date(2005, 7, 1))
+        u'Week 26 (2005-06-27 - 2005-07-04), 2005'
+
+    First, let's make sure that an empty calendar is rendered properly:
+
+        >>> print view.pdfdata()
+        %PDF-1.3...
+        ...
+
+    In this case buildEventTables should return an empty list:
+
+        >>> view.buildEventTables(date(2005, 7, 1))
+        []
+
+    Let's add a few events and make sure that no crashes occur:
+
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 7, 1, 9, 10),
+        ...                                 timedelta(hours=2), "Some event"))
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 7, 1, 9, 50),
+        ...                                 timedelta(hours=3), u"An event"))
+
+        >>> print view.pdfdata()
+        %PDF-1.3...
+        ...
+
+    buildEventTables now returns one headline for July 1st and a table.
+
+        >>> tables = view.buildEventTables(date(2005, 7, 1))
+        >>> len(tables)
+        2
+        >>> print tables[0].text
+        2005-07-01, Friday
+        >>> tables[1]
+        Table(...
+        ...
+
+    If we add an event on some other day
+
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 7, 3, 9, 10),
+        ...                                 timedelta(hours=2), "Some event"))
+
+    buildEventTables will return two tables with headlines:
+
+        >>> tables = view.buildEventTables(date(2005, 7, 1))
+        >>> len(tables)
+        4
+        >>> print tables[0].text
+        2005-07-01, Friday
+        >>> tables[1]
+        Table(...
+        ...
+        >>> print tables[2].text
+        2005-07-03, Sunday
+        >>> tables[3]
+        Table(...
+        ...
+
+    """
+
+
+def doctest_MonthlyPDFCalendarView():
+    r"""Tests for MonthlyPDFCalendarView.
+
+        >>> from schooltool.app.browser.pdfcal import MonthlyPDFCalendarView
+        >>> calendar = ISchoolToolCalendar(Person())
+        >>> request = TestRequest(form={'date': '2005-07-01'})
+        >>> view = MonthlyPDFCalendarView(calendar, request)
+        >>> view.getCalendars = lambda: [calendar]
+
+    The view's dateTitle method returns the representation of the date shown:
+
+        >>> view.dateTitle(date(2005, 7, 1))
+        u'July, 2005'
+
+    First, let's make sure that an empty calendar is rendered properly:
+
+        >>> print view.pdfdata()
+        %PDF-1.3...
+        ...
+
+    In this case buildEventTables should return an empty list:
+
+        >>> view.buildEventTables(date(2005, 7, 1))
+        []
+
+    Let's add a few events and make sure that no crashes occur:
+
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 7, 1, 9, 10),
+        ...                                 timedelta(hours=2), "Some event"))
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 7, 1, 9, 50),
+        ...                                 timedelta(hours=3), u"An event"))
+
+        >>> print view.pdfdata()
+        %PDF-1.3...
+        ...
+
+    buildEventTables now returns one headline for July 1st and a table.
+
+        >>> tables = view.buildEventTables(date(2005, 7, 1))
+        >>> len(tables)
+        2
+        >>> print tables[0].text
+        2005-07-01, Friday
+        >>> tables[1]
+        Table(...
+        ...
+
+    Let's add some more events.
+
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 7, 31, 9, 10),
+        ...                                 timedelta(hours=2), "Some event"))
+
+    And corner cases, which should not appear in the report:
+
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 6, 30, 9, 10),
+        ...                                 timedelta(hours=2), "No event"))
+        >>> calendar.addEvent(CalendarEvent(datetime(2005, 8, 1, 9, 10),
+        ...                                 timedelta(hours=2), "No event"))
+
+    buildEventTables will return two tables with headlines.  The events
+    that do not fall on the current month will be omitted.
+
+        >>> tables = view.buildEventTables(date(2005, 7, 1))
+        >>> len(tables)
+        4
+        >>> print tables[0].text
+        2005-07-01, Friday
+        >>> tables[1]
+        Table(...
+        ...
+        >>> print tables[2].text
+        2005-07-31, Sunday
+        >>> tables[3]
+        Table(...
+        ...
+
+    """
+
+
+def doctest_setUpMSTTCoreFonts():
+    r"""TrueType font setup tests.
+
+        >>> from schooltool.app.browser import pdfcal
+
+    The actual setup has been done at import-time by the test_suite function.
+    We only test the results here.
+
+    Let's check that the TrueType fonts have been configured:
+
+        >>> from reportlab.pdfbase import pdfmetrics
+
+        >>> pdfmetrics.getFont('Times_New_Roman')
+        <reportlab.pdfbase.ttfonts.TTFont instance at ...>
+        >>> pdfmetrics.getFont('Times_New_Roman_Bold')
+        <reportlab.pdfbase.ttfonts.TTFont instance at ...>
+        >>> pdfmetrics.getFont('Times_New_Roman_Italic')
+        <reportlab.pdfbase.ttfonts.TTFont instance at ...>
+        >>> pdfmetrics.getFont('Times_New_Roman_Bold_Italic')
+        <reportlab.pdfbase.ttfonts.TTFont instance at ...>
+
+        >>> pdfmetrics.getFont('Arial_Normal')
+        <reportlab.pdfbase.ttfonts.TTFont instance at ...>
+        >>> pdfmetrics.getFont('Arial_Bold')
+        <reportlab.pdfbase.ttfonts.TTFont instance at ...>
+        >>> pdfmetrics.getFont('Arial_Italic')
+        <reportlab.pdfbase.ttfonts.TTFont instance at ...>
+        >>> pdfmetrics.getFont('Arial_Bold_Italic')
+        <reportlab.pdfbase.ttfonts.TTFont instance at ...>
+
+    For our Serif font (normal paragraphs), the bold/italic mappings
+    are registered:
+
+        >>> from reportlab.lib.fonts import tt2ps, ps2tt
+
+        >>> tt2ps('Times_New_Roman', 0, 0)
+        'Times_New_Roman'
+        >>> tt2ps('Times_New_Roman', 1, 0)
+        'Times_New_Roman_Bold'
+        >>> tt2ps('Times_New_Roman', 0, 1)
+        'Times_New_Roman_Italic'
+        >>> tt2ps('Times_New_Roman', 1, 1)
+        'Times_New_Roman_Bold_Italic'
+
+        >>> ps2tt('Times_New_Roman')
+        ('times_new_roman', 0, 0)
+        >>> ps2tt('Times_New_Roman_Bold')
+        ('times_new_roman', 1, 0)
+        >>> ps2tt('Times_New_Roman_Italic')
+        ('times_new_roman', 0, 1)
+        >>> ps2tt('Times_New_Roman_Bold_Italic')
+        ('times_new_roman', 1, 1)
+
+        >>> tt2ps('Arial_Normal', 0, 0)
+        'Arial_Normal'
+        >>> tt2ps('Arial_Normal', 1, 0)
+        'Arial_Bold'
+        >>> tt2ps('Arial_Normal', 0, 1)
+        'Arial_Italic'
+        >>> tt2ps('Arial_Normal', 1, 1)
+        'Arial_Bold_Italic'
+
+        >>> ps2tt('Arial_Normal')
+        ('arial_normal', 0, 0)
+        >>> ps2tt('Arial_Bold')
+        ('arial_normal', 1, 0)
+        >>> ps2tt('Arial_Italic')
+        ('arial_normal', 0, 1)
+        >>> ps2tt('Arial_Bold_Italic')
+        ('arial_normal', 1, 1)
+
+        >>> pdfcal.SANS
+        'Arial_Normal'
+        >>> pdfcal.SANS_OBLIQUE
+        'Arial_Italic'
+        >>> pdfcal.SANS_BOLD
+        'Arial_Bold'
+        >>> pdfcal.SERIF
+        'Times_New_Roman'
+
+# XXX This part fails on Windows, I don't yet know why.
+#    If the fonts can not be found, setUpMSTTCoreFonts() will
+#    raise an exception:
+#
+#        >>> import reportlab.rl_config
+#        >>> real_path = reportlab.rl_config.TTFSearchPath[-1]
+#        >>> del reportlab.rl_config.TTFSearchPath[-1]
+#
+#        >>> pdfcal.setUpMSTTCoreFonts('/definitely/nonexistent')
+#        Traceback (most recent call last):
+#          ...
+#        TTFError: Can't open file "....ttf"
+#
+#    Clean up:
+#
+#        >>> reportlab.rl_config.TTFSearchPath.append(real_path)
+
+    """
+
+
+def test_getCalendars(self):
+    """Test for PDFCalendarViewBase.getCalendars().
+
+    getCalendars() only delegates the task to the ICalendarProvider
+    subscriber.  We will provide a stub subscriber to test the method.
+
+        >>> class CalendarListSubscriberStub(object):
+        ...     def __init__(self,context, request):
+        ...         pass
+        ...     def getCalendars(self):
+        ...         return [('some calendar', 'color1', 'color2'),
+        ...                 ('another calendar', 'color1', 'color2')]
+
+        >>> from zope.component import provideSubscriptionAdapter
+        >>> from zope.publisher.interfaces.http import IHTTPRequest
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> from schooltool.app.browser.interfaces import ICalendarProvider
+        >>> provideSubscriptionAdapter(CalendarListSubscriberStub,
+        ...                            (ISchoolToolCalendar, IHTTPRequest),
+        ...                            ICalendarProvider)
+
+        >>> from schooltool.app.cal import Calendar
+        >>> view = PDFCalendarViewBase(Calendar(None), TestRequest())
+
+    Now, if we call the method, the output of our stub will be returned:
+
+        >>> view.getCalendars()
+        ['some calendar', 'another calendar']
+
+    """
+
+
+def tryToSetUpReportLab():
+    """Try to set up reportlab.
+
+    Returns True without doing anything if pdfcal.disabled is False.
+
+    Tries to guess the location of fonts.  Returns True on success,
+    False if reportlab is not available or fonts could not be found.
+
+    If something breaks during setUpMSTTCoreFonts, the exception
+    will be propagated up.
+    """
+    try:
+        import reportlab
+    except ImportError:
+        return False # We don't have reportlab, so we can't get anywhere.
+
+    from schooltool.app.browser import pdfcal
+    if not pdfcal.disabled:
+        return True # Assume that reportlab has been configured already.
+
+    # Heuristic to try and find the TrueType fonts.
+    font_dirs = ['/usr/share/fonts/truetype/msttcorefonts', # Debian
+	         '/usr/share/fonts/corefonts', # SuSE
+                 '/usr/X11R6/lib/X11/fonts/drakfont/ttf/', # Mandrake
+                 r'C:\WINDOWS\Fonts']
+    for font_dir in font_dirs:
+        if os.path.exists(os.path.join(font_dir, 'arial.ttf')):
+            setUpMSTTCoreFonts(font_dir)
+            return True
+    else:
+        return False
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite('schooltool.app.browser.pdfcal'))
+    success = tryToSetUpReportLab()
+    if success:
+        docsuite = doctest.DocTestSuite(setUp=pdfSetUp, tearDown=pdfTearDown,
+                                        optionflags=doctest.ELLIPSIS)
+        suite.addTest(docsuite)
+    else:
+        print >> sys.stderr, ("reportlab or TrueType fonts not found;"
+                              " PDF generator tests skipped")
+
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_pdfcal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_skin.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_skin.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_skin.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool.app.browser.skin.
+
+$Id: test_skin.py 6034 2006-05-10 15:00:39Z faassen $
+"""
+
+import unittest
+import pprint
+
+from zope.interface import providedBy
+from zope.testing import doctest
+from zope.app.testing import setup
+from zope.publisher.browser import TestRequest
+from zope.app.publication.zopepublication import BeforeTraverseEvent
+
+def doctest_CalendarEventViewletManager():
+    """Tests for CalendarEventViewletManager.
+
+        >>> from schooltool.app.browser.skin import CalendarEventViewletManager
+        >>> from schooltool.app.browser.skin import ICalendarEventContext
+        >>> viewletManager = CalendarEventViewletManager(None, None, None)
+        >>> ICalendarEventContext.providedBy(viewletManager)
+        True
+
+    """
+
+def doctest_schoolToolTraverseSubscriber():
+    """Tests for schoolToolTraverseSubscriber.
+
+    We subscribe to Zope's BeforeTraverseEvent and apply the SchoolTool skin
+    whenever an ISchoolToolApplication is traversed during URL traversal.
+
+        >>> from schooltool.app.browser.skin import schoolToolTraverseSubscriber
+        >>> from schooltool.skin import ISchoolToolSkin
+        >>> from schooltool.app.app import SchoolToolApplication
+
+        >>> ob = SchoolToolApplication()
+        >>> request = TestRequest()
+        >>> ev = BeforeTraverseEvent(ob, request)
+        >>> schoolToolTraverseSubscriber(ob, ev)
+        >>> ISchoolToolSkin.providedBy(request)
+        True
+        >>> skin = list(providedBy(request).interfaces())[1]
+        >>> skin
+        <InterfaceClass schooltool.skin.skin.ISchoolToolSkin>
+        >>> pprint.pprint(skin.getBases())
+        (<InterfaceClass schooltool.skin.skin.ISchoolToolLayer>,
+         <InterfaceClass zope.publisher.interfaces.browser.IDefaultBrowserLayer>)
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(),
+           ])
+
+
+if __name__ == "__main__":
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/browser/tests/test_skin.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/cal.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/cal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/cal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,280 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolBell calendaring objects.
+
+$Id: cal.py 6487 2006-11-16 15:06:30Z ignas $
+"""
+import base64
+
+from persistent.dict import PersistentDict
+from persistent import Persistent
+from zope.interface import implements
+from zope.schema import getFieldNames
+from zope.component import adapts
+from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations
+from zope.app.container.contained import Contained
+
+from schooltool.calendar.icalendar import read_icalendar
+from schooltool.calendar.interfaces import ICalendar
+from schooltool.calendar.interfaces import ICalendarEvent
+from schooltool.calendar.mixins import CalendarMixin
+from schooltool.calendar.simple import SimpleCalendarEvent
+from schooltool.app.interfaces import ISchoolToolCalendarEvent
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.interfaces import IWriteCalendar
+from schooltool.app.interfaces import IHaveCalendar
+
+
+CALENDAR_KEY = 'schooltool.app.calendar.Calendar'
+
+
+class CalendarEvent(SimpleCalendarEvent, Persistent, Contained):
+    """A persistent calendar event contained in a persistent calendar."""
+
+    implements(ISchoolToolCalendarEvent, IAttributeAnnotatable)
+
+    __parent__ = None
+
+    resources = property(lambda self: self._resources)
+
+    def __init__(self, *args, **kwargs):
+        resources = kwargs.pop('resources', ())
+        SimpleCalendarEvent.__init__(self, *args, **kwargs)
+        self.__name__ = base64.encodestring(self.unique_id).replace('\n', '')
+        self._resources = ()
+        for resource in resources:
+            self.bookResource(resource)
+
+    def __conform__(self, interface):
+        if interface is ICalendar:
+            return self.__parent__
+
+    def bookResource(self, resource):
+        calendar = ISchoolToolCalendar(resource)
+        if resource in self.resources:
+            raise ValueError('resource already booked')
+        if calendar is self.__parent__:
+            raise ValueError('cannot book itself')
+        self._resources += (resource, )
+        if self.__parent__ is not None:
+            calendar.addEvent(self)
+
+    def unbookResource(self, resource):
+        if resource not in self.resources:
+            raise ValueError('resource not booked')
+        self._resources = tuple([r for r in self.resources
+                                 if r is not resource])
+        ISchoolToolCalendar(resource).removeEvent(self)
+
+    @property
+    def owner(self):
+        if self.__parent__:
+            return self.__parent__.__parent__
+        else:
+            return None
+
+
+class Calendar(Persistent, CalendarMixin):
+    """A persistent calendar."""
+
+    # CalendarMixin is only used for the expand() method
+
+    implements(ISchoolToolCalendar, IAttributeAnnotatable)
+
+    __name__ = 'calendar'
+
+    title = property(lambda self: self.__parent__.title)
+
+    def __init__(self, owner):
+        self.events = PersistentDict()
+        self.__parent__ = owner
+
+    def __iter__(self):
+        return self.events.itervalues()
+
+    def __len__(self):
+        return len(self.events)
+
+    def addEvent(self, event):
+        assert ISchoolToolCalendarEvent.providedBy(event)
+        if event.unique_id in self.events:
+            raise ValueError('an event with this unique_id already exists')
+        if event.__parent__ is None:
+            for resource in event.resources:
+                if ISchoolToolCalendar(resource) is self:
+                    raise ValueError('cannot book itself')
+            event.__parent__ = self
+            for resource in event.resources:
+                ISchoolToolCalendar(resource).addEvent(event)
+        elif self.__parent__ not in event.resources:
+            raise ValueError("Event already belongs to a calendar")
+        self.events[event.unique_id] = event
+
+    def removeEvent(self, event):
+        if self.__parent__ in event.resources:
+            event.unbookResource(self.__parent__)
+        else:
+            del self.events[event.unique_id]
+            parent_calendar = event.__parent__
+            if self is parent_calendar:
+                for resource in event.resources:
+                    event.unbookResource(resource)
+                event.__parent__ = None
+
+    def clear(self):
+        # clear is not actually used anywhere in schooltool.app (except tests),
+        # so it doesn't have to be efficient.
+        for e in list(self):
+            self.removeEvent(e)
+
+    def find(self, unique_id):
+        return self.events[unique_id]
+
+
+def getCalendar(owner):
+    """Adapt an ``IAnnotatable`` object to ``ISchoolToolCalendar``."""
+    annotations = IAnnotations(owner)
+    try:
+        return annotations[CALENDAR_KEY]
+    except KeyError:
+        calendar = Calendar(owner)
+        annotations[CALENDAR_KEY] = calendar
+        return calendar
+getCalendar.factory = Calendar # Convention to make adapter introspectable
+
+
+class WriteCalendar(object):
+    r"""An adapter that allows writing iCalendar data to a calendar.
+
+        >>> calendar = Calendar(None)
+        >>> adapter = WriteCalendar(calendar)
+        >>> adapter.write('''\
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        ... BEGIN:VEVENT
+        ... UID:some-random-uid at example.com
+        ... SUMMARY:LAN party
+        ... DTSTART:20050226T160000
+        ... DURATION:PT6H
+        ... DTSTAMP:20050203T150000
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... ''')
+        >>> for e in calendar:
+        ...     print e.dtstart.strftime('%Y-%m-%d %H:%M'), e.title
+        2005-02-26 16:00 LAN party
+
+    Supporting other charsets would be nice too:
+
+        >>> calendar = Calendar(None)
+        >>> adapter = WriteCalendar(calendar)
+        >>> adapter.write('''\
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        ... BEGIN:VEVENT
+        ... UID:some-random-uid at example.com
+        ... SUMMARY:LAN party %s
+        ... DTSTART:20050226T160000
+        ... DURATION:PT6H
+        ... DTSTAMP:20050203T150000
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... ''' %  chr(163), charset='latin-1')
+        >>> titles = [e.title for e in calendar]
+        >>> titles[0]
+        u'LAN party \xa3'
+
+    """
+
+    adapts(ISchoolToolCalendar)
+    implements(IWriteCalendar)
+
+    # Hook for unit tests.
+    read_icalendar = staticmethod(read_icalendar)
+
+    _event_attrs = getFieldNames(ICalendarEvent)
+
+    def __init__(self, context, request=None):
+        self.calendar = context
+
+    def write(self, data, charset='UTF-8'):
+        changes = {} # unique_id -> (old_event, new_event)
+        for e in self.calendar:
+            changes[e.unique_id] = (e, None)
+
+        for event in self.read_icalendar(data, charset):
+            old_event = changes.get(event.unique_id, (None, ))[0]
+            changes[event.unique_id] = (old_event, event)
+
+        for old_event, new_event in changes.itervalues():
+            if old_event is None:
+                # new_event is a SimpleCalendarEvent, we need a CalendarEvent
+                kwargs = dict([(attr, getattr(new_event, attr))
+                               for attr in self._event_attrs])
+                self.calendar.addEvent(CalendarEvent(**kwargs))
+            elif new_event is None:
+                self.calendar.removeEvent(old_event)
+            elif old_event != new_event:
+                # modify in place
+                for attr in self._event_attrs:
+                    setattr(old_event, attr, getattr(new_event, attr))
+
+
+def clearCalendarOnDeletion(event):
+    """When you delete an object, it's calendar should be cleared
+
+        >>> from zope.app.testing import setup
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> from schooltool.testing.setup import setUpCalendaring
+
+        >>> setUp()
+        >>> setUpCalendaring()
+
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> from schooltool.app.cal import clearCalendarOnDeletion
+        >>> zope.event.subscribers.append(clearCalendarOnDeletion)
+
+    We will need some object that implements IHaveCalendar for that:
+
+        >>> from zope.app.container.btree import BTreeContainer
+        >>> container = BTreeContainer()
+        >>> from schooltool.person.person import Person
+        >>> container = BTreeContainer()
+        >>> container['petras'] = petras =  Person(username="Petras")
+        >>> def clearCalendar():
+        ...     print "Clearing calendar"
+        >>> ISchoolToolCalendar(petras).clear = clearCalendar
+
+    If we delete Petras his calendar should be cleared:
+
+        >>> del container['petras']
+        Clearing calendar
+
+    Restore old subscribers:
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+
+    """
+    if IHaveCalendar.providedBy(event.object):
+        ISchoolToolCalendar(event.object).clear()


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/cal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/config-schema.xml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/config-schema.xml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/config-schema.xml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,278 @@
+<schema>
+  <description>
+    SchoolTool configuration schema.
+
+    This schema describes the configuration options available for SchoolTool
+    HTTP server.
+  </description>
+
+  <import package="ZODB" />
+
+  <section type="zodb.database" name="*" required="yes" attribute="database">
+    <description>
+      The main application database that should be used.
+    </description>
+    <example>
+      &lt;zodb&gt;
+        &lt;filestorage&gt;
+          path Data.fs
+        &lt;/filestorage&gt;
+      &lt;/zodb&gt;
+    </example>
+  </section>
+
+  <multikey name="path" datatype="string">
+    <description>
+      This specifies additional paths directories that are inserted into
+      the beginning of Python's module search path.  The set of directories
+      specified is inserted into the beginning of the module search path in
+      the order which they are specified here.  Note that the processing of
+      this directive may happen too late under some circumstances; it is
+      recommended that you use the PYTHONPATH environment variable if
+      using this directive doesn't work for you.
+
+      This option is obsolete.
+    </description>
+  </multikey>
+
+  <multikey name="module" datatype="string">
+    <description>
+      This specifies additional modules to be set up when the server starts.
+      Modules must provide the interface IModuleSetup.
+
+      This option is obsolete.
+    </description>
+    <metadefault>schooltool.main</metadefault>
+  </multikey>
+
+  <multikey name="listen" datatype="inet-address">
+    <description>
+      Network interface and port number the HTTP server should listen on.
+
+      Network interface can be omitted and just the port number specified.
+    </description>
+    <example>
+      listen 8080
+      listen 127.0.0.1:80
+    </example>
+  </multikey>
+
+  <multikey name="web" datatype="inet-address">
+    <description>
+      Network interface and port number the web server should listen on.
+
+      Network interface can be omitted and just the port number specified.
+    </description>
+    <example>
+      web 80
+      web 127.0.0.1:80
+    </example>
+  </multikey>
+
+  <multikey name="rest" datatype="inet-address">
+    <description>
+      Network interface and port number the RESTive server should listen on.
+
+      Network interface can be omitted and just the port number specified.
+    </description>
+    <example>
+      rest 80
+      rest 127.0.0.1:80
+    </example>
+  </multikey>
+
+  <multikey name="listen_ssl" datatype="inet-address">
+    <description>
+      Network interface and port number the HTTPS server should listen on.
+
+      Network interface can be omitted and just the port number specified.
+    </description>
+    <example>
+      listen_ssl 8080
+      listen_ssl 127.0.0.1:80
+    </example>
+  </multikey>
+
+  <multikey name="web_ssl" datatype="inet-address">
+    <description>
+      Network interface and port number the ssl web server should listen on.
+
+      Network interface can be omitted and just the port number specified.
+    </description>
+    <example>
+      web_ssl 8080
+      web_ssl 127.0.0.1:80
+    </example>
+  </multikey>
+
+  <key name="ssl_certificate" datatype="string">
+    <description>
+      PEM Certificate
+    </description>
+  </key>
+
+  <key name="thread-pool-size" datatype="integer" default="10">
+    <description>
+      Suggested thread pool size.
+    </description>
+    <example>
+      thread-pool-size 20
+    </example>
+  </key>
+
+  <key name="event-logging" datatype="boolean" default="off">
+    <description>
+      Enables or disables global event logging to /utils/eventlog.
+    </description>
+    <example>
+      event-logging on
+    </example>
+  </key>
+
+  <key name="test-mode" datatype="boolean" default="off">
+    <description>
+      Enables or disables in-memory database snapshots that are used
+      for functional testing.  Do not use for live servers.  This option
+      is not guaranteed to work if you use ZODB storage other than
+      MappingStorage.
+
+      This option is obsolete.
+    </description>
+    <example>
+      test-mode off
+    </example>
+  </key>
+
+
+  <key name="pid-file" datatype="string">
+    <description>
+      Specifies the path of a pid file.
+    </description>
+    <example>
+      pid-file /var/run/schooltool.pid
+    </example>
+  </key>
+
+  <multikey name="error-log-file" datatype="string">
+    <description>
+      Specifies the path of a log file used for exceptions. Special
+      values STDERR and STDOUT mean standard error and standard output
+      respectively.
+    </description>
+    <default>STDERR</default>
+    <example>
+      error-log-file /var/log/schooltool/error.log
+      error-log-file STDERR
+    </example>
+  </multikey>
+
+  <multikey name="rest-access-log-file" datatype="string">
+    <description>
+      Specifies the path of a file used for an Apache combined format
+      access log for the RESTive API server.  Special values STDERR
+      and STDOUT mean standard error and standard output respectively.
+    </description>
+    <default>STDOUT</default>
+    <example>
+      access-log-file /var/log/schooltool/rest-access.log
+      access-log-file STDOUT
+    </example>
+  </multikey>
+
+  <multikey name="web-access-log-file" datatype="string">
+    <description>
+      Specifies the path of a file used for an Apache combined format
+      access log for the web application interface.  Special values
+      STDERR and STDOUT mean standard error and standard output
+      respectively.
+    </description>
+    <default>STDOUT</default>
+    <example>
+      access-log-file /var/log/schooltool/web-access.log
+      access-log-file STDOUT
+    </example>
+  </multikey>
+
+  <multikey name="app-log-file" datatype="string">
+    <description>
+      Specifies the path of a file used for the application log.
+      Special values STDERR and STDOUT mean standard error and standard
+      output respectively.
+
+      This option is obsolete.
+    </description>
+    <example>
+      app-log-file /var/log/schooltool/app.log
+    </example>
+  </multikey>
+
+  <multikey name="attendance-log-file" datatype="string">
+    <description>
+      Specifies the path of a file used for the attendance log.
+      Special values STDERR and STDOUT mean standard error and standard
+      output respectively.
+    </description>
+    <example>
+      attendance-log-file /var/log/schooltool/attendance.log
+    </example>
+  </multikey>
+
+  <key name="lang" datatype="string" default="auto">
+    <description>
+      Specifies the locale of the messages to be used on the server.
+
+      If 'auto' is set, the language is chosen according to the user's
+      preference specified in the web browser configuration.
+    </description>
+    <example>
+      lang en_US
+    </example>
+  </key>
+
+  <key name="domain" datatype="string">
+    <description>
+      Specifies the name of the message catalog to be used on the server.
+
+      This option is obsolete.
+    </description>
+    <example>
+      domain schoolbell
+    </example>
+  </key>
+
+  <key name="reportlab_fontdir" datatype="string">
+    <description>
+      Specifies the path to TrueType fonts (Arial and Times New Roman)
+      for reportlab.
+
+      Comment out to disable reportlab.
+    </description>
+    <example>
+      reportlab_fontdir /usr/share/fonts/truetype/msttcorefonts
+    </example>
+  </key>
+
+  <key name="devmode" datatype="boolean">
+    <description>
+      Switches the Developer Mode on and off.
+
+      In developer mode, the Web UI will provide usefull utilities for
+      developers to work on schooltool applications.
+    </description>
+    <example>
+      devmode on
+    </example>
+    <metadefault>off</metadefault>
+  </key>
+
+  <key name="site-definition" default="schooltool-site.zcml">
+    <description>
+      The name of the top-level ZCML file that defines the component
+      configuration used for this site.
+    </description>
+    <example>
+      site-definition schooltool-site.zcml
+    </example>
+  </key>
+
+</schema>

Added: schooltool/branches/upstream/current/src/schooltool/app/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,316 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <include file="security.zcml" />
+
+  <!-- Adapters -->
+
+  <class class="schooltool.app.overlay.CalendarOverlayInfo">
+    <implements
+        interface="zope.annotation.interfaces.IAttributeAnnotatable" />
+  </class>
+
+  <adapter
+      for="schooltool.app.overlay.ICalendarOverlayInfo"
+      provides=".interfaces.IShowTimetables"
+      factory=".app.ShowTimetables"
+      trusted="true"
+      />
+
+  <class class=".app.ShowTimetables">
+    <require
+        permission="schooltool.view"
+        interface=".interfaces.IShowTimetables" />
+    <require
+        permission="schooltool.view"
+        set_schema=".interfaces.IShowTimetables" />
+  </class>
+
+  <adapter
+      for=".interfaces.IHaveCalendar"
+      provides=".interfaces.ISchoolToolCalendar"
+      factory=".cal.getCalendar"
+      trusted="true"
+      />
+
+  <adapter
+      for=".interfaces.ISchoolToolCalendar"
+      provides=".interfaces.IWriteCalendar"
+      factory=".cal.WriteCalendar"
+      />
+
+  <adapter
+      for=".interfaces.ISchoolToolApplication"
+      provides=".interfaces.IApplicationPreferences"
+      factory=".app.getApplicationPreferences"
+      trusted="true"
+      />
+
+  <class class=".cal.WriteCalendar">
+    <allow interface=".interfaces.IWriteCalendar" />
+  </class>
+
+  <adapter
+      for="None"
+      provides=".interfaces.ISchoolToolApplication"
+      factory=".app.getSchoolToolApplication" />
+
+  <!-- Utilities -->
+
+  <class class=".security.SchoolToolAuthenticationUtility">
+    <require
+        permission="zope.ManageServices"
+        interface="zope.app.security.interfaces.IAuthentication"
+        />
+  </class>
+
+  <utility
+      provides="schooltool.relationship.interfaces.IRelationshipSchema"
+      component=".relationships.Instruction"
+      name="http://schooltool.org/ns/instruction" />
+
+  <utility
+      provides="schooltool.relationship.interfaces.IRelationshipSchema"
+      component=".relationships.CourseSections"
+      name="http://schooltool.org/ns/coursesections" />
+
+  <utility
+      provides="schooltool.relationship.interfaces.IRelationshipSchema"
+      component=".membership.Membership"
+      name="http://schooltool.org/ns/membership" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".relationships.URIInstructor"
+      name="http://schooltool.org/ns/instruction/instructor" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".relationships.URISection"
+      name="http://schooltool.org/ns/instruction/section" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".relationships.URICourse"
+      name="http://schooltool.org/ns/coursesections/course" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".relationships.URISectionOfCourse"
+      name="http://schooltool.org/ns/coursesections/section" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".membership.URIMember"
+      name="http://schooltool.org/ns/membership/member" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".membership.URIGroup"
+      name="http://schooltool.org/ns/membership/group" />
+
+  <!-- Event Subscribers -->
+
+  <subscriber
+      for="schooltool.app.interfaces.ISchoolToolApplication zope.app.container.interfaces.IObjectAddedEvent"
+      handler=".security.authSetUpSubscriber"
+      />
+
+  <subscriber
+      for="schooltool.relationship.interfaces.IBeforeRelationshipEvent"
+      handler=".membership.enforceMembershipConstraints"
+      />
+
+  <subscriber
+      for="schooltool.relationship.interfaces.IBeforeRelationshipEvent"
+      handler=".relationships.enforceInstructionConstraints"
+    />
+
+  <subscriber
+      for="schooltool.relationship.interfaces.IRelationshipAddedEvent"
+      handler=".relationships.updateStudentCalendars"
+      />
+
+  <subscriber
+      for="schooltool.relationship.interfaces.IRelationshipRemovedEvent"
+      handler=".relationships.updateStudentCalendars"
+      />
+
+  <subscriber
+      for="schooltool.relationship.interfaces.IRelationshipAddedEvent"
+      handler=".relationships.updateInstructorCalendars"
+      />
+
+  <subscriber
+      for="schooltool.relationship.interfaces.IRelationshipRemovedEvent"
+      handler=".relationships.updateInstructorCalendars"
+      />
+
+  <subscriber
+      for="zope.app.container.interfaces.IObjectRemovedEvent"
+      handler=".overlay.unrelateCalendarOnDeletion"
+      />
+
+  <subscriber
+      for="zope.app.container.interfaces.IObjectRemovedEvent"
+      handler=".cal.clearCalendarOnDeletion" />
+
+  <!-- Timetables for content components -->
+  <class class="schooltool.app.app.SchoolToolApplication">
+    <implements interface="schooltool.timetable.interfaces.IHaveTimetables" />
+  </class>
+
+  <class class="schooltool.person.person.Person">
+    <implements interface="schooltool.timetable.interfaces.IHaveTimetables" />
+  </class>
+
+  <class class="schooltool.group.group.Group">
+    <implements interface="schooltool.timetable.interfaces.IHaveTimetables" />
+  </class>
+
+  <class class="schooltool.resource.resource.BaseResource">
+    <implements interface="schooltool.timetable.interfaces.IHaveTimetables" />
+  </class>
+  
+
+  <!-- Core and Domain content objects -->
+
+  <interface
+      interface=".interfaces.ISchoolToolApplication"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".app.SchoolToolApplication">
+    <implements interface="schooltool.app.interfaces.IHaveCalendar" />
+    <allow interface=".interfaces.ISchoolToolApplication" />
+    <allow attributes="getSiteManager" />
+  </class>
+
+  <class class=".cal.Calendar">
+    <require permission="schooltool.view"
+             interface="schooltool.calendar.interfaces.ICalendar"
+             attributes="title __cmp__" />
+    <require permission="schooltool.edit"
+             attributes="addEvent" />
+    <require permission="schooltool.edit"
+             attributes="clear removeEvent" />
+  </class>
+
+  <class class=".cal.CalendarEvent">
+    <require permission="schooltool.view"
+             interface="schooltool.calendar.interfaces.ICalendarEvent"
+             attributes="resources" />
+    <require permission="schooltool.edit"
+             set_schema="schooltool.calendar.interfaces.ICalendarEvent"
+             attributes="bookResource unbookResource"
+             set_attributes="__parent__" />
+  </class>
+
+  <class class=".app.ApplicationPreferences">
+    <require permission="zope.Public"
+             interface=".interfaces.IApplicationPreferences" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.IApplicationPreferences" />
+  </class>
+
+  <!-- Views -->
+
+  <include package=".browser" />
+  <include package=".rest" />
+
+  <!-- XXX It feels wrong to tweak permissions of objects in a sibling. -->
+
+  <class class="schooltool.calendar.mixins.ExpandedCalendarEvent">
+    <require permission="schooltool.view"
+             interface="schooltool.calendar.interfaces.IExpandedCalendarEvent"
+             attributes="resources"
+             />
+  </class>
+
+  <class class="schooltool.calendar.recurrent.DailyRecurrenceRule">
+    <require permission="zope.Public"
+             interface="schooltool.calendar.interfaces.IDailyRecurrenceRule" />
+  </class>
+
+  <class class="schooltool.calendar.recurrent.WeeklyRecurrenceRule">
+    <require permission="zope.Public"
+             interface="schooltool.calendar.interfaces.IWeeklyRecurrenceRule"
+             />
+  </class>
+
+  <class class="schooltool.calendar.recurrent.MonthlyRecurrenceRule">
+    <require permission="zope.Public"
+             interface="schooltool.calendar.interfaces.IMonthlyRecurrenceRule"
+             />
+  </class>
+
+  <class class="schooltool.calendar.recurrent.YearlyRecurrenceRule">
+    <require permission="zope.Public"
+             interface="schooltool.calendar.interfaces.IYearlyRecurrenceRule"
+             />
+  </class>
+
+  <class class="schooltool.calendar.simple.ImmutableCalendar">
+    <require permission="zope.Public"
+             interface="schooltool.calendar.interfaces.ICalendar" />
+  </class>
+
+  <adapter
+      for="schooltool.calendar.interfaces.IEditCalendar"
+      factory=".cal.WriteCalendar"
+      provides=".interfaces.IWriteCalendar" />
+
+  <class
+      class="schooltool.app.overlay.BoundOverlaidCalendarsProperty">
+    <allow attributes="__iter__ __contains__" />
+    <require
+        permission="schooltool.view"
+        attributes="add remove" />
+  </class>
+
+  <class class="schooltool.app.overlay.CalendarOverlayInfo">
+    <require
+        permission="schooltool.view"
+        interface="schooltool.app.overlay.ICalendarOverlayInfo"/>
+    <require
+        permission="schooltool.editCalendarOverlays"
+        set_schema="schooltool.app.overlay.ICalendarOverlayInfo"/>
+  </class>
+
+  <!-- Documentation -->
+
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      xmlns:apidoc="http://namespaces.zope.org/apidoc"
+      zcml:condition="have apidoc">
+
+    <apidoc:bookchapter
+        id="schooltool"
+        title="SchoolTool"
+        doc_path="README.txt" />
+
+    <!-- Security -->
+    <apidoc:bookchapter
+        id="security"
+        title="Security (General)"
+        parent="schooltool"
+        doc_path="security.txt" />
+
+    <!-- Calendar -->
+    <configure package="schooltool.calendar">
+      <apidoc:bookchapter
+          id="calendar"
+          title="Calendar"
+          parent="schooltool"
+          doc_path="README.txt" />
+    </configure>
+
+    <apidoc:bookchapter
+        id="booking"
+        title="Booking Resources"
+        parent="schooltool/calendar"
+        doc_path="booking.txt" />
+
+  </configure>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,213 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool application interfaces
+
+$Id: interfaces.py 6835 2007-04-12 11:05:03Z ignas $
+"""
+
+import zope.interface
+import zope.schema
+
+from zope.component.interfaces import ObjectEvent, IObjectEvent
+from zope.app import container
+from zope.location.interfaces import ILocation
+from zope.app.security.interfaces import IAuthentication, ILogout
+
+from schooltool import SchoolToolMessage as _
+from schooltool.calendar.interfaces import IEditCalendar, ICalendarEvent
+from schooltool.person.interfaces import ICalendarDisplayPreferences
+
+
+# Dirty hacks that provide sensible i10n for widget error messages.
+# See issue #221 (http://issues.schooltool.org/issue221).
+from zope.schema.interfaces import RequiredMissing
+RequiredMissing.__doc__ = _("""Required input is missing.""")
+
+import zope.app.form.browser.textwidgets
+zope.app.form.browser.textwidgets._ = _
+# Here we do a particulary evil thing: we override the translation (_) function
+# in the textwidgets module.  This means that all the messages in that module
+# are now in the 'schooltool' domain.  This is the list of the messages
+# (don't remove the list, it is used in localizable string extraction).
+textwidgets_strings=[_('Form input is not a file object'),
+                     _("Invalid integer data"),
+                     _("Invalid text data"),
+                     _("Invalid textual data"),
+                     _("Invalid unicode data"),
+                     _("Invalid integer data"),
+                     _("Invalid floating point data"),
+                     _("Invalid datetime data")]
+
+
+# Events
+
+class IApplicationInitializationEvent(IObjectEvent):
+    """The SchoolTool application is being initialized.
+
+    Usually subscribers add something to the initialization process.
+    """
+
+class ApplicationInitializationEvent(ObjectEvent):
+    zope.interface.implements(IApplicationInitializationEvent)
+
+
+
+class ICatalogSetUpEvent(IObjectEvent):
+    """The SchoolTool catalogs are being initialized.
+
+    Subscribers should set up their catalogs.
+    """
+
+class CatalogSetUpEvent(ObjectEvent):
+    zope.interface.implements(ICatalogSetUpEvent)
+
+
+class ISchoolToolCalendar(IEditCalendar, ILocation):
+    """A SchoolTool calendar.
+
+    Calendars stored within all provide ISchoolToolCalendarEvent.
+    """
+
+    title = zope.schema.TextLine(
+        title=u"Title",
+        description=u"Title of the calendar.")
+
+
+class IHaveCalendar(zope.interface.Interface):
+    """Marker interface for components that can have calendars.
+
+    Components providing this interface are adaptable to
+    ``ISchoolToolCalendar``.
+    """
+
+
+class ISchoolToolCalendarEvent(ICalendarEvent,
+                               container.interfaces.IContained):
+    """An event that is contained in a SchoolTool calendar."""
+
+    resources = zope.interface.Attribute(
+        """Resources that are booked by this event""")
+
+    owner = zope.interface.Attribute(
+        """Object which this event belongs to.""")
+
+    def bookResource(resource):
+        """Book a resource."""
+
+    def unbookResource(resource):
+        """Book a resource."""
+
+
+class ISchoolToolApplication(container.interfaces.IReadContainer):
+    """The main SchoolTool application object.
+
+    The application is a read-only container with the following items:
+
+        'persons' - IPersonContainer
+        'groups' - IGroupContainer
+        'resources' - IResourceContainer
+
+    This object can be added as a regular content object to a folder, or
+    it can be used as the application root object.
+    """
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        required=True,
+        description=_("""The name for the school or organization running
+            this server.  This will be displayed on the public calendar, the
+            bottom of all pages and in the page title."""))
+
+
+class IApplicationPreferences(ICalendarDisplayPreferences):
+    """Preferences stored in an annotation on the SchoolToolApplication."""
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        required=True,
+        description=_("""The name for the school or organization running
+            this server.  This will be displayed on the public calendar, the
+            bottom of all pages and in the page title."""))
+
+    frontPageCalendar = zope.schema.Bool(
+        title=_("Front Page Calendar"),
+        description=_("""Display site-wide calendar as the front page of the
+            site."""),
+        required=False,
+        default=True)
+
+
+class IWriteCalendar(zope.interface.Interface):
+
+    def write(data, charset='UTF-8'):
+        """Update the calendar data
+        """
+
+
+class IShowTimetables(zope.interface.Interface):
+    """Adapter to flag whether to show timetables in the calendar overlay."""
+
+    showTimetables = zope.schema.Bool(
+            title=_("Show timetables"),
+            description=_("""
+            An option that controls whether the timetable of this calendar's
+            owner is shown in the calendar views.
+            """))
+
+
+class ISchoolToolAuthentication(IAuthentication, ILogout):
+    """A local authentication utility for SchoolTool"""
+
+    def setCredentials(request, username, password):
+        """Save the username and password in the session.
+
+        If the credentials passed are invalid, ValueError is raised.
+        """
+
+    def clearCredentials(request):
+        """Forget the username and password stored in a session"""
+
+
+class ICalendarParentCrowd(zope.interface.Interface):
+    """A crowd object that is used on a calendar's parent.
+
+    This is just a marker interface.
+    """
+
+    def contains(principal):
+        """Return True if principal is in the crowd."""
+
+
+class IAsset(zope.interface.Interface):
+    """An asset of a leader."""
+
+    leaders = zope.interface.Attribute("Leaders of this asset")
+
+
+class ICookieLanguageSelector(zope.interface.Interface):
+
+    def getLanguageList():
+        """Return the list of available languages."""
+
+    def getSelectedLanguage():
+        """Return the language that is currently selected."""
+
+    def setSelectedLanguage():
+        """Set the selected language into a cookie."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/main.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/main.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/main.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,659 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Main SchoolTool script.
+
+This module is not necessary if you use SchoolTool as a Zope 3 content object.
+It is only used by the standalone SchoolTool executable.
+
+$Id: main.py 6835 2007-04-12 11:05:03Z ignas $
+"""
+import os
+import sys
+import time
+import getopt
+import locale
+import gettext
+import logging
+import errno
+
+import ZConfig
+import transaction
+import zope.app.component.hooks
+import zope.configuration.config
+import zope.configuration.xmlconfig
+from zope.interface import directlyProvides, implements
+from zope.component import provideAdapter, adapts
+from zope.event import notify
+from zope.server.taskthreads import ThreadedTaskDispatcher
+from zope.publisher.interfaces.http import IHTTPRequest
+from zope.i18n.interfaces import IUserPreferredLanguages
+from zope.app.server.main import run
+from zope.app.server.wsgi import http
+from zope.app.appsetup import DatabaseOpened, ProcessStarting
+from zope.app.publication.zopepublication import ZopePublication
+from zope.traversing.interfaces import IContainmentRoot
+from zope.app.container.contained import ObjectAddedEvent
+from zope.app.dependable.interfaces import IDependable
+from zope.app.component.hooks import setSite
+from zope.component import getUtility
+from zope.app.intid import IntIds
+from zope.app.intid.interfaces import IIntIds
+from zope.app.component.interfaces import ISite
+from zope.app.component.site import LocalSiteManager
+
+from schooltool.app.app import SchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.rest import restServerType
+from schooltool.app.browser import pdfcal
+from schooltool.person.interfaces import IPersonFactory
+from schooltool.app.interfaces import ICookieLanguageSelector
+from schooltool.app.interfaces import CatalogSetUpEvent
+from schooltool.app.interfaces import ApplicationInitializationEvent
+from schooltool.utility.utility import setUpUtilities
+from schooltool.utility.utility import UtilitySpecification
+
+
+MANAGER_USERNAME = 'manager'
+MANAGER_PASSWORD = 'schooltool'
+
+locale_charset = locale.getpreferredencoding()
+
+localedir = os.path.join(os.path.dirname(__file__), '..', 'locales')
+catalog = gettext.translation('schooltool', localedir, fallback=True)
+_ = lambda us: catalog.ugettext(us).encode(locale_charset, 'replace')
+_._domain = 'schooltool'
+
+st_usage_message = _("""
+Usage: %s [options]
+Options:
+  -c, --config xxx       use this configuration file instead of the default
+  -h, --help             show this help message
+  -d, --daemon           go to background after starting
+  -r, --restore-manager password
+                         restore the manager user with the provided password
+                         (read password from the standart input if 'password'
+                         is '-')
+  --manage               only do management tasks, don't run the server
+""").strip()
+
+
+st_no_storage_error_msg = _("""
+No storage defined in the configuration file.
+
+If you're using the default configuration file, please edit it now and
+uncomment one of the ZODB storage sections.
+""").strip()
+
+
+st_incompatible_db_error_msg = _("""
+This is not a SchoolTool 0.11 database file, aborting.
+""").strip()
+
+
+st_old_db_error_msg = _("""
+This is not a SchoolTool 0.10 database file, aborting.
+
+Please run the standalone database upgrade script.
+""").strip()
+
+
+class OldDatabase(Exception):
+    pass
+
+
+class IncompatibleDatabase(Exception):
+    pass
+
+
+def die(message, exitcode=1):
+    print >> sys.stderr, message
+    sys.exit(exitcode)
+
+
+class Options(object):
+    config_filename = 'schooltool.conf'
+    daemon = False
+    quiet = False
+    config = None
+    pack = False
+    restore_manager = False
+    manager_password = MANAGER_PASSWORD
+    manage = False
+
+    def __init__(self):
+        dirname = os.path.dirname(__file__)
+        dirname = os.path.normpath(os.path.join(dirname, '..', '..', '..'))
+        self.config_file = os.path.join(dirname, self.config_filename)
+        if not os.path.exists(self.config_file):
+            self.config_file = os.path.join(dirname,
+                                            self.config_filename + '.in')
+
+
+class CookieLanguageSelector(object):
+    implements(ICookieLanguageSelector)
+
+    def getLanguageList(self):
+        return self.available_languages
+
+    def getSelectedLanguage(self):
+        return self.context.cookies.get("schooltool.lang", self.available_languages[0])
+
+    def setSelectedLanguage(self, lang):
+        self.context.response.setCookie("schooltool.lang", lang)
+
+
+def setLanguage(lang):
+    """Set the language for the user interface."""
+    if lang == 'auto':
+        return # language is negotiated at runtime through Accept-Language.
+
+    if len(lang.split(",")) > 1:
+
+        class CookiePreferredLanguage(CookieLanguageSelector):
+            adapts(IHTTPRequest)
+            implements(IUserPreferredLanguages)
+
+            def __init__(self, context):
+                self.context = context
+                self.available_languages = [language.strip()
+                                            for language in lang.split(",")]
+
+            def getPreferredLanguages(self):
+                return (self.getSelectedLanguage(),)
+
+        provideAdapter(CookiePreferredLanguage, provides=IUserPreferredLanguages)
+        return
+
+    class SinglePreferredLanguage(object):
+
+        adapts(IHTTPRequest)
+        implements(IUserPreferredLanguages)
+
+        def __init__(self, context):
+            pass
+
+        def getPreferredLanguages(self):
+            return (lang, )
+
+    # Replace the default adapter with one that always asks for the language
+    # specified in the configuration file.
+    provideAdapter(SinglePreferredLanguage)
+
+
+class StreamWrapper(object):
+    r"""Unicode-friendly wrapper for writable file-like objects.
+
+    Here the terms 'encoding' and 'charset' are used interchangeably.
+
+    The main use case for StreamWrapper is wrapping sys.stdout and sys.stderr
+    so that you can forget worrying about charsets of your data.
+
+        >>> from StringIO import StringIO
+        >>> import schooltool.app.main
+        >>> old_locale_charset = schooltool.app.main.locale_charset
+        >>> schooltool.app.main.locale_charset = 'UTF-8'
+
+        >>> sw = StreamWrapper(StringIO())
+        >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7"
+        >>> sw.stm.getvalue()
+        'Hello, world! \xc2\xb7\xe2\x98\xbb\xc2\xb7\n'
+
+    By default printing Unicode strings to stdout/stderr will raise Unicode
+    errors if the stream encoding does not include some characters you are
+    printing.  StreamWrapper will replace unconvertable characters to question
+    marks, therefore you should only use it for informative messages where such
+    loss of information is acceptable.
+
+        >>> schooltool.app.main.locale_charset = 'US-ASCII'
+        >>> sw = StreamWrapper(StringIO())
+        >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7"
+        >>> sw.stm.getvalue()
+        'Hello, world! ???\n'
+
+    StreamWrapper converts all unicode strings that are written to it to the
+    encoding defined in the wrapped stream's 'encoding' attribute, or, if that
+    is None, to the locale encoding.  Typically the stream's encoding attribute
+    is set when the stream is connected to a console device, and None when the
+    stream is connected to a file.  On Unix systems the console encoding
+    matches the locale charset, but on Win32 systems they differ.
+
+        >>> s = StringIO()
+        >>> s.encoding = 'ISO-8859-1'
+        >>> sw = StreamWrapper(s)
+        >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7"
+        >>> sw.stm.getvalue()
+        'Hello, world! \xb7?\xb7\n'
+
+    You can print other kinds of objects:
+
+        >>> sw = StreamWrapper(StringIO())
+        >>> print >> sw, 1, 2,
+        >>> print >> sw, 3
+        >>> sw.stm.getvalue()
+        '1 2 3\n'
+
+    but not 8-bit strings:
+
+        >>> sw = StreamWrapper(StringIO())
+        >>> print >> sw, "\xff"
+        Traceback (most recent call last):
+          ...
+        UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
+
+    In addition to 'write', StreamWrapper provides 'flush' and 'writelines'
+
+        >>> sw = StreamWrapper(StringIO())
+        >>> sw.write('xyzzy\n')
+        >>> sw.flush()
+        >>> sw.writelines(['a', 'b', 'c', 'd'])
+        >>> sw.stm.getvalue()
+        'xyzzy\nabcd'
+
+    Clean up:
+
+        >>> schooltool.app.main.locale_charset = old_locale_charset
+
+    """
+
+    def __init__(self, stm):
+        self.stm = stm
+        self.encoding = getattr(stm, 'encoding', None)
+        if self.encoding is None:
+            self.encoding = locale_charset
+
+    def write(self, obj):
+        self.stm.write(obj.encode(self.encoding, 'replace'))
+
+    def flush(self):
+        self.stm.flush()
+
+    def writelines(self, seq):
+        for obj in seq:
+            self.write(obj)
+
+    def close(self):
+        self.stm.close()
+
+
+class UnicodeFileHandler(logging.StreamHandler):
+    """A handler class which writes records to disk files.
+
+    This class differs from logging.FileHandler in that it can handle Unicode
+    strings with graceful degradation.
+    """
+
+    def __init__(self, filename):
+        stm = StreamWrapper(open(filename, 'a'))
+        logging.StreamHandler.__init__(self, stm)
+
+    def close(self):
+        self.stream.close()
+
+
+def setUpLogger(name, filenames, format=None):
+    """Set up a named logger.
+
+    Sets up a named logger to log into filenames with the given format.
+    Two filenames are special: 'STDOUT' means sys.stdout and 'STDERR'
+    means sys.stderr.
+    """
+    formatter = logging.Formatter(format)
+    logger = logging.getLogger(name)
+    logger.propagate = False
+    logger.setLevel(logging.INFO)
+    for filename in filenames:
+        if filename == 'STDOUT':
+            handler = logging.StreamHandler(sys.stdout)
+        elif filename == 'STDERR':
+            handler = logging.StreamHandler(sys.stderr)
+        else:
+            handler = UnicodeFileHandler(filename)
+        handler.setFormatter(formatter)
+        logger.addHandler(handler)
+
+
+def daemonize():
+    """Daemonize with a double fork and close the standard IO."""
+    pid = os.fork()
+    if pid:
+        sys.exit(0)
+    os.setsid()
+    os.umask(077)
+
+    pid = os.fork()
+    if pid:
+        print _("Going to background, daemon pid %d" % pid)
+        sys.exit(0)
+
+    os.close(0)
+    os.close(1)
+    os.close(2)
+    os.open('/dev/null', os.O_RDWR)
+    os.dup(0)
+    os.dup(0)
+
+
+class StandaloneServer(object):
+
+    ZCONFIG_SCHEMA = os.path.join(os.path.dirname(__file__),
+                                  'config-schema.xml')
+
+    usage_message = st_usage_message
+    no_storage_error_msg = st_no_storage_error_msg
+    incompatible_db_error_msg = st_incompatible_db_error_msg
+    old_db_error_msg = st_old_db_error_msg
+
+    system_name = "SchoolTool"
+
+    Options = Options
+
+    devmode = False
+
+    def configure(self):
+        """Configure Zope 3 components."""
+        # Hook up custom component architecture calls
+        zope.app.component.hooks.setHooks()
+        context = zope.configuration.config.ConfigurationMachine()
+        if self.devmode:
+            context.provideFeature('devmode')
+        zope.configuration.xmlconfig.registerCommonDirectives(context)
+        context = zope.configuration.xmlconfig.file(
+            self.siteConfigFile, context=context)
+
+        # Store the configuration context
+        from zope.app.appsetup import appsetup
+        appsetup.__dict__['__config_context'] = context
+
+    def load_options(self, argv):
+        """Parse the command line and read the configuration file."""
+        options = self.Options()
+
+        # Parse command line
+        progname = os.path.basename(argv[0])
+        try:
+            opts, args = getopt.gnu_getopt(argv[1:], 'c:hdr:',
+                                           ['config=', 'pack',
+                                            'help', 'daemon',
+                                            'restore-manager=',
+                                            'manage'])
+        except getopt.error, e:
+            print >> sys.stderr, _("%s: %s") % (progname, e)
+            print >> sys.stderr, _("Run %s -h for help.") % progname
+            sys.exit(1)
+        for k, v in opts:
+            if k in ('-h', '--help'):
+                print self.usage_message % progname
+                sys.exit(0)
+            if k in ('-c', '--config'):
+                options.config_file = v
+            if k in ('-p', '--pack'):
+                options.pack = True
+            if k in ('-d', '--daemon'):
+                if not hasattr(os, 'fork'):
+                    print >> sys.stderr, _("%s: daemon mode not supported on"
+                                           " your operating system.")
+                    sys.exit(1)
+                else:
+                    options.daemon = True
+            if k in ('-r', '--restore-manager'):
+                options.restore_manager = True
+                if v != '-':
+                    options.manager_password = v
+                else:
+                    print 'Manager password: ',
+                    password = sys.stdin.readline().strip('\r\n')
+                    options.manager_password = password
+            if k in ('--manage'):
+                options.manage = True
+                options.daemon = False
+
+        # Read configuration file
+        schema = ZConfig.loadSchema(self.ZCONFIG_SCHEMA)
+        print _("Reading configuration from %s") % options.config_file
+        try:
+            options.config, handler = ZConfig.loadConfig(schema,
+                                                         options.config_file)
+        except ZConfig.ConfigurationError, e:
+            print >> sys.stderr, _("%s: %s") % (progname, e)
+            sys.exit(1)
+        if options.config.database.config.storage is None:
+            print >> sys.stderr, _("%s: %s") % (progname,
+                                                self.no_storage_error_msg)
+            sys.exit(1)
+
+        return options
+
+    def bootstrapSchoolTool(self, db):
+        """Bootstrap SchoolTool database."""
+        connection = db.open()
+        root = connection.root()
+        if root.get('schooltool'):
+            transaction.abort()
+            connection.close()
+            raise OldDatabase('old database')
+        app_obj = root.get(ZopePublication.root_name)
+        if app_obj is None:
+            app = SchoolToolApplication()
+            directlyProvides(app, IContainmentRoot)
+            root[ZopePublication.root_name] = app
+            # savepoint to make sure that the app object has
+            # a _p_jar. This is needed to make things like
+            # KeyReference work, which in turn is needed to
+            # make the catalog work. We make this savepoint
+            # optimistic because it will then work with any registered
+            # data managers that do not support this feature.
+            transaction.savepoint(optimistic=True)
+
+            # set up the site so that local utility setups and catalog
+            # indexing would work properly
+            if not ISite.providedBy(app):
+                app.setSiteManager(LocalSiteManager(app))
+
+            setSite(app)
+
+            # We must set up the int ids utility before setting up any
+            # of the plugin specific catalogs, as catalogs rely on
+            # IntIds being present
+            setUpUtilities(app, [UtilitySpecification(IntIds, IIntIds)])
+
+            # tell plugins to initialize their catalogs, must be done
+            # before initializing plugins themselves or else all the
+            # initial groups, persons, resources will not get indexed
+            notify(CatalogSetUpEvent(app))
+
+            # initialize plugins themselves
+            notify(ApplicationInitializationEvent(app))
+
+            notify(ObjectAddedEvent(app))
+
+            # unset the site so we would not confuse other
+            # bootstraping code
+            setSite(None)
+
+            self.restoreManagerUser(app, MANAGER_PASSWORD)
+        elif not ISchoolToolApplication.providedBy(app_obj):
+            transaction.abort()
+            connection.close()
+            raise IncompatibleDatabase('incompatible database')
+        transaction.commit()
+        connection.close()
+
+    def restoreManagerUser(self, app, password):
+        """Ensure there is a manager user
+
+        Create a user if needed, set password to default, grant
+        manager permissions
+        """
+        # set the site so that catalog utilities and person factory
+        # utilities and subscribers were available
+        setSite(app)
+        _('%s Manager') # mark for l10n
+        manager_title = catalog.ugettext('%s Manager') % self.system_name
+        if MANAGER_USERNAME not in app['persons']:
+            factory = getUtility(IPersonFactory)
+            manager = factory(MANAGER_USERNAME, manager_title)
+            app['persons'][MANAGER_USERNAME] = manager
+            IDependable(manager).addDependent('')
+        manager = app['persons'][MANAGER_USERNAME]
+        manager.setPassword(password)
+        manager_group = app['groups']['manager']
+        if manager not in manager_group.members:
+            manager_group.members.add(manager)
+        setSite(None)
+
+    def main(self, argv=sys.argv):
+        """Start the SchoolTool server."""
+        t0, c0 = time.time(), time.clock()
+        options = self.load_options(argv)
+        db = self.setup(options)
+        if not options.manage:
+            self.beforeRun(options, db)
+            t1, c1 = time.time(), time.clock()
+            print _("Startup time: %.3f sec real, %.3f sec CPU") % (t1 - t0,
+                                                                    c1 - c0)
+            run()
+            self.afterRun(options)
+
+    def setup(self, options):
+        """Configure SchoolTool."""
+        setUpLogger(None, options.config.error_log_file,
+                    "%(asctime)s %(message)s")
+        setUpLogger('accesslog', options.config.web_access_log_file)
+        setUpLogger('attendance', options.config.attendance_log_file)
+
+        # Shut up ZODB lock_file, because it logs tracebacks when unable
+        # to lock the database file, and we don't want that.
+        logging.getLogger('ZODB.lock_file').disabled = True
+
+        # Determine whether we are in developer's mode:
+        self.devmode = options.config.devmode
+
+        # Process ZCML
+        global SCHOOLTOOL_SITE_DEFINITION
+        SCHOOLTOOL_SITE_DEFINITION = options.config.site_definition
+        self.siteConfigFile = options.config.site_definition
+        self.configure()
+
+        # Set language specified in the configuration
+        setLanguage(options.config.lang)
+
+        # Configure reportlab.
+        self.configureReportlab(options.config.reportlab_fontdir)
+
+        # Open the database
+        db_configuration = options.config.database
+        try:
+           db = db_configuration.open()
+           if options.pack:
+               db.pack()
+        except IOError, e:
+            print >> sys.stderr, _("Could not initialize the database:\n%s" %
+                                   (e, ))
+            if e.errno == errno.EAGAIN: # Resource temporarily unavailable
+                print >> sys.stderr, _("\nPerhaps another %s instance"
+                                       " is using it?" % self.system_name)
+            sys.exit(1)
+
+        try:
+            self.bootstrapSchoolTool(db)
+        except IncompatibleDatabase:
+            print >> sys.stderr, self.incompatible_db_error_msg
+            sys.exit(1)
+        except OldDatabase:
+            print >> sys.stderr, self.old_db_error_msg
+            sys.exit(1)
+
+        notify(DatabaseOpened(db))
+
+        if options.restore_manager:
+            connection = db.open()
+            root = connection.root()
+            app = root[ZopePublication.root_name]
+            self.restoreManagerUser(app, options.manager_password)
+            transaction.commit()
+            connection.close()
+        return db
+
+    def beforeRun(self, options, db):
+        if options.daemon:
+            daemonize()
+
+        task_dispatcher = ThreadedTaskDispatcher()
+        task_dispatcher.setThreadCount(options.config.thread_pool_size)
+
+        for ip, port in options.config.web:
+            http.create('HTTP', task_dispatcher, db, port=port, ip=ip)
+
+        for ip, port in options.config.rest:
+            restServerType.create('REST', task_dispatcher, db,
+                                  port=port, ip=ip)
+
+        # TODO BBB: remove the folowing lines after a while.
+        # respecting options.config.listen is depreciated and for
+        # compatibility only.
+        for ip, port in options.config.listen:
+            restServerType.create('REST', task_dispatcher, db,
+                                  port=port, ip=ip)
+
+        notify(ProcessStarting())
+
+        if options.config.pid_file:
+            pidfile = file(options.config.pid_file, "w")
+            print >> pidfile, os.getpid()
+            pidfile.close()
+
+    def afterRun(self, options):
+        if options.config.pid_file:
+            os.unlink(options.config.pid_file)
+
+    def configureReportlab(self, fontdir):
+        """Configure reportlab given a path to TrueType fonts.
+
+        Disables PDF support in SchoolTool if fontdir is empty.
+        Outputs a warning to stderr in case of errors.
+        """
+        if not fontdir:
+            return
+
+        try:
+            import reportlab
+        except ImportError:
+            print >> sys.stderr, _("Warning: could not find the reportlab"
+                                   " library.\nPDF support disabled.")
+            return
+
+        if not os.path.isdir(fontdir):
+            print >> sys.stderr, (_("Warning: font directory '%s' does"
+                                    " not exist.\nPDF support disabled.")
+                                  % fontdir)
+            return
+
+        for font_file in pdfcal.font_map.values():
+            font_path = os.path.join(fontdir, font_file)
+            if not os.path.exists(font_path):
+                print >> sys.stderr, _("Warning: font '%s' does not exist.\n"
+                                       "PDF support disabled.") % font_path
+                return
+
+        pdfcal.setUpMSTTCoreFonts(fontdir)
+
+
+if __name__ == '__main__':
+    StandaloneServer().main()


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/main.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/membership.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/membership.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/membership.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,261 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Membership relationship.
+
+This module defines group membership as a relationship.
+
+We can reuse most of the test fixture from schooltool.relationship.tests.
+
+    >>> from schooltool.relationship.tests import setUp, tearDown
+    >>> setUp()
+
+We also need to register an event subscriber for IBeforeRelationshipEvent,
+to enforce relationship constraints.
+
+    >>> import zope.event
+    >>> old_subscribers = zope.event.subscribers[:]
+    >>> zope.event.subscribers.append(enforceMembershipConstraints)
+
+We will need some sample persons and groups for the demonstration
+
+    >>> from schooltool.group.group import Group
+    >>> from schooltool.person.person import Person
+    >>> jonas = Person()
+    >>> petras = Person()
+    >>> developers = Group()
+    >>> admins = Group()
+
+You can create memberships this way:
+
+    >>> from schooltool.app.membership import Membership
+    >>> Membership(member=jonas, group=developers)
+    >>> Membership(member=petras, group=developers)
+    >>> Membership(member=petras, group=admins)
+
+You can find all members of a group, or groups of a persons this way:
+
+    >>> from sets import Set
+    >>> from schooltool.relationship import getRelatedObjects
+    >>> from schooltool.app.membership import URIMember, URIGroup
+    >>> Set(getRelatedObjects(developers, URIMember)) == Set([jonas, petras])
+    True
+    >>> Set(getRelatedObjects(petras, URIGroup)) == Set([admins, developers])
+    True
+
+There are some constraints: Only objects providing IGroup can be groups.
+
+    >>> Membership(member=jonas, group=petras)
+    Traceback (most recent call last):
+      ...
+    InvalidRelationship: Groups must provide IGroup.
+
+You may not create cyclic memberships.
+
+    >>> Membership(member=admins, group=developers)
+    >>> Membership(member=developers, group=admins)
+    Traceback (most recent call last):
+      ...
+    InvalidRelationship: No cycles are allowed.
+
+You may not create ill-formed relationships
+
+    >>> from schooltool.relationship import relate
+    >>> from schooltool.app.membership import URIMembership
+    >>> relate(URIMembership, (jonas, URIMember), (petras, URIMember))
+    Traceback (most recent call last):
+      ...
+    InvalidRelationship: Membership must have one member and one group.
+
+    >>> relate(URIMembership, (jonas, URIGroup), (petras, URIGroup))
+    Traceback (most recent call last):
+      ...
+    InvalidRelationship: Membership must have one member and one group.
+
+Resources can't be part of a group:
+
+    >>> from schooltool.resource.resource import Resource
+    >>> printer = Resource()
+    >>> relate(URIMembership, (admins, URIGroup), (printer, URIMember))
+    Traceback (most recent call last):
+      ...
+    InvalidRelationship: Resources cannot be members of a group.
+
+Of course, these constraints do not apply to other kinds of relationships.
+
+    >>> from schooltool.relationship.tests import URIStub
+    >>> relate('example:Frogship', (jonas, URIStub('example:Frog')),
+    ...                            (petras, URIStub('example:Frog')))
+
+That's all.
+
+    >>> zope.event.subscribers[:] = old_subscribers
+    >>> tearDown()
+
+"""
+
+import sets
+
+from zope.component import adapts
+
+from schooltool.relationship import URIObject, RelationshipSchema
+from schooltool.relationship import getRelatedObjects
+from schooltool.relationship.interfaces import IBeforeRelationshipEvent
+from schooltool.relationship.interfaces import InvalidRelationship
+from schooltool.resource.interfaces import IBaseResource
+from schooltool.group.interfaces import IBaseGroup as IGroup
+from schooltool.person.interfaces import IPerson
+from schooltool.securitypolicy.crowds import Crowd
+
+
+URIMembership = URIObject('http://schooltool.org/ns/membership',
+                          'Membership', 'The membership relationship.')
+URIGroup = URIObject('http://schooltool.org/ns/membership/group',
+                     'Group', 'A role of a containing group.')
+URIMember = URIObject('http://schooltool.org/ns/membership/member',
+                      'Member', 'A group member role.')
+
+Membership = RelationshipSchema(URIMembership,
+                                member=URIMember,
+                                group=URIGroup)
+
+
+def enforceMembershipConstraints(event):
+    """Enforce membership constraints (IBeforeRelationshipEvent subscriber)."""
+    # XXX look through all the IBeforeRelationshipEvent subscribers,
+    # if there are any, and convert them to something different.
+    if not IBeforeRelationshipEvent.providedBy(event):
+        return
+    if event.rel_type != URIMembership:
+        return
+    if ((event.role1, event.role2) != (URIMember, URIGroup) and
+        (event.role1, event.role2) != (URIGroup, URIMember)):
+        raise InvalidRelationship('Membership must have one member'
+                                  ' and one group.')
+    if IBaseResource.providedBy(event[URIMember]):
+        raise InvalidRelationship("Resources cannot be members of a group.")
+    if not IGroup.providedBy(event[URIGroup]):
+        raise InvalidRelationship('Groups must provide IGroup.')
+    if isTransitiveMember(event[URIGroup], event[URIMember]):
+        raise InvalidRelationship('No cycles are allowed.')
+
+
+def isTransitiveMember(obj, group):
+    """Is `obj` a member of `group` (either directly or indirectly)?
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+    Suppose we have four groups, named a, b, c and d.
+
+        >>> from schooltool.group.group import Group
+        >>> a, b, c, d = [Group() for n in range(4)]
+
+    A is a member of b, which is a member of c.
+
+        >>> Membership(member=a, group=b)
+        >>> Membership(member=b, group=c)
+
+    If a is a member of b, it is, obviously, a transitive member
+
+        >>> isTransitiveMember(a, b)
+        True
+
+    If a is a member of b, which is a member of c, then a is a transitive
+    member of c.
+
+        >>> isTransitiveMember(a, c)
+        True
+
+    We say that a is a transitive member of a, for convenience.
+
+        >>> isTransitiveMember(a, a)
+        True
+
+    In all other cases, we return False.
+
+        >>> isTransitiveMember(b, a)
+        False
+        >>> isTransitiveMember(c, a)
+        False
+        >>> isTransitiveMember(a, d)
+        False
+
+    That's it.
+
+        >>> tearDown()
+
+    """
+    if obj is group:
+        return True
+    # A group usually has more members than a member has groups, so we will
+    # find all transitive groups of `obj` and see whether `group` is one of
+    # them.  It does not matter if we use breadth-first or depth-first search.
+    queue = [obj]
+    seen = sets.Set([id(obj)])
+    while queue:
+        cur_obj = queue.pop() # therefore DFS; change to pop(0) to get BFS
+        for new_group in getRelatedObjects(cur_obj, URIGroup):
+            if new_group is group:
+                return True
+            if id(new_group) not in seen:
+                seen.add(id(new_group))
+                queue.append(new_group)
+    return False
+
+
+class GroupMemberCrowd(Crowd):
+    """Crowd that contains all the members of the group.
+
+        >>> from schooltool.app.membership import GroupMemberCrowd
+        >>> class GroupStub(object):
+        ...     def __init__(self, members):
+        ...         self.members = members
+        >>> class PrincipalStub(object):
+        ...     def __init__(self, name):
+        ...         self.name = name
+        ...     def __conform__(self, iface):
+        ...         if iface == IPerson:
+        ...             return self.name
+        >>> group = GroupStub(["Petras"])
+        >>> crowd = GroupMemberCrowd(group)
+
+    If person is not a member of the group return False:
+
+        >>> crowd.contains(PrincipalStub("Jonas"))
+        False
+
+    If the person is in the member list of the context group return
+    True:
+
+        >>> crowd.contains(PrincipalStub("Petras"))
+        True
+
+    Some principals might not adapt to IPerson, they should be
+    rejected:
+
+        >>> crowd.contains("Foo")
+        False
+
+    """
+
+    adapts(IGroup)
+
+    def contains(self, principal):
+        return IPerson(principal, None) in self.context.members


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/membership.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/overlay.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/overlay.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/overlay.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,448 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Calendar overlays.
+
+This module defines relationships used to store calendar subscriptions.
+
+    >>> from zope.app.testing import setup
+    >>> setup.placelessSetUp()
+    >>> setup.setUpAnnotations()
+
+    >>> from schooltool.testing import setup as sbsetup
+    >>> sbsetup.setUpCalendaring()
+
+    >>> from schooltool.relationship.tests import setUpRelationships
+    >>> setUpRelationships()
+
+We will need some sample persons and groups for the demonstration
+
+    >>> from schooltool.group.group import Group
+    >>> from schooltool.person.person import Person
+    >>> john = Person(title="John")
+    >>> smith = Person(title="Smith")
+    >>> developers = Group(title="Developers")
+    >>> admins = Group(title="Admins")
+
+Let's say John wants to see the calendars of Smith and the Developers group
+overlaid on his own calendar
+
+    >>> john.overlaid_calendars.add(ISchoolToolCalendar(smith))
+    <...CalendarOverlayInfo object at ...>
+    >>> john.overlaid_calendars.add(ISchoolToolCalendar(developers))
+    <...CalendarOverlayInfo object at ...>
+
+He also wants the Admins group calendar to be displayed in the overlaid
+calendars portlet, but hidden by default, and perhaps set the colour to green:
+
+    >>> info = john.overlaid_calendars.add(ISchoolToolCalendar(admins),
+    ...                                    show=False)
+    >>> info.color1 = 'green'
+
+Iterating over `overlaid_calendars` returns ICalendarOverlayInfo objects
+
+    >>> for item in john.overlaid_calendars:
+    ...     checked = item.show and "+" or " "
+    ...     title = item.calendar.__parent__.title
+    ...     print "[%s] %-10s (%s, %s)" % (checked, title,
+    ...                                    item.color1, item.color2)
+    [+] Smith      (#e0b6af, #c1665a)
+    [+] Developers (#eed680, #d1940c)
+    [ ] Admins     (green, #83a67f)
+
+However, 'in' checks for the presence of a calendar
+
+    >>> ISchoolToolCalendar(smith) in john.overlaid_calendars
+    True
+    >>> ISchoolToolCalendar(Person(title="Newcomer")) in john.overlaid_calendars
+    False
+
+Clean up
+
+    >>> setup.placelessTearDown()
+
+"""
+
+import sys
+
+from persistent import Persistent
+from zope.proxy import getProxiedObject
+from zope.interface import Interface, implements
+from zope.schema import Object, TextLine, Bool
+from zope.app.container.interfaces import IObjectRemovedEvent
+
+from schooltool.relationship import URIObject
+from schooltool.relationship.interfaces import IRelationshipLinks
+from schooltool.relationship.relationship import BoundRelationshipProperty
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.interfaces import IHaveCalendar
+from schooltool.relationship.relationship import unrelateAll
+
+
+URICalendarSubscription = URIObject(
+                "http://schooltool.org/ns/calendar_subscription",
+                "Calendar subscription",
+                "The calendar subscription relationship.")
+
+URICalendarProvider = URIObject(
+                "http://schooltool.org/ns/calendar_subscription/provider",
+                "Calendar provider",
+                "A role of an object providing a calendar.")
+
+URICalendarSubscriber = URIObject(
+                "http://schooltool.org/ns/calendar_subscription/subscriber",
+                "Calendar subscriber",
+                "A role of an object that subscribes to a calendar.")
+
+
+DEFAULT_COLORS = (
+        ('#e0b6af', '#c1665a'), # Red Highlight, Red Medium
+        ('#eed680', '#d1940c'), # Accent Yellow, Accent Yellow Dark
+        ('#c5d2c8', '#83a67f'), # Green Highlight, Green Medium
+        ('#efe0cd', '#e0c39e'), # Face Skin Highlight, Face Skin Medium
+        ('#ada7c8', '#887fa3'), # Purple Highlight, Purple Medium
+        ('#eae8e3', '#bab5ab'), # Basic 3D Highlight, Basic 3D Medium
+        ('#e0c39e', '#b39169'), # Face Skin Medium, Face Skin Dark
+        ('#c1665a', '#884631'), # Red Medium, Red Dark
+        ('#b39169', '#826647'), # Face Skin Dark, Face Skin Shadow
+        ('#83a67f', '#5d7555'), # Green Medium, Green Dark
+    )
+
+
+class ICalendarOverlayInfo(Interface):
+    """Information about an overlaid calendar."""
+
+    calendar = Object(
+            title=u"Calendar",
+            schema=ISchoolToolCalendar,
+            description=u"""
+            Calendar.
+            """)
+
+    color1 = TextLine(
+            title=u"Color 1",
+            description=u"""
+            Color for this calendar.
+
+            This is a string that is acceptable as a CSS color, e.g. '#ccffee'.
+            """)
+
+    color2 = TextLine(
+            title=u"Color 2",
+            description=u"""
+            Color for this calendar.
+
+            This is a string that is acceptable as a CSS color, e.g. '#ccffee'.
+            """)
+
+    show = Bool(
+            title=u"Show",
+            description=u"""
+            An option that controls whether events from this calendar are shown
+            in the calendar views (show=True), or if they are only listed in
+            the portlet (show=False).
+            """)
+
+
+class IOverlaidCalendarsProperty(Interface):
+    """A property for maintaining a list of overlaid calendars."""
+
+    def __nonzero__():
+        """Are there any overlaid calendars?"""
+
+    def __len__():
+        """Return the number of overlaid calendars."""
+
+    def __contains__(calendar):
+        """Check whether `calendar` is in the list."""
+
+    def __iter__():
+        """Iterate over all overlaid calendars.
+
+        Returns ICalendarOverlayInfo objects.  Iteration order is unspecified.
+        """
+
+    def add(calendar, show=True, color1=None, color2=None):
+        """Add `calendar` to the list.
+
+        If `color1` or `color2` is not specified, a pair of colours are chosen
+        from a list of standard colors.  The color chooser tries to minimize
+        color conflicts with other overlaid calendars.
+        """
+
+    def remove(calendar):
+        """Remove `calendar` from the list."""
+
+
+class OverlaidCalendarsProperty(object):
+    """Property for `overlaid_calendars`.
+
+    Stores the list of overlaid calendars in relationships.
+
+    Example:
+
+        >>> class SomeClass(object): # must be a new-style class
+        ...     calendars = OverlaidCalendarsProperty()
+
+        >>> from zope.interface.verify import verifyObject
+        >>> someinstance = SomeClass()
+        >>> verifyObject(IOverlaidCalendarsProperty, someinstance.calendars)
+        True
+
+    """
+
+    def __get__(self, instance, owner):
+        if instance is None:
+            return self
+        else:
+            return BoundOverlaidCalendarsProperty(instance)
+
+
+class BoundOverlaidCalendarsProperty(BoundRelationshipProperty):
+    """Bound property for `overlaid_calendars`
+
+    Stores the list of overlaid calendars in relationships.
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> from schooltool.relationship.tests import SomeObject
+        >>> from schooltool.relationship import getRelatedObjects
+        >>> setUp()
+
+    Given a relatable object, and a relatable calendar
+
+        >>> a = SomeObject('a')
+        >>> cal = SomeObject('cal')
+
+    we can create a BoundOverlaidCalendarsProperty
+
+        >>> overlaid_calendars = BoundOverlaidCalendarsProperty(a)
+
+    The `add` method establishes a URICalendarSubscriber relationship
+
+        >>> overlaid_calendars.add(cal)
+        <...CalendarOverlayInfo object at ...>
+        >>> getRelatedObjects(a, URICalendarProvider)
+        [cal]
+        >>> getRelatedObjects(cal, URICalendarSubscriber)
+        [a]
+
+    `__nonzero__` and `__len__` do the obvious things
+
+        >>> bool(overlaid_calendars)
+        True
+        >>> len(overlaid_calendars)
+        1
+
+    The `remove` method breaks it
+
+        >>> overlaid_calendars.remove(cal)
+        >>> len(overlaid_calendars)
+        0
+        >>> bool(overlaid_calendars)
+        False
+        >>> getRelatedObjects(a, URICalendarProvider)
+        []
+        >>> getRelatedObjects(cal, URICalendarSubscriber)
+        []
+
+    You can specify extra arguments for `add`
+
+        >>> overlaid_calendars.add(cal, show=False,
+        ...                        color1="red", color2="green")
+        <...CalendarOverlayInfo object at ...>
+
+    You can extract these when iterating
+
+        >>> for item in overlaid_calendars:
+        ...     print item.calendar, item.show, item.color1, item.color2
+        cal False red green
+
+    We're done.
+
+        >>> tearDown()
+
+    """
+
+    implements(IOverlaidCalendarsProperty)
+
+    def __init__(self, this):
+        BoundRelationshipProperty.__init__(self, this, URICalendarSubscription,
+                                           URICalendarSubscriber,
+                                           URICalendarProvider)
+        # for the local grants to work
+        self.__parent__ = this
+
+    def add(self, calendar, show=True, color1=None, color2=None):
+        if not color1 or not color2:
+            used_colors = [(item.color1, item.color2) for item in self]
+            color1, color2 = choose_color(DEFAULT_COLORS, used_colors)
+        info = CalendarOverlayInfo(calendar, show, color1, color2)
+        info.__parent__ = self.this
+        BoundRelationshipProperty.add(self, calendar, info)
+        return info
+
+    def __contains__(self, calendar):
+        for item in self:
+            if item.calendar is calendar:
+                return True
+        return False
+
+    def __iter__(self):
+        for link in IRelationshipLinks(self.this):
+            if link.role == self.other_role and link.rel_type == self.rel_type:
+                yield link.extra_info
+
+
+class CalendarOverlayInfo(Persistent):
+    """Information about an overlaid calendar.
+
+        >>> from zope.interface.verify import verifyObject
+        >>> calendar = object()
+        >>> item = CalendarOverlayInfo(calendar, True, 'red', 'yellow')
+        >>> verifyObject(ICalendarOverlayInfo, item)
+        True
+
+    The calendar attribute must be read-only, because a CalendarOverlayInfo is
+    stored as an attribute on a specific relationship with a specific calendar
+    object.
+
+        >>> item.calendar = object()
+        Traceback (most recent call last):
+          ...
+        AttributeError: can't set attribute
+
+    `show`, `color1` and `color2` attributes are changeable
+
+        >>> item.show = True
+        >>> item.color1 = 'blue'
+        >>> item.color2 = 'black'
+
+    """
+
+    implements(ICalendarOverlayInfo)
+
+    calendar = property(lambda self: self._calendar)
+
+    def __init__(self, calendar, show, color1, color2):
+        self._calendar = calendar
+        self.show = show
+        self.color1 = color1
+        self.color2 = color2
+
+
+def choose_color(colors, used_colors):
+    """Choose a color, avoiding colors that have been used already.
+
+        >>> colors = ('red', 'green', 'blue')
+
+    choose_color picks the first unused color.
+
+        >>> choose_color(colors, [])
+        'red'
+        >>> choose_color(colors, ['red'])
+        'green'
+        >>> choose_color(colors, ['green', 'red'])
+        'blue'
+
+    If all colors have been used, choose_color picks the one that
+    has been used the least number of times, and if there are several
+    such colors, picks the first of them.
+
+        >>> choose_color(colors, ['green', 'red', 'blue'])
+        'red'
+        >>> choose_color(colors, ['green', 'red', 'blue', 'red'])
+        'green'
+
+    You can also use choose_color for color pairs
+
+        >>> pairs = [('red', 'green'), ('red', 'yellow'), ('blue', 'green')]
+        >>> choose_color(pairs, [('red', 'green')])
+        ('red', 'yellow')
+
+    """
+    if not colors:
+        raise ValueError("no colors to choose from")
+    used_count = {}
+    for c in used_colors:
+        used_count[c] = used_count.get(c, 0) + 1
+    min_count = sys.maxint
+    for c in colors:
+        count = used_count.get(c, 0)
+        if count == 0:
+            return c
+        if count < min_count:
+            best_color = c
+            min_count = count
+    return best_color
+
+
+def unrelateCalendarOnDeletion(event):
+    """When you delete an object, relationships of it's calendar should be removed
+
+        >>> from zope.app.testing import setup
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> from schooltool.testing.setup import setUpCalendaring
+
+        >>> setUp()
+        >>> setUpCalendaring()
+
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> from schooltool.app.overlay import unrelateCalendarOnDeletion
+        >>> zope.event.subscribers.append(unrelateCalendarOnDeletion)
+
+
+    We will need some object that implements IHaveCalendar for that:
+
+        >>> from zope.app.container.btree import BTreeContainer
+        >>> container = BTreeContainer()
+        >>> from schooltool.person.person import Person
+        >>> container = BTreeContainer()
+        >>> container['jonas'] = jonas = Person(username="Jonas")
+        >>> container['petras'] = petras =  Person(username="Petras")
+
+    Let's add calendar of Petras to the list of overlaid calendars:
+
+        >>> jonas.overlaid_calendars.add(ISchoolToolCalendar(petras))
+        <...CalendarOverlayInfo object at ...>
+        >>> list(jonas.overlaid_calendars)
+        [<schooltool.app.overlay.CalendarOverlayInfo object at ...>]
+
+    If we delete Petras - Jonas should have no calendars in his overlay list:
+
+        >>> del container['petras']
+        >>> list(jonas.overlaid_calendars)
+        []
+
+    Restore old subscribers:
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+
+    """
+    if not IObjectRemovedEvent.providedBy(event):
+        return
+    # event.object may be a ContainedProxy
+    obj = getProxiedObject(event.object)
+    if not IHaveCalendar.providedBy(obj):
+        return
+    calendar = ISchoolToolCalendar(obj)
+    linkset = IRelationshipLinks(calendar, None)
+    if linkset is not None:
+        unrelateAll(calendar)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/overlay.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/relationships.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/relationships.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/relationships.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,192 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Relationship URIs and utilities for schooltool
+
+$Id: relationships.py 6300 2006-06-18 22:18:12Z ignas $
+
+"""
+
+from schooltool.course.interfaces import ICourse, ISection
+from schooltool.person.interfaces import IPerson
+from schooltool.group.interfaces import IGroup
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.interfaces import IShowTimetables
+from schooltool.app.membership import URIMembership, URIMember, URIGroup
+from schooltool.relationship import URIObject, RelationshipSchema
+from schooltool.relationship.interfaces import IBeforeRelationshipEvent
+from schooltool.relationship.interfaces import IRelationshipAddedEvent
+from schooltool.relationship.interfaces import IRelationshipRemovedEvent
+from schooltool.relationship.interfaces import InvalidRelationship
+
+
+#
+# The Instruction relationship
+#
+
+URIInstruction = URIObject('http://schooltool.org/ns/instruction',
+                           'Instruction', 'The instruction relationship.')
+URISection = URIObject('http://schooltool.org/ns/instruction/section',
+                       'Section', 'A role of a containing section.')
+URIInstructor = URIObject('http://schooltool.org/ns/instruction/instructor',
+                          'Instructor', 'A section instructor role.')
+
+Instruction = RelationshipSchema(URIInstruction,
+                                 instructor=URIInstructor,
+                                 section=URISection)
+
+
+def enforceInstructionConstraints(event):
+    """Enforce instruction constraints (IBeforeRelationshipEvent subscriber).
+    """
+    if not IBeforeRelationshipEvent.providedBy(event):
+        return
+    if event.rel_type != URIInstruction:
+        return
+    if ((event.role1, event.role2) != (URIInstructor, URISection) and
+        (event.role1, event.role2) != (URISection, URIInstructor)):
+        raise InvalidRelationship('Instruction must have one instructor'
+                                  ' and one section.')
+    if not ISection.providedBy(event[URISection]):
+        raise InvalidRelationship('Sections must provide ISection.')
+
+
+def updateInstructorCalendars(event):
+    """Add section's calendar to instructors overlaid calendars."""
+
+    if event.rel_type != URIInstruction:
+        return
+
+    person = event[URIInstructor]
+    section = event[URISection]
+    calendar = ISchoolToolCalendar(section)
+    if IRelationshipAddedEvent.providedBy(event):
+        if calendar not in person.overlaid_calendars:
+            overlay_info = person.overlaid_calendars.add(calendar)
+            IShowTimetables(overlay_info).showTimetables = False
+    elif IRelationshipRemovedEvent.providedBy(event):
+        if calendar in person.overlaid_calendars:
+            person.overlaid_calendars.remove(calendar)
+
+
+#
+# The CourseSection relationship
+#
+
+
+URICourseSections = URIObject('http://schooltool.org/ns/coursesections',
+                          'Course Sections',
+                          'The sections that implement a course.')
+
+URICourse = URIObject('http://schooltool.org/ns/coursesections/course',
+                      'Course', 'A section that implements a course.')
+
+# TODO it seems to me like this should be the same as URISection but because
+# the URIs for roles have, so far, included the ../ns/RELATIONSHIP/.. that the
+# role participates in I'm creating a seperate role URI.
+
+URISectionOfCourse = URIObject(
+                      'http://schooltool.org/ns/coursesections/section',
+                      'Section', 'A course of study.')
+
+def enforceCourseSectionConstraint(event):
+    """Each CourseSections relationship requires one ICourse and one ISection
+    """
+    if not IBeforeRelationshipEvent.providedBy(event):
+        return
+    if event.rel_type != URICourseSections:
+        return
+    if ((event.role1, event.role2) != (URICourse, URISectionOfCourse) and
+        (event.role1, event.role2) != (URISectionOfCourse, URIInstructor)):
+        raise InvalidRelationship('CourseSections must have one course'
+                                  ' and one section.')
+    if not ISection.providedBy(event[URISectionOfCourse]):
+        raise InvalidRelationship('Sections must provide ISection.')
+    if not ICourse.providedBy(event[URICourse]):
+        raise InvalidRelationship('Course must provide ICourse.')
+
+
+CourseSections = RelationshipSchema(URICourseSections,
+                                    course=URICourse,
+                                    section=URISectionOfCourse)
+
+#
+# Additional handling of the section membership relationship to add sections
+# to members' (students') overlay portlets automatically.  In Group membership
+# relationships users must manually add the calendar to the portlet (see
+# schooltool.app.membership).
+#
+
+def updateStudentCalendars(event):
+    """Add section's calendar to students overlaid calendars."""
+
+    if event.rel_type != URIMembership:
+        return
+
+    section = event[URIGroup]
+
+    # Only continue if we're working with Sections rather than generic groups
+    if not ISection.providedBy(section):
+        return
+
+    member = event[URIMember]
+
+    calendar = ISchoolToolCalendar(section)
+    if IRelationshipAddedEvent.providedBy(event):
+        if IPerson.providedBy(member) and \
+                calendar not in member.overlaid_calendars:
+            overlay_info = member.overlaid_calendars.add(calendar)
+            IShowTimetables(overlay_info).showTimetables = False
+
+        elif IGroup.providedBy(member):
+            for person in member.members:
+                # we don't handle nested groups any more so there
+                # shouldn't be more than one layer of groups
+                # TODO make sure nested groups are not possible via REST
+                if IPerson.providedBy(person) and \
+                        calendar not in person.overlaid_calendars:
+                    overlay_info = person.overlaid_calendars.add(calendar)
+                    IShowTimetables(overlay_info).showTimetables = False
+
+    elif IRelationshipRemovedEvent.providedBy(event):
+        if IPerson.providedBy(member):
+            if calendar in member.overlaid_calendars:
+                member.overlaid_calendars.remove(calendar)
+
+        elif IGroup.providedBy(member):
+            for person in member.members:
+                if IPerson.providedBy(person):
+                    if calendar in person.overlaid_calendars:
+                        person.overlaid_calendars.remove(calendar)
+
+
+#
+# The leadership relationship
+#
+
+URILeadership = URIObject('http://schooltool.org/ns/leadership',
+                          'Leadership', 'The leadership relationship.')
+URILeader = URIObject('http://schooltool.org/ns/leadership/leader',
+                      'Leader', 'A role of a leader of an asset.')
+URIAsset = URIObject('http://schooltool.org/ns/leadership/asset',
+                     'Asset', 'An asset of a leader.')
+
+Leadership = RelationshipSchema(URILeadership,
+                                leader=URILeader,
+                                asset=URIAsset)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/relationships.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Restive XML views for the SchoolTool application.
+
+$Id: __init__.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+from zope.interface import implements
+from zope.publisher.http import HTTPRequest
+from zope.server.http.commonaccesslogger import CommonAccessLogger
+from zope.server.http.wsgihttpserver import WSGIHTTPServer
+from zope.app.publication.interfaces import IPublicationRequestFactory
+from zope.app.publication.http import HTTPPublication
+from zope.app.server.wsgi import ServerType
+from zope.app.wsgi import WSGIPublisherApplication
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile \
+                                                as Template # reexport
+
+
+class RestPublicationRequestFactory(object):
+    """Request factory for the RESTive server.
+
+    This request factory always creates HTTPRequests, regardless of
+    the method or content type of the incoming request.
+    """
+
+    implements(IPublicationRequestFactory)
+
+    def __init__(self, db):
+        """See `zope.app.publication.interfaces.IPublicationRequestFactory`"""
+        self.db = db
+
+    def __call__(self, input_stream, env):
+        """See `zope.app.publication.interfaces.IPublicationRequestFactory`"""
+        request = HTTPRequest(input_stream, env)
+        request.setPublication(HTTPPublication(self.db))
+
+        return request
+
+
+restServerType = ServerType(WSGIHTTPServer,
+                            WSGIPublisherApplication,
+                            CommonAccessLogger,
+                            7001, True,
+                            requestFactory=RestPublicationRequestFactory)
+
+
+class View(object):
+    """A base class for RESTive views."""
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def GET(self):
+        return self.template(self.request, view=self, context=self.context)
+
+    def HEAD(self):
+        body = self.GET()
+        request.setHeader('Content-Length', len(body))
+        return ""


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/app.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/app.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/app.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,200 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for SchoolToolApplication
+
+$Id: app.py 5990 2006-04-27 16:38:09Z faassen $
+"""
+
+from zope.app import zapi
+from zope.interface import implements
+from zope.app.container.interfaces import INameChooser
+from zope.filerepresentation.interfaces import IFileFactory, IWriteFile
+
+from schooltool.xmlparsing import XMLDocument
+from schooltool.app.rest import View, Template
+from schooltool.app.interfaces import IWriteCalendar, ISchoolToolCalendar
+from schooltool.calendar.icalendar import convert_calendar_to_ical
+from schooltool.traverser.traverser import NullTraverserPlugin
+from schooltool.traverser.traverser import AdapterTraverserPlugin
+
+
+class ApplicationObjectFileFactory(object):
+    """A superclass for ApplicationObjectContainer to FileFactory adapters."""
+
+    implements(IFileFactory)
+
+    def __init__(self, container):
+        self.context = container
+
+    def parseXML(self, data):
+        """Get values from document, and put them into a dict."""
+        doc = XMLDocument(data, self.schema)
+        try:
+            doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+            return self.parseDoc(doc)
+        finally:
+            doc.free()
+
+    def __call__(self, name, content_type, data):
+        return self.factory(**self.parseXML(data))
+
+
+class ApplicationObjectFile(object):
+    """Adapter adapting Application Objects to IWriteFile"""
+
+    implements(IWriteFile)
+
+    def __init__(self, context):
+        self.context = context
+
+    def write(self, data):
+        """See IWriteFile"""
+        container = self.context.__parent__
+        factory = IFileFactory(container)
+        kwargs = factory.parseXML(data)
+        self.modify(**kwargs)
+
+
+class ApplicationView(View):
+    """The root view for the application."""
+
+    template = Template("templates/app.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    def getContainers(self):
+        return [{'href': zapi.absoluteURL(self.context[key], self.request),
+                 'title': key} for key in self.context.keys()]
+
+
+class GenericContainerView(View):
+    """A RESTive container view superclass."""
+
+    template = Template("templates/aoc.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    def getName(self):
+        return self.context.__name__
+
+    def items(self):
+        return [{'href': zapi.absoluteURL(self.context[key], self.request),
+                 'title': self.context[key].title}
+                for key in self.context.keys()]
+
+    def add(self, obj):
+        chooser = INameChooser(self.context)
+        name = chooser.chooseName(None, obj)
+        self.context[name] = obj
+
+    def POST(self):
+        return self.create()
+
+    def create(self):
+        """Create a new object from the data supplied in the request."""
+
+        response = self.request.response
+        body = self.request.bodyStream.read()
+
+        factory = IFileFactory(self.context)
+        item = factory(None, None, body)
+        self.add(item)
+        location = zapi.absoluteURL(item, self.request)
+
+        response.setStatus(201, 'Created')
+        response.setHeader('Content-Type', 'text/plain; charset=UTF-8')
+        response.setHeader('Location', location)
+        return u"Object created: %s" % location
+
+
+def getCharset(content_type, default="UTF-8"):
+    """Get charset out of content-type
+
+        >>> getCharset('text/xml; charset=latin-1')
+        'latin-1'
+
+        >>> getCharset('text/xml; charset=yada-yada')
+        'yada-yada'
+
+        >>> getCharset('text/xml; charset=yada-yada; fo=ba')
+        'yada-yada'
+
+        >>> getCharset('text/plain')
+        'UTF-8'
+
+        >>> getCharset(None)
+        'UTF-8'
+
+    """
+    if not content_type:
+        return default
+
+    parts = content_type.split(";")
+    if len(parts) == 0:
+        return default
+
+    stripped_parts = [part.strip() for part in parts]
+
+    charsets = [part for part in stripped_parts
+                if part.startswith("charset=")]
+
+    if len(charsets) == 0:
+        return default
+
+    return charsets[0].split("=")[1]
+
+
+class CalendarView(View):
+    """Restive view for calendars"""
+
+    def GET(self):
+        data = "\r\n".join(convert_calendar_to_ical(self.context)) + "\r\n"
+        request = self.request
+        request.response.setHeader('Content-Type',
+                                   'text/calendar; charset=UTF-8')
+        request.response.setHeader('Content-Length', len(data))
+        request.response.setStatus(200)
+        return data
+
+    def PUT(self):
+        request = self.request
+
+        for name in request:
+            if name.startswith('HTTP_CONTENT_'):
+                # Unimplemented content header
+                request.response.setStatus(501)
+                return ''
+
+        body = self.request.bodyStream
+        data = body.read()
+        charset = getCharset(self.request.getHeader("Content-Type"))
+
+        adapter = IWriteCalendar(self.context)
+        adapter.write(data, charset)
+        return ''
+
+
+NullICSCalendarTraverserPlugin = NullTraverserPlugin('calendar.ics')
+NullVFBCalendarTraverserPlugin = NullTraverserPlugin('calendar.vfb')
+
+CalendarTraverserPlugin = AdapterTraverserPlugin(
+    'calendar', ISchoolToolCalendar)
+ICSCalendarTraverserPlugin = AdapterTraverserPlugin(
+    'calendar.ics', ISchoolToolCalendar)
+VFBCalendarTraverserPlugin = AdapterTraverserPlugin(
+    'calendar.vfb', ISchoolToolCalendar)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,269 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+<!-- Security Declarations -->
+
+  <class class="schooltool.relationship.relationship.LinkSet">
+    <allow
+       interface="schooltool.relationship.interfaces.IRelationshipLinks"
+       />
+  </class>
+
+  <class class="schooltool.relationship.relationship.Link">
+    <allow
+       interface="schooltool.relationship.interfaces.IRelationshipLink"
+       />
+  </class>
+
+  <class class="schooltool.relationship.uri.URIObject">
+    <allow
+       interface="schooltool.relationship.uri.IURIObject"
+       />
+  </class>
+
+<!-- Traversers -->
+
+  <view
+      for="zope.interface.Interface"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ISchoolToolApplication"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ISchoolToolCalendar"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="zope.app.container.interfaces.IReadContainer
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory="zope.app.http.traversal.ContainerTraverser"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="schooltool.app.interfaces.IHaveCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".app.CalendarTraverserPlugin"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="schooltool.app.interfaces.IHaveCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".app.ICSCalendarTraverserPlugin"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="schooltool.app.interfaces.IHaveCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".app.VFBCalendarTraverserPlugin"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="zope.annotation.interfaces.IAnnotatable
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".relationships.RelationshipsTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.relationship.interfaces.IRelationshipLinks"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.IPublishTraverse"
+      factory=".relationships.LinkTraverser"
+      permission="zope.Public"
+      />
+
+  <!-- the following are used by PUT requests on the normal web server -->
+  <subscriber
+      for="schooltool.app.interfaces.ISchoolToolCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".app.NullICSCalendarTraverserPlugin"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="schooltool.app.interfaces.ISchoolToolCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".app.NullVFBCalendarTraverserPlugin"
+      permission="zope.Public"
+      />
+
+<!-- RESTive verbs implementations -->
+
+  <view
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      name="GET"
+      factory=".app.ApplicationView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      name="GET"
+      factory=".app.CalendarView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      name="PUT"
+      factory=".app.CalendarView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <class class="schooltool.app.rest.relationships.RelationshipsView">
+    <allow attributes="GET" />
+    <require permission="schooltool.edit"
+             attributes="POST" />
+  </class>
+
+  <view
+      for="schooltool.relationship.interfaces.IRelationshipLinks"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      factory="schooltool.app.rest.relationships.RelationshipsViewFactory"
+      name="GET"
+      />
+
+  <view
+      for="schooltool.relationship.interfaces.IRelationshipLinks"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      factory="schooltool.app.rest.relationships.RelationshipsViewFactory"
+      name="POST"
+      />
+
+  <class class="schooltool.app.rest.relationships.LinkView">
+    <allow attributes="GET info" />
+    <require permission="schooltool.edit"
+             attributes="DELETE" />
+  </class>
+
+  <view
+      for="schooltool.relationship.interfaces.IRelationshipLink"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      factory="schooltool.app.rest.relationships.LinkViewFactory"
+      name="GET"
+      />
+
+  <view
+      for="schooltool.relationship.interfaces.IRelationshipLink"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      factory="schooltool.app.rest.relationships.LinkViewFactory"
+      name="DELETE"
+      />
+
+
+  <!-- Error views -->
+
+  <defaultView
+      for="zope.interface.common.interfaces.IException"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      name="GET"
+      />
+
+    <!-- but restore the original default view for browser requests -->
+
+  <defaultView
+      for="zope.interface.common.interfaces.IException"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      name="index.html"
+      />
+
+  <view
+      for="schooltool.xmlparsing.IXMLError"
+      name="GET"
+      factory=".errors.XMLErrorView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.app.rest.errors.ICalParseError"
+      name="GET"
+      factory=".errors.ICalParseErrorView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="zope.interface.common.interfaces.IException"
+      name="GET"
+      factory=".errors.SystemErrorView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.app.rest.errors.RestError"
+      name="GET"
+      factory=".errors.TextErrorView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="zope.app.dependable.interfaces.DependencyError"
+      name="GET"
+      factory=".errors.DependencyErrorView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      xmlns:apidoc="http://namespaces.zope.org/apidoc"
+      zcml:condition="have apidoc">
+
+    <apidoc:bookchapter
+        id="rest"
+        title="REST Interface"
+        parent="schooltool" />
+
+    <apidoc:bookchapter
+        id="relationships"
+        title="Relationships"
+        parent="schooltool/rest"
+        doc_path="ftests/relationships.txt" />
+
+    <apidoc:bookchapter
+        id="errors"
+        title="Errors"
+        parent="schooltool/rest"
+        doc_path="ftests/errors.txt" />
+
+    <apidoc:bookchapter
+        id="app"
+        title="Application"
+        parent="schooltool/rest"
+        doc_path="ftests/app.txt" />
+
+  </configure>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/errors.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/errors.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/errors.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,95 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for errors in SchoolToolApplication
+
+$Id: errors.py 5370 2005-12-01 14:13:09Z mg $
+"""
+
+from zope.interface import classImplements, implements
+from zope.interface.common.interfaces import IException
+from zope.app.exception.interfaces import ISystemErrorView
+
+from schooltool.app.rest import View
+from schooltool.calendar.icalendar import ICalParseError
+
+
+class TextErrorView(View):
+    """A base class for error views
+
+    Sets the response status to 400 by default, that is signals a "Bad
+    request" user error.
+    """
+
+    def __init__(self, context, request):
+        View.__init__(self, context, request)
+        request.response.setStatus(400)
+        request.response.setHeader('Content-Type', 'text/plain; charset=utf-8')
+
+    def __call__(self):
+        return str(self.context)
+
+
+class XMLErrorView(TextErrorView):
+    """A view for IXMLErrors"""
+
+
+class ICalParseErrorView(TextErrorView):
+    """A view for iCalendar parse errors"""
+
+    def __call__(self):
+        return 'Error parsing iCalendar data: ' + str(self.context)
+
+
+class IICalParseError(IException):
+    """Invalid iCalendar data"""
+
+classImplements(ICalParseError, IICalParseError)
+
+
+class DependencyErrorView(TextErrorView):
+    """A view for DependencyError.
+
+    Zope 3 raises a DependencyError when you try to remove a component while
+    other components depend on it.  SchoolTool uses this mechanism to prevent
+    users from deleting system objects like the manager user and some
+    predefined groups.
+    """
+
+    def __call__(self):
+        self.request.response.setStatus(405)
+        return 'Cannot delete system objects.'
+
+
+class SystemErrorView(TextErrorView):
+    """A catch-all view for programmer errors"""
+
+    implements(ISystemErrorView)
+
+    def isSystemError(self):
+        return True
+
+    def __call__(self):
+        self.request.response.setStatus(500)
+        return "A system error has occurred."
+
+
+class RestError(Exception):
+    """A catch-all error for ReST views that should produce a 400 response."""
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/errors.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,38 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for scholltool.rest.app
+
+$Id: __init__.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+from zope.app.testing.functional import HTTPCaller
+from zope.publisher.http import HTTPRequest
+from zope.app.publication.http import HTTPPublication
+
+
+class RESTCaller(HTTPCaller):
+    """An HTTP caller for REST functional page tests"""
+
+    def chooseRequestClass(self, method, path, environment):
+        """Always returns HTTPRequests regardless of methods and content"""
+        return HTTPRequest, HTTPPublication
+
+
+rest = RESTCaller()


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/app.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/app.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/app.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,464 @@
+Functional tests for SchoolTool app RESTive views
+=================================================
+
+The front page enumerates all top-level containers:
+
+    >>> print rest("""
+    ... GET / HTTP/1.1
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <schooltool xmlns:xlink="http://www.w3.org/1999/xlink">
+      <message>Welcome to the SchoolTool server</message>
+      <containers>
+        ...
+        <container xlink:type="simple"
+                   xlink:href="http://localhost/persons"
+                   xlink:title="persons"/>
+        ...
+      </containers>
+    </schooltool>
+    <BLANKLINE>
+
+There is a number of built-in groups (listed alphabetically)
+
+    >>> print rest("""
+    ... GET /groups/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>groups</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/groups/administrators"
+              xlink:title="School Administrators"/>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/groups/clerks"
+              xlink:title="Clerks"/>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/groups/manager"
+              xlink:title="Site Managers"/>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/groups/students"
+              xlink:title="Students"/>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/groups/teachers"
+              xlink:title="Teachers"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/groups/acl"/>
+    </container>
+    <BLANKLINE>
+
+Initially there are no resources:
+
+    >>> print rest("""
+    ... GET /resources/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>resources</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/resources/acl"/>
+    </container>
+    <BLANKLINE>
+
+One person:
+
+    >>> print rest("""
+    ... GET /persons/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>persons</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/persons/manager"
+              xlink:title="SchoolTool Manager"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/persons/acl"/>
+    </container>
+    <BLANKLINE>
+
+
+No courses:
+
+    >>> print rest("""
+    ... GET /courses/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>courses</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/courses/acl"/>
+    </container>
+    <BLANKLINE>
+
+
+Let's add a person, a group, a resource and a course, and let's make sure they
+are SchoolTool objects, rather than SchoolBell objects:
+
+
+    >>> print rest("""
+    ... PUT /persons/goose HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Goose"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /groups/birds HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birds"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /resources/lily HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1"
+    ...         title="Lily"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /courses/birdwatching HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding1"
+    ...         course="birding" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> app = getRootFolder()
+    >>> app['persons']['goose']
+    <schooltool.person.person.Person object at ...>
+    >>> app['groups']['birds']
+    <schooltool.group.group.Group object at ...>
+    >>> app['resources']['lily']
+    <schooltool.resource.resource.Resource object at ...>
+    >>> app['courses']['birdwatching']
+    <schooltool.course.course.Course object at ...>
+    >>> app['sections']['birdwatching-1']
+    <schooltool.course.section.Section object at ...>
+    >>> del app
+
+
+The same should happen if we post to respective containers:
+
+    >>> print rest("""
+    ... POST /groups HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Animals"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /resources HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Water"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /courses HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Flight"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> app = getRootFolder()
+    >>> app['groups']['animals']
+    <schooltool.group.group.Group object at ...>
+    >>> app['resources']['water']
+    <schooltool.resource.resource.Resource object at ...>
+    >>> app['courses']['flight']
+    <schooltool.course.course.Course object at ...>
+    >>> del app
+
+Let's see what our course looks like:
+
+    >>> print rest("""
+    ... GET /courses/flight HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <course xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>Flight</title>
+      <description></description>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/courses/flight/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/courses/flight/acl"/>
+    </course>
+    <BLANKLINE>
+
+
+Let's see what our section looks like:
+
+    >>> print rest("""
+    ... GET /sections/birdwatching-1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <section xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>Birding1</title>
+      <description></description>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/sections/birdwatching-1/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/sections/birdwatching-1/acl"/>
+    </section>
+    <BLANKLINE>
+
+    >>> print rest("""
+    ... POST /courses/flight/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...  xlink:role="http://schooltool.org/ns/coursesections/section"
+    ...               xlink:arcrole="http://schooltool.org/ns/coursesections"
+    ...  xlink:href="http://localhost/sections/birdwatching-1"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+Currently, the relationships of goose should only show the application
+calendar, and our section show's its link to the course Flight:
+
+    >>> print rest("""
+    ... GET /persons/goose/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/calendar_subscription/provider"
+                      xlink:arcrole="http://schooltool.org/ns/calendar_subscription"
+                      xlink:href="http://localhost/calendar">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/goose/relationships/1"/>
+        </relationship>
+      </existing>
+    </relationships>
+
+    >>> print rest("""
+    ... GET /sections/birdwatching-1/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/coursesections/course"
+                      xlink:arcrole="http://schooltool.org/ns/coursesections"
+                      xlink:href="http://localhost/courses/flight">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/sections/birdwatching-1/relationships/1"/>
+        </relationship>
+      </existing>
+    </relationships>
+
+
+Let's make goose a student in our section:
+
+    >>> print rest("""
+    ... POST /persons/goose/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...  xlink:href="http://localhost/sections/birdwatching-1"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+Now the membership relationship, which indicates a student should be in both
+and the calendar subscription to show the student the section's calendar:
+
+    >>> print rest("""
+    ... GET /persons/goose/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length:...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+    ...
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/group"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://localhost/sections/birdwatching-1">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/goose/relationships/2"/>
+        </relationship>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/calendar_subscription/provider"
+                      xlink:arcrole="http://schooltool.org/ns/calendar_subscription"
+                      xlink:href="http://localhost/sections/birdwatching-1/calendar">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/goose/relationships/3"/>
+        </relationship>
+      </existing>
+    </relationships>
+    <BLANKLINE>
+
+    >>> print rest("""
+    ... GET /sections/birdwatching-1/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/coursesections/course"
+                      xlink:arcrole="http://schooltool.org/ns/coursesections"
+                      xlink:href="http://localhost/courses/flight">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/sections/birdwatching-1/relationships/1"/>
+        </relationship>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/member"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://localhost/persons/goose">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/sections/birdwatching-1/relationships/2"/>
+        </relationship>
+      </existing>
+    </relationships>
+
+Now we'll need an instructor:
+
+    >>> print rest("""
+    ... PUT /persons/maverick HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Maverick"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Maverick is going to teach Goose a lesson:
+
+    >>> print rest("""
+    ... POST /persons/maverick/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/instruction/section"
+    ...               xlink:arcrole="http://schooltool.org/ns/instruction"
+    ...  xlink:href="http://localhost/sections/birdwatching-1"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+Now the section is in maverick's relationships
+
+    >>> print rest("""
+    ... GET /persons/goose/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+    ...
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/group"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://localhost/sections/birdwatching-1">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/goose/relationships/2"/>
+        </relationship>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/calendar_subscription/provider"
+                      xlink:arcrole="http://schooltool.org/ns/calendar_subscription"
+                      xlink:href="http://localhost/sections/birdwatching-1/calendar">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/goose/relationships/3"/>
+        </relationship>
+      </existing>
+    </relationships>
+    <BLANKLINE>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/app.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/errors.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/errors.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/errors.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,156 @@
+Error handling in REST views
+============================
+
+We need to shut up libxml2, so it does not spew errors to stderr:
+
+   >>> import libxml2
+   >>> libxml2.registerErrorHandler(lambda ctx, error: None, None)
+   1
+
+Now, let's submit a well-formed but invalid XML document:
+
+    >>> print rest("""
+    ... POST /groups HTTP/1.1
+    ...
+    ... <hello>world</hello>
+    ... """)
+    HTTP/1.1 400 Bad Request
+    Content-Length: 39
+    Content-Type: text/plain; charset=utf-8
+    <BLANKLINE>
+    Document not valid according to schema.
+
+An ill-well formed document:
+
+    >>> print rest("""
+    ... POST /groups HTTP/1.1
+    ...
+    ... <what's going on?
+    ... """)
+    HTTP/1.1 400 Bad Request
+    Content-Length: 20
+    Content-Type: text/plain; charset=utf-8
+    <BLANKLINE>
+    Ill-formed document.
+
+Method not supported errors:
+
+    >>> print rest("""
+    ... POST / HTTP/1.1
+    ...
+    ... new user
+    ... """)
+    HTTP/1.1 405 Method Not Allowed
+    Allow: DELETE, GET, OPTIONS, PUT
+    Content-Length: ...
+    <BLANKLINE>
+    Method Not Allowed
+
+    >>> print rest("""
+    ... DELETE / HTTP/1.1
+    ...
+    ... """)
+    HTTP/1.1 405 Method Not Allowed
+    Allow: DELETE, GET, OPTIONS, PUT
+    Content-Length: ...
+    <BLANKLINE>
+    Method Not Allowed
+
+XXX mg: the two Allow: headers above should only list 'GET', but I have no time
+   to make Zope 3 do that right now.
+
+
+Unauthorized errors are handled by Zope for us:
+
+    >>> print rest("""
+    ... POST /groups HTTP/1.1
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="A Group"/>
+    ... """)
+    HTTP/1.1 401 Unauthorized
+    Content-Length: 0
+    WWW-Authenticate: basic realm="Zope"
+    <BLANKLINE>
+
+
+Application errors are also handled with a 400 response.  Let's say a
+non valid iCalendar is posted to a user's calendar
+
+    >>> print rest("""
+    ... PUT /persons/test HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="John Doe"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /persons/test/calendar HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... !@#$line noise#@$%^
+    ... """)
+    HTTP/1.1 400 Bad Request
+    Content-Length: 80
+    Content-Type: text/plain; charset=utf-8
+    <BLANKLINE>
+    Error parsing iCalendar data: Missing property name in line:
+    !@#$line noise#@$%^
+
+
+Also, there is a special exception that generates a Bad Request
+response.  Let's create a view that raises this error:
+
+    >>> from zope.app.testing import ztapi
+    >>> from schooltool.app.rest.errors import RestError
+
+    >>> class BadView:
+    ...     def __init__(self, context, request):
+    ...         self.context = context
+    ...         self.request = request
+    ...     def POST(self):
+    ...         raise RestError("Houston, we've got a problem")
+
+
+    >>> from schooltool.person.interfaces import IPerson
+    >>> from zope.publisher.interfaces.http import IHTTPRequest
+    >>> from zope.interface import Interface
+    >>> ztapi.provideAdapter((IPerson, IHTTPRequest), Interface,
+    ...                      BadView, 'POST')
+
+Now, let's trigger it:
+
+    >>> print rest("""
+    ... POST /persons/test HTTP/1.1
+    ... Content-Type: text/xml
+    ... """)
+    HTTP/1.1 400 Bad Request
+    Content-Length: ...
+    Content-Type: text/plain; charset=utf-8
+    <BLANKLINE>
+    Houston, we've got a problem
+
+And what about NotFound errors?
+
+    >>> print rest("""
+    ... POST /hahaha HTTP/1.1
+    ... Content-Type: text/xml
+    ... """)
+    HTTP/1.1 404 Not Found
+    Content-Length: 0
+
+
+Tear down
+=========
+
+Restore the libxml2 error handling:
+
+    >>> import sys
+    >>> def on_error_callback(ctx, msg):
+    ...     sys.stderr.write(msg)
+    >>> libxml2.registerErrorHandler(on_error_callback, None)
+    1


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/errors.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/relationships.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/relationships.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/relationships.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,348 @@
+Functional tests for SchoolBell relationship RESTive views
+==========================================================
+
+We can add some groups with POST:
+
+    >>> print rest("""
+    ... POST /groups/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="A Group"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    Location: http://localhost/groups/a-group
+    Set-Cookie: ...
+    <BLANKLINE>
+    Object created: http://localhost/groups/a-group
+
+
+    >>> print rest("""
+    ... POST /groups/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Another group"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    Location: http://localhost/groups/another-group
+    Set-Cookie: ...
+    <BLANKLINE>
+    Object created: http://localhost/groups/another-group
+
+
+    >>> print rest("""
+    ... POST /groups/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="One more group"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    Location: http://localhost/groups/one-more-group
+    Set-Cookie: ...
+    <BLANKLINE>
+    Object created: http://localhost/groups/one-more-group
+
+Now some users:
+
+    >>> print rest("""
+    ... PUT /persons/john HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="John"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /persons/pete HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Pete"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /persons/frog HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Frog"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+The list of relationships of persons should only contain the initial site-wide
+calendar:
+
+    >>> print rest("""
+    ... GET /persons/frog/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    ...
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/calendar_subscription/provider"
+                      xlink:arcrole="http://schooltool.org/ns/calendar_subscription"
+                      xlink:href="http://localhost/calendar">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/persons/frog/relationships/1"/>
+        </relationship>
+      </existing>
+    </relationships>
+    <BLANKLINE>
+
+Groups have no relationships:
+
+    >>> print rest("""
+    ... GET /groups/a-group/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+      </existing>
+    </relationships>
+
+We can add some users by adding a relationship to our user:
+
+    >>> print rest("""
+    ... POST /persons/john/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/groups/a-group"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+or our group:
+
+    >>> print rest("""
+    ... POST /groups/a-group/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/member"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/persons/pete"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+We should see relationships we have just created:
+
+    >>> print rest("""
+    ... GET /groups/a-group/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/member"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://localhost/persons/john">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/groups/a-group/relationships/1"/>
+        </relationship>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/member"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://localhost/persons/pete">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/groups/a-group/relationships/2"/>
+        </relationship>
+      </existing>
+    </relationships>
+
+We can GET the relationship:
+
+    >>> print rest("""
+    ... GET /groups/a-group/relationships/1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                  xlink:type="simple"
+                  xlink:role="http://schooltool.org/ns/membership/member"
+                  xlink:arcrole="http://schooltool.org/ns/membership"
+                  xlink:href="http://localhost/persons/john"/>
+    <BLANKLINE>
+
+Or delete them:
+
+    >>> print rest("""
+    ... DELETE /groups/a-group/relationships/1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    Link removed
+
+We just lost one of the relationships:
+
+    >>> print rest("""
+    ... GET /groups/a-group/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+        <relationship xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/member"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://localhost/persons/pete">
+          <manage xlink:type="simple"
+                  xlink:href="http://localhost/groups/a-group/relationships/2"/>
+        </relationship>
+      </existing>
+    </relationships>
+
+Lets see how permissions work:
+
+    >>> print rest("""
+    ... PUT /persons/john/password HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ...
+    ... ann
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+John should not be capable of adding himself back into the group:
+
+    >>> print rest("""
+    ... POST /persons/john/relationships HTTP/1.1
+    ... Authorization: Basic john:ann
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/groups/a-group"/>
+    ... """)
+    HTTP/1.1 401 Unauthorized
+    ...
+
+Or deleting any relationships:
+
+    >>> print rest("""
+    ... DELETE /groups/a-group/relationships/2 HTTP/1.1
+    ... Authorization: Basic john:ann
+    ... """)
+    HTTP/1.1 401 Unauthorized
+    ...
+
+But should be capable of viewing relationships:
+
+    >>> print rest("""
+    ... GET /groups/a-group/relationships/2 HTTP/1.1
+    ... Authorization: Basic john:ann
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                  xlink:type="simple"
+                  xlink:role="http://schooltool.org/ns/membership/member"
+                  xlink:arcrole="http://schooltool.org/ns/membership"
+                  xlink:href="http://localhost/persons/pete"/>
+    <BLANKLINE>
+
+We can give him needed permissions though, by adding him to a manager group:
+
+    >>> print rest("""
+    ... POST /persons/john/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/groups/manager"/>
+    ... """)
+    HTTP/1.1 201 Created
+    Content-Length: ...
+    Content-Type: text/plain; charset=UTF-8
+    Location: http://localhost/persons/john/relationships/2
+    ...
+    <BLANKLINE>
+    Relationship created: http://localhost/persons/john/relationships/2
+
+John should now be capable of adding himself back into the group:
+
+    >>> print rest("""
+    ... POST /persons/john/relationships HTTP/1.1
+    ... Authorization: Basic john:ann
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/groups/a-group"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    Location: http://localhost/persons/john/relationships/3
+    ...
+    <BLANKLINE>
+    Relationship created: http://localhost/persons/john/relationships/3
+
+He can delete the other relationship now too:
+
+    >>> print rest("""
+    ... DELETE /persons/pete/relationships/1 HTTP/1.1
+    ... Authorization: Basic john:ann
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    Link removed
+
+Calendars have their relationships too:
+
+    >>> print rest("""
+    ... GET /persons/frog/calendar/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    ...
+    <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+      <existing>
+      </existing>
+    </relationships>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/relationships.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/system-objects.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/system-objects.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/system-objects.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,75 @@
+System objects
+==============
+
+SchoolTool has a default user object and some default group objects.  These
+objects are special and cannot be deleted.
+
+This functional test makes sure they cannot be deleted via the REST interface.
+
+
+Setup
+-----
+
+Let us add a user and a group, so that we have something besides the default
+system objects:
+
+    >>> print rest("""
+    ... PUT /persons/goose HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Goose"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /groups/birds HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birds"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+
+Test
+----
+
+We can't delete system objects:
+
+    >>> print rest(r"""
+    ... DELETE /persons/manager HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 405 Method Not Allowed
+    Content-Length: ...
+    Content-Type: text/plain; charset=utf-8
+    <BLANKLINE>
+    Cannot delete system objects.
+
+    >>> print rest(r"""
+    ... DELETE /groups/teachers HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 405 Method Not Allowed
+    Content-Length: ...
+    Content-Type: text/plain; charset=utf-8
+    <BLANKLINE>
+    Cannot delete system objects.
+
+but you can delete regular objects
+
+    >>> print rest(r"""
+    ... DELETE /persons/goose HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    ...
+
+    >>> print rest(r"""
+    ... DELETE /groups/birds HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    ...
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/system-objects.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.app.rest.
+
+$Id: test_all.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+
+
+def test_suite():
+    return collect_ftests()
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool restive view interfaces
+
+$Id: interfaces.py 5996 2006-04-27 18:57:17Z ignas $
+"""
+
+from zope.interface import Interface
+from zope.app.http.interfaces import INullResource
+
+
+class ITimetableFileFactory(Interface):
+    """A special interface fot a custom file factory that needs the request. """
+
+    def __call__(name, content_type, data):
+        """Create a timetable
+
+        The file `name`, content `type`, `data` and `request` are provided to
+        help create the object.
+        """
+
+
+class INullTimetable(INullResource):
+    """Placeholder objects for new timetables to be created via PUT
+    """


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/relationships.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/relationships.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/relationships.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,256 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for relationships
+
+$Id: relationships.py 5986 2006-04-27 15:17:13Z faassen $
+"""
+
+from zope.app import zapi
+from zope.traversing.api import traverse
+from zope.traversing.interfaces import TraversalError
+from zope.component import getUtility
+from zope.component.interfaces import ComponentLookupError
+from zope.publisher.interfaces import NotFound
+from zope.security.proxy import removeSecurityProxy
+from zope.security.checker import ProxyFactory
+
+from schooltool.xmlparsing import XMLDocument
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.errors import RestError
+from schooltool.common import unquote_uri
+from schooltool.relationship.uri import IURIObject
+from schooltool.relationship.interfaces import IRelationshipLinks
+from schooltool.relationship.interfaces import IRelationshipSchema
+from schooltool.relationship.relationship import relate, unrelate
+from schooltool.relationship.interfaces import DuplicateRelationship
+from schooltool.traverser.traverser import AdapterTraverserPlugin
+
+
+class RelationshipsView(View):
+    """A view of relationships on IRelationshipLinks.
+
+    Allows the client see the relationships (GET),
+    and create new relationships (POST).
+    """
+
+    template = Template("templates/relationships.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    schema = """<?xml version="1.0" encoding="UTF-8"?>
+    <!--
+    RelaxNG grammar for a relationships
+    -->
+    <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+             xmlns:xlink="http://www.w3.org/1999/xlink"
+             ns="http://schooltool.org/ns/model/0.1"
+             datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+      <!-- parts of a simple xlink -->
+      <define name="simplelinktype">
+        <attribute name="xlink:type">
+          <value>simple</value>
+        </attribute>
+      </define>
+      <define name="href">
+        <attribute name="xlink:href">
+          <data type="anyURI"/>
+        </attribute>
+      </define>
+      <define name="role">
+        <attribute name="xlink:role">
+          <data type="anyURI"/>
+        </attribute>
+      </define>
+      <define name="arcrole">
+        <attribute name="xlink:arcrole">
+          <data type="anyURI"/>
+        </attribute>
+      </define>
+      <define name="title">
+        <attribute name="xlink:title">
+          <text/>
+        </attribute>
+      </define>
+      <define name="show">
+        <attribute name="xlink:show">
+          <choice>
+            <value>new</value>
+            <value>replace</value>
+            <value>embed</value>
+            <value>other</value>
+            <value>none</value>
+          </choice>
+        </attribute>
+      </define>
+      <define name="actuate">
+        <attribute name="xlink:actuate">
+          <choice>
+            <value>onLoad</value>
+            <value>onRequest</value>
+            <value>other</value>
+            <value>none</value>
+          </choice>
+        </attribute>
+      </define>
+      <start>
+        <element name="relationship">
+          <ref name="simplelinktype"/>
+          <ref name="href"/>
+          <ref name="role"/>
+          <ref name="arcrole"/>
+          <optional>
+            <ref name="title"/>
+          </optional>
+          <optional>
+            <ref name="show"/>
+          </optional>
+          <optional>
+            <ref name="actuate"/>
+          </optional>
+        </element>
+      </start>
+    </grammar>"""
+
+    def __init__(self, context, request):
+        self.context = context
+        self.__parent__ = self.context
+        self.request = request
+
+    # It may be a bit counterintuitive that you need to have
+    # ModifyPermission to add members to groups.
+
+    def listLinks(self):
+        return [{'traverse': zapi.absoluteURL(link.target, self.request),
+                 'type': link.rel_type.uri,
+                 'role': link.role.uri,
+                 'href': zapi.absoluteURL(link, self.request)}
+                for link in self.context]
+
+    def POST(self):
+        body = self.request.bodyStream.read()
+        response = self.request.response
+
+        doc = XMLDocument(body, self.schema)
+        try:
+            doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+            doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+            node = doc.query('/m:relationship')[0]
+            rel_type = node['xlink:arcrole']
+            target_role = node['xlink:role']
+            path = unquote_uri(node['xlink:href'])
+        finally:
+            doc.free()
+
+        try:
+            schema = getUtility(IRelationshipSchema, rel_type)
+            target_role = getUtility(IURIObject, target_role)
+        except ComponentLookupError, e:
+            raise RestError("Bad URI: %s" % target_role)
+
+        try:
+            sb_app = getSchoolToolApplication()
+            sb_url = zapi.absoluteURL(sb_app, self.request)
+            path = path.replace("%s/" % sb_url, "")
+            target = traverse(sb_app, path)
+        except TraversalError, e:
+            raise RestError("Bad URI: %s" % path)
+
+        role1, role2 = schema.roles.values()
+        if target_role == role1:
+            my_role = role2
+        else:
+            my_role = role1
+
+        target = removeSecurityProxy(target)
+        parent = removeSecurityProxy(self.context.__parent__)
+
+        rel_type = schema.rel_type
+
+        try:
+            relate(rel_type,
+                   (parent, my_role),
+                   (target, target_role))
+        except DuplicateRelationship:
+            raise RestError(
+                "Duplicate relationship between '%s' and '%s' of type '%s'" %
+                (zapi.absoluteURL(parent, self.request), path, rel_type))
+
+        link = self.context.find(my_role, target, target_role, rel_type)
+        location = zapi.absoluteURL(link, self.request)
+
+        response.setHeader('Location', location)
+        response.setStatus(201)
+        response.setHeader('Content-Type', 'text/plain; charset=UTF-8')
+        return "Relationship created: %s" % location
+
+
+def RelationshipsViewFactory(context, request):
+    return ProxyFactory(RelationshipsView(context, request))
+RelationshipsViewFactory.factory = RelationshipsView
+
+
+class LinkView(View):
+    """A view on relationship links."""
+
+    template = Template("templates/link.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    def __init__(self, context, request):
+        self.context = context
+        self.__parent__ = self.context
+        self.request = request
+
+    def info(self):
+        return {'role': self.context.role.uri,
+                'arcrole': self.context.rel_type.uri,
+                'href': zapi.absoluteURL(self.context.target, self.request)}
+
+    def DELETE(self):
+        unrelate(self.context.rel_type,
+                 (removeSecurityProxy(self.context.__parent__.__parent__),
+                  self.context.my_role),
+                 (removeSecurityProxy(self.context.target),
+                  self.context.role))
+
+        response = self.request.response
+        response.setStatus(200)
+        response.setHeader('content-type', 'text/plain; charset=UTF-8')
+        return "Link removed"
+
+
+def LinkViewFactory(context, request):
+    return ProxyFactory(LinkView(context, request))
+LinkViewFactory.factory = LinkView
+
+RelationshipsTraverser = AdapterTraverserPlugin(
+    'relationships', IRelationshipLinks)
+
+class LinkTraverser(object):
+    """Allows traversing into links of IRelationshipLinks."""
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        ob = self.context.get(name, None)
+        if ob is not None:
+            return ob
+        raise NotFound(self.context, name, request)


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/relationships.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/acl.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/templates/acl.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/templates/acl.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,14 @@
+<acl xmlns:tal="http://xml.zope.org/namespaces/tal"
+     xmlns="http://schooltool.org/ns/model/0.1">
+  <principal
+      tal:repeat="principal view/getPrincipals"
+      tal:attributes="id principal">
+    <tal:block define="perms python:view.permsForPrincipal(principal)">
+      <permission
+          tal:repeat="perm view/permissions"
+          tal:attributes="id python:perm[0];
+                          setting python:perm[0] in perms and 'on' or None"
+          />
+    </tal:block>
+  </principal>
+</acl>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/acl.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/aoc.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/templates/aoc.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/templates/aoc.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<container xmlns:xlink="http://www.w3.org/1999/xlink"
+           xmlns:tal="http://xml.zope.org/namespaces/tal"
+           xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+           i18n:domain="schooltool">
+  <name tal:content="view/getName" />
+  <items>
+    <item xlink:type="simple" tal:repeat="root view/items"
+          tal:attributes="xlink:title root/title; xlink:href root/href" />
+  </items>
+  <acl xlink:type="simple" xlink:title="ACL"
+      i18n:attributes="xlink:title ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/acl" />
+</container>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/aoc.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/app.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/templates/app.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/templates/app.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<schooltool xmlns:xlink="http://www.w3.org/1999/xlink"
+            xmlns:tal="http://xml.zope.org/namespaces/tal"
+            xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+            i18n:domain="schooltool">
+  <message i18n:translate="">Welcome to the SchoolTool server</message>
+  <containers>
+    <container xlink:type="simple" tal:repeat="container view/getContainers"
+               tal:attributes="xlink:title container/title;
+                               xlink:href container/href"/>
+  </containers>
+</schooltool>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/app.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/link.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/templates/link.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/templates/link.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,7 @@
+<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+              xmlns:tal="http://xml.zope.org/namespaces/tal"
+              xlink:type="simple"
+              tal:define="link view/info"
+              tal:attributes="xlink:role link/role;
+                              xlink:arcrole link/arcrole;
+                              xlink:href link/href"/>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/link.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/relationships.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/templates/relationships.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/templates/relationships.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,17 @@
+<relationships
+  xmlns:tal="http://xml.zope.org/namespaces/tal"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  xmlns="http://schooltool.org/ns/model/0.1">
+  <existing>
+    <relationship
+      tal:repeat="r view/listLinks"
+      xlink:type="simple"
+      tal:attributes="xlink:role r/role;
+                      xlink:arcrole r/type;
+                      xlink:href r/traverse"
+    >
+      <manage xlink:type="simple"
+              tal:attributes="xlink:href  r/href" />
+    </relationship>
+  </existing>
+</relationships>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/templates/relationships.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/testing.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/testing.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/testing.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,137 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2004 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Common utilities (stubs, mixins) for schooltool unit tests.
+
+$Id: testing.py 6047 2006-05-11 18:31:03Z mg $
+"""
+__metaclass__ = type
+
+from StringIO import StringIO
+
+import zope.traversing.namespace
+from zope.interface import Interface
+from zope.publisher.browser import TestRequest
+from zope.app.component.testing import PlacefulSetup
+from zope.app.container.interfaces import INameChooser
+from zope.app.testing import ztapi, setup
+from zope.traversing.interfaces import ITraversable
+
+from schooltool.testing import setup as sbsetup
+from schooltool.testing.util import XMLCompareMixin
+from schooltool.testing.util import QuietLibxml2Mixin
+from schooltool.app.app import SimpleNameChooser
+from schooltool.xmlparsing import XMLParseError
+from schooltool.group.group import Group
+from schooltool.group.interfaces import IGroupContainer
+from schooltool.group.rest.group import GroupFileFactory, GroupContainerView
+from schooltool.resource.interfaces import IResourceContainer
+from schooltool.resource.rest.resource import ResourceFileFactory
+
+
+
+class ContainerViewTestMixin(XMLCompareMixin, QuietLibxml2Mixin):
+    """Common code for Container View tests"""
+
+    def setUp(self):
+        setup.placefulSetUp()
+        self.setUpLibxml2()
+
+        from zope.filerepresentation.interfaces import IFileFactory
+        ztapi.provideView(Interface, Interface, ITraversable, 'view',
+                          zope.traversing.namespace.view)
+        ztapi.provideAdapter(IGroupContainer, INameChooser,
+                             SimpleNameChooser)
+        ztapi.provideAdapter(IGroupContainer, IFileFactory,
+                             GroupFileFactory)
+        ztapi.provideAdapter(IResourceContainer, IFileFactory,
+                             ResourceFileFactory)
+
+
+        self.app = sbsetup.setUpSchoolToolSite()
+        self.groupContainer = self.app['groups']
+        self.group = self.app['groups']['root'] = Group("Root group")
+
+
+    def tearDown(self):
+        self.tearDownLibxml2()
+        setup.placefulTearDown()
+
+    def test_post(self, suffix="", view=None,
+                  body="""<object xmlns="http://schooltool.org/ns/model/0.1"
+                                  title="New Group"/>"""):
+        view = GroupContainerView(self.groupContainer,
+                                  TestRequest(StringIO(body)))
+        result = view.POST()
+        response = view.request.response
+
+        self.assertEquals(response.getStatus(), 201)
+        self.assertEquals(response._reason, "Created")
+
+        location = response.getHeader('location')
+        base = "http://127.0.0.1/groups/"
+        self.assert_(location.startswith(base),
+                     "%r.startswith(%r) failed" % (location, base))
+        name = location[len(base):]
+        self.assert_(name in self.app['groups'].keys())
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/plain; charset=UTF-8")
+        self.assert_(location in result)
+        return name
+
+    def test_post_with_a_description(self):
+        name = self.test_post(body='''
+            <object title="New Group"
+                    description="A new group"
+                    xmlns='http://schooltool.org/ns/model/0.1'/>''')
+        self.assertEquals(self.app['groups'][name].title, 'New Group')
+        self.assertEquals(self.app['groups'][name].description, 'A new group')
+        self.assertEquals(name, 'new-group')
+
+    def test_post_error(self):
+        view = GroupContainerView(
+            self.groupContainer,
+            TestRequest(StringIO('<element title="New Group">')))
+        self.assertRaises(XMLParseError, view.POST)
+
+
+class FileFactoriesSetUp(PlacefulSetup):
+
+    def setUp(self):
+        from zope.filerepresentation.interfaces import IFileFactory
+        PlacefulSetup.setUp(self)
+        ztapi.provideAdapter(IGroupContainer, IFileFactory,
+                             GroupFileFactory)
+        ztapi.provideAdapter(IResourceContainer, IFileFactory,
+                             ResourceFileFactory)
+
+
+class ApplicationObjectViewTestMixin(ContainerViewTestMixin):
+
+    def setUp(self):
+        ContainerViewTestMixin.setUp(self)
+        self.personContainer = self.app['persons']
+        self.groupContainer = self.app['groups']
+
+    def get(self):
+        """Perform a GET of the view being tested."""
+        view = self.makeTestView(self.testObject, TestRequest())
+        result = view.GET()
+
+        return result, view.request.response


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/testing.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_app.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_app.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_app.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,126 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.rest.app.
+
+$Id: test_app.py 6047 2006-05-11 18:31:03Z mg $
+"""
+import unittest
+
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app.testing import setup
+
+from schooltool.testing import setup as sbsetup
+
+
+def doctest_ApplicationView():
+    """SchoolToolApplication
+
+    Lets create a schooltool instance and make a view for it:
+
+        >>> from schooltool.app.rest.app import ApplicationView
+        >>> setup.placefulSetUp()
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> view = ApplicationView(app, TestRequest())
+        >>> result = view.GET()
+
+    Lets test the XML output:
+
+        >>> from schooltool.xmlparsing import XMLDocument
+        >>> doc = XMLDocument(result)
+        >>> doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+
+    There should only be one set of containers:
+
+        >>> nodes = doc.query('/schooltool/containers')
+        >>> len(nodes)
+        1
+
+    Let's test our containers:
+
+    persons:
+
+        >>> persons = doc.query('/schooltool/containers/container'
+        ...                     '[@xlink:href="http://127.0.0.1/persons"]')[0]
+        >>> persons['xlink:type']
+        u'simple'
+        >>> persons['xlink:title']
+        u'persons'
+
+    groups:
+
+        >>> groups = doc.query('/schooltool/containers/container'
+        ...                     '[@xlink:href="http://127.0.0.1/groups"]')[0]
+        >>> groups['xlink:type']
+        u'simple'
+        >>> groups['xlink:title']
+        u'groups'
+
+    resources:
+
+        >>> resources = doc.query('/schooltool/containers/container'
+        ...                     '[@xlink:href="http://127.0.0.1/resources"]')[0]
+        >>> resources['xlink:type']
+        u'simple'
+        >>> resources['xlink:title']
+        u'resources'
+
+    sections:
+
+        >>> sections = doc.query('/schooltool/containers/container'
+        ...                     '[@xlink:href="http://127.0.0.1/sections"]')[0]
+        >>> sections['xlink:type']
+        u'simple'
+        >>> sections['xlink:title']
+        u'sections'
+
+    courses:
+
+        >>> courses = doc.query('/schooltool/containers/container'
+        ...                     '[@xlink:href="http://127.0.0.1/courses"]')[0]
+        >>> courses['xlink:type']
+        u'simple'
+        >>> courses['xlink:title']
+        u'courses'
+
+    that's all of our containers:
+
+        >>> doc.free()
+
+    XXX this is what our output should look like:
+
+    XXX mg: who wrote the XXX above, and what does it mean?
+
+    Cleanup:
+
+        >>> setup.placefulTearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+        doctest.DocTestSuite('schooltool.app.rest.app',
+                             optionflags=doctest.ELLIPSIS),
+        ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_errors.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_errors.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_errors.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,135 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool.rest.app.errors.
+
+$Id: test_errors.py 5370 2005-12-01 14:13:09Z mg $
+"""
+
+import unittest
+
+from zope.testing import doctest
+from zope.publisher.browser import TestRequest
+from zope.app.exception.interfaces import ISystemErrorView
+
+
+def doctest_TextErrorView():
+    """Tests for TextErrorView.
+
+        >>> from schooltool.app.rest.errors import TextErrorView
+        >>> exc = Exception("something went wrong")
+        >>> view = TextErrorView(exc, TestRequest())
+
+        >>> print view()
+        something went wrong
+
+        >>> view.request.response.getStatus()
+        400
+        >>> view.request.response.getHeader('Content-Type')
+        'text/plain; charset=utf-8'
+
+    """
+
+
+def doctest_XMLErrorView():
+    """Tests for XMLErrorView.
+
+        >>> from schooltool.app.rest.errors import XMLErrorView
+        >>> exc = Exception("something went wrong while parsing XML")
+        >>> view = XMLErrorView(exc, TestRequest())
+
+        >>> print view()
+        something went wrong while parsing XML
+
+        >>> view.request.response.getStatus()
+        400
+        >>> view.request.response.getHeader('Content-Type')
+        'text/plain; charset=utf-8'
+
+    """
+
+
+def doctest_ICalParseErrorView():
+    """Tests for ICalParseErrorView.
+
+        >>> from schooltool.app.rest.errors import ICalParseErrorView
+        >>> exc = Exception("more info")
+        >>> view = ICalParseErrorView(exc, TestRequest())
+
+        >>> print view()
+        Error parsing iCalendar data: more info
+
+        >>> view.request.response.getStatus()
+        400
+        >>> view.request.response.getHeader('Content-Type')
+        'text/plain; charset=utf-8'
+
+    """
+
+
+def doctest_DependencyErrorView():
+    """Tests for DependencyErrorView.
+
+        >>> from schooltool.app.rest.errors import DependencyErrorView
+        >>> exc = Exception("something couldn't be deleted")
+        >>> view = DependencyErrorView(exc, TestRequest())
+
+        >>> print view()
+        Cannot delete system objects.
+
+        >>> view.request.response.getStatus()
+        405
+        >>> view.request.response.getHeader('Content-Type')
+        'text/plain; charset=utf-8'
+
+    """
+
+
+def doctest_SystemErrorView():
+    """Tests for SystemErrorView.
+
+        >>> from schooltool.app.rest.errors import SystemErrorView
+        >>> exc = Exception("something broke")
+        >>> view = SystemErrorView(exc, TestRequest())
+
+        >>> print view()
+        A system error has occurred.
+
+        >>> view.request.response.getStatus()
+        500
+        >>> view.request.response.getHeader('Content-Type')
+        'text/plain; charset=utf-8'
+
+    The view is a system error view, thus causing the zope publication to
+    log exceptions via the SiteError logger.
+
+        >>> ISystemErrorView.providedBy(view)
+        True
+        >>> view.isSystemError()
+        True
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite()
+
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_errors.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_relationships.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_relationships.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_relationships.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,342 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schollbell.rest.relationship
+
+$Id: test_relationships.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+from StringIO import StringIO
+
+import zope
+from zope.interface import Interface
+from zope.traversing.interfaces import ITraversable
+from zope.app.container.interfaces import INameChooser
+from zope.publisher.browser import TestRequest
+from zope.app.testing import setup, ztapi
+
+from schooltool.app.rest.errors import RestError
+from schooltool.relationship.interfaces import IRelationshipLinks
+from schooltool.relationship.interfaces import IRelationshipSchema
+from schooltool.relationship.uri import IURIObject
+from schooltool.app.membership import Membership, URIMember, URIGroup
+from schooltool.app.app import SimpleNameChooser
+from schooltool.relationship.annotatable import getRelationshipLinks
+from schooltool.group.interfaces import IGroupContainer
+from schooltool.testing.util import XMLCompareMixin
+from schooltool.testing.util import QuietLibxml2Mixin
+from schooltool.xmlparsing import XMLParseError
+from schooltool.xmlparsing import XMLValidationError
+from schooltool.testing import setup as sbsetup
+
+
+class CommonSetupMixin(XMLCompareMixin, QuietLibxml2Mixin):
+
+    def setUp(self):
+        from schooltool.group.group import Group
+        from schooltool.person.person import Person
+        from schooltool.relationship.tests import setUpRelationships
+
+        setup.placefulSetUp()
+        setup.setUpAnnotations()
+        self.setUpLibxml2()
+        setUpRelationships()
+
+        ztapi.provideUtility(IRelationshipSchema,
+                             Membership,
+                             name="http://schooltool.org/ns/membership")
+        ztapi.provideUtility(IURIObject,
+                             URIGroup,
+                             name="http://schooltool.org/ns/membership/member")
+        ztapi.provideUtility(IURIObject,
+                             URIMember,
+                             name="http://schooltool.org/ns/membership/group")
+        ztapi.provideView(Interface, Interface, ITraversable, 'view',
+                          zope.traversing.namespace.view)
+        ztapi.provideAdapter(IGroupContainer,
+                             INameChooser,
+                             SimpleNameChooser)
+
+        self.app = sbsetup.setUpSchoolToolSite()
+
+        self.group = self.app['groups']["root"] = Group("group")
+        self.new = self.app['groups']["new"] = Group("New Group")
+        self.person = self.app['persons']["pete"] = Person(username="pete",
+                                                           title="Pete")
+        self.person2 = self.app['persons']["john"] = Person(username="john",
+                                                            title="John")
+
+        Membership(group=self.group, member=self.person)
+        Membership(group=self.new, member=self.person)
+        Membership(group=self.new, member=self.person2)
+
+    def tearDown(self):
+        self.tearDownLibxml2()
+        setup.placefulTearDown()
+
+
+class TestRelationshipsView(CommonSetupMixin, unittest.TestCase):
+
+    def setUp(self):
+        from schooltool.app.rest.relationships import RelationshipsView
+        CommonSetupMixin.setUp(self)
+        self.request = TestRequest()
+        self.view = RelationshipsView(IRelationshipLinks(self.new), self.request)
+
+    def test_listLinks(self):
+        from pprint import pformat
+        result = self.view.listLinks()
+        self.assertEquals(len(result), 2)
+        self.assert_({'traverse': 'http://127.0.0.1/persons/pete',
+                      'role': 'http://schooltool.org/ns/membership/member',
+                      'type': 'http://schooltool.org/ns/membership',
+                      'href': 'http://127.0.0.1/groups/new/relationships/1'}
+                     in result, pformat(result))
+        self.assert_({'traverse': 'http://127.0.0.1/persons/john',
+                      'role': 'http://schooltool.org/ns/membership/member',
+                      'type': 'http://schooltool.org/ns/membership',
+                      'href': 'http://127.0.0.1/groups/new/relationships/2'}
+                     in result, pformat(result))
+
+    def testGET(self):
+        result = self.view.GET()
+        response = self.request.response
+
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+
+        self.assertEqualsXML(result,
+            """<relationships xmlns="http://schooltool.org/ns/model/0.1"
+                              xmlns:xlink="http://www.w3.org/1999/xlink">
+                 <existing>
+                   <relationship xlink:arcrole="http://schooltool.org/ns/membership"
+                                 xlink:href="http://127.0.0.1/persons/pete"
+                                 xlink:role="http://schooltool.org/ns/membership/member"
+                                 xlink:type="simple">
+                     <manage xlink:href="http://127.0.0.1/groups/new/relationships/1"
+                             xlink:type="simple"/>
+                   </relationship>
+                   <relationship xlink:arcrole="http://schooltool.org/ns/membership"
+                                 xlink:href="http://127.0.0.1/persons/john"
+                                 xlink:role="http://schooltool.org/ns/membership/member"
+                                 xlink:type="simple">
+                     <manage xlink:href="http://127.0.0.1/groups/new/relationships/2"
+                             xlink:type="simple"/>
+                   </relationship>
+                 </existing>
+               </relationships>""")
+
+    def testPOST(self):
+        from schooltool.app.rest.relationships import RelationshipsView
+
+        body = """<relationship xmlns="http://schooltool.org/ns/model/0.1"
+                                     xmlns:xlink="http://www.w3.org/1999/xlink"
+                                     xlink:type="simple"
+                                     xlink:role="http://schooltool.org/ns/membership/member"
+                                     xlink:arcrole="http://schooltool.org/ns/membership"
+                                     xlink:href="http://127.0.0.1/persons/john"/>"""
+
+        request = TestRequest(StringIO(body))
+        view = RelationshipsView(IRelationshipLinks(self.group), request)
+
+        self.assertEquals(len(view.listLinks()), 1)
+        self.assert_(self.person2 not in
+                     [l.target for l in getRelationshipLinks(self.group)])
+        result = view.POST()
+        response = view.request.response
+        self.assertEquals(response.getStatus(), 201)
+        self.assertEquals(len(view.listLinks()), 2)
+        self.assert_(self.person2 in
+                     [l.target for l in getRelationshipLinks(self.group)])
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/plain; charset=UTF-8")
+        location = "http://127.0.0.1/groups/root/relationships/2"
+        self.assertEquals(response.getHeader('location'), location)
+        self.assert_(location in result)
+
+    def testUrlQuotedURIs(self):
+        from schooltool.app.rest.relationships import RelationshipsView
+        from schooltool.person.person import Person
+        self.person3 = Person(username=u"\u017eilvinas", title=u"\u017eilvinas")
+        self.app['persons'][u"\u017eilvinas"] = self.person3
+
+        body = """<relationship xmlns="http://schooltool.org/ns/model/0.1"
+                                xmlns:xlink="http://www.w3.org/1999/xlink"
+                                xlink:type="simple"
+                                xlink:role="http://schooltool.org/ns/membership/member"
+                                xlink:arcrole="http://schooltool.org/ns/membership"
+                                xlink:href="http://127.0.0.1/persons/%C5%BEilvinas"/>"""
+
+        request = TestRequest(StringIO(body))
+        view = RelationshipsView(IRelationshipLinks(self.group), request)
+
+        self.assertEquals(len(view.listLinks()), 1)
+        self.assert_(self.person3 not in
+                     [l.target for l in getRelationshipLinks(self.group)])
+        result = view.POST()
+        response = view.request.response
+        self.assertEquals(response.getStatus(), 201)
+        self.assertEquals(len(view.listLinks()), 2)
+        self.assert_(self.person3 in
+                     [l.target for l in getRelationshipLinks(self.group)])
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/plain; charset=UTF-8")
+        location = "http://127.0.0.1/groups/root/relationships/2"
+        self.assertEquals(response.getHeader('location'), location)
+        self.assert_(location in result)
+
+    def testBadPOSTs(self):
+        from schooltool.app.rest.relationships import RelationshipsView
+        # let's post a valid relationship so we would cause a
+        # duplication error later
+
+        body = """<relationship xmlns="http://schooltool.org/ns/model/0.1"
+                                xmlns:xlink="http://www.w3.org/1999/xlink"
+                                xlink:type="simple"
+                                xlink:role="http://schooltool.org/ns/membership/member"
+                                xlink:arcrole="http://schooltool.org/ns/membership"
+                                xlink:href="http://127.0.0.1/persons/john"/>"""
+
+        request = TestRequest(StringIO(body))
+        view = RelationshipsView(IRelationshipLinks(self.new), request)
+        result = view.POST()
+        response = view.request.response
+        self.assertEquals(response.getStatus(), 201)
+
+        bad_requests = [
+            # Document not valid according to schema.
+            (XMLValidationError,
+             """<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                              xlink:type="simple"
+                              xlink:role="http://schooltool.org/ns/membership/group"
+                              xlink:arcrole="http://schooltool.org/ns/membership"
+                              xlink:href="/groups/new"/>"""),
+            # Duplicate relationship
+            (RestError,
+             """<relationship xmlns="http://schooltool.org/ns/model/0.1"
+                                     xmlns:xlink="http://www.w3.org/1999/xlink"
+                                     xlink:type="simple"
+                                     xlink:role="http://schooltool.org/ns/membership/member"
+                                     xlink:arcrole="http://schooltool.org/ns/membership"
+                                     xlink:href="http://127.0.0.1/persons/john"/>"""),
+            # Bad URI: BADPATH
+            (RestError,
+             """<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                              xmlns="http://schooltool.org/ns/model/0.1"
+                              xlink:type="simple"
+                              xlink:role="http://schooltool.org/ns/membership/group"
+                              xlink:arcrole="http://schooltool.org/ns/membership"
+                              xlink:href="BADPATH"/>"""),
+            # Bad URI: BADURI
+            (RestError,
+             """<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                              xmlns="http://schooltool.org/ns/model/0.1"
+                              xlink:type="simple"
+                              xlink:role="BADURI"
+                              xlink:arcrole="http://schooltool.org/ns/membership"
+                              xlink:href="/groups/new"/>"""),
+            # Bad URI: http://schooltool.org/ns/nonexistent
+            (RestError,
+             """<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                              xmlns="http://schooltool.org/ns/model/0.1"
+                              xlink:type="simple"
+                              xlink:role="http://schooltool.org/ns/nonexistent"
+                              xlink:arcrole="http://schooltool.org/ns/membership"
+                              xlink:href="/groups/new"/>"""),
+            # Document not valid according to schema.
+            (XMLValidationError,
+             """<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                              xmlns="http://schooltool.org/ns/model/0.1"
+                              xlink:type="simple"
+                              xlink:role="http://schooltool.org/ns/membership/group"
+                              xlink:arcrole="http://schooltool.org/ns/membership"
+                              />"""),
+            # Document not valid according to schema.
+            (XMLValidationError,
+             """<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                              xmlns="http://schooltool.org/ns/model/0.1"
+                              xlink:type="simple"
+                              xlink:arcrole="http://schooltool.org/ns/membership"
+                              xlink:href="/groups/new"/>"""),
+            # Document not valid according to schema.
+            (XMLValidationError,
+             """<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                              xmlns="http://schooltool.org/ns/model/0.1"
+                              xlink:type="simple"
+                              xlink:role="http://schooltool.org/ns/membership"
+                              xlink:href="/groups/new"/>"""),
+            # Ill-formed document.
+            (XMLParseError,
+             """<relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                              xmlns="http://schooltool.org/ns/model/0.1"
+                              xlink:type="simple"
+                              xlink:role="http://schooltool.org/ns/membership/group"
+                              xlink:arcrole="http://schooltool.org/ns/membership"
+                              xlink:href="/groups/root" bad_xml>"""),
+            ]
+
+        for exception, body in bad_requests:
+            body = StringIO(body)
+            request = TestRequest(body)
+            view = RelationshipsView(IRelationshipLinks(self.new), request)
+
+            self.assertEquals(len(view.listLinks()), 3)
+            self.assertRaises(exception, view.POST)
+            self.assertEquals(len(view.listLinks()), 3)
+
+
+class TestLinkView(CommonSetupMixin, unittest.TestCase):
+
+    def setUp(self):
+        from schooltool.app.rest.relationships import LinkView
+        CommonSetupMixin.setUp(self)
+        self.request = TestRequest()
+        self.view = LinkView(getRelationshipLinks(self.group)['1'], self.request)
+
+    def testGET(self):
+        result = self.view.GET()
+        self.assertEquals(self.request.response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result, """
+        <relationship xmlns:xlink="http://www.w3.org/1999/xlink"
+                      xlink:type="simple"
+                      xlink:role="http://schooltool.org/ns/membership/member"
+                      xlink:arcrole="http://schooltool.org/ns/membership"
+                      xlink:href="http://127.0.0.1/persons/pete"/>
+        """)
+
+    def testDELETE(self):
+        self.assertEqual(
+            len([link for link in getRelationshipLinks(self.group)]), 1)
+        result = self.view.DELETE()
+        self.assertEqual(result, 'Link removed')
+        self.assertEqual(
+            len([link for link in getRelationshipLinks(self.group)]), 0)
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestRelationshipsView))
+    suite.addTest(unittest.makeSuite(TestLinkView))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_relationships.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_rest.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_rest.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_rest.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,62 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for infrastructure of restive views.
+
+$Id: test_rest.py 5459 2005-12-15 17:28:45Z mg $
+"""
+import unittest
+from StringIO import StringIO
+
+from zope.app.testing.placelesssetup import PlacelessSetup
+from zope.app.publication.http import HTTPPublication
+from zope.publisher.http import HTTPRequest
+
+
+class Test(PlacelessSetup, unittest.TestCase):
+
+    def setUp(self):
+        super(Test, self).setUp()
+        self.__env =  {
+            'SERVER_URL':         'http://127.0.0.1',
+            'HTTP_HOST':          '127.0.0.1',
+            'CONTENT_LENGTH':     '0',
+            'GATEWAY_INTERFACE':  'TestFooInterface/1.0',
+            }
+
+    def test_http(self):
+        from schooltool.app.rest import RestPublicationRequestFactory
+
+        factory = RestPublicationRequestFactory(None)
+        for method in ('HEAD', 'PUT', 'POST', 'DELETE',
+                       'head', 'put', 'post', 'delete',
+                       'whatnot'):
+            self.__env['REQUEST_METHOD'] = method
+            request = factory(StringIO(''), self.__env)
+            self.assertEqual(request.__class__, HTTPRequest)
+            self.assertEqual(request.publication.__class__, HTTPPublication)
+
+
+def test_suite():
+    return unittest.TestSuite((
+        unittest.makeSuite(Test),
+        ))
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/rest/tests/test_rest.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/security.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/security.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/security.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,238 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool security infrastructure
+
+$Id: security.py 6892 2007-04-25 12:58:41Z ignas $
+"""
+
+import urllib
+
+from persistent import Persistent
+from zope.app import zapi
+from zope.app.component import getNextUtility
+from zope.app.component.interfaces import ISite
+from zope.app.component.site import LocalSiteManager
+from zope.app.container.contained import Contained
+from zope.location.interfaces import ILocation
+from zope.app.security.interfaces import IAuthentication, ILoginPassword
+from zope.app.security.interfaces import IAuthenticatedGroup, IEveryoneGroup
+from zope.app.session.interfaces import ISession
+from zope.interface import implements
+from zope.component import adapts
+from zope.security.interfaces import IGroupAwarePrincipal
+from zope.security.checker import ProxyFactory
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.annotation.interfaces import IAttributeAnnotatable
+
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolAuthentication
+from schooltool.app.interfaces import IAsset
+from schooltool.person.interfaces import IPerson
+from schooltool.securitypolicy.crowds import Crowd
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import ICalendarParentCrowd
+from schooltool.securitypolicy.crowds import ConfigurableCrowd, ParentCrowd
+
+
+class Principal(Contained):
+    implements(IGroupAwarePrincipal)
+
+    def __init__(self, id, title, person=None):
+        self.id = id
+        self.title = title
+        self.description = ""
+        self.groups = []
+        self._person = person
+
+    def __conform__(self, interface):
+        if interface is IPerson:
+            return self._person
+
+
+class SchoolToolAuthenticationUtility(Persistent, Contained):
+    """A local SchoolTool authentication utility.
+
+    This utility serves principals for groups and persons in the
+    nearest SchoolToolApplication instance.
+
+    It authenticates the requests containing usernames and passwords
+    in the session.
+    """
+
+    implements(ISchoolToolAuthentication, ILocation, IAttributeAnnotatable)
+
+    person_prefix = "sb.person."
+    group_prefix = "sb.group."
+    session_name = "schooltool.auth"
+
+    def authenticate(self, request):
+        """Identify a principal for request.
+
+        Retrieves the username and password from the session.
+        """
+        session = ISession(request)[self.session_name]
+        if 'username' in session and 'password' in session:
+            if self._checkPassword(session['username'], session['password']):
+                return self.getPrincipal('sb.person.' + session['username'])
+
+        # Try HTTP basic too
+        creds = ILoginPassword(request, None)
+        if creds:
+            login = creds.getLogin()
+            if self._checkPassword(login, creds.getPassword()):
+                return self.getPrincipal('sb.person.' + login)
+
+    def _checkPassword(self, username, password):
+        app = getSchoolToolApplication()
+        if username in app['persons']:
+            person = app['persons'][username]
+            return person.checkPassword(password)
+
+    def unauthenticatedPrincipal(self):
+        """Return the unauthenticated principal, if one is defined."""
+        return None
+
+    def unauthorized(self, id, request):
+        """Signal an authorization failure."""
+        if not IBrowserRequest.providedBy(request) or request.method == 'PUT':
+            next = getNextUtility(self, IAuthentication)
+            return next.unauthorized(id, request)
+        if str(request.URL).endswith('.ics'):
+            # Special case: testing shows that Mozilla Calendar does not send
+            # the Authorization header unless challenged.  It is pointless
+            # to redirect an iCalendar client to an HTML login form.
+            next = getNextUtility(self, IAuthentication)
+            return next.unauthorized(id, request)
+        app = getSchoolToolApplication()
+        app_url = zapi.absoluteURL(app, request)
+        query_string = request.getHeader('QUERY_STRING')
+        if query_string:
+            query_string = "?%s" % query_string
+        else:
+            query_string = ""
+        full_url = "%s%s" % (str(request.URL), query_string)
+        request.response.redirect("%s/@@login.html?forbidden=yes&nexturl=%s"
+                                  % (app_url, urllib.quote(full_url)))
+
+    def getPrincipal(self, id):
+        """Get principal meta-data.
+
+        Returns principals for groups and persons.
+        """
+        app = getSchoolToolApplication()
+        if id.startswith(self.person_prefix):
+            username = id[len(self.person_prefix):]
+            if username in app['persons']:
+                person = app['persons'][username]
+                principal = Principal(id, person.title,
+                                      person=ProxyFactory(person))
+                for group in person.groups:
+                    group_principal_id = self.group_prefix + group.__name__
+                    principal.groups.append(group_principal_id)
+                authenticated = zapi.queryUtility(IAuthenticatedGroup)
+                if authenticated:
+                    principal.groups.append(authenticated.id)
+                everyone = zapi.queryUtility(IEveryoneGroup)
+                if everyone:
+                    principal.groups.append(everyone.id)
+                return principal
+
+        if id.startswith(self.group_prefix):
+            group_name = id[len(self.group_prefix):]
+            if group_name in app['groups']:
+                group = app['groups'][group_name]
+                # Group membership is not supported in SB, so we don't bother
+                # filling in principal.groups.
+                return Principal(id, group.title)
+
+        next = getNextUtility(self, IAuthentication)
+        return next.getPrincipal(id)
+
+    def setCredentials(self, request, username, password):
+        if not self._checkPassword(username, password):
+            raise ValueError('bad credentials')
+        session = ISession(request)[self.session_name]
+        session['username'] = username
+        session['password'] = password
+
+    def clearCredentials(self, request):
+        session = ISession(request)[self.session_name]
+        try:
+            del session['password']
+            del session['username']
+        except KeyError:
+            pass
+
+    # See ILogout
+    logout = clearCredentials
+
+
+def setUpLocalAuth(site, auth=None):
+    """Set up local authentication for SchoolTool.
+
+    Creates a site management folder in a site and sets up local
+    authentication.
+    """
+
+    if auth is None:
+        auth = SchoolToolAuthenticationUtility()
+
+    if not ISite.providedBy(site):
+        site.setSiteManager(LocalSiteManager(site))
+
+    # go to the site management folder
+    default = zapi.traverse(site, '++etc++site/default')
+    # if we already have the auth utility registered, we're done
+    if 'SchoolToolAuth' in default:
+        return
+    # otherwise add it and register it
+    default['SchoolToolAuth'] = auth
+    manager = site.getSiteManager()
+    manager.registerUtility(auth, IAuthentication)
+
+
+def authSetUpSubscriber(app, event):
+    """Set up local authentication for newly added SchoolTool apps.
+
+    This is a handler for IObjectAddedEvent.
+    """
+    setUpLocalAuth(app)
+
+
+class ApplicationCalendarCrowd(ConfigurableCrowd):
+    adapts(ISchoolToolApplication)
+    setting_key = 'everyone_can_view_app_calendar'
+
+
+CalendarViewersCrowd = ParentCrowd(
+    ICalendarParentCrowd, 'schooltool.view')
+
+
+CalendarEditorsCrowd = ParentCrowd(
+    ICalendarParentCrowd, 'schooltool.edit')
+
+
+class LeaderCrowd(Crowd):
+    """A crowd that contains leaders of an object."""
+
+    def contains(self, principal):
+        assert IAsset.providedBy(self.context)
+        person = IPerson(principal, None)
+        return person in self.context.leaders


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/security.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/security.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/security.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/security.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,326 @@
+==================================
+SchoolBell security infrastructure
+==================================
+
+General design
+--------------
+
+The security system of SchoolBell consists of:
+
+ * SchoolToolAuthenticationUtility
+ * views for login/logout
+ * a custom security policy
+
+The login/logout views store/reset the authentication data in the
+session.  The authentication utility authenticates the request
+according to the data stored in the session.
+
+The security policy is documented in src/schooltool/securitypolicy/README.txt
+
+
+SchoolBell authentication utility
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+(Handwaving...)
+
+    >>> from zope.app.testing import setup
+    >>> root = setup.placefulSetUp(True)
+    >>> from schooltool.relationship.tests import setUpRelationships
+    >>> setUpRelationships()
+
+    Global auth utility:
+
+    >>> from zope.app.security.principalregistry import principalRegistry
+    >>> from zope.app.security.interfaces import IAuthentication
+    >>> from zope.app.testing import ztapi
+    >>> ztapi.provideUtility(IAuthentication, principalRegistry)
+
+    Session setup:
+
+    >>> from zope.app.session.session import ClientId, Session
+    >>> from zope.app.session.session import PersistentSessionDataContainer
+    >>> from zope.publisher.interfaces import IRequest
+    >>> from zope.app.session.http import CookieClientIdManager
+    >>> from zope.app.session.interfaces import ISessionDataContainer
+    >>> from zope.app.session.interfaces import IClientId
+    >>> from zope.app.session.interfaces import IClientIdManager, ISession
+    >>> ztapi.provideAdapter(IRequest, IClientId, ClientId)
+    >>> ztapi.provideAdapter(IRequest, ISession, Session)
+    >>> ztapi.provideUtility(IClientIdManager, CookieClientIdManager())
+    >>> sdc = PersistentSessionDataContainer()
+    >>> ztapi.provideUtility(ISessionDataContainer, sdc, 'schooltool.auth')
+
+
+SchoolBell is a possible site:
+
+    >>> from zope.interface.verify import verifyObject
+    >>> from zope.app.component.interfaces import IPossibleSite, ISite
+
+    >>> from schooltool.app.app import SchoolToolApplication
+    >>> app = SchoolToolApplication()
+    >>> verifyObject(IPossibleSite, app)
+    True
+    >>> verifyObject(ISite, app)
+    Traceback (most recent call last):
+    ...
+    DoesNotImplement: ...
+    ...
+
+
+The SchoolToolAuthenticationUtility is an IAuthentication utility that
+lives in that site:
+
+    >>> from schooltool.app.security import SchoolToolAuthenticationUtility
+    >>> from schooltool.app.interfaces import ISchoolToolAuthentication
+    >>> auth = SchoolToolAuthenticationUtility()
+    >>> verifyObject(IAuthentication, auth)
+    True
+    >>> verifyObject(ISchoolToolAuthentication, auth)
+    True
+
+Let's provide the location of auth:
+
+    >>> root['frogpond'] = app
+    >>> from schooltool.app.security import setUpLocalAuth
+    >>> setUpLocalAuth(app, auth)
+    >>> from zope.app.component.hooks import setSite
+    >>> setSite(app)
+
+Now, we get our local authentication service:
+
+    >>> from zope.app import zapi
+    >>> zapi.getUtility(IAuthentication, context=app) is auth
+    True
+    >>> verifyObject(ISite, app)
+    True
+
+getPrincipal
+------------
+
+The utility knows about the users of the application:
+
+    >>> from schooltool.person.person import Person, PersonContainer
+    >>> from zope.app.security.interfaces import IPrincipal
+    >>> app['persons'] = PersonContainer()
+    >>> person = Person(username=u"frog", title="Frog")
+    >>> app['persons']['frog'] = person
+
+    >>> principal = auth.getPrincipal('sb.person.frog')
+    >>> verifyObject(IPrincipal, principal)
+    True
+    >>> principal.title
+    'Frog'
+
+The utility delegates to the next service if the principal is not
+found:
+
+    >>> p = principalRegistry.definePrincipal('zope.manager', 'Mgmt', '',
+    ...                                       'gandalf', '123')
+
+    >>> p1 = auth.getPrincipal('zope.manager')
+    >>> p == p1
+    True
+    >>> p.title
+    'Mgmt'
+
+
+If the principal we are looking up does not exist, an exception is
+raised:
+
+    >>> auth.getPrincipal('sb.person.nonexistent')
+    Traceback (most recent call last):
+    ...
+    PrincipalLookupError: sb.person.nonexistent
+
+
+The groups of the SchoolBell instance are also principals:
+
+    >>> from schooltool.group.group import GroupContainer
+    >>> app['groups'] = GroupContainer()
+
+    >>> from schooltool.group.group import Group
+    >>> group = Group()
+    >>> group.title = "The Management"
+    >>> app['groups']['management'] = group
+
+    >>> g1 = auth.getPrincipal('sb.group.management')
+    >>> g1.title
+    'The Management'
+    >>> group.members.add(person)
+
+And the user principal has a list ids of group principals he belongs
+to.  This list is used by the security policy:
+
+    >>> from zope.security.interfaces import IGroupAwarePrincipal
+    >>> p = auth.getPrincipal('sb.person.frog')
+    >>> verifyObject(IGroupAwarePrincipal, p)
+    True
+    >>> p.groups
+    [u'sb.group.management']
+
+If the global principals like IEveryoneGroup, IAuthenticatedGroup are
+defined, they are added to the list of groups of a principal, too:
+
+    >>> from zope.app.security.interfaces import IAuthenticatedGroup
+    >>> from zope.app.security.interfaces import IEveryoneGroup
+    >>> from zope.app.security.principalregistry import AuthenticatedGroup
+    >>> from zope.app.security.principalregistry import EverybodyGroup
+
+    >>> authenticated = AuthenticatedGroup('zope.authenticated', '', '')
+    >>> ztapi.provideUtility(IAuthenticatedGroup, authenticated)
+    >>> everyone = EverybodyGroup('zope.everybody', 'All users', '')
+    >>> ztapi.provideUtility(IEveryoneGroup, everyone)
+
+    >>> p = auth.getPrincipal('sb.person.frog')
+    >>> p.groups
+    [u'sb.group.management', 'zope.authenticated', 'zope.everybody']
+
+
+authenticate
+------------
+
+When no credentials are provided in the session, authenticate returns None:
+
+    >>> from zope.publisher.browser import TestRequest
+    >>> request = TestRequest()
+    >>> auth.authenticate(request)
+
+Suppose, the user 'frog' has a password:
+
+    >>> app['persons']['frog'].setPassword('pond')
+
+The frog has authenticated itself in the login form and the
+credentials are stored in the session:
+
+    >>> auth.setCredentials(request, 'frog', 'shmond')
+    Traceback (most recent call last):
+    ...
+    ValueError: bad credentials
+    >>> auth.setCredentials(request, 'snake', 'badgermushroom')
+    Traceback (most recent call last):
+    ...
+    ValueError: bad credentials
+    >>> auth.setCredentials(request, 'frog', 'pond')
+
+Now, it is authenticated by our utility:
+
+    >>> principal = auth.authenticate(request)
+    >>> verifyObject(IGroupAwarePrincipal, principal)
+    True
+    >>> principal.id
+    'sb.person.frog'
+
+Our principal is adaptable to IPerson:
+
+    >>> from schooltool.person.interfaces import IPerson
+    >>> from zope.security.proxy import removeSecurityProxy
+    >>> removeSecurityProxy(IPerson(principal)) is  app['persons']['frog']
+    True
+
+The credentials can be cleared from the session:
+
+    >>> auth.clearCredentials(request)
+    >>> auth.authenticate(request)
+
+If there are no credentials set, clearing does not fail:
+
+    >>> auth.clearCredentials(request)
+
+Also, if cookie based authentication fails, we support HTTP basic
+authentication (by trying to adapt the request to ILoginPassword):
+
+    >>> from zope.interface import Interface, directlyProvides, implements
+    >>> from zope.app.security.interfaces import ILoginPassword
+
+    >>> class Adapter:
+    ...     implements(ILoginPassword)
+    ...     def __init__(self, context):
+    ...         self.context = context
+    ...     def getLogin(self):
+    ...         return "frog"
+    ...     def getPassword(self):
+    ...         return "pond"
+    ...     def needLogin(self, realm):
+    ...         self.context.unauthorized("basic realm=%s" % realm)
+    ...
+    >>> class IFrogMarker(Interface): pass
+    >>> ztapi.provideAdapter(IFrogMarker, ILoginPassword, Adapter)
+    >>> request = TestRequest()
+    >>> directlyProvides(request, IFrogMarker)
+
+    >>> auth.authenticate(request).id
+    'sb.person.frog'
+
+
+unauthorized
+------------
+
+Our view issues the authorization challenge by redirecting to the
+login page:
+
+    >>> request = TestRequest()
+    >>> auth.unauthorized(None, request)
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('Location')
+    'http://127.0.0.1/frogpond/@@login.html?forbidden=yes&nexturl=http%3A//127.0.0.1'
+
+The URL is properly escaped
+
+    >>> request = TestRequest()
+    >>> request.getURL = lambda *a: '/++etc++site'
+    >>> auth.unauthorized(None, request)
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('Location')
+    'http://127.0.0.1/frogpond/@@login.html?forbidden=yes&nexturl=/%2B%2Betc%2B%2Bsite'
+
+GET parameters are passed along:
+
+    >>> request = TestRequest()
+    >>> request.getURL = lambda *a: '/++etc++site'
+    >>> request.getHeader = lambda *a: 'foo=10&bar=20'
+    >>> auth.unauthorized(None, request)
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('Location')
+    'http://127.0.0.1/frogpond/@@login.html?forbidden=yes&nexturl=/%2B%2Betc%2B%2Bsite%3Ffoo%3D10%26bar%3D20'
+
+However it does that only for regular browser requests.  Other kinds of
+requests issue the default challenge by setting the response code to 401
+(Unauthorized).
+
+    >>> from zope.publisher.tests import httprequest
+    >>> request = httprequest.TestRequest()
+    >>> directlyProvides(request, IFrogMarker)
+    >>> auth.unauthorized(None, request)
+    >>> request.response.getStatus()
+    401
+
+HTTP PUT, does so likewise, even though it uses a real BrowserRequest.
+
+    >>> request = TestRequest()
+    >>> request.method = 'PUT'
+    >>> directlyProvides(request, IFrogMarker)
+    >>> auth.unauthorized(None, request)
+    >>> request.response.getStatus()
+    401
+
+And, since this is not a perfect world, we need a workaround for Mozilla
+Calendar -- HTTP GET requests for .ics files also issue the HTTP Basic
+authentication challenge.
+
+    >>> request = TestRequest()
+    >>> request.getURL = lambda *a: '/dir/calendar.ics'
+    >>> str(request.URL)
+    '...calendar.ics'
+    >>> directlyProvides(request, IFrogMarker)
+    >>> auth.unauthorized(None, request)
+    >>> request.response.getStatus()
+    401
+
+
+Clean up:
+
+    >>> setup.placefulTearDown()


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/security.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/security.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/security.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/security.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+<configure xmlns="http://schooltool.org/securitypolicy"
+           xmlns:zope="http://namespaces.zope.org/zope">
+
+  <crowd
+      name="leaders"
+      factory=".security.LeaderCrowd" />
+
+  <crowd
+      name="group_members"
+      factory=".membership.GroupMemberCrowd" />
+
+  <allow
+      interface="schooltool.group.interfaces.IGroup"
+      permission="schooltool.view"
+      crowds="group_members" />
+
+  <allow
+      interface="schooltool.app.interfaces.ISchoolToolApplication"
+      crowds="everybody"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.app.interfaces.ISchoolToolApplication"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <allow
+      interface="schooltool.app.interfaces.ISchoolToolApplication"
+      crowds="administration"
+      permission="zope.ManageSite" />
+
+  <zope:configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+    <allow
+       interface="schooltool.app.interfaces.ISchoolToolApplication"
+       crowds="administration"
+       permission="zope.app.apidoc.UseAPIDoc" />
+  </zope:configure>
+
+  <!-- Security declarations for calendaring -->
+
+  <zope:adapter
+      factory=".security.ApplicationCalendarCrowd"
+      provides=".security.ICalendarParentCrowd"
+      name="schooltool.view" />
+
+  <crowd
+      name="calendar_viewers"
+      factory=".security.CalendarViewersCrowd" />
+
+  <crowd
+      name="calendar_editors"
+      factory=".security.CalendarEditorsCrowd" />
+
+  <allow
+      interface=".interfaces.ISchoolToolCalendar"
+      permission="schooltool.view"
+      crowds="administration calendar_viewers" />
+
+  <allow
+      interface=".interfaces.ISchoolToolCalendar"
+      permission="schooltool.edit"
+      crowds="administration owner calendar_editors" />
+
+  <setting
+      key="everyone_can_view_app_calendar"
+      text="Everyone can view the application calendar."
+      default="True"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/security.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2 @@
+# Make a package.
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/empty.conf
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/empty.conf	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/empty.conf	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2 @@
+<zodb>
+</zodb>

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/sample.conf
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/sample.conf	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/sample.conf	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,18 @@
+path /xxxxx
+path /yyyyy/zzzzz
+module schooltool.tests.test_main
+listen 123
+listen 10.20.30.40:9999
+web 48080
+rest 47001
+listen_ssl 10.20.30.41:10000
+web_ssl 48081
+ssl_certificate moon.pem
+thread-pool-size 42
+domain schooltool
+lang lt_LT
+app-log-file app.log
+<zodb>
+  <mappingstorage>
+  </mappingstorage>
+</zodb>

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/test_app.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/test_app.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/test_app.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,154 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.
+
+$Id: test_app.py 5928 2006-04-18 09:08:27Z vidas $
+"""
+import unittest
+
+from zope.component import provideAdapter
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup, placelesssetup
+
+from schooltool.testing import setup as sbsetup
+
+
+def doctest_SchoolToolApplication():
+    """SchoolToolApplication
+
+    We need to register an adapter to make the title attribute available:
+
+        >>> placelesssetup.setUp()
+        >>> setup.setUpAnnotations()
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> provideAdapter(getApplicationPreferences,
+        ...                adapts=[ISchoolToolApplication],
+        ...                provides=IApplicationPreferences)
+
+    Let's check that SchoolToolApplication satisfies the interface:
+
+        >>> app = sbsetup.createSchoolToolApplication()
+
+        >>> verifyObject(ISchoolToolApplication, app)
+        True
+
+    The most basic containers should be available:
+
+        >>> from schooltool.person.interfaces import IPersonContainer
+        >>> verifyObject(IPersonContainer, app['persons'])
+        True
+
+        >>> from schooltool.group.interfaces import IGroupContainer
+        >>> verifyObject(IGroupContainer, app['groups'])
+        True
+
+        >>> from schooltool.resource.interfaces import IResourceContainer
+        >>> verifyObject(IResourceContainer, app['resources'])
+        True
+
+        >>> from schooltool.course.interfaces import ICourseContainer
+        >>> verifyObject(ICourseContainer, app['courses'])
+        True
+
+        >>> from schooltool.course.interfaces import ISectionContainer
+        >>> verifyObject(ISectionContainer, app['sections'])
+        True
+
+    Our ApplicationPreferences title should be 'SchoolTool' by default:
+
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> getApplicationPreferences(app).title
+        'SchoolTool'
+
+    Time settings for application:
+
+        >>> prefs = getApplicationPreferences(app)
+        >>> prefs.timezone
+        'UTC'
+
+        >>> prefs.dateformat
+        '%Y-%m-%d'
+
+        >>> prefs.timeformat
+        '%H:%M'
+
+        >>> prefs.weekstart
+        0
+
+    Clean up
+
+        >>> placelesssetup.tearDown()
+
+    """
+
+
+def doctest_getSchoolToolApplication():
+    """Tests for getSchoolToolApplication.
+
+      >>> setup.placelessSetUp()
+
+    Let's say we have a SchoolTool app, which is a site.
+
+      >>> from schooltool.app.app import SchoolToolApplication
+      >>> app = SchoolToolApplication()
+
+      >>> from zope.app.component.site import LocalSiteManager
+      >>> app.setSiteManager(LocalSiteManager(app))
+
+    If site is not a SchoolToolApplication, we get an error
+
+      >>> from schooltool.app.app import getSchoolToolApplication
+      >>> getSchoolToolApplication()
+      Traceback (most recent call last):
+      ...
+      ValueError: can't get a SchoolToolApplication
+
+    If current site is a SchoolToolApplication, we get it:
+
+      >>> from zope.app.component.hooks import setSite
+      >>> setSite(app)
+
+      >>> getSchoolToolApplication() is app
+      True
+
+      >>> setup.placelessTearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+                doctest.DocTestSuite('schooltool.app.app',
+                                     optionflags=doctest.ELLIPSIS),
+                doctest.DocTestSuite('schooltool.app.interfaces',
+                                     optionflags=doctest.ELLIPSIS),
+                doctest.DocTestSuite('schooltool.app.membership',
+                                     optionflags=doctest.ELLIPSIS),
+                doctest.DocFileSuite('../README.txt',
+                                     optionflags=doctest.ELLIPSIS)
+           ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/tests/test_app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/test_booking.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/test_booking.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/test_booking.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,36 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.booking.
+
+$Id: test_booking.py 4828 2005-08-19 17:39:59Z srichter $
+"""
+
+import unittest
+from zope.testing import doctest
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocFileSuite('../booking.txt',
+                                     optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/tests/test_booking.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/test_cal.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/test_cal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/test_cal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,511 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.app.
+
+$Id: test_cal.py 6487 2006-11-16 15:06:30Z ignas $
+"""
+
+import unittest
+from textwrap import dedent
+from datetime import datetime, timedelta
+
+from zope.testing import doctest
+from zope.interface import implements
+from zope.interface.verify import verifyObject
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.testing import setup
+
+from schooltool.app.interfaces import IHaveCalendar
+from schooltool.testing import setup as sbsetup
+
+class ResourceStub(object):
+    """Stub resource.
+
+    For the purposes of resource booking, a resource is anything that
+    has a 'calendar' attribute.
+    """
+    implements(IHaveCalendar, IAttributeAnnotatable)
+
+
+def doctest_CalendarEvent():
+    r"""Tests for CalendarEvent.
+
+    CalendarEvents are almost like SimpleCalendarEvents, the main difference
+    is that CalendarEvents are mutable and IContained.
+
+        >>> from schooltool.app.cal import CalendarEvent, Calendar
+
+        >>> event = CalendarEvent(datetime(2005, 2, 7, 16, 24),
+        ...                       timedelta(hours=3),
+        ...                       "A sample event",
+        ...                       unique_id="*the* event")
+
+    The event implements ISchoolToolCalendarEvent:
+
+        >>> from schooltool.app.interfaces import ISchoolToolCalendarEvent
+        >>> verifyObject(ISchoolToolCalendarEvent, event)
+        True
+
+    It has a name, which is equal to base64 of the unique id, and can
+    have a parent:
+
+        >>> event.__name__
+        'KnRoZSogZXZlbnQ='
+        >>> event.__parent__ is None
+        True
+
+    The calendar in which the event resides is referenced in __parent__,
+    but you should just use adaptation to ICalendar:
+
+    XXX mg: I have second thoughts about using adaptation to navigate.
+
+        >>> event.__parent__ = object()
+
+        >>> from schooltool.calendar.interfaces import ICalendar
+        >>> ICalendar(event) is event.__parent__
+        True
+
+    As CalendarEvents are mutable, you can modify attributes at will:
+
+        >>> event.dtend = timedelta(hours=1)
+        >>> event.dtend
+        datetime.timedelta(0, 3600)
+
+
+    Owner of the event is the __parent__ of its calendar:
+
+        >>> class CalStub(object):
+        ...     __parent__ = "Owner"
+        >>> event.__parent__ = CalStub()
+        >>> event.owner
+        'Owner'
+
+    If event has no calendar it is assumed that it has no owner too:
+
+        >>> event.__parent__ = None
+        >>> event.owner is None
+        True
+
+    It is very unwise to touch the __name__ or unique_id of events.
+    TODO: enforce this restriction.
+
+    """
+
+
+def doctest_CalendarEvent_resource_booking():
+    """Resource booking tests for CalendarEvent.
+
+        >>> setup.setUpAnnotations()
+        >>> sbsetup.setUpCalendaring()
+
+    All calendar events have a `resources` argument, but initially it is empty.
+
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> from schooltool.app.cal import Calendar, CalendarEvent
+        >>> c = Calendar(None)
+        >>> e = CalendarEvent(datetime(2005, 2, 28), None, '')
+        >>> c.addEvent(e)
+        >>> e.resources
+        ()
+
+    It is also read-only.
+
+        >>> e.resources = []
+        Traceback (most recent call last):
+          ...
+        AttributeError: can't set attribute
+
+    CalendarEvent.bookResource adds the resource to its resources list and
+    adds the event into the resource's calendar.
+
+        >>> r = ResourceStub()
+        >>> e.bookResource(r)
+        >>> e.resources
+        (<...ResourceStub object at...>,)
+        >>> e in ISchoolToolCalendar(r)
+        True
+
+    CalendarEvent.unbookResource undoes this
+
+        >>> e.unbookResource(r)
+        >>> e.resources
+        ()
+        >>> e in ISchoolToolCalendar(r)
+        False
+
+    When you create a CalendarEvent, you can pass a list of resources
+    to the constructor.  This is equivalent to creating a CalendarEvent
+    without the resources argument, and then subsequently calling bookResource
+    for each resource.
+
+        >>> a = ResourceStub()
+        >>> b = ResourceStub()
+        >>> e = CalendarEvent(datetime(2005, 2, 28), None, 'title', resources=[a, b])
+        >>> c.addEvent(e)
+        >>> a in e.resources and b in e.resources
+        True
+        >>> e in ISchoolToolCalendar(a) and e in ISchoolToolCalendar(b)
+        True
+        >>> e.__parent__ is c
+        True
+
+    You cannot book the same resource twice:
+
+        >>> e.bookResource(a)
+        Traceback (most recent call last):
+          ...
+        ValueError: resource already booked
+
+    You cannot unbook a resource that is not booked
+
+        >>> e.unbookResource(r)
+        Traceback (most recent call last):
+          ...
+        ValueError: resource not booked
+
+    """
+
+
+def doctest_Calendar():
+    r"""Tests for Calendar.
+
+    Let's create a Calendar:
+
+        >>> from schooltool.app.cal import Calendar
+        >>> cal = Calendar(None)
+        >>> cal.__name__
+        'calendar'
+
+    The calendar should be an ILocation and it should implement IEditCalendar.
+
+        >>> from schooltool.calendar.interfaces import IEditCalendar
+        >>> from zope.location.interfaces import ILocation
+        >>> verifyObject(IEditCalendar, cal)
+        True
+        >>> verifyObject(ILocation, cal)
+        True
+
+    A quick look at the empty calendar:
+
+        >>> len(cal)
+        0
+        >>> list(cal)
+        []
+
+    We can add events by using addEvent():
+
+        >>> from schooltool.app.cal import CalendarEvent
+        >>> event = CalendarEvent(datetime(2005, 2, 28), None, 'Example 1')
+
+        >>> cal.addEvent(event)
+        >>> len(cal)
+        1
+        >>> list(cal) == [event]
+        True
+
+    Added events acquire a parent:
+
+        >>> event.__parent__ is cal
+        True
+
+    You should not try to add the same event to a different calendar:
+
+        >>> cal2 = Calendar(None)
+        >>> cal2.addEvent(event)
+        Traceback (most recent call last):
+        ...
+        ValueError: Event already belongs to a calendar
+
+    There are exceptions to the previous rule: resource booking adds the same
+    event to several calendars simultaneously.
+
+    Let's add a few more events:
+
+        >>> event2 = CalendarEvent(datetime(2005, 2, 28), None, 'Example 2')
+        >>> cal.addEvent(event2)
+        >>> event3 = CalendarEvent(datetime(2005, 2, 28), None, 'Example 3')
+        >>> cal.addEvent(event3)
+
+    You can't, however, add multiple events with the same unique_id
+
+        >>> event3a = CalendarEvent(datetime(2005, 2, 28), None, 'Example 3',
+        ...                         unique_id=event3.unique_id)
+        >>> cal.addEvent(event3a)
+        Traceback (most recent call last):
+          ...
+        ValueError: an event with this unique_id already exists
+
+    You can iterate through a calendar:
+
+        >>> len(cal)
+        3
+        >>> titles = [ev.title for ev in cal]
+        >>> titles.sort()
+        >>> titles
+        ['Example 1', 'Example 2', 'Example 3']
+
+    Events can be retrieved by their unique id through find():
+
+        >>> cal.find(event2.unique_id) == event2
+        True
+
+        >>> cal.find('nonexistent')
+        Traceback (most recent call last):
+        ...
+        KeyError: 'nonexistent'
+
+    You can remove an event by calling removeEvent()
+
+        >>> cal.removeEvent(event)
+
+    When an event is removed, its __parent__ becomes None
+
+        >>> event.__parent__ is None
+        True
+
+    All events can be removed from a calendar by using clear():
+
+        >>> cal.clear()
+        >>> list(cal)
+        []
+
+    It also clears __parent__ attributes
+
+        >>> event3.__parent__ is None
+        True
+
+    By the way, you can specify the calendar's owner in the constructor:
+
+        >>> class PersonStub:
+        ...     title = 'A person'
+        >>> parent = PersonStub()
+        >>> cal2 = Calendar(parent)
+        >>> cal2.__parent__ is parent
+        True
+
+    The calendar's `title` is its owner's title:
+
+        >>> cal2.title
+        'A person'
+
+    We will trust that `expand` inherited from CalendarMixin has been unit
+    tested.
+    """
+
+
+def doctest_Calendar_addEvent_resource_booking():
+    """Tests for Calendar.addEvent.
+
+        >>> setup.setUpAnnotations()
+        >>> sbsetup.setUpCalendaring()
+
+    For the purposes of resource booking, a resource is anything that
+    has a 'calendar' attribute.
+
+        >>> resource = ResourceStub()
+
+    When you add an event to a calendar, the calendar's addEvent sets the
+    event's __parent__ to itself, or complains loudly if __parent__ already
+    set.  Thus normally you cannot add the same calendar event into two
+    different calendars.
+
+        >>> from schooltool.app.cal import Calendar, CalendarEvent
+        >>> cal = Calendar(None)
+        >>> e = CalendarEvent(datetime(2005, 2, 28), None, '')
+        >>> cal.addEvent(e)
+        >>> e.__parent__ is cal
+        True
+
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> ISchoolToolCalendar(resource).addEvent(e)
+        Traceback (most recent call last):
+          ...
+        ValueError: Event already belongs to a calendar
+
+    However, there is an exception to the previous rule: you can add an event
+    to a resource's calendar, if the resource is listed in event.resources.
+
+        >>> e._resources = (resource, )
+        >>> resource in e.resources
+        True
+
+        >>> calendar = ISchoolToolCalendar(resource)
+        >>> calendar.addEvent(e)
+        >>> e in calendar
+        True
+
+    Event's __parent__ is not changed in this case.
+
+        >>> e.__parent__ is cal
+        True
+
+    """
+
+
+def doctest_WriteCalendar():
+    r"""Tests for WriteCalendar.
+
+    WriteCalendar is an adapter for calendars into IWriteFile
+
+        >>> from schooltool.app.cal import Calendar, WriteCalendar
+        >>> cal = Calendar(None)
+        >>> writer = WriteCalendar(cal)
+
+        >>> from schooltool.app.interfaces import IWriteCalendar
+        >>> verifyObject(IWriteCalendar, writer)
+        True
+
+    Let's check that WriteCalendar is hooked up to the iCalendar parser:
+
+        >>> writer.write(dedent('''\
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... METHOD:PUBLISH
+        ... BEGIN:VEVENT
+        ... UID:956630271
+        ... SUMMARY:Christmas Day
+        ... CLASS:PUBLIC
+        ... DTSTART;VALUE=DATE:20030501
+        ... DTEND;VALUE=DATE:20031226
+        ... DTSTAMP:20020430T114937Z
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... '''))
+
+        >>> len(list(cal))
+        1
+        >>> event = cal.find('956630271')
+        >>> event.title
+        u'Christmas Day'
+
+    As iCalendar is a bit unwieldy for testing, we will plant a hook:
+
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> def event(unique_id, title, day=22, duration=3, **kwargs):
+        ...     return SimpleCalendarEvent(title=title,
+        ...                                dtstart=datetime(2005, 2, day),
+        ...                                duration=duration,
+        ...                                unique_id=unique_id)
+        >>> evts = []
+        >>> writer.read_icalendar = lambda ignored, ignored_too: evts
+
+    OK, now we can do a trivial test with two events:
+
+        >>> evts = [event('e1', 'Event I'), event('e2', 'Event II')]
+        >>> writer.write(None)
+
+        >>> len(list(cal))
+        2
+        >>> cal.find('e1').title
+        'Event I'
+        >>> cal.find('e2').title
+        'Event II'
+
+    """
+
+
+def doctest_WriteCalendar_sophisticated():
+    r"""Tests for WriteCalendar.
+
+    We start with three calendar events.
+
+        >>> from datetime import datetime, timedelta
+        >>> from schooltool.app.cal import Calendar, CalendarEvent
+        >>> cal = Calendar(None)
+        >>> event1 = CalendarEvent(title='Play Doom',
+        ...                        dtstart=datetime(2005, 2, 28),
+        ...                        duration=timedelta(hours=2),
+        ...                        unique_id=u'id1')
+        >>> cal.addEvent(event1)
+        >>> event2 = CalendarEvent(title='Play chess',
+        ...                        dtstart=datetime(2005, 3, 1),
+        ...                        duration=timedelta(hours=2),
+        ...                        unique_id=u'id2')
+        >>> cal.addEvent(event2)
+        >>> event3 = CalendarEvent(title='Sleep',
+        ...                        dtstart=datetime(2005, 3, 2),
+        ...                        duration=timedelta(hours=2),
+        ...                        unique_id=u'id3')
+        >>> cal.addEvent(event3)
+
+    We will now upload a new calendar that does not change event1, removes
+    event2, modifies event3 and adds a new event, event4.
+
+        >>> from schooltool.app.cal import WriteCalendar
+        >>> writer = WriteCalendar(cal)
+        >>> writer.write(dedent('''\
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... BEGIN:VEVENT
+        ... UID:id1
+        ... SUMMARY:Play Doom
+        ... DTSTART:20050228T000000
+        ... DURATION:PT2H
+        ... END:VEVENT
+        ... BEGIN:VEVENT
+        ... UID:id3
+        ... SUMMARY:Sleep (zzz)
+        ... DTSTART:20050302T000000
+        ... DURATION:PT8H
+        ... END:VEVENT
+        ... BEGIN:VEVENT
+        ... UID:id4
+        ... SUMMARY:Wake up
+        ... DTSTART:20050302T080000
+        ... DURATION:PT0H
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... '''))
+
+    The calendar now contains three events -- event2 is gone, event4 has
+    appeared.
+
+        >>> ids = [e.unique_id for e in cal]
+        >>> ids.sort()
+        >>> ids
+        [u'id1', u'id3', u'id4']
+
+    event1 is unchanged, and, in fact, it is the same object
+
+        >>> cal.find('id1') is event1
+        True
+
+    event3 was modified in place
+
+        >>> cal.find('id3') is event3
+        True
+        >>> event3.duration == timedelta(hours=8)
+        True
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setup.placelessSetUp,
+                             tearDown=setup.placelessTearDown,
+                             optionflags=doctest.ELLIPSIS),
+        doctest.DocTestSuite('schooltool.app.cal',
+                             optionflags=doctest.ELLIPSIS),
+           ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/tests/test_cal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/test_main.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/test_main.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/test_main.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,751 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.main.
+
+$Id: test_main.py 6835 2007-04-12 11:05:03Z ignas $
+"""
+
+import os
+import sys
+import unittest
+
+from zope.testing import doctest
+from zope.app import zapi
+from zope.testing import cleanup
+from zope.traversing.interfaces import IContainmentRoot
+from zope.interface import directlyProvides
+
+
+def findSiteZCML():
+    import schooltool
+    dir = os.path.dirname(schooltool.__file__)
+    for trial in (('..', '..', 'schooltool-skel', 'etc', 'site.zcml'),
+                  ('..', '..', '..', 'schooltool-skel', 'etc', 'site.zcml'),
+                  ('..', '..', '..', 'etc', 'site.zcml')):
+        path = os.path.abspath(os.path.join(dir, *trial))
+        if os.path.exists(path):
+            return path
+    raise ValueError('`site.zcml` not found.')
+
+
+def doctest_Options():
+    """Tests for Options.
+
+    The only interesting thing Options does is find the default configuration
+    file.
+
+        >>> import os
+        >>> from schooltool.app.main import Options
+        >>> options = Options()
+        >>> options.config_file
+        '...schooltool.conf...'
+
+    """
+
+
+def doctest_main():
+    """Tests for main().
+
+    Main does nothing more but configures SchoolTool, prints the startup time,
+    and starts the main loop.
+
+    Since we don't want to actually create disk files and start a web server in
+    a test, we will set up some stubs.
+
+        >>> from schooltool.app.main import Options
+        >>> options = Options()
+        >>> class ConfigStub:
+        ...     pid_file = ''
+        >>> options.config = ConfigStub()
+
+        >>> def load_options_stub(argv):
+        ...     return options
+        >>> def setup_stub(opts):
+        ...     print "Performing setup..."
+        ...     assert opts is options
+        >>> def run_stub():
+        ...     print "Running..."
+        >>> def before_run_stub(options, db):
+        ...     print "before Running..."
+        >>> def after_run_stub(options):
+        ...     print "after Running..."
+        >>> from schooltool.app import main
+        >>> from schooltool.app.main import StandaloneServer
+        >>> server = StandaloneServer()
+        >>> old_run = main.run
+        >>> server.load_options = load_options_stub
+        >>> server.setup = setup_stub
+        >>> server.beforeRun = before_run_stub
+        >>> server.afterRun = after_run_stub
+        >>> main.run = run_stub
+
+    Now we will run main().
+
+        >>> server.main(['sb.py', '-d'])
+        Performing setup...
+        before Running...
+        Startup time: ... sec real, ... sec CPU
+        Running...
+        after Running...
+
+    Clean up
+
+        >>> main.run = old_run
+    """
+
+
+def doctest_load_options():
+    """Tests for load_options().
+
+        >>> from zope.app.testing import setup
+        >>> setup.placelessSetUp()
+
+    We will use a sample configuration file that comes with these tests.
+
+        >>> import os
+        >>> from schooltool.app import tests
+        >>> test_dir = os.path.dirname(tests.__file__)
+        >>> sample_config_file = os.path.join(test_dir, 'sample.conf')
+        >>> empty_config_file = os.path.join(test_dir, 'empty.conf')
+
+    load_options will report errors to stderr.  We need to temporarily
+    redirect stderr to stdout, because otherwise doctests will not see the
+    output.
+
+        >>> import sys
+        >>> old_stderr = sys.stderr
+        >>> sys.stderr = sys.stdout
+
+    Load options parses command line arguments and the configuration file.
+
+        >>> from schooltool.app.main import StandaloneServer
+        >>> server = StandaloneServer()
+        >>> o = server.load_options(['st.py', '-c', sample_config_file])
+        Reading configuration from ...sample.conf
+
+    Some options come from the command line
+
+        >>> o.config_file
+        '...sample.conf'
+        >>> o.daemon
+        False
+
+    Some come from the config file
+
+        >>> o.config.web in ([('', 48080)],          # Unix
+        ...                  [('localhost', 48080)]) # Windows
+        True
+        >>> o.config.rest in ([('', 47001)],          # Unix
+        ...                  [('localhost', 47001)])  # Windows
+        True
+        >>> o.config.listen
+        [('...', 123), ('10.20.30.40', 9999)]
+
+    Note that "listen 123" in config.py produces ('localhost', 123) on
+    Windows, but ('', 123) on other platforms.
+
+    `load_options` can also give you a nice help message and exit with status
+    code 0.
+
+        >>> try:
+        ...     o = server.load_options(['st.py', '-h'])
+        ... except SystemExit, e:
+        ...     print '[exited with status %s]' % e
+        Usage: st.py [options]
+        Options:
+          -c, --config xxx       use this configuration file instead of the default
+          -h, --help             show this help message
+          -d, --daemon           go to background after starting
+          -r, --restore-manager password
+                                 restore the manager user with the provided password
+                                 (read password from the standart input if 'password'
+                                 is '-')
+          --manage               only do management tasks, don't run the server
+        [exited with status 0]
+
+    Here's what happens, when you use an unknown command line option.
+
+        >>> try:
+        ...     o = server.load_options(['st.py', '-q'])
+        ... except SystemExit, e:
+        ...     print '[exited with status %s]' % e
+        st.py: option -q not recognized
+        Run st.py -h for help.
+        [exited with status 1]
+
+    Here's what happens when the configuration file cannot be found
+
+        >>> try:
+        ...     o = server.load_options(['st.py', '-c', 'nosuchfile'])
+        ... except SystemExit, e:
+        ...     print '[exited with status %s]' % e
+        Reading configuration from nosuchfile
+        st.py: error opening file ...nosuchfile: ...
+        [exited with status 1]
+
+    Here's what happens if you do not specify a storage section in the
+    configuration file.
+
+        >>> try:
+        ...     o = server.load_options(['st.py', '-c', empty_config_file])
+        ... except SystemExit, e:
+        ...     print '[exited with status %s]' % e
+        Reading configuration from ...empty.conf
+        st.py: No storage defined in the configuration file.
+        <BLANKLINE>
+        If you're using the default configuration file, please edit it now and
+        uncomment one of the ZODB storage sections.
+        [exited with status 1]
+
+    Cleaning up.
+
+        >>> sys.stderr = old_stderr
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_configureReportlab():
+    """Tests for configureReportlab.
+
+        >>> from schooltool.app.browser import pdfcal
+        >>> from schooltool.app.main import StandaloneServer
+
+        >>> server = StandaloneServer()
+
+        >>> def setupStub(fontdir):
+        ...     print 'reportlab set up: %s' % fontdir
+        >>> realSetup = pdfcal.setUpMSTTCoreFonts
+        >>> pdfcal.setUpMSTTCoreFonts = setupStub
+
+    First, if a null path is given, nothing happens (PDF support is
+    left disabled):
+
+        >>> server.configureReportlab(None)
+
+    Now, let's imitate a situation where a font path is given, but reportlab
+    can not be imported.
+
+        >>> old_stderr = sys.stderr
+        >>> sys.stderr = sys.stdout
+
+        >>> try:
+        ...     import reportlab
+        ... except ImportError:
+        ...     pass
+
+        >>> real_reportlab = sys.modules.get('reportlab')
+        >>> sys.modules['reportlab'] = None
+
+    reportlab can not be imported, see?
+
+        >>> import reportlab
+        Traceback (most recent call last):
+          ...
+        ImportError: No module named reportlab
+
+    Good.  Now configureReportLab should print a warning.
+
+        >>> server.configureReportlab('.')
+        Warning: could not find the reportlab library.
+        PDF support disabled.
+
+        >>> sys.modules['reportlab'] = object()
+
+    Now test the check that the font path is a directory:
+
+        >>> server.configureReportlab(__file__)
+        Warning: font directory '...test_main...' does not exist.
+        PDF support disabled.
+
+    We will cheat and temporarily override pdfcal.font_map:
+
+        >>> pseudo_fontdir = os.path.dirname(__file__)
+        >>> real_font_map = pdfcal.font_map
+        >>> pdfcal.font_map = {'1': 'test_main.py', '2': 'nonexistent_file'}
+
+        >>> server.configureReportlab(pseudo_fontdir)
+        Warning: font '...nonexistent_file' does not exist.
+        PDF support disabled.
+
+    Now let's simulate a successful scenario:
+
+        >>> del pdfcal.font_map['2']
+        >>> server.configureReportlab(pseudo_fontdir)
+        reportlab set up: ...tests
+
+    Cleaning up.
+
+        >>> pdfcal.font_map = real_font_map
+        >>> sys.stderr = old_stderr
+        >>> if real_reportlab:
+        ...     sys.modules['reportlab'] = real_reportlab
+        >>> pdfcal.setUpMSTTCoreFonts = realSetup
+
+    """
+
+
+def doctest_setLanguage():
+    """Tests for setLanguage.
+
+        >>> from zope.app.testing import setup
+        >>> setup.placelessSetUp()
+
+    First, the 'automatic mode':
+
+        >>> from schooltool.app.main import setLanguage
+        >>> setLanguage('auto')
+
+    The language adapter shouldn't have been installed:
+
+        >>> from zope.i18n.interfaces import IUserPreferredLanguages
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> IUserPreferredLanguages(request).getPreferredLanguages()
+        []
+
+    Now, if we specify a language, a language adapter should be set up:
+
+        >>> setLanguage('lt')
+        >>> IUserPreferredLanguages(request).getPreferredLanguages()
+        ('lt',)
+
+    If the language list contains more than one language, you get a
+    cookie language selector:
+
+        >>> from schooltool.app.interfaces import ICookieLanguageSelector
+        >>> setLanguage('en, lt')
+        >>> upl = IUserPreferredLanguages(request)
+        >>> ICookieLanguageSelector.providedBy(upl)
+        True
+
+        >>> upl.getLanguageList()
+        ['en', 'lt']
+
+        >>> upl.getPreferredLanguages()
+        ('en',)
+
+    We're done.
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_setup():
+    """Tests for setup()
+
+        >>> from zope.testing import cleanup
+        >>> cleanup.setUp()
+
+    setup() does everything except enter the main application loop:
+
+    - sets up loggers
+    - configures Zope 3 components
+    - opens the database (optionally packs it)
+
+    It is difficult to unit test, but we'll try.
+
+        >>> from schooltool.app.main import Options, StandaloneServer
+        >>> from ZODB.MappingStorage import MappingStorage
+        >>> from ZODB.DB import DB
+        >>> options = Options()
+        >>> class DatabaseConfigStub:
+        ...     def open(self):
+        ...         return DB(MappingStorage())
+        >>> class ConfigStub:
+        ...     web = []
+        ...     rest = []
+        ...     listen = []
+        ...     thread_pool_size = 1
+        ...     database = DatabaseConfigStub()
+        ...     pid_file = ''
+        ...     path = []
+        ...     error_log_file = ['STDERR']
+        ...     web_access_log_file = ['STDOUT']
+        ...     attendance_log_file = ['STDOUT']
+        ...     lang = 'lt'
+        ...     reportlab_fontdir = ''
+        ...     devmode = False
+        ...     site_definition = findSiteZCML()
+        >>> options.config = ConfigStub()
+
+    Workaround to fix a Windows failure:
+
+        >>> import logging
+        >>> del logging.getLogger(None).handlers[:]
+
+    And go!
+
+        >>> server = StandaloneServer()
+        >>> db = server.setup(options)
+        >>> print db
+        <ZODB.DB.DB object at ...>
+
+    The root object is SchoolToolApplication:
+
+        >>> connection = db.open()
+        >>> root = connection.root()
+        >>> from zope.app.publication.zopepublication import ZopePublication
+        >>> app = root.get(ZopePublication.root_name)
+        >>> app
+        <schooltool.app.app.SchoolToolApplication object at ...>
+
+    The manager is a SchoolTool person:
+
+        >>> from schooltool.person.interfaces import IPerson
+        >>> IPerson.providedBy(app['persons']['manager'])
+        True
+
+    A web access logger has been set up:
+
+        >>> logger1 = logging.getLogger('accesslog')
+        >>> logger1.propagate
+        False
+        >>> logger1.handlers
+        [<logging.StreamHandler instance at 0x...>]
+
+    A generic access logger has been set up too:
+
+        >>> logger2 = logging.getLogger(None)
+        >>> logger2.handlers
+        [<logging.StreamHandler instance at 0x...>]
+
+    As well as an attendance logger:
+
+        >>> logger3 = logging.getLogger('attendance')
+        >>> logger3.handlers
+        [<logging.StreamHandler instance at 0x...>]
+
+    The language adapter shouldn't have been installed:
+
+        >>> from zope.i18n.interfaces import IUserPreferredLanguages
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> IUserPreferredLanguages(request).getPreferredLanguages()
+        ('lt',)
+
+    ZODB.lock_file has been shut up:
+
+        >>> logging.getLogger('ZODB.lock_file').disabled
+        True
+
+    We better clean up logging before we leave:
+
+        >>> logging.getLogger('ZODB.lock_file').disabled = False
+        >>> for logger in [logger1, logger2, logger3]:
+        ...     del logger.handlers[:]
+        ...     logger.propagate = True
+        ...     logger.disabled = False
+
+        >>> for logger in [logger1, logger3]:
+        ...     logger.setLevel(0)
+
+        >>> cleanup.tearDown()
+
+    """
+
+
+def doctest_before_afterRun():
+    """Tests for beforeRun(options, db) and afterRun(options)
+
+        >>> from zope.app.testing import setup
+        >>> setup.placelessSetUp()
+
+    beforeRun(options, db) starts tcp server
+
+        >>> from schooltool.app.main import Options, StandaloneServer
+        >>> from ZODB.MappingStorage import MappingStorage
+        >>> from ZODB.DB import DB
+        >>> options = Options()
+        >>> class DatabaseConfigStub:
+        ...     def open(self):
+        ...         return DB(MappingStorage())
+        >>> class ConfigStub:
+        ...     web = []
+        ...     rest = []
+        ...     listen = []
+        ...     thread_pool_size = 1
+        ...     database = DatabaseConfigStub()
+        ...     pid_file = ''
+        ...     path = []
+        ...     error_log_file = ['STDERR']
+        ...     web_access_log_file = ['STDOUT']
+        ...     attendance_log_file = ['STDOUT']
+        ...     lang = 'lt'
+        ...     reportlab_fontdir = ''
+        ...     devmode = False
+        ...     site_definition = findSiteZCML()
+        >>> options.config = ConfigStub()
+        >>> db = object()
+
+    And go!
+
+        >>> server = StandaloneServer()
+        >>> server.beforeRun(options, db)
+        >>> server.afterRun(options)
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_bootstrapSchoolTool():
+    r"""Tests for bootstrapSchoolTool()
+
+        >>> cleanup.setUp()
+
+    Normally, bootstrapSchoolTool is called when Zope 3 is fully configured
+
+        >>> from schooltool.app.main import StandaloneServer
+        >>> server = StandaloneServer()
+        >>> server.siteConfigFile = findSiteZCML()
+        >>> server.configure()
+
+    When we start with an empty database, bootstrapSchoolTool creates a
+    SchoolTool application in it.
+
+        >>> import transaction
+        >>> from ZODB.DB import DB
+        >>> from ZODB.MappingStorage import MappingStorage
+        >>> db = DB(MappingStorage())
+
+        >>> server.bootstrapSchoolTool(db)
+
+    Let's take a look...
+
+        >>> connection = db.open()
+        >>> root = connection.root()
+        >>> from zope.app.publication.zopepublication import ZopePublication
+        >>> app = root.get(ZopePublication.root_name)
+        >>> app
+        <schooltool.app.app.SchoolToolApplication object at ...>
+
+    This new application object is the containment root
+
+        >>> IContainmentRoot.providedBy(app)
+        True
+
+    It is also a site
+
+        >>> from zope.app.component.interfaces import ISite
+        >>> ISite.providedBy(app)
+        True
+
+    It has a local authentication utility
+
+        >>> from zope.app.security.interfaces import IAuthentication
+        >>> zapi.getUtility(IAuthentication, context=app)
+        <schooltool.app.security.SchoolToolAuthenticationUtility object at ...>
+
+    It has an initial user (username 'manager', password 'schooltool')
+
+        >>> manager = app['persons']['manager']
+        >>> manager.checkPassword('schooltool')
+        True
+
+    bootstrapSchoolTool doesn't do anything if it finds the root object already
+    present in the database.
+
+        >>> from schooltool.person.person import Person
+        >>> manager = app['persons']['user1'] = Person('user1')
+        >>> transaction.commit()
+        >>> connection.close()
+
+        >>> server.bootstrapSchoolTool(db)
+
+        >>> connection = db.open()
+        >>> root = connection.root()
+        >>> 'user1' in root[ZopePublication.root_name]['persons']
+        True
+
+    However it fails if the application root is not a SchoolTool application
+
+        >>> root[ZopePublication.root_name] = 'the object is strange'
+        >>> transaction.commit()
+        >>> connection.close()
+
+        >>> server.bootstrapSchoolTool(db)
+        Traceback (most recent call last):
+          ...
+        IncompatibleDatabase: incompatible database
+
+    It also checks for the presence of an old data.
+
+        >>> connection = db.open()
+        >>> root = connection.root()
+        >>> del root[ZopePublication.root_name]
+        >>> root['schooltool'] = object()
+        >>> transaction.commit()
+        >>> connection.close()
+
+        >>> server.bootstrapSchoolTool(db)
+        Traceback (most recent call last):
+          ...
+        OldDatabase: old database
+
+    Clean up
+
+        >>> transaction.abort()
+        >>> connection.close()
+        >>> cleanup.tearDown()
+    """
+
+
+def doctest_restoreManagerUser():
+    r"""Unit test for StandaloneServer.restoreManagerUser
+
+        >>> cleanup.setUp()
+
+    We need a configured server:
+
+        >>> from schooltool.app.main import StandaloneServer
+        >>> server = StandaloneServer()
+        >>> server.siteConfigFile = findSiteZCML()
+        >>> server.configure()
+
+    We also need an application (we are doing the full set up in here
+    because else person factory local utility is not being
+    registered):
+
+        >>> import transaction
+        >>> from zope.app.container.contained import ObjectAddedEvent
+        >>> from schooltool.app.interfaces import ApplicationInitializationEvent
+        >>> from zope.event import notify
+        >>> from zope.app.publication.zopepublication import ZopePublication
+        >>> from ZODB.DB import DB
+        >>> from ZODB.MappingStorage import MappingStorage
+
+        >>> db = DB(MappingStorage())
+        >>> connection = db.open()
+        >>> root = connection.root()
+
+        >>> from schooltool.app.app import SchoolToolApplication
+        >>> app = SchoolToolApplication()
+        >>> directlyProvides(app, IContainmentRoot)
+        >>> root[ZopePublication.root_name] = app
+
+        >>> save_point = transaction.savepoint(optimistic=True)
+        >>> notify(ApplicationInitializationEvent(app))
+        >>> notify(ObjectAddedEvent(app))
+
+    Initially, there's no manager user in the database:
+
+        >>> app['persons']['manager']
+        Traceback (most recent call last):
+          ...
+        KeyError: 'manager'
+
+    When we call restoreManagerUser, it gets created:
+
+        >>> server.restoreManagerUser(app, 'schooltool')
+
+        >>> manager = app['persons']['manager']
+        >>> manager.checkPassword('schooltool')
+        True
+
+    Manager is by default member of 'manager' group:
+
+        >>> manager in app['groups']['manager'].members
+        True
+
+    To prevent this user from being deleted we add a dependency
+
+        >>> from zope.app.dependable.interfaces import IDependable
+        >>> IDependable(manager).dependents()
+        (u'/persons/',)
+
+    Let's break the manager user by forgetting his password:
+
+        >>> marker = object()
+        >>> manager.calendar = marker
+        >>> manager.setPassword('randomrandom')
+
+        >>> manager.checkPassword('schooltool')
+        False
+
+    If we call restoreManagerUser again, the object remains the same,
+    but its password gets reset:
+
+        >>> server.restoreManagerUser(app, 'schooltool')
+
+        >>> manager = app['persons']['manager']
+        >>> manager.checkPassword('schooltool')
+        True
+
+    The manager is the same:
+
+        >>> manager.calendar is marker
+        True
+
+    Cleanup:
+
+        >>> transaction.abort()
+        >>> connection.close()
+        >>> cleanup.tearDown()
+    """
+
+
+def test_setUpLogger():
+    r"""Tests for setUpLogger.
+
+    setUpLogger sets up a logger:
+
+        >>> import logging
+        >>> from schooltool.app.main import setUpLogger
+        >>> setUpLogger('schooltool.just_testing',
+        ...             ['STDERR', '_just_testing.log'],
+        ...             '%(asctime)s %(message)s')
+
+        >>> logger = logging.getLogger('schooltool.just_testing')
+        >>> logger.propagate
+        False
+        >>> logger.handlers
+        [<logging.StreamHandler instance ...>, <...UnicodeFileHandler ...>]
+        >>> logger.handlers[0].stream is sys.stderr
+        True
+        >>> logger.handlers[0].formatter
+        <logging.Formatter instance at ...>
+        >>> logger.handlers[0].formatter._fmt
+        '%(asctime)s %(message)s'
+
+    Let's clean up after ourselves (logging is messy):
+
+        >>> del logger.handlers[:]
+        >>> logger.propagate = True
+        >>> logger.disabled = False
+        >>> logger.setLevel(0)
+
+        >>> import os
+        >>> os.unlink('_just_testing.log')
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+                doctest.DocTestSuite('schooltool.app.main',
+                                     optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/tests/test_main.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/test_overlay.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/test_overlay.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/test_overlay.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.overlay.
+
+$Id: test_overlay.py 5149 2005-10-03 17:07:23Z mg $
+"""
+
+import unittest
+from zope.testing import doctest
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite('schooltool.app.overlay',
+                                     optionflags=doctest.ELLIPSIS),
+           ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/tests/test_overlay.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/test_relationships.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/test_relationships.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/test_relationships.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,456 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.relationships
+
+$Id: test_relationships.py 6300 2006-06-18 22:18:12Z ignas $
+"""
+
+from pprint import pprint
+import unittest
+
+from zope.testing import doctest
+from zope.interface import implements
+from zope.app.testing import ztapi
+from zope.component import provideAdapter
+
+from schooltool.app.interfaces import IShowTimetables
+
+
+class ShowTimetablesStub(object):
+    implements(IShowTimetables)
+
+    def __init__(self, context):
+        self.context = context
+
+    def _getShowTimetables(self):
+        return getattr(self.context, '_show_timetables', True)
+
+    def _setShowTimetables(self, value):
+        self.context._show_timetables = value
+
+    showTimetables = property(_getShowTimetables, _setShowTimetables)
+
+
+def doctest_Instruction():
+    r"""Tests for Instruction URIs and methods
+
+        >>> from schooltool.app.relationships import *
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> zope.event.subscribers.append(enforceInstructionConstraints)
+
+    We will need some sample persons and sections for the demonstration
+
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.course.section import Section
+        >>> jonas = Person()
+        >>> petras = Person()
+        >>> developers = Section()
+        >>> admins = Section()
+
+    There are some constraints: Only objects providing ISection can be
+    Sections.
+
+        >>> Instruction(instructor=jonas, section=petras)
+        Traceback (most recent call last):
+        ...
+        InvalidRelationship: Sections must provide ISection.
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+
+    """
+
+
+def doctest_CourseSections():
+    r"""Tests for CourseSections relationship
+
+    Lets import the pieces of CourseSections
+
+        >>> from schooltool.app.relationships import URICourseSections, URICourse
+        >>> from schooltool.app.relationships import CourseSections
+        >>> from schooltool.app.relationships import URISectionOfCourse
+        >>> from schooltool.app.relationships import enforceCourseSectionConstraint
+
+    Relationship tests require some setup:
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> zope.event.subscribers.append(enforceCourseSectionConstraint)
+
+    We will need a course and several sections:
+
+        >>> from schooltool.course.course import Course
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.person.person import Person
+        >>> history = Course()
+        >>> section1 = Section(title = "section1")
+        >>> section2 = Section(title = "section2")
+        >>> section3 = Section(title = "section3")
+        >>> section4 = Section(title = "section4")
+        >>> person = Person()
+
+    Our course doesn't have any sections yet:
+
+        >>> for section in history.sections:
+        ...     print section
+
+    Lets add one:
+
+        >>> history.sections.add(section1)
+        >>> for section in history.sections:
+        ...     print section.title
+        section1
+
+    Lets try to add a person to the course:
+
+        >>> history.sections.add(person)
+        Traceback (most recent call last):
+        ...
+        InvalidRelationship: Sections must provide ISection.
+
+    Lets try to add a course to the course:
+
+        >>> algebra = Course()
+        >>> history.sections.add(algebra)
+        Traceback (most recent call last):
+        ...
+        InvalidRelationship: Sections must provide ISection.
+
+    No luck, you can only add sections:
+
+        >>> history.sections.add(section2)
+        >>> history.sections.add(section3)
+        >>> for section in history.sections:
+        ...     print section.title
+        section1
+        section2
+        section3
+
+    You can use the Relationship to relate sections and courses:
+
+        >>> CourseSections(course=history, section=section4)
+        >>> for section in history.sections:
+        ...     print section.title
+        section1
+        section2
+        section3
+        section4
+
+    That's it:
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+
+    """
+
+
+def getSectionCalendar(section):
+    return section.calendar
+
+
+from zope.annotation.interfaces import IAttributeAnnotatable
+class CalendarStub(object):
+    implements(IAttributeAnnotatable)
+    def __init__(self, section):
+        self.title = section.title
+
+
+def doctest_updateInstructorCalendars():
+    r"""
+        >>> from schooltool.app.relationships import updateInstructorCalendars
+        >>> from schooltool.app.relationships import URIInstruction
+        >>> from schooltool.app.relationships import URISection, URIInstructor
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> from schooltool.course.interfaces import ISection
+        >>> from schooltool.relationship.interfaces import \
+        ...                                         IRelationshipAddedEvent
+        >>> from schooltool.relationship.interfaces import \
+        ...                                         IRelationshipRemovedEvent
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+        >>> provideAdapter(getSectionCalendar,
+        ...                adapts=(ISection,),
+        ...                provides=ISchoolToolCalendar)
+
+        >>> from schooltool.app.overlay import CalendarOverlayInfo
+        >>> ztapi.provideAdapter(CalendarOverlayInfo, IShowTimetables,
+        ...                      ShowTimetablesStub)
+
+        >>> class AddEventStub(dict):
+        ...     rel_type = URIInstruction
+        ...     implements(IRelationshipAddedEvent)
+
+        >>> class RemoveEventStub(dict):
+        ...     rel_type = URIInstruction
+        ...     implements(IRelationshipRemovedEvent)
+
+        >>> class OtherEventStub(dict):
+        ...     rel_type = URIInstruction
+
+        >>> person = Person()
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+        >>> section = Section(title="SectionA")
+        >>> section.calendar = CalendarStub(section)
+
+    When the person is made the instructor of a section the sections calendar
+    is added to the overlaid calendars:
+
+        >>> add = AddEventStub()
+        >>> add[URIInstructor] = person
+        >>> add[URISection] = section
+        >>> updateInstructorCalendars(add)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        ['SectionA']
+
+    The calendar of the section is visible by default, but the timetable is
+    hidden.
+
+        >>> [(cal.show, IShowTimetables(cal).showTimetables) for cal in
+        ...  person.overlaid_calendars]
+        [(True, False)]
+
+    The calendar is removed when the instructor is no longer in the section:
+
+        >>> remove = RemoveEventStub()
+        >>> remove[URIInstructor] = person
+        >>> remove[URISection] = section
+        >>> updateInstructorCalendars(remove)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+    If a person allready has that calendar nothing changes:
+
+        >>> sectionb = Section(title="SectionB")
+        >>> sectionb.calendar = CalendarStub(sectionb)
+        >>> person.overlaid_calendars.add(sectionb.calendar)
+        <...CalendarOverlayInfo object at ...>
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        ['SectionB']
+
+        >>> add = AddEventStub()
+        >>> add[URIInstructor] = person
+        >>> add[URISection] = sectionb
+        >>> updateInstructorCalendars(add)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        ['SectionB']
+
+    If the person removes the calendar manually, that's ok:
+
+        >>> person.overlaid_calendars.remove(sectionb.calendar)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+
+        >>> remove = RemoveEventStub()
+        >>> remove[URIInstructor] = person
+        >>> remove[URISection] = sectionb
+        >>> updateInstructorCalendars(remove)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+    Events that aren't RelationshipAdded/Removed are ignored:
+
+        >>> other = OtherEventStub()
+        >>> other[URIInstructor] = person
+        >>> other[URISection] = sectionb
+        >>> updateInstructorCalendars(other)
+
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+
+        >>> tearDown()
+
+    """
+
+
+def doctest_updateStudentCalendars():
+    r"""
+        >>> from schooltool.app.relationships import updateStudentCalendars
+        >>> from schooltool.app.membership import URIMembership
+        >>> from schooltool.app.membership import URIGroup, URIMember
+        >>> from schooltool.relationship.interfaces import \
+        ...                                         IRelationshipAddedEvent
+        >>> from schooltool.relationship.interfaces import \
+        ...                                         IRelationshipRemovedEvent
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+        >>> from schooltool.course.interfaces import ISection
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> provideAdapter(getSectionCalendar,
+        ...                adapts=(ISection,),
+        ...                provides=ISchoolToolCalendar)
+
+        >>> from schooltool.app.overlay import CalendarOverlayInfo
+        >>> ztapi.provideAdapter(CalendarOverlayInfo, IShowTimetables,
+        ...                      ShowTimetablesStub)
+
+
+        >>> class AddEventStub(dict):
+        ...     rel_type = URIMembership
+        ...     implements(IRelationshipAddedEvent)
+
+        >>> class RemoveEventStub(dict):
+        ...     rel_type = URIMembership
+        ...     implements(IRelationshipRemovedEvent)
+
+        >>> class OtherEventStub(dict):
+        ...     rel_type = URIMembership
+
+        >>> person = Person('p')
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+        >>> section = Section(title="SectionA")
+        >>> section.calendar = CalendarStub(section)
+
+    When the person is made a member of a section the sections calendar
+    is added to the overlaid calendars:
+
+        >>> add = AddEventStub()
+        >>> add[URIMember] = person
+        >>> add[URIGroup] = section
+        >>> updateStudentCalendars(add)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        ['SectionA']
+
+    The calendar of the section is visible by default, but the timetable is
+    hidden.
+
+        >>> [(cal.show, IShowTimetables(cal).showTimetables) for cal in
+        ...  person.overlaid_calendars]
+        [(True, False)]
+
+    The calendar is removed when the person is no longer in the section:
+
+        >>> remove = RemoveEventStub()
+        >>> remove[URIMember] = person
+        >>> remove[URIGroup] = section
+        >>> updateStudentCalendars(remove)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+    If a person already has that calendar nothing changes:
+
+        >>> sectionb = Section(title="SectionB")
+        >>> sectionb.calendar = CalendarStub(sectionb)
+        >>> person.overlaid_calendars.add(sectionb.calendar)
+        <...CalendarOverlayInfo object at ...>
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        ['SectionB']
+
+        >>> add = AddEventStub()
+        >>> add[URIMember] = person
+        >>> add[URIGroup] = sectionb
+        >>> updateStudentCalendars(add)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        ['SectionB']
+
+    If the person removes the calendar manually, that's ok for now, we may
+    want to take away this ability later.
+
+        >>> person.overlaid_calendars.remove(sectionb.calendar)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+        >>> remove = RemoveEventStub()
+        >>> remove[URIMember] = person
+        >>> remove[URIGroup] = sectionb
+        >>> updateStudentCalendars(remove)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+    Events that aren't RelationshipAdded/Removed are ignored:
+
+        >>> other = OtherEventStub()
+        >>> other[URIMember] = person
+        >>> other[URIGroup] = sectionb
+        >>> updateStudentCalendars(other)
+
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+    If you add a person to a Group that isn't a section, nothing happens, the
+    user will have to overlay the calendar manually:
+
+        >>> from schooltool.group.group import Group
+        >>> person = Person('p2')
+        >>> group = Group()
+        >>> add = AddEventStub()
+        >>> add[URIMember] = person
+        >>> add[URIGroup] = group
+        >>> updateStudentCalendars(add)
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+
+    You can add a group to a section and it's members overlay list will be
+    updated:
+
+        >>> student = Person('p3')
+        >>> [cal.calendar.title for cal in person.overlaid_calendars]
+        []
+        >>> freshmen = Group()
+        >>> freshmen.members.add(student)
+        >>> section = Section("Freshmen Math")
+        >>> section.calendar = CalendarStub(section)
+        >>> add = AddEventStub()
+        >>> add[URIMember] = freshmen
+        >>> add[URIGroup] = section
+        >>> updateStudentCalendars(add)
+        >>> [cal.calendar.title for cal in student.overlaid_calendars]
+        ['Freshmen Math']
+
+        >>> [(cal.show, IShowTimetables(cal).showTimetables) for cal in
+        ...  student.overlaid_calendars]
+        [(True, False)]
+
+        >>> remove = RemoveEventStub()
+        >>> remove[URIMember] = freshmen
+        >>> remove[URIGroup] = section
+        >>> updateStudentCalendars(remove)
+        >>> [cal.calendar.title for cal in student.overlaid_calendars]
+        []
+
+        >>> tearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+                doctest.DocTestSuite('schooltool.app.relationships',
+                                     optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/tests/test_relationships.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/app/tests/test_security.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/app/tests/test_security.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/app/tests/test_security.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,83 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.security
+
+$Id: test_security.py 6300 2006-06-18 22:18:12Z ignas $
+"""
+
+import unittest
+
+from zope.interface import Interface, implements
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+from zope.app import zapi
+from zope.traversing.interfaces import TraversalError
+from zope.component.interfaces import ComponentLookupError
+from zope.app.security.interfaces import IAuthentication
+from zope.app.container.contained import ObjectAddedEvent
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+from schooltool.testing import setup as sbsetup
+
+
+class TestAuthSetUpSubscriber(unittest.TestCase):
+
+    def setUp(self):
+        from schooltool.app.app import SchoolToolApplication
+        self.root = setup.placefulSetUp(True)
+        self.app = SchoolToolApplication()
+        self.root['frogpond'] = self.app
+
+        # Authenticated group
+        from zope.app.security.interfaces import IAuthenticatedGroup
+        from zope.app.security.principalregistry import AuthenticatedGroup
+        ztapi.provideUtility(IAuthenticatedGroup,
+                             AuthenticatedGroup('zope.authenticated',
+                                                'Authenticated users',
+                                                ''))
+
+    def tearDown(self):
+        setup.placefulTearDown()
+
+    def test(self):
+        from schooltool.app.security import authSetUpSubscriber
+        self.assertRaises(ComponentLookupError, self.app.getSiteManager)
+        event = ObjectAddedEvent(self.app)
+        authSetUpSubscriber(self.app, event)
+        auth = zapi.traverse(self.app, '++etc++site/default/SchoolToolAuth')
+        auth1 = zapi.getUtility(IAuthentication, context=self.app)
+        self.assert_(auth is auth1)
+
+        # If we fire the event again, it does not fail.  Such events
+        # are fired when the object is copied and pasted.
+        authSetUpSubscriber(self.app, event)
+
+
+def test_suite():
+    return unittest.TestSuite([
+        unittest.makeSuite(TestAuthSetUpSubscriber),
+        doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+        doctest.DocFileSuite('../security.txt', optionflags=doctest.ELLIPSIS),
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/app/tests/test_security.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,495 @@
+===================
+Attendance Tracking
+===================
+
+
+Definitions
+-----------
+
+An "absence" is when a student fails to show up during a period.
+
+A "day absence" is when a student fails to show up during the homeroom period
+for a particular day.
+
+A "section absence" is when a student fails to show up for the scheduled
+meeting of a section.
+
+A "tardy" is when a student shows up late.
+
+A "presence" is when a student shows up on time.
+
+An "attendance incident" is either an absence or a tardy.
+
+Attendance incidents can be either "explained" or "unexplained".  We'll use the
+terms explained and unexplained instead of excused and unexcused, because the
+workflow may be resolved by an explanation that is not a valid excuse.
+
+
+Basic workflow
+--------------
+
+- If a student is not in attendance, create an "unexplained" absence at the
+  beginning of the section/day.
+
+- If the student arrives late, the absence becomes an unexplained tardy.
+
+- The absence or tardy can be advanced to "explained" by actions by clerks,
+  school administrators or (in some cases) teachers, thus ending the workflow.
+
+The workflow of attendance incidents (absences, tardies) will be modeled by
+WFMC workflows, so they will be clearly defined and (relatively) easy to modify
+to fit specific business processes.
+
+
+Use cases
+---------
+
+- Realtime class attendance: a web form to allow one to take attendance during
+  class.  This form lets teachers create section absences, and convert absences
+  to tardies.  Presences are also recorded.
+
+- Homeroom class attendance: a web form to allow one to take attendance during
+  the homeroom period.  This form lets teachers create day absences.  Presences
+  are also recorded.
+
+- Logging: attendance-related transaction must be logged to an 'attendance.log'
+  file in a simple text log format.
+
+- Student attendance in the calendar view: lets users see absences/tardies as
+  read-only events in a student's calendar.  Also indicated whether the
+  absences/tardies are explained or not.
+
+- Sparkline plot for day/section absence during the last 10 days.
+
+- List of unexplained attendance incidents for a student for both days and
+  periods.
+
+- List of all attendance incidents for a student for a single term (i.e. date
+  range).
+
+- Modification of attendance workflow status, whatever that means.
+
+
+API
+---
+
+The following code is *science-fiction*, that is, it doesn't work yet, but
+instead represents our thoughts about the API should look like
+
+
+Realtime class attendance
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The user can create section absences for each student in a section.  Presences
+are also recorded.
+
+    >>> from schooltool.attendance.interface import ISectionAttendance
+
+    >>> section = app['sections']['sec00213']
+    >>> for student in section.students:
+    ...     is_present = student.__name__ not in request['absent']
+    ...     ISectionAttendance(student).record(section, datetime, duration,
+    ...                                        period_id, is_present)
+
+The form lets teachers convert absences to tardies
+
+    >>> for student in section.students:
+    ...     is_present = student.__name__ not in request['absent']
+    ...     attendance_record = ISectionAttendance(student).get(section, datetime)
+    ...     if is_present and attendance_record.isAbsent():
+    ...         arrived = parse_time(request['arrived.%s' % student.__name__])
+    ...         attendance_record.makeTardy(arrived=arrived)
+
+The form displays the current attendance status as well.
+
+    >>> for student in section.students:
+    ...     attendance_record = ISectionAttendance(student).get(section, datetime)
+    ...     absent_checked[student.__name__] = attendance_record.isAbsent()
+
+The following API emerges::
+
+    class ISectionAttendance(Interface):
+        """A set of all student's section attendance records."""
+
+        def get(section, datetime):
+            """Return the attendance record for a specific section meeting.
+
+            Always succeeds, but the returned attendance record may be
+            "unknown".
+            """
+
+        def record(section, datetime, duration, period_id, present):
+            """Record the student's absence or presence.
+
+            You can record the absence or presence only once for a given
+            (section, datetime) pair.
+            """
+
+    class IAttendanceRecord(Interface):
+        """A single attendance record for a day/section."""
+
+        status = Attribute("""Attendance status (UNKNOWN, PRESENT, ABSENT, TARDY.""")
+
+        def isUnknown(): """True if status == UNKNOWN."""
+        def isPresent(): """True if status == PRESENT."""
+        def isAbsent():  """True if status == ABSENT."""
+        def isTardy():   """True if status == TARDY."""
+
+        late_arrival = Attribute("""Time of a late arrival.
+
+            None if status != TARDY.
+            """)
+
+        def isExplained():
+            """Is the absence/tardy explained?
+
+            Meaningless (i.e. raises some exception) when status ==
+            UNKNOWN or PRESENT.
+            """
+
+        def makeTardy(arrived):
+            """Convert an absence to a tardy.
+
+            `arrived` is a datetime.datetime.
+
+            Meaningless (i.e. raises some exception) when status != ABSENT.
+            """
+
+
+Colored backgrounds indicating attendance status
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The realtime attendance form has colored backgrounds that indicate the following:
+
+* student in school today (grey)
+* student absent today (yellow)
+* student absent with excuse (greenish)
+* student in school earlier but subsequently gone with no excuse (red)
+
+Let's specify this more precisely:
+
+* grey -- there are no recorded absences/tardies for today (neither day, nor
+  section absences)
+* yellow -- there is at least one unexcused absence/tardy for today, and
+  there are no recorded presences for today
+* greenish -- there is at least one excused absence/tardy for today, there are
+  no unexcused absences/tardies nor recorded presences for today
+* red -- there are both recorded presences and recorded unexcused absences for
+  today
+* There is no background if a student's attendance hasn't been recorded yet.
+
+Implementation:
+
+    >>> def getColorForStudent(student):
+    ...     records = [IDayAttendance(student).get(date)]
+    ...     records.extend(ISectionAttendance(student).getAllForDay(date))
+    ...     records = [ar for ar in records if not ar.isUnknown()]
+    ...     was_present = False
+    ...     was_absent = False
+    ...     was_absent_without_excuse = False
+    ...     for ar in records:
+    ...         if ar.isPresent():
+    ...             was_present = True
+    ...         else:
+    ...             was_absent = True
+    ...             if not ar.isExplained():
+    ...                 was_absent_without_excuse = True
+    ...     if was_present and was_absent_without_excuse:
+    ...         return 'red'
+    ...     elif was_absent_without_excuse:
+    ...         return 'yellow'
+    ...     elif was_absent:
+    ...         return 'greenish'
+    ...     elif was_present:
+    ...         return 'grey'
+    ...     else:
+    ...         return 'transparent'
+
+Thus our ISectionAttendance interface gains a new method::
+
+    class ISectionAttendance(Interface):
+        ...
+
+        def getAllForDay(date):
+            """Return all recorded attendance records for a specific day."""
+
+
+Sparkline attendance graph
+--------------------------
+
+The real-time attendance form will have whisker sparkline__ graphs showing
+attendance for the last 10 meetings of the section for each student.
+
+__ http://sparkline.org/
+
+- Successful attendance during days when the section has met are designated by
+  a full length positive black line.
+
+- Non-attendance on days when the section meets is indicated by a full length
+  black (excused) or yellow (unexcused) line.
+
+- Non-attendance in days when the section met and the student was in school are
+  designated by full length red whiskers, until they are excused (black).
+
+This is complicated.  Let's show a table:
+
+   +---------+------------------+--------------------+------+---------+-----+
+   | section |                  |                    |      |         |     |
+   | meets   | present during   | present during day | size | colour  | +/- |
+   | on this | section?         | (homeroom period)? |      |         |     |
+   | day?    |                  |                    |      |         |     |
+   +=========+==================+====================+======+=========+=====+
+   | yes     | unknown          | (does not matter)  | dot  | black   | n/a |
+   +---------+------------------+--------------------+------+---------+-----+
+   | yes     | yes              | (does not matter)  | full | black   | `+` |
+   +---------+------------------+--------------------+------+---------+-----+
+   | yes     | no (explained)   | (does not matter)  | full | black   | `-` |
+   +---------+------------------+--------------------+------+---------+-----+
+   | yes     | no (unexplained) | yes                | full | red     | `-` |
+   +---------+------------------+--------------------+------+---------+-----+
+   | yes     | no (unexplained) | no                 | full | yellow  | `-` |
+   +---------+------------------+--------------------+------+---------+-----+
+   | no      |                  |                    | dot  | black   | n/a |
+   +---------+------------------+--------------------+------+---------+-----+
+
+
+This only covers absences, not tardies.  Tardies are ignored.
+
+If the section meets more than once on a given day, take the "worst" of the
+outcomes.
+
+If this table does not match the list of rules above, consider the table
+to be authoritative.
+
+    >>> section_calendar = ITimetables(section).makeCalendar()
+    >>> def worst_section_presence(date):
+    ...     """Return the "worst" section presence on a given date."""
+    ...     records = [ar for ar in ISectionAttendance(student).getAllForDay(date)
+    ...                if ar.section == section]
+    ...     for ar in records:
+    ...         if (ar.isAbsent() or ar.isTardy()) and not ar.isExplained():
+    ...             return ar
+    ...     for ar in records:
+    ...         if ar.isAbsent() or ar.isTardy():
+    ...             return ar
+    ...     for ar in records:
+    ...         if ar.isPresent():
+    ...             return ar
+    ...     return UnknownAttendanceRecord()
+
+It appears that an attendance record needs to know about its section.
+
+    >>> def data_point(date):
+    ...     day_start = datetime.combine(date, time(0)) # XXX timezone
+    ...     day_end = day_start + datetime.timedelta(1)
+    ...     section_meets_on_this_day = bool(section_calendar.expand(day_start, day_end))
+    ...     section_presence = worst_section_presence(section, date)
+    ...     day_presence = IDayAttendance(student).get(date)
+    ...     if section_meets_on_this_day:
+    ...         if section_presence.isUnknown():
+    ...             return 'black dot'
+    ...         elif section_presence.isPresent():
+    ...             return 'black positive full line'
+    ...         elif section_presence.isExplained():
+    ...             return 'black negative full line'
+    ...         elif day_presence.isPresent():
+    ...             return 'red negative full line'
+    ...         else:
+    ...             return 'yellow negative full line'
+    ...     else:
+    ...         if day_presence.isUnknown():
+    ...             return 'black dot'
+    ...         elif day_presence.isPresent():
+    ...             return 'black positive half line'
+    ...         elif day_presence.isExplained():
+    ...             return 'black negative half line'
+    ...         else:
+    ...             return 'yellow negative half line'
+
+We also need some way to get the last 10 schooldays
+
+    >>> last_schooldays = []
+    >>> d = datetime.date.today()
+    >>> term = getTermForDate(d)
+    >>> while d >= term.first and len(last_schooldays) < 10:
+    ...     if term.isSchoolday(d):
+    ...         last_schooldays.append(d)
+    ...     d -= datetime.date.resolution
+
+| **XXX** We stumble on timezones once again -- at what time does a school day start?
+|         And by "at what time", I mean "at 00:00 in which timezone"?
+
+Homeroom class attendance
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Homeroom class attendance form deals with day absences.
+
+    >>> section = app['sections']['sec00213']
+    >>> for student in section.students:
+    ...     is_present = student.__name__ not in request['absent']
+    ...     IDayAttendance(student).record(date, is_present)
+
+API::
+
+    class IDayAttendance(Interface):
+        """A set of all student's day attendance records."""
+
+        def get(date):
+            """Return the attendance record for a specific day.
+
+            Always succeeds, but the returned attendance record may be
+            "unknown".
+            """
+
+        def record(date, present):
+            """Record the student's absence or presence.
+
+            You can only record the absence or presence once for a given date.
+            """
+
+Logging
+~~~~~~~
+
+All attendance related events appear in a log file
+
+    >>> logging.getLogger('schooltool.attendance').addHandler(...)
+    >>> IDayAttendance(student).record(date, False)
+    YYYY-MM-DD HH:MM:SS +ZZZZ: student Foo was absent from homeroom
+    >>> IDayAttendance(student).get(date).makeTardy(datetime)
+    YYYY-MM-DD HH:MM:SS +ZZZZ: student Foo was late for homeroom
+
+    >>> del logging.getLogger('schooltool.attendance').handlers[:]
+
+
+Attendance events in a student's calendar
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The calendar view will have to include two more calendars in its getCalendars() method:
+
+    >>> daily_absences = IDayAttendance(student).makeCalendar(start, end)
+    >>> section_absences = ISectionAttendance(student).makeCalendar(start, end)
+
+Daily absences will contain all-day events for all absences and tardies.
+Section absences will contain regular events for all absences and tardies.
+
+New API, for both IDayAttendance and ISectionAttendance::
+
+        def makeCalendar(start, end):
+            """Return attendance incidents as calendar events."""
+
+
+List of pending attendance incidents
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+"Attendance" should appear as a action while viewing a student.  The
+attendance view should show a list of pending unexcused attendance
+incidents, for both days and periods.
+
+    >>> for ar in IDayAttendance(student):
+    ...     if not ar.isPresent() and not ar.isExplained():
+    ...         print "Explain why you weren't present on %s" % ar.date
+    >>> for ar in ISectionAttendance(student):
+    ...     if not ar.isPresent() and not ar.isExplained():
+    ...         print "Explain why you missed %s on %s" % (ar.section.title, ar.date)
+
+New API, for both IDayAttendance and ISectionAttendance::
+
+        def __iter__():
+            """Return all recorded attendance records.
+
+            (This means that none of the returned records will be in
+            the UNKNOWN state.)
+            """
+
+We also need two new interfaces::
+
+    class IDayAttendanceRecord(IAttendanceRecord):
+        """A single attendance record for a day."""
+
+        date = Attribute("""The date of this record.""")
+
+
+    class ISectionAttendanceRecord(IAttendanceRecord):
+        """A single attendance record for a section."""
+
+        section = Attribute("""The section object.""")
+
+        datetime = Attribute("""The date and time of the section meeting.""")
+
+        duration = Attribute("""The duration of the section meeting."""
+
+        period_id = Attribute("""The name of the period.""")
+
+Actually, ``date`` is a useful attribute for IAttendanceRecord::
+
+    class IAttendanceRecord(Interface):
+        ...
+        date = Attribute("""The date of this record.""")
+
+For ISectionAttendanceRecord ``date`` may be a property that returns
+``self.datetime.date()``.  But be careful with timezones -- if you're in Tokyo,
+and a lesson starts at 8 AM on a Monday, that exact datetime corresponds to
+23 PM on Sunday UTC.  The date of that record should be Monday, not Sunday.
+
+
+Summary of attendance per term
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The attendance view should show [...] a summary of absences and
+tardies by term.  The user can click on a term for a list of all
+absences and tardies per term.
+
+The summary is just the number of absences and tardies.  The list shows the
+time, date and class for each attendance incident.
+
+We need to count the number of absences/tardies in a given time period
+
+    >>> day_attendances = IDayAttendance(student).filter(term.first, term.last)
+    >>> section_attendances = ISectionAttendance(student).filter(term.first, term.last)
+    >>> attendances = day_attendances + section_attendances
+    >>> n_absences = len(ar for ar in attendances if ar.isAbsent())
+    >>> n_tardies = len(ar for ar in attendances if ar.isTardy())
+
+We also need to know for each attendance incident the date/time and section.
+
+New API, for both IDayAttendance and ISectionAttendance::
+
+        def filter(start, end):
+            """Return all recorded attendance records within a given date range.
+
+            (This means that none of the returned records will be in
+            the UNKNOWN state.)
+            """
+
+Workflow status modification
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This is the haziest part of the whole spec.  All we know is "If the
+user has the proper access, he or she can modify the workflow status
+of unresolved incidents from the attendance view."
+
+Stab in the dark:
+
+* we want to attach explainations to absence records
+
+    >>> ar.isExplained()
+    False
+    >>> ar.addExplanation("The dog ate my homework")
+    >>> ar.addExplanation("I vas very sick from drinking bloo^H^H^H^Hjuice")
+    >>> print ar.explanations
+    ["The dog ...", "I vas very sick..."]
+    >>> ar.isExplained()
+    True
+
+* we want to resolve pending absences as excused
+
+    >>> ar.excuse()
+    >>> ar.isExcused()
+    True
+
+* we want to reject an explanation
+
+    >>> ar.reject()
+    >>> ar.isExcused()
+    False
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/attendance-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/attendance-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/attendance-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.attendance" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/attendance-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/attendance.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/attendance.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/attendance.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,725 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Storage of attendance records.
+
+$Id: attendance.py 6566 2007-01-11 18:22:39Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+
+import datetime
+import logging
+
+import pytz
+from BTrees.OOBTree import OOBTree
+from persistent import Persistent
+from persistent.list import PersistentList
+from zope.interface import implements
+from zope.annotation.interfaces import IAnnotations
+from zope.i18n import translate
+from zope.location.location import Location
+from zope.wfmc.interfaces import IWorkItem
+from zope.wfmc.interfaces import IParticipant
+from zope.wfmc.interfaces import IActivity
+from zope.wfmc.interfaces import IProcessDefinition
+from zope.interface import implements
+from zope.component import adapts
+from zope.app import zapi
+from zope.security.proxy import removeSecurityProxy
+from zope.publisher.interfaces import IApplicationRequest
+from zope.security.management import queryInteraction
+
+from schooltool import SchoolToolMessage as _
+from schooltool.person.interfaces import IPerson
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.calendar.simple import ImmutableCalendar
+from schooltool.calendar.simple import SimpleCalendarEvent
+from schooltool.attendance.interfaces import IAttendanceRecord
+from schooltool.attendance.interfaces import IHomeroomAttendance
+from schooltool.attendance.interfaces import IHomeroomAttendanceRecord
+from schooltool.attendance.interfaces import ISectionAttendance
+from schooltool.attendance.interfaces import ISectionAttendanceRecord
+from schooltool.attendance.interfaces import IUnresolvedAbsenceCache
+from schooltool.attendance.interfaces import IAbsenceExplanation
+from schooltool.attendance.interfaces import UNKNOWN, PRESENT, ABSENT, TARDY
+from schooltool.attendance.interfaces import NEW, ACCEPTED, REJECTED
+from schooltool.attendance.interfaces import AttendanceError
+from schooltool.course.section import PersonInstructorsCrowd
+from schooltool.securitypolicy.crowds import ConfigurableCrowd
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.person.interfaces import IPerson
+
+
+class AttendancePreferences(Persistent):
+
+    defaultAttendanceStatusCodes = {'P': 'Parent Excused',
+                                    'S': 'School Excused',
+                                    'I': 'In School Suspension',
+                                    'O': 'Out of School Suspension',
+                                    'X': 'Truant',
+                                    'V': 'Vacation',
+                                    'F': 'Field Trip',
+                                    'B': 'Late Bus'}
+
+    attendanceRetroactiveTimeout = 60
+
+    homeroomTardyGracePeriod = 5
+
+    def __init__(self):
+        self.attendanceStatusCodes = self.defaultAttendanceStatusCodes
+
+
+def getAttendancePreferences(app):
+    """Adapt a SchoolToolApplication to IAttendancePreferences."""
+
+    annotations = IAnnotations(app)
+    key = 'schooltool.app.AttendancesPreferences'
+    try:
+        return annotations[key]
+    except KeyError:
+        annotations[key] = AttendancePreferences()
+        annotations[key].__parent__ = app
+        return annotations[key]
+
+
+def date_to_schoolday_start(date):
+    """Given a date, return the datetime of the beginning of the day.
+
+    Takes the school's timezone into account.
+    """
+    app = ISchoolToolApplication(None)
+    tzinfo = pytz.timezone(IApplicationPreferences(app).timezone)
+    return tzinfo.localize(datetime.datetime.combine(date, datetime.time(0)))
+
+
+def date_to_schoolday_end(date):
+    """Given a date, return the datetime of the end of the day.
+
+    Takes the school's timezone into account.
+    """
+    return date_to_schoolday_start(date) + datetime.timedelta(days=1)
+
+
+# XXX move it to some utils or common file
+def getRequestFromInteraction(request_type=IApplicationRequest):
+    """Extract the browser request from the current interaction.
+
+    Returns None when there is no interaction, or when the interaction has no
+    participations that provide request_type.
+    """
+    interaction = queryInteraction()
+    if interaction is not None:
+        for participation in interaction.participations:
+            if request_type.providedBy(participation):
+                return participation
+    return None
+
+
+class AttendanceLoggingProxy(object):
+    """Logging proxy for attendance records.
+
+    Logs information about operations performed on attendance recrod
+    into an attendance log file.
+    """
+
+    def __init__(self, attendance_record, person):
+        self.__dict__["attendance_record"] = attendance_record
+        self.__dict__["person"] = person
+
+    def _getLoggedInPerson(self):
+        """Get the name of the principal.
+
+        Returns None when there is no interaction or request.
+        """
+        request = getRequestFromInteraction()
+        if request:
+            person = IPerson(request.principal, None)
+            if person:
+                return person.__name__
+        return None
+
+    def _getLogger(self):
+        return logging.getLogger("attendance")
+
+    def log(self, action):
+        logger = self._getLogger()
+        logger.info("%s, %s, %s of %s: %s" % (datetime.datetime.utcnow(),
+                                              self._getLoggedInPerson(),
+                                              self.attendance_record,
+                                              self.person.__name__,
+                                              action))
+
+    def addExplanation(self, explanation):
+        self.attendance_record.addExplanation(explanation)
+        self.log("added an explanation")
+
+    def acceptExplanation(self, code):
+        self.attendance_record.acceptExplanation(code)
+        self.log("accepted explanation")
+
+    def rejectExplanation(self):
+        self.attendance_record.rejectExplanation()
+        self.log("rejected explanation")
+
+    def makeTardy(self, arrival_time):
+        self.attendance_record.makeTardy(arrival_time)
+        self.log("made attendance record a tardy, arrival time (%s)" % arrival_time)
+
+    def __repr__(self):
+        return repr(self.attendance_record)
+
+    def __getattr__(self, name):
+        return getattr(self.attendance_record, name)
+
+    def __setattr__(self, name, value):
+        setattr(self.attendance_record, name, value)
+
+    def __cmp__(self, other):
+        return cmp(self.attendance_record,
+                   other.attendance_record)
+
+
+class SectionAttendanceLoggingProxy(AttendanceLoggingProxy):
+    implements(ISectionAttendanceRecord)
+
+
+class HomeroomAttendanceLoggingProxy(AttendanceLoggingProxy):
+    implements(IHomeroomAttendanceRecord)
+
+
+#
+# Attendance record classes
+#
+
+class AbsenceExplanation(Persistent):
+    """An explanation of an absence/tardy."""
+
+    implements(IAbsenceExplanation)
+
+    def __init__(self, text):
+        self.text = text
+        self.status = NEW
+        self.code = ''
+
+    def isProcessed(self):
+        return self.status != NEW
+
+    def isAccepted(self):
+        return self.status == ACCEPTED
+
+
+class AttendanceRecord(Persistent):
+    """Base class for attendance records."""
+
+    implements(IAttendanceRecord)
+
+    # These are class attributes to conserve ZODB space
+    late_arrival = None
+    explanations = ()
+
+    def __init__(self, section, datetime, status, person,
+                 duration=datetime.timedelta(0), period_id=None):
+        assert datetime.tzinfo is not None, 'need datetime with timezone'
+        assert status in (UNKNOWN, PRESENT, ABSENT)
+        self.status = status
+        self.section = section
+        self.datetime = datetime
+        self.duration = duration
+        self.period_id = period_id
+        if status == ABSENT:
+            self._createWorkflow(person)
+
+    def __cmp__(self, other):
+        def reprtuple(absence):
+            return (absence.__class__.__name__,
+                    absence.section.__name__,
+                    absence.datetime,
+                    absence.status,
+                    absence.duration,
+                    absence.period_id)
+        return cmp(reprtuple(self), reprtuple(other))
+
+    def _createWorkflow(self, person):
+        pd = zapi.getUtility(IProcessDefinition,
+                             name='schooltool.attendance.explanation')
+        pd().start(self, person)
+
+    def isUnknown(self):
+        return self.status == UNKNOWN
+    def isPresent(self):
+        return self.status == PRESENT
+    def isAbsent(self):
+        return self.status == ABSENT
+    def isTardy(self):
+        return self.status == TARDY
+
+    def isExplained(self):
+        if self.status not in (ABSENT, TARDY):
+            raise AttendanceError(
+                "only absences and tardies can be explained.")
+        for e in self.explanations:
+            if e.isAccepted():
+                return True
+        return False
+
+    def acceptExplanation(self, code):
+        if not self.explanations or self.explanations[-1].isProcessed():
+            raise AttendanceError("there are no outstanding explanations.")
+        self._work_item.acceptExplanation(code)
+
+    def rejectExplanation(self):
+        if not self.explanations or self.explanations[-1].isProcessed():
+            raise AttendanceError("there are no outstanding explanations.")
+        self._work_item.rejectExplanation()
+
+    def addExplanation(self, text):
+        if self.status not in (ABSENT, TARDY):
+            raise AttendanceError(
+                "only absences and tardies can be explained.")
+        if (self.explanations and
+            not self.explanations[-1].isProcessed()):
+            raise AttendanceError(
+                "you have unprocessed explanations.")
+        if (self.explanations and
+            self.explanations[-1].isAccepted()):
+            raise AttendanceError(
+                "can't add an explanation to an explained absence.")
+        explanation = AbsenceExplanation(text)
+        if not self.explanations: # convert the tuple to a persistent list
+            self.explanations = PersistentList()
+        self.explanations.append(explanation)
+
+    def makeTardy(self, arrival_time):
+        assert type(arrival_time) == datetime.datetime or arrival_time is None
+        if not self.isAbsent():
+            raise AttendanceError("makeTardy when status is %s, not ABSENT"
+                                  % self.status)
+        self._work_item.makeTardy(arrival_time)
+
+    @property
+    def date(self):
+        app = ISchoolToolApplication(None)
+        tzinfo = pytz.timezone(IApplicationPreferences(app).timezone)
+        return self.datetime.astimezone(tzinfo).date()
+
+
+class SectionAttendanceRecord(AttendanceRecord):
+    """Record of a student's presence or absence at a given section meeting."""
+
+    implements(ISectionAttendanceRecord)
+
+    def __repr__(self):
+        return 'SectionAttendanceRecord(%r, %r, %s)' % (self.section,
+                                                        self.datetime,
+                                                        self.status)
+
+    def __str__(self):
+        return 'SectionAttendanceRecord(%s, %s, section=%s)' % (
+            self.datetime,
+            self.status,
+            self.section.__name__)
+
+
+class HomeroomAttendanceRecord(AttendanceRecord):
+    """Record of a student's presence or absence at a given homeroom period."""
+
+    implements(IHomeroomAttendanceRecord)
+
+    def __repr__(self):
+        return 'HomeroomAttendanceRecord(%r, %r, %s)' % (self.section,
+                                                         self.datetime,
+                                                         self.status)
+
+    def __str__(self):
+        return 'HomeroomAttendanceRecord(%s, %s, section=%s)' % (
+            self.datetime,
+            self.status,
+            self.section.__name__)
+
+
+#
+# Attendance storage classes
+#
+
+
+class AttendanceFilteringMixin(object):
+    """Mixin that implements IAttendance.filter on top of __iter__."""
+
+    def filter(self, first, last):
+        assert type(first) == datetime.date
+        assert type(last) == datetime.date
+        for ar in self:
+            if first <= ar.date <= last:
+                yield ar
+
+
+class AttendanceCalendarMixin(object):
+    """Mixin that implements IAttendance.makeCalendar on top of filter.
+
+    Classes that mix this in need to provide the following methods:
+
+        tardyEventTitle(record)
+        absenceEventTitled(record)
+        makeCalendarEvent(record, title)
+
+    """
+
+    def incidentDescription(self, record):
+        """The description of the event for the attendance record."""
+        # The mapping argument is here to suppress a spurious deprecation
+        # warning.  See Zope 3 bug http://www.zope.org/Collectors/Zope3-dev/531
+        workaround = {'': ''}
+        if record.isExplained():
+            return translate(_("Explanation was accepted.", mapping=workaround))
+        else:
+            return translate(_("Is not explanained yet.", mapping=workaround))
+
+    def makeCalendar(self):
+        events = []
+        for record in self:
+            title = None
+            if record.isTardy():
+                title = self.tardyEventTitle(record)
+            elif record.isAbsent():
+                title = self.absenceEventTitle(record)
+            if title:
+                description = self.incidentDescription(record)
+                event = self.makeCalendarEvent(record, title, description)
+                event.__parent__ = None
+                events.append(event)
+        return ImmutableCalendar(events)
+
+
+class AttendanceBase(Persistent, AttendanceFilteringMixin):
+
+    def __init__(self, person):
+        self.person = person
+        self._records = OOBTree() # datetime -> list of AttendanceRecords
+
+    def __iter__(self):
+        for group in self._records.values():
+            for record in group:
+                yield self._wrapRecordForLogging(record)
+
+    def filter(self, first, last):
+        assert type(first) == datetime.date
+        assert type(last) == datetime.date
+        dt_min = date_to_schoolday_start(first)
+        dt_max = date_to_schoolday_end(last)
+        for group in self._records.values(min=dt_min, max=dt_max,
+                                          excludemax=True):
+            for record in group:
+                yield self._wrapRecordForLogging(record)
+
+    def getAllForDay(self, date):
+        return self.filter(date, date)
+
+    def get(self, section, datetime):
+        for ar in self._records.get(datetime, ()):
+            if ar.section == section:
+                return self._wrapRecordForLogging(ar)
+        ar = self.factory(section, datetime, status=UNKNOWN, person=self.person)
+        return self._wrapRecordForLogging(ar)
+
+    def createAttendanceRecord(self, section, datetime, duration, period_id, status):
+        # Optimization: attendance records with status PRESENT are never
+        # changed, and look the same for all students.  If we reuse the
+        # same persistent object for all section members, we conserve
+        # a huge amount of memory and disk space.
+        # XXX mg: go read http://www.zope.org/Wikis/ZODB/VolatileAttributes
+        #     I am not sure it is safe to store a Persistent object in a
+        #     _v_attr, as it might survive transaction boundaries.  If you
+        #     happen to use it from a different transaction, will it work?
+        cached = getattr(section, self.cache_attribute, (None, ))
+        if (status == PRESENT and cached[0] == datetime):
+            ar = cached[1]
+        else:
+            ar = self.factory(section, datetime, status=status,
+                              person=self.person, duration=duration,
+                              period_id=period_id)
+            if status == PRESENT:
+                setattr(section, self.cache_attribute, (datetime, ar))
+        return ar
+
+    def record(self, section, datetime, duration, period_id, present):
+        if self.get(section, datetime).status != UNKNOWN:
+            raise AttendanceError('record for %s at %s already exists'
+                                  % (section, datetime))
+        if present:
+            status = PRESENT
+        else:
+            status = ABSENT
+
+        ar = self.createAttendanceRecord(section, datetime, duration,
+                                         period_id, status)
+
+        self._records.setdefault(datetime, ())
+        self._records[datetime] += (ar, )
+        self._wrapRecordForLogging(ar).log("created")
+
+
+class HomeroomAttendance(AttendanceBase):
+
+    implements(IHomeroomAttendance)
+
+    cache_attribute = "_v_HomeroomAttendance_cache"
+    factory = HomeroomAttendanceRecord
+
+    def _wrapRecordForLogging(self, ar):
+        return HomeroomAttendanceLoggingProxy(ar, self.person)
+
+    def getHomeroomPeriodForRecord(self, section_ar):
+        hr_periods = self.getAllForDay(section_ar.date)
+        for period in reversed(list(hr_periods)):
+            if period.datetime <= section_ar.datetime:
+                return period
+
+        return self.get(section_ar.section, section_ar.datetime)
+
+
+class SectionAttendance(AttendanceBase, AttendanceCalendarMixin):
+    """Persistent object that stores section attendance records for a student.
+    """
+
+    implements(ISectionAttendance)
+
+    cache_attribute = "_v_SectionAttendance_cache"
+    factory = SectionAttendanceRecord
+
+    def _wrapRecordForLogging(self, ar):
+        return SectionAttendanceLoggingProxy(ar, self.person)
+
+    def tardyEventTitle(self, record):
+        """Produce a title for a calendar event representing a tardy."""
+        minutes_late = (record.late_arrival - record.datetime).seconds / 60
+        return translate(_('Was late for ${section} (${mins} minutes).',
+                           mapping={'section': record.section.title,
+                                    'mins': minutes_late}))
+
+    def absenceEventTitle(self, record):
+        """Produce a title for a calendar event representing an absence."""
+        return translate(_('Was absent from ${section}.',
+                           mapping={'section': record.section.title}))
+
+    def makeCalendarEvent(self, record, title, description):
+        """Produce a calendar event for an absence or a tardy."""
+        return SimpleCalendarEvent(title=title,
+                                   description=description,
+                                   dtstart=record.datetime,
+                                   duration=record.duration)
+
+#
+# Adapters
+#
+
+SECTION_ATTENDANCE_KEY = 'schooltool.attendance.SectionAttendance'
+HOMEROOM_ATTENDANCE_KEY = 'schooltool.attendance.HomeroomAttendance'
+
+
+def getSectionAttendance(person):
+    """Return the section attendance record for a person."""
+    annotations = IAnnotations(person)
+    try:
+        attendance = annotations[SECTION_ATTENDANCE_KEY]
+    except KeyError:
+        attendance = SectionAttendance(person)
+        annotations[SECTION_ATTENDANCE_KEY] = attendance
+    return attendance
+
+
+def getHomeroomAttendance(person):
+    """Return the section attendance record for a person."""
+    annotations = IAnnotations(person)
+    try:
+        attendance = annotations[HOMEROOM_ATTENDANCE_KEY]
+    except KeyError:
+        attendance = HomeroomAttendance(person)
+        annotations[HOMEROOM_ATTENDANCE_KEY] = attendance
+    return attendance
+
+
+#
+# Workflow
+#
+
+class AttendanceAdmin(Persistent):
+    adapts(IActivity)
+    implements(IParticipant)
+
+    def __init__(self, activity):
+        self.activity = activity
+
+
+class AttendanceWorkItem(Persistent, Location):
+
+    adapts(IParticipant)
+    implements(IWorkItem)
+
+    def __init__(self, participant):
+        self.participant = participant
+
+
+class WaitForExplanation(AttendanceWorkItem):
+
+    def start(self, attendance_record):
+        attendance_record._work_item = self
+
+    def makeTardy(self, arrival_time):
+        self.participant.activity.workItemFinished(self, 'tardy', arrival_time, None)
+
+    def rejectExplanation(self):
+        self.participant.activity.workItemFinished(self, 'reject', None, None)
+
+    def acceptExplanation(self, code):
+        self.participant.activity.workItemFinished(self, 'accept', None, code)
+
+
+class MakeTardy(AttendanceWorkItem):
+
+    def start(self, attendance_record, arrival_time):
+        attendance_record.status = TARDY
+        attendance_record.late_arrival = arrival_time
+        self.participant.activity.workItemFinished(self)
+
+
+class AcceptExplanation(AttendanceWorkItem):
+
+    def start(self, attendance_record, code):
+        attendance_record.explanations[-1].status = ACCEPTED
+        attendance_record.explanations[-1].code = code
+        self.participant.activity.workItemFinished(self)
+
+
+class RejectExplanation(AttendanceWorkItem):
+
+    def start(self, attendance_record):
+        attendance_record.explanations[-1].status = REJECTED
+        self.participant.activity.workItemFinished(self)
+
+
+class UnresolvedAbsenceCache(Persistent):
+    """A set of unresolved absences."""
+
+    implements(IUnresolvedAbsenceCache)
+
+    def __init__(self):
+        self._cache = OOBTree()
+
+    def add(self, student, record):
+        records = self._cache.setdefault(student.__name__, PersistentList())
+        assert record not in records
+        records.append(record)
+
+    def remove(self, student, record):
+        records = self._cache[student.__name__]
+        records.remove(record)
+        if not records:
+            del self._cache[student.__name__]
+
+    def __iter__(self):
+        return iter(self._cache.items())
+
+
+AbsenceCacheKey = 'schooltool.attendance.absencecache'
+
+
+def getUnresolvedAbsenceCache(app):
+    """Extract the absence cache from the application.
+
+    Internally the cache is stored as an annotation on the administrators'
+    group.
+    """
+    admin = app['groups']['administrators']
+    annotations = IAnnotations(admin)
+    if AbsenceCacheKey not in annotations:
+        annotations[AbsenceCacheKey] = UnresolvedAbsenceCache()
+    return annotations[AbsenceCacheKey]
+
+
+def addAttendanceRecordToCache(event):
+    """A subscriber that adds an attendance record to the cache.
+
+    The subscriber is invoked when a process starts.  The related record should
+    be an absence/tardy.
+    """
+    pdi = event.process.process_definition_identifier
+    if pdi == 'schooltool.attendance.explanation':
+        record = event.process.workflowRelevantData.attendanceRecord
+        student = event.process.workflowRelevantData.student
+        app = ISchoolToolApplication(None)
+        cache = IUnresolvedAbsenceCache(app)
+        cache.add(student, record)
+
+
+def removeAttendanceRecordFromCache(event):
+    """A subscriber that removes an attendance record from the cache.
+
+    The subscriber is invoked when a process ends.
+    """
+    pdi = event.process.process_definition_identifier
+    if pdi == 'schooltool.attendance.explanation':
+        record = event.process.workflowRelevantData.attendanceRecord
+        student = event.process.workflowRelevantData.student
+        app = ISchoolToolApplication(None)
+        cache = IUnresolvedAbsenceCache(app)
+        cache.remove(student, record)
+
+
+#
+# Calendar Provider
+#
+
+class AttendanceCalendarProvider(object):
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def _getAuthenticatedUser(self):
+        return IPerson(self.request.principal, None)
+
+    def _isLookingAtOwnCalendar(self, user):
+        unproxied_context = removeSecurityProxy(self.context)
+        unproxied_calendar = removeSecurityProxy(ISchoolToolCalendar(user))
+        return unproxied_context is unproxied_calendar
+
+    def getCalendars(self):
+        user = self._getAuthenticatedUser()
+        if not user:
+            return
+
+        if self._isLookingAtOwnCalendar(user):
+            yield (ISectionAttendance(user).makeCalendar(), '#aa0000', '#ff0000')
+
+
+def getAttendanceOwner(attendance):
+    return IPerson(attendance.person, None)
+
+
+class AttendanceEditorsCrowd(ConfigurableCrowd):
+    """The crowd of people who can view the info of a person."""
+
+    setting_key = 'teachers_can_modify_attendance_records'
+
+    def contains(self, principal):
+        """Return the value of the related setting (True or False)."""
+        return (ConfigurableCrowd.contains(self, principal) and
+                PersonInstructorsCrowd(self.context).contains(principal))


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/attendance.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.css
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.css	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.css	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,51 @@
+.attendance-alert {background-color: #ff8080;}
+.attendance-explained {background-color: #80ff80;}
+.attendance-absent {background-color: #ffff80;}
+.attendance-present {background-color: #cccccc;}
+.attendance-clear {}
+.attendance-table {border-collapse: collapse;}
+.attendance-row {border-bottom: 1px solid gray;}
+.attendance-legend {
+  float: right;
+  width:32em;
+  border: 1px solid gray;
+  display: block;
+  padding: 1em;
+}
+
+form#attendance_explain_resolve div.row {
+  margin-top: 1em;
+}
+form#attendance_explain_resolve div.label {
+  float: none;
+}
+
+form#attendance_explain_resolve div.explanation {
+  margin: 0.5ex 0.5ex 2ex 6ex;
+}
+
+form#attendance_explain_resolve h3 {
+  margin-top: 4ex;
+  margin-bottom: 2ex;
+}
+
+tr.attendance-retro-row th,  tr.attendance-retro-row td{
+  border-bottom: 1px solid gray;
+  text-align: center;
+}
+
+tr.attendance-retro-row .first {
+  border-left: none;
+}
+
+tr.attendance-retro-row .other {
+  border-left: 1px solid gray;
+}
+
+tr.attendance-retro-row .disabled {
+  color: gray;
+}
+
+form td.num {
+  text-align: center;
+}

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1004 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Views for SchoolTool attendance
+
+$Id: attendance.py 6863 2007-04-16 14:50:03Z ignas $
+"""
+import urllib
+import datetime
+import itertools
+import pytz
+
+from zope.app.security.settings import PermissionSetting
+from zope.app.securitypolicy.interfaces import IPrincipalPermissionManager
+from zope.app.form.interfaces import WidgetsError
+from zope.app.form.interfaces import IInputWidget
+from zope.app import zapi
+from zope.publisher.browser import BrowserView
+from zope.publisher.interfaces import NotFound
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.component import adapts
+from zope.viewlet import viewlet
+from zope.schema import Choice
+from zope.app.form.browser.itemswidgets import DropdownWidget
+from zope.schema.vocabulary import SimpleVocabulary
+from zope.schema import getFieldNamesInOrder
+from zope.app.form.utility import getWidgetsData, setUpWidgets
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.security.proxy import removeSecurityProxy
+from zope.security import checkPermission
+from zope.i18n import translate
+
+from schooltool.common import collect
+from schooltool.table.batch import IterableBatch
+from schooltool.timetable.interfaces import ITimetables
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.timetable.interfaces import ITimetableCalendarEvent
+from schooltool.calendar.utils import parse_date, parse_time
+from schooltool.course.interfaces import ISection
+from schooltool.app.browser import ViewPreferences
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.attendance.interfaces import IUnresolvedAbsenceCache
+from schooltool.person.interfaces import IPerson
+from schooltool.group.interfaces import IGroup
+from schooltool.calendar.utils import utcnow
+from schooltool.attendance.interfaces import IAttendancePreferences
+from schooltool.attendance.interfaces import IHomeroomAttendance
+from schooltool.attendance.interfaces import IHomeroomAttendanceRecord
+from schooltool.attendance.interfaces import ISectionAttendance
+from schooltool.attendance.interfaces import ISectionAttendanceRecord
+from schooltool.attendance.interfaces import ABSENT, TARDY, PRESENT, UNKNOWN
+from schooltool.attendance.interfaces import AttendanceError
+from schooltool import SchoolToolMessage as _
+
+
+class AttendancePreferencesView(BrowserView):
+    """View used for editing attendance status codes."""
+
+    __used_for__ = IAttendancePreferences
+
+    error = None
+    message = None
+
+    schema = IAttendancePreferences
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+
+        app = ISchoolToolApplication(None)
+        self.prefs = IAttendancePreferences(app)
+        self.dictionary = self.prefs.attendanceStatusCodes
+
+        initial = {}
+        for field in self.schema:
+            initial[field] = getattr(self.prefs, field)
+        names = getFieldNamesInOrder(self.schema)
+        # disable attendanceStatusCodes widget
+        self.field_names = [name for name in names if name != 'attendanceStatusCodes']
+        setUpWidgets(self, self.schema, IInputWidget, initial=initial,
+                     names=self.field_names)
+
+    @property
+    def codes(self):
+        result = []
+        for (key, value) in sorted(self.dictionary.items()):
+            result.append({'key': key, 'value': value})
+        return result
+
+    def validateKey(self, key):
+        key = key.strip()
+        if not key:
+            for i in xrange(999):
+                i_s = '%03d' % (i+1)
+                if i_s in self.dictionary:
+                    continue
+                return i_s
+            return 'default'
+        return key
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            url = zapi.absoluteURL(self.context, self.request)
+            self.request.response.redirect(url)
+            return
+        for arg in self.request.keys():
+            if arg.startswith('REMOVE_'):
+                key = arg[7:]
+                if key in self.dictionary:
+                    del self.dictionary[key]
+        if 'ADD' in self.request:
+            new_key = self.validateKey(self.request['new_key'])
+            new_value = self.request['new_value']
+            if new_value in self.dictionary.values():
+                self.error = 'Description fields must be unique'
+                return
+            self.dictionary[new_key] = new_value
+        if 'UPDATE_SUBMIT' in self.request:
+            for key in self.dictionary:
+                key_s = 'key_%s' % key
+                value_s = 'value_%s' % key
+                if key_s in self.request and \
+                   value_s in self.request:
+                    del self.dictionary[key]
+                    new_key = self.validateKey(self.request[key_s])
+                    new_value = self.request[value_s]
+                    if new_value in self.dictionary.values():
+                        self.error = 'Description fields must be unique'
+                        return
+                    self.dictionary[new_key] = new_value
+            try:
+                data = getWidgetsData(self, self.schema, self.field_names)
+            except WidgetsError:
+                return # Errors will be displayed next to widgets
+
+            for field in self.schema:
+                if field in data: # skip non-fields
+                    setattr(self.prefs, field, data[field])
+        # make it persistent
+        self.prefs.attendanceStatusCodes = self.dictionary
+
+
+AttendanceCSSViewlet = viewlet.CSSViewlet("attendance.css")
+
+
+def datetime_to_schoolday_date(datetime):
+    """Given a datetime, return the date of the schoolday.
+
+    Takes the school's timezone into account.
+    """
+    app = ISchoolToolApplication(None)
+    tzinfo = pytz.timezone(IApplicationPreferences(app).timezone)
+    return datetime.astimezone(tzinfo).date()
+
+
+def getCurrentSectionMeeting(section, datetime):
+    """Find the closest section meeting event, if it exists on a given day.
+
+    Returns the event of the section meeting if there is one on a given day,
+    and None otherwise.
+    """
+    date = datetime_to_schoolday_date(datetime)
+    closest_meeting = None
+    last_meeting = None
+    events = ICompositeTimetables(section).makeTimetableCalendar(date, date)
+    for ev in reversed(sorted(events, key=lambda e: e.dtstart)):
+        if datetime < ev.dtstart + ev.duration:
+            closest_meeting = ev
+        if last_meeting is None:
+            last_meeting = ev
+    return closest_meeting or last_meeting
+
+
+def getPeriodEventForSection(section, date, period_id):
+    """Find the section meeting event, if it exists.
+
+    Returns the event of the section meeting if the section has a period with a
+    given id on a given date, and None otherwise.
+    """
+    for ev in ICompositeTimetables(section).makeTimetableCalendar(date, date):
+        if period_id == ev.period_id:
+            return ev
+    return None
+
+
+def formatAttendanceRecord(ar):
+    """Returns a short indication of the status of an attendance record:
+
+        >>> class AttendanceRecordStub:
+        ...     status = 'ABSENT'
+        >>> ar = AttendanceRecordStub()
+
+    '-' for absent:
+
+        >>> formatAttendanceRecord(ar)
+        '-'
+
+    'T' for tardy
+
+        >>> ar.status = 'TARDY'
+        >>> formatAttendanceRecord(ar)
+        'T'
+
+    ' '  for unknown:
+
+        >>> ar.status = 'UNKNOWN'
+        >>> formatAttendanceRecord(ar)
+        ' '
+
+    And finally, '+' for present.
+
+        >>> ar.status = 'PRESENT'
+        >>> formatAttendanceRecord(ar)
+        '+'
+
+    """
+    if ar.status == ABSENT:
+        return '-'
+    elif ar.status == TARDY:
+        return 'T'
+    elif ar.status == PRESENT:
+        return '+'
+    return ' '
+
+
+class AttendanceCalendarEventViewlet(object):
+    """Viewlet for section meeting calendar events.
+
+    Adds an Attendance link to all section meeting events.
+    """
+
+    def attendanceLink(self):
+        """Construct the URL for the attendance form for a section meeting.
+
+        Returns None if the calendar event is not a section meeting event.
+        """
+        event_for_display = self.manager.event
+        calendar_event = event_for_display.context
+        if not ITimetableCalendarEvent.providedBy(calendar_event):
+            return None
+        section = calendar_event.activity.owner
+        if not ISection.providedBy(section):
+            return None
+        return '%s/attendance/%s/%s' % (
+                    zapi.absoluteURL(section, self.request),
+                    event_for_display.dtstarttz.date(),
+                    calendar_event.period_id)
+
+
+class RealtimeInfo(object):
+    """A row of information about a student for the realtime attendance form"""
+
+    def __init__(self, name, title, color, symbol, disabled, sparkline_url,
+                 arrival_time, sort_key):
+        self.name = name
+        self.title = title
+        self.color = color
+        self.symbol = symbol
+        self.disabled = disabled
+        self.sparkline_url = sparkline_url
+        self.arrival_time = arrival_time
+        self.sort_key = sort_key
+
+    def __repr__(self):
+        return 'RealtimeInfo(%r, %r, %r, %r, %r, %r)' % \
+               (self.name, self.title, self.color, self.symbol, self.disabled,
+                self.sparkline_url)
+
+
+class AttendanceView(BrowserView):
+    """Attendance view for a section
+
+    Shows a realtime or a retrospective attendance form depending on
+    when the view is accessed.
+    """
+
+    __used_for__ = ISection
+
+    realtime_template = ViewPageTemplateFile("templates/real_time.pt")
+    retro_template = ViewPageTemplateFile("templates/retro.pt")
+    no_section_meeting_today_template = ViewPageTemplateFile(
+                                            "templates/no_section_meeting.pt")
+
+    error = None
+
+    # Additional parameters extracted from additional URL elements
+    date = None
+    period_id = None
+
+    def iterTransitiveMembers(self):
+        """Return all transitive members of a section
+
+        Sections can have students as members, and can have groups
+        that have students as members.  Groups within groups are not
+        allowed.
+        """
+        persons = []
+        for member in self.context.members:
+            if IPerson.providedBy(member):
+                yield member
+            if IGroup.providedBy(member):
+                for person in member.members:
+                    # recursive groups not supported
+                    yield person
+
+    def listMembers(self):
+        """Return a list of RealtimeInfo objects about all members"""
+        result = []
+        for person in self.iterTransitiveMembers():
+            past_status = self.studentStatus(person)
+            ar = self._getAttendanceRecord(ISectionAttendance(person))
+            current_status = formatAttendanceRecord(ar)
+            disabled_checkbox = ar.isPresent() or ar.isTardy()
+            section_url = zapi.absoluteURL(ISection(self.context),
+                                   self.request)
+            sparkline_url = '%s/@@sparkline.png?person=%s&date=%s' % \
+                            (section_url, person.username, self.date)
+
+            if hasattr(person, 'nameinfo'):
+                sort_key = person.nameinfo.last_name, person.nameinfo.first_name
+            else:
+                # Let's handle all cases
+                names = person.title.rsplit(' ', 1)
+                names.reverse()
+                sort_key = names
+
+            result.append(RealtimeInfo(
+                person.__name__, # id
+                person.title,    # title
+                past_status,     # colour
+                current_status,  # letter
+                disabled_checkbox,
+                sparkline_url,
+                ar.late_arrival,
+                sort_key
+                ))
+
+        result.sort(key=lambda this: this.sort_key)
+        return result
+
+    def getDaysAttendanceRecords(self, student, date):
+        """Return all attendance records for a student and a given date."""
+        section_ars = list(ISectionAttendance(student).getAllForDay(date))
+        homeroom_ars = list(IHomeroomAttendance(student).getAllForDay(date))
+        return section_ars + homeroom_ars
+
+    def studentStatus(self, student):
+        """Returns the attendance status of a student
+
+        This status can be used as the name of a CSS class for this
+        student's record in the form.
+
+        The status can be one of:
+
+           attendance-clear     -- no records today
+           attendance-present   -- only 'present' records
+           attendance-absent    -- only unexplained absences/tardies
+           attendance-alert     -- both presences and absences/tardies recorded
+           attendance-explained -- only explained absences/tardies
+
+        """
+        was_present = False
+        was_absent = False
+        was_absent_unexplained = False
+        for ar in self.getDaysAttendanceRecords(student, self.date):
+            if ar.isUnknown():
+                continue
+            elif ar.isPresent():
+                was_present = True
+            else:
+                was_absent = True
+                if not ar.isExplained():
+                    was_absent_unexplained = True
+        if was_present and was_absent_unexplained:
+            return 'attendance-alert'
+        elif was_absent and not was_absent_unexplained:
+            return 'attendance-explained'
+        elif was_absent:
+            return 'attendance-absent'
+        elif was_present:
+            return 'attendance-present'
+        else:
+            return 'attendance-clear'
+
+    def update(self):
+        """Process form submissions."""
+        # If there are persons with UNKNOWN status, show the 'absent' button,
+        # otherwise show 'tardy' and 'arrived'.
+        self.unknowns = False
+
+        for person in self.iterTransitiveMembers():
+            check_id = "%s_check" % person.__name__
+            selected = check_id in self.request
+
+            attendance = ISectionAttendance(person)
+            self.updateAttendance(attendance, selected)
+
+            if self.homeroom:
+                hr_attendance = IHomeroomAttendance(person)
+                self.updateAttendance(hr_attendance, selected)
+
+    def updateAttendance(self, attendance, selected):
+        ar = self._getAttendanceRecord(attendance)
+        if 'ABSENT' in self.request:
+            if ar.isUnknown():
+                present = not selected
+                self._record(attendance, present)
+        elif 'TARDY' in self.request:
+            try:
+                arrived = self.getArrival()
+            except ValueError:
+                self.error = _('The arrival time you entered is '
+                               'invalid.  Please use HH:MM format')
+                return
+            if selected and ar.isAbsent():
+                ar.makeTardy(arrived)
+
+        ar = self._getAttendanceRecord(attendance)
+        if ar.isUnknown():
+            self.unknowns = True
+
+    def retro_update(self):
+        """Process submissions for the retroactive form"""
+        self.arrival_errors = {}
+        self.arrivals = {}
+        if 'SUBMIT' in self.request:
+            for person in self.iterTransitiveMembers():
+                name = person.__name__
+                arrival_string = self.request.get(name + '_tardy', '').strip()
+                if self.request.get(name) == 'T':
+                    try:
+                        self.arrivals[name] = self.getArrival(name + '_tardy')
+                    except ValueError:
+                        self.arrival_errors[name] = _(
+                            'The minutes late value you entered is '
+                            'invalid.  Please use an integer number of minutes.')
+                elif arrival_string:
+                    self.arrival_errors[name] = _(
+                        'Arrival times only apply to tardy students')
+            if self.arrival_errors:
+                return
+            for person in self.iterTransitiveMembers():
+                attendance = ISectionAttendance(person)
+                self._retroUpdatePerson(attendance, person)
+                if self.homeroom:
+                    hattendance = IHomeroomAttendance(person)
+                    self._retroUpdatePerson(hattendance, person)
+
+    def _retroUpdatePerson(self, attendance, person):
+        name = person.__name__
+        action = self.request.get(name, 'U')
+        if action == 'P':
+            self._record(attendance, True)
+        elif action == 'A':
+            self._record(attendance, False)
+        elif action == 'T':
+            self._record(attendance, False)
+            ar = self._getAttendanceRecord(attendance)
+            ar.makeTardy(self.arrivals[name])
+
+    def _getAttendanceRecord(self, attendance):
+        """Get a attendance record for this section meeting."""
+        return attendance.get(self.context, self.meeting.dtstart)
+
+    def _record(self, attendance, present):
+        """Record a student's presence or absence."""
+        attendance.record(removeSecurityProxy(self.context),
+                          self.meeting.dtstart, self.meeting.duration,
+                          self.period_id, present)
+
+    def getArrival(self, field='arrival'):
+        """Extracts the date of late arrivals from the request.
+
+        If the time is not specified, defaults to now.
+        """
+        if self.request.get(field):
+            mins = int(self.request[field])
+            result = self.meeting.dtstart + datetime.timedelta(minutes=mins)
+            return result
+        if self.sectionMeetingFinished():
+            return None
+        else:
+            return pytz.utc.localize(datetime.datetime.utcnow())
+
+    def publishTraverse(self, request, name):
+        """Collect additional URL elements."""
+        if self.date is None:
+            try:
+                self.date = parse_date(name)
+                return self
+            except ValueError:
+                pass # will raise NotFound at the end
+        elif self.period_id is None:
+            self.period_id = name
+            return self
+        raise NotFound(self.context, name, self.request)
+
+    def verifyParameters(self):
+        """Check if the date and period_id parameters are valid.
+
+        Raises a NotFound error if they aren't.
+        """
+        if self.date is None and self.period_id is None:
+            self.findClosestMeeting()
+        if self.date is None or self.period_id is None:
+            # Not enough traversal path elements
+            raise NotFound(self.context, self.__name__, self.request)
+        self.meeting = getPeriodEventForSection(self.context, self.date,
+                                               self.period_id)
+        if not self.meeting:
+            raise NotFound(self.context, self.__name__, self.request)
+        timetable = self.meeting.activity.timetable
+        homeroom_ids = timetable[self.meeting.day_id].homeroom_period_ids
+        self.homeroom = (self.meeting.period_id in homeroom_ids)
+
+
+    def findClosestMeeting(self):
+        """Find the closest section meeting."""
+        if 'date' in self.request.form and 'period_id' in self.request.form:
+            self.date = parse_date(self.request['date'])
+            self.period_id = self.request['period_id']
+            return
+        now = pytz.utc.localize(datetime.datetime.utcnow())
+        ev = getCurrentSectionMeeting(self.context, now)
+        if not ev:
+            raise NoSectionMeetingToday
+        self.date = datetime_to_schoolday_date(now)
+        self.period_id = ev.period_id
+
+    def sectionMeetingFinished(self):
+        app = ISchoolToolApplication(None)
+        mins = IAttendancePreferences(app).attendanceRetroactiveTimeout
+        delta = datetime.timedelta(minutes=mins)
+        if self.meeting.dtstart + self.meeting.duration + delta < utcnow():
+            return True
+        return False
+
+    def __call__(self):
+        """Process form submissions and render the view."""
+        try:
+            self.verifyParameters()
+        except NoSectionMeetingToday:
+            return self.no_section_meeting_today_template()
+
+        if self.sectionMeetingFinished():
+            self.retro_update()
+            return self.retro_template()
+        else:
+            self.update()
+            return self.realtime_template()
+
+
+class NoSectionMeetingToday(Exception):
+    """There are no section meetings today."""
+
+
+class AttendanceInheritanceMixin(object):
+    """Mixin that helps collapse related homeroom and section absences."""
+
+    def hasParentHomeroom(self, section_ar, homeroom_attendance):
+        """Does a section absence/tardy have a parent homeroom absence/tardy?"""
+        if not ISectionAttendanceRecord.providedBy(section_ar):
+            return False
+        hr_ar = homeroom_attendance.getHomeroomPeriodForRecord(section_ar)
+        if not hr_ar.isAbsent() and not hr_ar.isTardy():
+            return False
+        return self.inheritsFrom(hr_ar, section_ar)
+
+    def inheritsFrom(self, homeroom_ar, section_ar):
+        """Should section_ar inherit its status from homeroom_ar?"""
+        if homeroom_ar.isAbsent():
+            return True
+
+        assert homeroom_ar.isTardy()
+        arrival = section_ar.late_arrival or (section_ar.datetime +
+                                              section_ar.duration)
+        if arrival - self.homeroomTardyGracePeriod > homeroom_ar.late_arrival:
+            return False
+
+        return True
+
+    @property
+    def homeroomTardyGracePeriod(self):
+        app = ISchoolToolApplication(None)
+        minutes = IAttendancePreferences(app).homeroomTardyGracePeriod
+        return datetime.timedelta(minutes=minutes)
+
+
+class StudentAttendanceView(BrowserView, AttendanceInheritanceMixin):
+    """Attendance view for a student.
+
+    Lists pending unexcused attendance incidents, and a summary of absences and
+    tardies by term.
+    """
+
+    adapts(IPerson, IBrowserRequest)
+
+    template = ViewPageTemplateFile('templates/student-attendance.pt')
+
+    def __call__(self):
+        """Process the form and render the view."""
+        self.update()
+        return self.template()
+
+    def canUpdate(self):
+        return checkPermission('schooltool.edit',
+                               ISectionAttendance(self.context))
+
+    def update(self):
+        """Process the form."""
+        self.statuses = []
+        self.errors = []
+        self.tardy_error = None
+
+        # hand craft a drop-down widget from a dict
+        app = ISchoolToolApplication(None)
+        code_dict = IAttendancePreferences(app).attendanceStatusCodes
+        code_items = sorted((v, k) for k, v in code_dict.items())
+        code_vocabulary = SimpleVocabulary.fromItems(code_items)
+        self.code = ''
+        code_field = Choice(__name__='code', title=u'Set status:',
+                            required=False,
+                            vocabulary=code_vocabulary).bind(self)
+        self.code_widget = DropdownWidget(code_field, code_vocabulary,
+                                          self.request)
+
+
+        if 'UPDATE' not in self.request:
+            return
+        if not self.canUpdate():
+            self.errors.append(_('You are not allowed to modify'
+                                 ' attendance information.'))
+            return
+
+        code = ''
+        if self.code_widget.hasInput():
+            code = self.code_widget.getInputValue()
+        explanation = self.request.get('explanation', '').strip()
+        resolve = self.request.get('resolve', '')
+        late_arrival = self.request.get('tardy_time', '')
+        for ar in self.unresolvedAbsences():
+            if ar['id'] in self.request.form:
+                self._process(ar['attendance_record'], translate(ar['text']),
+                              explanation, resolve, code, late_arrival)
+                # make tardy is not inherited
+                if resolve != 'tardy':
+                    inheriting_ars = self.getInheritingRecords(
+                        ar['attendance_record'],
+                        ar['day'])
+                    for iar in inheriting_ars:
+                        self._process(iar,
+                                      translate(self.formatAttendanceRecord(
+                                                                    iar)),
+                                      explanation, resolve, code, late_arrival)
+
+    def _process(self, ar, text, explanation, resolve, code, late_arrival):
+        """Process a single attendance record"""
+        # We want only one status message per attendance record, so if we
+        # both add an explanation and accept/reject it in one go, only the
+        # acceptance/rejection status message will be shown.
+        status = None
+        mapping = {'absence': text}
+        if explanation:
+            if self._addExplanation(ar, explanation, mapping):
+                status = _('Added an explanation for $absence',
+                           mapping=mapping)
+            else:
+                # If we couldn't add an explanation, let's not accept/reject
+                # some other explanation that just happened to be there.
+                return
+        if resolve == 'accept':
+            if self._acceptExplanation(ar, code, mapping):
+                status = _('Resolved $absence', mapping=mapping)
+        elif resolve == 'reject':
+            if self._rejectExplanation(ar, mapping):
+                status = _('Rejected explanation for $absence',
+                           mapping=mapping)
+        elif resolve == 'tardy':
+            if self._makeTardy(ar, late_arrival, mapping):
+                status = _('Made $absence a tardy',
+                           mapping=mapping)
+        if status:
+            self.statuses.append(status)
+
+    def _addExplanation(self, ar, explanation, mapping):
+        """Add an explanation, reporting errors gracefully."""
+        try:
+            ar.addExplanation(explanation)
+            return True
+        except AttendanceError:
+            self.errors.append(_('Cannot add new explanation for'
+                                 ' $absence: old explanation not'
+                                 ' accepted/rejected', mapping=mapping))
+            return False
+
+    def _acceptExplanation(self, ar, code, mapping):
+        """Accept an explanation, reporting errors gracefully."""
+        try:
+            ar.acceptExplanation(code)
+            return True
+        except AttendanceError:
+            self.errors.append(_('There are no outstanding'
+                                 ' explanations to accept for'
+                                 ' $absence', mapping=mapping))
+            return False
+
+    def _rejectExplanation(self, ar, mapping):
+        """Reject an explanation, reporting errors gracefully."""
+        try:
+            ar.rejectExplanation()
+            return True
+        except AttendanceError:
+            self.errors.append(_('There are no outstanding'
+                                 ' explanations to reject for'
+                                 ' $absence', mapping=mapping))
+            return False
+
+    def parseArrivalTime(self, dt, late_arrival):
+        """Converts a string HH:MM to a datetime.
+
+        If the time is not specified, returns None.
+        """
+        if late_arrival:
+            return dt + datetime.timedelta(minutes=int(late_arrival))
+
+    def _makeTardy(self, ar, late_arrival, mapping):
+        """Convert homeroom attendance record into a tardy."""
+        if not IHomeroomAttendanceRecord.providedBy(ar) or not ar.isAbsent():
+            self.errors.append(_('$absence is not a homeroom absence,'
+                                 ' only homeroom absences can be converted'
+                                 ' into tardies',
+                                 mapping=mapping))
+            return False
+
+        try:
+            arrived = self.parseArrivalTime(ar.datetime, late_arrival)
+        except ValueError:
+            self.tardy_error = _('The arrival time you entered is '
+                                 'invalid.  Please use HH:MM format')
+            return False
+
+        try:
+            ar.makeTardy(arrived)
+            return True
+        except AttendanceError:
+            self.errors.append(_('Could not convert $absence absence into'
+                                 'a homeroom tardy', mapping=mapping))
+            return False
+
+    @property
+    def term_for_detailed_summary(self):
+        """Return the term for a detailed list of absences."""
+        app = ISchoolToolApplication(None)
+        term_name = self.request.get('term', None)
+        return app['terms'].get(term_name, None)
+
+    def terms(self):
+        """List all terms in chronological order."""
+        app = ISchoolToolApplication(None)
+        terms = sorted(app['terms'].values(), key=lambda t: t.first)
+        return terms
+
+    def makeId(self, ar):
+        """Create an ID to identify an attendance record."""
+        if IHomeroomAttendanceRecord.providedBy(ar):
+            prefix = "h"
+            name = "homeroom"
+        else:
+            assert ISectionAttendanceRecord.providedBy(ar)
+            prefix = "s"
+            name = ar.section.__name__.encode('UTF-8').encode('base64')
+            name = name.rstrip() # chomp off the trailing newline
+        return "%s_%s_%s" % (prefix, ar.datetime.isoformat('_'), name)
+
+    def formatAttendanceRecord(self, ar):
+        """Format an attendance record for display."""
+        assert ar.isAbsent() or ar.isTardy()
+        if IHomeroomAttendanceRecord.providedBy(ar):
+            title = translate(_('homeroom'))
+        else:
+            assert ISectionAttendanceRecord.providedBy(ar)
+            title = translate(ar.section.label)
+
+        arrival_time = ar.late_arrival and ar.late_arrival.strftime('%H:%M')
+        mapping = {'date': ar.date,
+                   'time': ar.datetime.strftime('%H:%M'),
+                   'section': title,
+                   'late_arrival': arrival_time}
+
+        if ar.isAbsent():
+            return _('$date $time: absent from $section', mapping=mapping)
+        else:
+            return _('$date $time: late for $section,'
+                     ' arrived on $late_arrival', mapping=mapping)
+
+    def outstandingExplanation(self, ar):
+        """Return the outstanding unaccepted explanation, if any."""
+        if ar.explanations and not ar.explanations[-1].isProcessed():
+            return ar.explanations[-1].text
+        else:
+            return None
+
+    def interleaveAttendanceRecords(self, homeroom_attendances,
+                                    section_attendances):
+        """Interleave day and section attendance records."""
+        homeroom_iter = itertools.chain(homeroom_attendances, [None])
+        section_iter = itertools.chain(section_attendances, [None])
+        cur_homeroom = homeroom_iter.next()
+        cur_section = section_iter.next()
+        while cur_homeroom is not None and cur_section is not None:
+            if cur_homeroom.datetime <= cur_section.datetime:
+                yield cur_homeroom
+                cur_homeroom = homeroom_iter.next()
+            else:
+                yield cur_section
+                cur_section = section_iter.next()
+        if cur_homeroom is not None:
+            yield cur_homeroom
+            for cur_homeroom in homeroom_iter:
+                if cur_homeroom is not None:
+                    yield cur_homeroom
+        if cur_section is not None:
+            yield cur_section
+            for cur_section in section_iter:
+                if cur_section is not None:
+                    yield cur_section
+
+    def unresolvedAttendanceRecords(self):
+        """Return an interleaved list of unresolved absence records."""
+        homeroom_attendance = IHomeroomAttendance(self.context)
+        section_attendance = ISectionAttendance(self.context)
+        def unresolved(ar):
+            return (ar.isAbsent() or ar.isTardy()) and not ar.isExplained()
+        return self.interleaveAttendanceRecords(
+                            filter(unresolved, homeroom_attendance),
+                            filter(unresolved, section_attendance))
+
+    def pigeonholeAttendanceRecords(self):
+        """Divide attendance records into a list of days.
+
+        Returns a list of lists, in which every sublist has attendance
+        records for one date.
+        """
+        attendance_records = self.unresolvedAttendanceRecords()
+        date = None
+        days = []
+        for ar in attendance_records:
+            if ar.date != date:
+                days.append([])
+                date = ar.date
+            days[-1].append(ar)
+        return days
+
+    def getInheritingRecords(self, homeroom_ar, day):
+        """Filter out inheriting attendance records in a day."""
+        homeroom_attendance = IHomeroomAttendance(self.context)
+        records = []
+        for ar in day:
+            if not IHomeroomAttendanceRecord.providedBy(ar):
+                hr_ar = homeroom_attendance.getHomeroomPeriodForRecord(ar)
+                if hr_ar == homeroom_ar and self.inheritsFrom(homeroom_ar, ar):
+                    records.append(ar)
+        return records
+
+    def hideInheritingRecords(self, days):
+        """Remove inheriting absences from days in the list.
+
+        Days is a list of days where each day is a list of attendance
+        records: [[ar, ar, ar], [ar, ar]].
+        """
+        homeroom_attendance = IHomeroomAttendance(self.context)
+        return [[ar for ar in day
+                 if not self.hasParentHomeroom(ar, homeroom_attendance)]
+                for day in days]
+
+    def flattenDays(self, days):
+        """Flatten a list of days into a list of attendance record dicts."""
+        l = []
+        for day in days:
+            for ar in day:
+                l.append({'id': self.makeId(ar),
+                          'text': self.formatAttendanceRecord(ar),
+                          'attendance_record': ar,
+                          'explanation': self.outstandingExplanation(ar),
+                          'day': day,
+                          })
+        return l
+
+    def unresolvedAbsencesForDisplay(self):
+        """Return only non inheriting unresolved absences."""
+        days = self.pigeonholeAttendanceRecords()
+        days = self.hideInheritingRecords(days)
+        return self.flattenDays(days)
+
+    def unresolvedAbsences(self):
+        """Return all unresolved absences and tardies."""
+        days = self.pigeonholeAttendanceRecords()
+        return self.flattenDays(days)
+
+    @collect
+    def absencesForTerm(self, term):
+        """Return all absences and tardies in a term."""
+        homeroom_attendance = IHomeroomAttendance(self.context)
+        section_attendance = ISectionAttendance(self.context)
+        for ar in self.interleaveAttendanceRecords(
+                            homeroom_attendance.filter(term.first, term.last),
+                            section_attendance.filter(term.first, term.last)):
+            if ar.isAbsent() or ar.isTardy():
+                yield self.formatAttendanceRecord(ar)
+
+    def summaryPerTerm(self):
+        """List a summary of absences and tardies for each term."""
+        homeroom_attendance = IHomeroomAttendance(self.context)
+        section_attendance = ISectionAttendance(self.context)
+        for term in self.terms():
+            n_homeroom_absences, n_homeroom_tardies = self.countAbsences(
+                    homeroom_attendance.filter(term.first, term.last))
+            n_section_absences, n_section_tardies = self.countAbsences(
+                    section_attendance.filter(term.first, term.last))
+            yield {'name': term.__name__,
+                   'title': term.title,
+                   'first': term.first,
+                   'last': term.last,
+                   'homeroom_absences': n_homeroom_absences,
+                   'homeroom_tardies': n_homeroom_tardies,
+                   'section_absences': n_section_absences,
+                   'section_tardies': n_section_tardies}
+
+    def countAbsences(self, attendance_records):
+        """Count absences and tardies."""
+        n_absences = n_tardies = 0
+        for ar in attendance_records:
+            if ar.isAbsent():
+                n_absences += 1
+            elif ar.isTardy():
+                n_tardies += 1
+        return n_absences, n_tardies
+
+
+class AttendancePanelView(BrowserView, AttendanceInheritanceMixin):
+    """A control panel for tracking global attendance."""
+
+    __used_for__ = ISchoolToolApplication
+
+    def getItems(self, search_str=''):
+        """Return persons matching a search string with their absence records.
+        """
+        cache = IUnresolvedAbsenceCache(self.context)
+        person_container = self.context['persons']
+        subjects = [(person_container[username], absences)
+                    for username, absences in cache]
+        lowercased_search_str = search_str.lower()
+        return [{'title': person.title,
+                 'person': person,
+                 'absences': absences}
+                for person, absences in subjects
+                if lowercased_search_str in person.title.lower()]
+
+    def update(self):
+        if 'CLEAR_SEARCH' in self.request:
+            self.request.form['SEARCH'] = ''
+        search_str = self.request.get('SEARCH', '')
+        results = self.getItems(search_str)
+
+        extra_url = ""
+        if search_str:
+            extra_url = "&SEARCH=%s" % urllib.quote(self.request['SEARCH'])
+
+        self.batch = IterableBatch(results, self.request, sort_by='title',
+                                   extra_url=extra_url)
+        for record in self.batch:
+            homeroom_attendance = IHomeroomAttendance(record['person'])
+            n_hr, n_section = self.countAbsences(record['absences'],
+                                                 homeroom_attendance)
+            record['hr_absences'] = n_hr
+            record['section_absences'] = n_section
+
+    def countAbsences(self, absences, homeroom_attendance):
+        """Count the number of homeroom and section absences."""
+        n_hr = n_section = 0
+        for ar in absences:
+            if IHomeroomAttendanceRecord.providedBy(ar):
+                n_hr += 1
+            elif ISectionAttendanceRecord.providedBy(ar):
+                if not self.hasParentHomeroom(ar, homeroom_attendance):
+                    n_section += 1
+        return n_hr, n_section
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/attendance.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<configure xmlns:browser="http://namespaces.zope.org/browser"
+           xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <!-- XXX: The same hack (temporary?) as in ApplicationPreferences -->
+  <browser:page
+      name="site-preferences-codes.html"
+      for="schooltool.person.interfaces.IPerson"
+      class="schooltool.attendance.browser.attendance.AttendancePreferencesView"
+      template="templates/attendance_preferences.pt"
+      permission="schooltool.edit" />
+
+  <browser:page
+      name="attendance"
+      for="schooltool.course.interfaces.ISection"
+      class="schooltool.attendance.browser.attendance.AttendanceView"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Attendance"
+      />
+
+  <browser:viewlet
+      name="section-attendance-link"
+      for="*"
+      manager="schooltool.app.browser.skin.ICalendarEventViewletManager"
+      template="templates/section-attendance-viewlet.pt"
+      class=".attendance.AttendanceCalendarEventViewlet"
+      permission="zope.Public"
+      order="15"
+      />
+
+  <browser:viewlet
+      name="attendance_css"
+      for="*"
+      manager="schooltool.skin.ICSSManager"
+      class=".attendance.AttendanceCSSViewlet"
+      permission="zope.View"
+      />
+
+  <browser:resource name="attendance.css" file="attendance.css" />
+
+  <browser:page
+      name="sparkline.png"
+      for="schooltool.course.interfaces.ISection"
+      class="schooltool.attendance.browser.sparkline.AttendanceSparklineView"
+      permission="schooltool.view" />
+
+  <browser:page
+      name="attendance.html"
+      for="schooltool.person.interfaces.IPerson"
+      class="schooltool.attendance.browser.attendance.StudentAttendanceView"
+      permission="schooltool.view"
+      menu="schooltool_actions"
+      title="Attendance"
+      />
+
+  <browser:page
+      name="attendancepanel.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      class="schooltool.attendance.browser.attendance.AttendancePanelView"
+      template="templates/controlpanel.pt"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Attendance Control Panel"
+      />
+
+  <browser:navigationViewlet
+      name="attendance_control_panel"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/controlpanelViewlet.pt"
+      class="schooltool.skin.NavigationViewlet"
+      permission="schooltool.edit"
+      link="attendancepanel.html"
+      title="Attendance Panel"
+      order="90"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/attendance-forms.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/attendance-forms.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/attendance-forms.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,423 @@
+Realtime Attendance Form
+========================
+
+
+Overview
+--------
+
+1. Define a simple school structure (courses, sections, timetables).
+2. Look at the real-time attendance form, then use it.
+3. Look for absence events in the student's calendar.
+4. Look at nice sparklines.
+5. Take a brief glance at the student's attendance view.
+
+
+Setup
+-----
+
+This is going to be a bit boring, since we start with a clean slate.
+
+A manager logs in
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+and creates a course and a section
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('New Course').click()
+    >>> manager.getControl('Title').value = 'Dancing 1'
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('Dancing 1').click()
+    >>> manager.getLink('New Section').click()
+    >>> manager.getControl('Code').value = 'dancing-1a'
+    >>> manager.getControl('Add').click()
+
+We also need a term and a timetable
+
+    >>> manager.getLink('Terms').click()
+    >>> manager.getLink('New Term').click()
+    >>> manager.getControl('Title').value = '2005 Fall'
+    >>> manager.getControl('Start date').value = '2005-09-01'
+    >>> manager.getControl('End date').value = '2006-01-31'
+    >>> manager.getControl('Next').click()
+    >>> manager.getControl('Sunday').click()
+    >>> manager.getControl('Saturday').click()
+    >>> manager.getControl('Add term').click()
+
+    >>> manager.getLink('Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+    >>> manager.getControl('Title').value = 'default'
+    >>> manager.getControl('Next').click()
+    >>> manager.getControl('Days of the week').click()
+    >>> manager.getControl('Same time each day').click()
+    >>> manager.getControl(name='field.times').value = """
+    ...    9:30-10:25
+    ...    10:30-11:25
+    ...    11:35-12:20
+    ...    12:45-13:30
+    ...    13:35-14:20
+    ...    14:30-15:15
+    ... """
+    >>> manager.getControl('Next').click()
+    >>> manager.getControl('Designated by time').click()
+    >>> manager.getControl('No').click()
+
+Let's schedule the section
+
+    >>> manager.open('http://localhost/sections/dancing1a')
+    >>> manager.getLink('Schedule').click()
+
+    >>> manager.getControl(name="Monday.09:30-10:25").value = True
+    >>> manager.getControl(name="Wednesday.11:35-12:20").value = True
+    >>> manager.getControl('Save').click()
+
+Let's also create a teacher for the section
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Great Teacher Largo', 'largo', 'sittinghorse', 
+    ...     groups=['teachers'])
+
+    >>> manager.open('http://localhost/sections/dancing1a')
+    >>> manager.getLink('edit instructors').click()
+    >>> manager.getControl('Great Teacher Largo').selected = True
+    >>> manager.getControl('Add').click()
+
+Create clerk
+
+    >>> addPerson('Krumpetzki', 'harvie', 'facts', groups=['clerks'])
+
+Create some students
+
+    >>> addPerson('Joniukas', 'joniukas', 'gretute', groups=['students'])
+    >>> addPerson('Gretute', 'gretute', 'tenerife', groups=['students'])
+
+Add them to dancing section
+
+    >>> manager.open('http://localhost/sections/dancing1a')
+    >>> manager.getLink('edit individuals').click()
+    >>> manager.getControl('Joniukas').selected = True
+    >>> manager.getControl('Gretute').selected = True
+    >>> manager.getControl('Add').click()
+
+
+Real-time attendance form
+-------------------------
+
+Let's say now it's 2005-12-12T9:44Z:
+
+    >>> from pytz import utc
+    >>> from datetime import datetime
+    >>> from schooltool.calendar.utils import stub_utcnow
+    >>> stub_utcnow(datetime(2005, 12, 12, 9, 44, tzinfo=utc))
+
+
+The teacher logs in
+
+    >>> largo = Browser()
+    >>> largo.handleErrors = False
+    >>> largo.addHeader('Authorization', 'Basic largo:sittinghorse')
+
+Looks at his daily view, and sees the Dancing section there:
+
+    >>> largo.open('http://localhost/persons/largo/calendar/2005-12-12')
+    >>> print analyze.queryHTML('id("content-body")', largo.contents)[0]
+    <div id="content-body">
+    ...
+      <h6 style="background: #...">
+        <a href="http://localhost/sections/dancing1a/calendar/..." title="Dancing 1">
+          Dancing 1
+          <span class="start-end">
+            (<span>09:30</span>
+             -
+            <span>10:25</span>)
+          </span>
+        </a>
+      </h6>
+    ...
+
+You can go to the section attendance form by following the 'Attendance' link in
+the event box.
+
+    >>> largo.getLink('Attendance', url="dancing1a").click()
+    >>> print analyze.queryHTML('id("content-header")', largo.contents)[0]
+    <div id="content-header">
+    <h2>Section attendance for Great Teacher Largo -- Dancing 1  at 2005-12-12
+    period 09:30-10:25</h2>
+    </div>
+
+    <>>> print analyze.queryHTML('id("content-body")', largo.contents)[0]
+    ...
+    <form method="POST" action="http://localhost/sections/dancing1a/attendance/2005-12-12/09:30-10:25">
+    ...
+
+Mark Joniukas as absent:
+
+    >>> largo.getControl(name='joniukas_check').value=True
+    >>> largo.getControl('Mark as absent').click()
+
+Joniukas is marked as absent, and Gretute is marked as present (checkbox disabled)
+
+    >>> print '\n'.join(analyze.queryHTML('//tr[@class="attendance-row"]', largo.contents))
+    <tr class="attendance-row"><td>
+          <input type="checkbox" disabled name="gretute_check" id="gretute_check">...
+           <label for="gretute_check">Gretute</label>...
+          +
+    ...
+    <tr class="attendance-row"><td>
+          <input type="checkbox" name="joniukas_check" id="joniukas_check">...
+           <label for="joniukas_check">Joniukas</label>...
+          -
+    ...
+
+An absence event should be visible in his calendar:
+
+    >>> joniukas = Browser()
+    >>> joniukas.addHeader('Authorization', 'Basic joniukas:gretute')
+    >>> joniukas.handleErrors = False
+    >>> joniukas.open('http://localhost/persons/joniukas/calendar/2005-12-12')
+
+    >>> print joniukas.contents
+    <BLANKLINE>
+    ...
+      <h6 style="background: ...">
+          Was absent from...
+          <span class="start-end">
+            (<span>09:30</span>
+              - <span>10:25</span>)
+          </span>
+      </h6>
+    ...
+      <div class="title">Was absent from dancing-1a.</div>
+    ...
+
+
+Finaly Joniukas is here, make him tardy
+
+    >>> largo.getControl(name='joniukas_check').value=True
+    >>> largo.getControl('Minutes late:').value = 'too late'
+    >>> largo.getControl('Make tardy').click()
+
+We should have entered time...
+
+    >>> print analyze.queryHTML('//div[@class="error"]', largo.contents)[0]
+    <div class="error">The arrival time you entered is invalid.  Please use HH:MM format</div>
+
+Try it again (Joniukas remains checked)
+
+    >>> largo.getControl(name='joniukas_check').value
+    True
+    >>> largo.getControl('Minutes late:').value = '52'
+    >>> largo.getControl('Make tardy').click()
+
+Now Joniukas is tardy
+
+    >>> print '\n'.join(analyze.queryHTML('//tr[@class="attendance-row"]', largo.contents))
+    <tr class="attendance-row"><td>
+          <input type="checkbox" disabled name="gretute_check" id="gretute_check">...
+           <label for="gretute_check">Gretute</label>...
+          +
+    ...
+    <tr class="attendance-row"><td>
+          <input type="checkbox" disabled name="joniukas_check" id="joniukas_check">...
+           <label for="joniukas_check">Joniukas</label>...
+          T
+    ...
+
+And the absence event is replaced with a tardy event:
+
+    >>> joniukas.open('http://localhost/persons/joniukas/calendar/2005-12-12')
+
+    >>> print joniukas.contents
+    <BLANKLINE>
+    ...
+      <h6 style="background: ...">
+           Was late for da...
+           <span class="start-end">
+             (<span>09:30</span>
+               - <span>10:25</span>)
+           </span>
+      </h6>
+    ...
+      <div class="title">Was late for dancing-1a (52 minutes).</div>
+    ...
+
+
+Sparkline
+---------
+
+Look at the attendance event for the next section meeting. Each person has
+attendance sparkline drawn along with the status symbol:
+
+    >>> largo.open('http://localhost/persons/largo/calendar/2005-12-14')
+    >>> largo.getLink('Attendance', url="dancing1a").click()
+    >>> print '\n'.join(analyze.queryHTML('//img[@width="30"]', largo.contents))
+    <img alt="attendance graph for the last 10 days" width="30" height="13" src="http://localhost/sections/dancing1a/@@sparkline.png?person=gretute&amp;date=2005-12-14">
+    <img alt="attendance graph for the last 10 days" width="30" height="13" src="http://localhost/sections/dancing1a/@@sparkline.png?person=joniukas&amp;date=2005-12-14">
+
+"Look" at the attendance sparkline for joniukas
+
+    >>> largo.open('http://localhost/sections/dancing1a/@@sparkline.png?person=joniukas&amp;date=2005-12-14')
+    >>> image = largo.contents
+
+It looks like this
+
+    >>> import Image
+    >>> import StringIO
+    >>> image_file = StringIO.StringIO(image)
+    >>> pil_image = Image.open(image_file)
+    >>> from schooltool.attendance.tests.test_sparkline import show_image_as_text
+    >>> show_image_as_text(pil_image, extracolors={'\xFF\xC0\x00': 'Y'})
+    ------------------------------
+    ------------------------------
+    ------------------------------
+    ------------------------------
+    ------------------------------
+    ------------------------------
+    ##-##-##-##-##-##-##-##-##-YY-
+    ---------------------------YY-
+    ---------------------------YY-
+    ---------------------------YY-
+    ---------------------------YY-
+    ---------------------------YY-
+    ---------------------------YY-
+
+
+
+Attendance view
+---------------
+
+A student's page contains an "Attendance" action in the menu.
+
+    >>> joniukas = Browser()
+    >>> joniukas.handleErrors = False
+    >>> joniukas.addHeader('Authorization', 'Basic joniukas:gretute')
+    >>> joniukas.open('http://localhost/persons/joniukas')
+    >>> joniukas.getLink('Attendance', url='@@attendance.html').click()
+
+If you go there, you see a list of unresolved absences
+
+    >>> print joniukas.contents
+    <BLANKLINE>
+    ...
+    <h2>Attendance of Joniukas</h2>
+    ...
+    ...2005-12-12 09:30: late for Great Teacher Largo -- Dancing 1...
+
+
+Even if the teachers are allowed to resolve the absences (regression test)
+
+    >>> manager.open('http://localhost/access_control.html')
+    >>> manager.getControl('Teachers can modify attendance records').click()
+    >>> manager.getControl('Apply').click()
+
+the student of course can't resolve the absences himself:
+
+    >>> joniukas.getControl('late for Great Teacher Largo').click()
+    >>> joniukas.getControl('Update').click()
+    >>> 'You are not allowed to modify' in joniukas.contents
+    True
+
+
+Retroactive attendance form
+---------------------------
+
+Some time has passed, and the teacher comes back to filling in
+attendance after the lunch break the next day:
+
+    >>> from schooltool.calendar.utils import stub_utcnow
+    >>> stub_utcnow(datetime(2005, 12, 14, 16, 44, tzinfo=utc))
+
+He knows the URL and just enters it:
+
+    >>> largo.open("http://localhost/sections/dancing1a/"
+    ...            "attendance/2005-12-14/11:35-12:20")
+
+He gets to the retroactive attendance form.  It does not have
+'ABSENT' or 'TARDY' buttons, but has a 'SUBMIT':
+
+    >>> 'ABSENT' not in largo.contents
+    True
+    >>> 'TARDY' not in largo.contents
+    True
+    >>> 'SUBMIT' in largo.contents
+    True
+
+The default values of the radio buttons are "present":
+
+    >>> largo.getControl(name="joniukas").value
+    ['P']
+    >>> largo.getControl(name="gretute").value
+    ['P']
+
+Largo enters an arrival time and tries to submit the form:
+
+    >>> largo.getControl(name="joniukas_tardy").value = '3'
+    >>> largo.getControl('Submit').click()
+
+He gets an error:
+
+   >>> print largo.contents
+   <BLANKLINE>
+   ...
+   <p class="error">Arrival times only apply to tardy students</p>
+   ...
+
+He then notices that he forgot to mark Joniukas as tardy, and Gretute
+as absent:
+
+    >>> largo.getControl(name="joniukas").value =  ['T']
+    >>> largo.getControl(name="gretute").value =  ['A']
+    >>> largo.getControl('Submit').click()
+
+The form submits fine.  The controls still show their values but are
+disabled:
+
+    >>> print largo.contents
+    <BLANKLINE>
+    ...
+    <h2>Section attendance for
+      Great Teacher Largo -- Dancing 1
+      at 2005-12-14
+      period 11:35-12:20</h2>
+      ...
+      <tr class="attendance-retro-row">
+        <td class="attendance-absent">
+           <label class="disabled">Gretute</label>
+        </td>
+        ...
+        <td class="other">
+          <input type="radio" value="A" disabled="disabled"
+                 checked="checked" name="gretute" />
+        </td>
+        ...
+      </tr>
+      <tr class="attendance-retro-row">
+        <td class="attendance-absent">
+           <label class="disabled">Joniukas</label>
+        </td>
+        ...
+        <td class="other">
+          <input type="radio" value="T" disabled="disabled"
+                 checked="checked" name="joniukas" />
+          <input type="text" disabled="disabled"
+                 name="joniukas_tardy" value="3" />
+        </td>
+      </tr>
+    </table>
+    ...
+
+Resubmitting the form does nothing:
+
+    >>> largo.getControl('Submit').click()
+
+
+Epilog
+------
+
+Let's reset the "now" stub:
+
+    >>> stub_utcnow(None)


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/attendance-forms.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/student-attendance.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/student-attendance.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/student-attendance.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,197 @@
+Student Attendance View
+=======================
+
+Overview
+--------
+
+1. Define a simple school structure (courses, sections, timetables).
+2. Register some absences and tardies
+3. Look at the student's attendance view
+4. Look at the attendance control panel
+
+
+Setup
+-----
+
+This is going to be a bit boring, since we start with a clean slate.
+
+Let's say now it's 2005-11-14T9:44Z:
+
+    >>> from pytz import utc
+    >>> from datetime import datetime
+    >>> from schooltool.calendar.utils import stub_utcnow
+    >>> stub_utcnow(datetime(2005, 11, 14, 9, 44, tzinfo=utc))
+
+A manager logs in
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+create a teacher
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Great Teacher Largo', 'largo', 'sittinghorse',
+    ...     groups=['teachers'])
+
+and creates a course:
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('New Course').click()
+    >>> manager.getControl('Title').value = 'Dancing 1'
+    >>> manager.getControl('Add').click()
+
+add a section:
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('Dancing 1').click()
+    >>> manager.getLink('New Section').click()
+    >>> manager.getControl('Code').value = 'dancing-1a'
+    >>> manager.getControl('Add').click()
+
+We also need a term and a timetable
+
+    >>> manager.getLink('Terms').click()
+    >>> manager.getLink('New Term').click()
+    >>> manager.getControl('Title').value = '2005 Fall'
+    >>> manager.getControl('Start date').value = '2005-09-01'
+    >>> manager.getControl('End date').value = '2006-01-31'
+    >>> manager.getControl('Next').click()
+    >>> manager.getControl('Sunday').click()
+    >>> manager.getControl('Saturday').click()
+    >>> manager.getControl('Add term').click()
+
+    >>> manager.getLink('Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+    >>> manager.getControl('Title').value = 'default'
+    >>> manager.getControl('Next').click()
+    >>> manager.getControl('Days of the week').click()
+    >>> manager.getControl('Same time each day').click()
+    >>> manager.getControl(name='field.times').value = """
+    ...    9:30-10:25
+    ...    10:30-11:25
+    ...    11:35-12:20
+    ...    12:45-13:30
+    ...    13:35-14:20
+    ...    14:30-15:15
+    ... """
+    >>> manager.getControl('Next').click()
+    >>> manager.getControl('Designated by time').click()
+    >>> manager.getControl('Yes').click()
+    >>> manager.getControl(name='homeroom_0_09:30-10:25').value = True
+    >>> manager.getControl(name='homeroom_1_09:30-10:25').value = True
+    >>> manager.getControl(name='homeroom_2_09:30-10:25').value = True
+    >>> manager.getControl(name='homeroom_3_09:30-10:25').value = True
+    >>> manager.getControl(name='homeroom_4_09:30-10:25').value = True
+    >>> manager.getControl('Next').click()
+
+Let's make largo a teacher for the section:
+
+    >>> manager.open('http://localhost/sections/dancing1a')
+    >>> manager.getLink('edit instructors').click()
+    >>> manager.getControl('Great Teacher Largo').selected = True
+    >>> manager.getControl('Add').click()
+
+XXX ignas: do we really want to allow teachers to schedule sections?
+Let's schedule the section:
+
+    >>> largo = Browser()
+    >>> largo.addHeader('Authorization', 'Basic largo:sittinghorse')
+    >>> largo.handleErrors = False
+    >>> largo.open('http://localhost/')
+
+    >>> largo.open('http://localhost/sections/dancing1a')
+    >>> largo.getLink('Schedule').click()
+
+    >>> largo.getControl(name="Monday.09:30-10:25").value = True
+    >>> largo.getControl(name="Wednesday.11:35-12:20").value = True
+    >>> largo.getControl('Save').click()
+
+Create some students
+
+    >>> addPerson('Joniukas', 'joniukas', 'gretute', groups=['students'])
+    >>> addPerson('Gretute', 'gretute', 'tenerife', groups=['students'])
+
+Add them to dancing section
+
+    >>> largo.open('http://localhost/sections/dancing1a')
+    >>> largo.getLink('edit individuals').click()
+    >>> largo.getControl('Joniukas').selected = True
+    >>> largo.getControl('Gretute').selected = True
+    >>> largo.getControl('Add').click()
+
+And register some absences
+
+    >>> largo.open('http://localhost/sections/dancing1a'
+    ...            '/attendance/2005-11-14/09:30-10:25')
+    >>> largo.getControl(name='joniukas_check').value=True
+    >>> largo.getControl('Mark as absent').click()
+
+    >>> largo.open('http://localhost/sections/dancing1a'
+    ...            '/attendance/2005-11-16/11:35-12:20')
+    >>> largo.getControl(name='joniukas_check').value=True
+    >>> largo.getControl('Mark as absent').click()
+
+    >>> largo.open('http://localhost/sections/dancing1a'
+    ...            '/attendance/2005-11-21/09:30-10:25')
+    >>> largo.getControl(name='joniukas_check').value=True
+    >>> largo.getControl('Mark as absent').click()
+
+    >>> largo.open('http://localhost/sections/dancing1a'
+    ...            '/attendance/2005-11-23/11:35-12:20')
+    >>> largo.getControl(name='joniukas_check').value=True
+    >>> largo.getControl('Mark as absent').click()
+    >>> largo.getControl(name='joniukas_check').value=True
+    >>> largo.getControl('Minutes late:').value = '10'
+    >>> largo.getControl('Make tardy').click()
+
+
+Attendance view
+---------------
+
+A student's page contains an "Attendance" action in the menu.
+
+    >>> largo.open('http://localhost/persons/joniukas')
+    >>> largo.getLink('Attendance', url='@@attendance.html').click()
+
+    >>> from schooltool.testing.util import normalize_xml
+    >>> for node in analyze.queryHTML('//table[@class="attendance_summary_per_term"]',
+    ...                       largo.contents):
+    ...     print normalize_xml(node, compact=True)
+    <table class="attendance_summary_per_term">
+      <tr>
+        <th rowspan="2">Term</th>
+        <th colspan="2">Homeroom attendance</th>
+        <th colspan="2">Section attendance</th>
+      </tr>
+      <tr>
+        <th>Absences</th>
+        <th>Tardies</th>
+        <th>Absences</th>
+        <th>Tardies</th>
+      </tr>
+      <tr>
+        <td>
+          <a href="?term=2005-fall">2005 Fall</a>
+        </td>
+        <td class="number">2</td>
+        <td class="number">0</td>
+        <td class="number">3</td>
+        <td class="number">1</td>
+      </tr>
+    </table>
+
+Let's check the attendance panel:
+
+    >>> manager.getLink('Attendance Panel').click()
+    >>> 'Joniukas' in manager.contents
+    True
+
+Epilog
+------
+
+Let's reset the "now" stub:
+
+    >>> stub_utcnow(None)


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/student-attendance.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.attendance
+
+$Id: test_all.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.attendance.ftesting import attendance_functional_layer
+
+def test_suite():
+    return collect_ftests(layer=attendance_functional_layer)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/workflow.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/workflow.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/workflow.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,104 @@
+Attendance workflow
+===================
+
+Let's set up a subscriber that prints out all the events:
+
+    >>> def log_workflow(event):
+    ...     print event
+
+    >>> from datetime import datetime
+    >>> from pytz import utc
+    >>> import zope.event
+    >>> from zope.app.testing.functional import setSite
+    >>> zope.event.subscribers.append(log_workflow)
+    >>> setSite(getRootFolder())
+
+Now we can create the process:
+
+    >>> from schooltool.person.person import Person
+    >>> from schooltool.attendance.attendance import SectionAttendanceRecord
+    >>> from schooltool.attendance.attendance import ABSENT
+    >>> person = Person('jonas', title='Jonas')
+    >>> dt = datetime(2006, 4, 14, tzinfo=utc)
+    >>> ar = SectionAttendanceRecord('sekcija', dt, ABSENT, person)
+    ProcessStarted(Process('schooltool.attendance.explanation'))
+    Transition(None, Activity('schooltool.attendance.explanation.create'))
+    ActivityStarted(Activity('schooltool.attendance.explanation.create'))
+    ActivityFinished(Activity('schooltool.attendance.explanation.create'))
+    Transition(Activity('schooltool.attendance.explanation.create'),
+               Activity('schooltool.attendance.explanation.explain'))
+    ActivityStarted(Activity('schooltool.attendance.explanation.explain'))
+
+Let's make the attendance record a tardy:
+
+    >>> ar.makeTardy(datetime(2005, 1, 1, 10, 15))
+    WorkItemFinished(u'WaitForExplanation')
+    ActivityFinished(Activity('schooltool.attendance.explanation.explain'))
+    Transition(Activity('schooltool.attendance.explanation.explain'),
+               Activity('schooltool.attendance.explanation.makeTardy'))
+    ActivityStarted(Activity('schooltool.attendance.explanation.makeTardy'))
+    WorkItemFinished(u'MakeTardy')
+    ActivityFinished(Activity('schooltool.attendance.explanation.makeTardy'))
+    Transition(Activity('schooltool.attendance.explanation.makeTardy'),
+               Activity('schooltool.attendance.explanation.explain'))
+    ActivityStarted(Activity('schooltool.attendance.explanation.explain'))
+
+It should be tardy now:
+
+    >>> ar.isTardy()
+    True
+    >>> ar.late_arrival
+    datetime.datetime(2005, 1, 1, 10, 15)
+
+Let's add an explanation:
+
+    >>> ar.addExplanation('space aliens abducted me')
+
+and reject it
+
+    >>> ar.rejectExplanation()
+    WorkItemFinished(u'WaitForExplanation')
+    ActivityFinished(Activity('schooltool.attendance.explanation.explain'))
+    Transition(Activity('schooltool.attendance.explanation.explain'),
+               Activity('schooltool.attendance.explanation.reject'))
+    ActivityStarted(Activity('schooltool.attendance.explanation.reject'))
+    WorkItemFinished(u'RejectExplanation')
+    ActivityFinished(Activity('schooltool.attendance.explanation.reject'))
+    Transition(Activity('schooltool.attendance.explanation.reject'),
+               Activity('schooltool.attendance.explanation.explain'))
+    ActivityStarted(Activity('schooltool.attendance.explanation.explain'))
+
+    >>> def printExplanations(ar):
+    ...     for e in ar.explanations:
+    ...         print e.status + ':', e.text
+
+    >>> printExplanations(ar)
+    REJECTED: space aliens abducted me
+
+Let's add a better explanation:
+
+    >>> ar.addExplanation('I was lazy')
+
+and accept it
+
+    >>> ar.acceptExplanation('001')
+    WorkItemFinished(u'WaitForExplanation')
+    ActivityFinished(Activity('schooltool.attendance.explanation.explain'))
+    Transition(Activity('schooltool.attendance.explanation.explain'),
+               Activity('schooltool.attendance.explanation.excuse'))
+    ActivityStarted(Activity('schooltool.attendance.explanation.excuse'))
+    WorkItemFinished(u'AcceptExplanation')
+    ActivityFinished(Activity('schooltool.attendance.explanation.excuse'))
+    ProcessFinished(Process('schooltool.attendance.explanation'))
+
+    >>> printExplanations(ar)
+    REJECTED: space aliens abducted me
+    ACCEPTED: I was lazy
+
+This concludes our workflow process.
+
+
+Clean up:
+
+    >>> zope.event.subscribers = zope.event.subscribers[:-1]
+    >>> setSite(None)


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/ftests/workflow.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/sparkline.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/sparkline.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/sparkline.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Views for SchoolTool attendance sparkline
+
+$Id: sparkline.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+
+from schooltool.course.interfaces import ISection
+from zope.publisher.browser import BrowserView
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.calendar.utils import parse_date
+
+from schooltool.attendance.sparkline import AttendanceSparkline
+
+
+class AttendanceSparklineView(BrowserView):
+    """Realtime attendance view for a section"""
+
+    __used_for__ = ISection
+
+    def update(self):
+        self.section = self.context
+        person_id = self.request['person']
+        app = getSchoolToolApplication()
+        self.person = app['persons'][person_id]
+        date = self.request['date']
+        self.date = parse_date(date)
+
+    def __call__(self):
+        self.update()
+        sparkline = AttendanceSparkline(self.person, self.section, self.date)
+        self.request.response.setHeader('Content-Type', 'image/png')
+        return sparkline.renderAsPngData()
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/sparkline.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/attendance_preferences.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/attendance_preferences.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/attendance_preferences.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,81 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Attendance preferences</title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+  <form action="." method="post" tal:attributes="action request/URL"
+        class="standalone" enctype="multipart/form-data">
+
+    <h3 i18n:translate="">Attendance preferences</h3>
+
+    <div class="info" tal:condition="view/message" tal:content="view/message" />
+    <div class="error" tal:condition="view/error" tal:content="view/error" />
+    <div class="row">
+      <div class="label">
+        <label i18n:translate="">Attendance status codes</label>
+      </div>
+      <div class="field">
+        <table>
+          <tr>
+            <th i18n:translate="">Code</th>
+            <th i18n:translate="">Description</th>
+          </tr>
+          <tal:loop tal:repeat="code view/codes">
+            <tr>
+              <td>
+                <input type="text" size="5"
+                       tal:attributes="name string:key_${code/key};
+                                       value code/key" />
+              </td>
+              <td>
+                <input type="text"
+                       tal:attributes="name string:value_${code/key};
+                                       value code/value" />
+              </td>
+              <td align="right">
+                <input type="submit" value="Remove"
+                       i18:attributes="value remove-button"
+                       tal:attributes="name string:REMOVE_${code/key}"/>
+              </td>
+            </tr>
+          </tal:loop>
+          <tr>
+            <td>
+              <input type="text" size="5"
+                     tal:attributes="name string:new_key" />
+            </td>
+            <td>
+              <input type="text"
+                     tal:attributes="name string:new_value" />
+            </td>
+            <td align="right">
+              <input type="submit" value="Add"
+                     i18:attributes="value add-button"
+                     tal:attributes="name string:ADD"/>
+            </td>
+          </tr>
+        </table>
+      </div>
+    </div>
+    <div class="row" tal:define="widget nocall:view/attendanceRetroactiveTimeout_widget">
+      <div metal:use-macro="context/@@form_macros/widget_row" />
+    </div>
+    <div class="row" tal:define="widget nocall:view/homeroomTardyGracePeriod_widget">
+      <div metal:use-macro="context/@@form_macros/widget_row" />
+    </div>
+    <div class="controls">
+        <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Apply"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+
+  <a href="@@site-preferences.html" i18n:translate="">back to site preferences</a>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/attendance_preferences.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanel.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanel.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanel.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+<tal:defs define="update view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate=""
+        >Attendance Control Panel</title>
+</head>
+<body>
+
+<metal:block metal:fill-slot="content-header">
+<h2 i18n:translate="">Attendance Control Panel</h2>
+</metal:block>
+
+<metal:block metal:fill-slot="body">
+
+<form class="standalone">
+<fieldset tal:define="batch view/batch">
+  <legend i18n:translate="">Students with unresolved absences</legend>
+
+  <tal:block replace="structure view/batch/render" />
+
+  <div class="batch-search">
+    <input id="batch-search-box" type="text" name="SEARCH"
+        tal:attributes="value request/SEARCH|nothing"/>
+    <input type="submit" name="SEARCH_BUTTON" value="Find Now"
+        i18n:attributes="value"/>
+    <input type="submit" name="CLEAR_SEARCH" value="Clear"
+        i18n:attributes="value"/>
+  </div>
+
+  <table>
+    <tr>
+      <th i18n:translate="">Person</th>
+      <th i18n:translate="">Homeroom<br/>absences</th>
+      <th i18n:translate="">Section<br/>absences</th>
+    </tr>
+
+    <tr tal:repeat="item batch">
+      <td>
+        <a tal:attributes="
+            href string:${item/person/@@absolute_url}/@@attendance.html"
+            i18n:translate="" tal:content="item/title" />
+      </td>
+      <td class="num" tal:content="item/hr_absences" />
+      <td class="num" tal:content="item/section_absences" />
+    </tr>
+  </table>
+</fieldset>
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanel.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanelViewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanelViewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanelViewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4 @@
+  <a tal:attributes="href string:${view/appURL}/${view/link}"
+     tal:content="view/title"
+     i18n:domain="schooltool"
+     i18n:translate="">Title</a>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/controlpanelViewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/no_section_meeting.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/no_section_meeting.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/no_section_meeting.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,20 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate=""
+    ><span i18n:name="section" i18n:translate=""
+           tal:replace="context/label"/> attendance</title>
+</head>
+<body>
+
+<metal:block metal:fill-slot="content-header">
+<h2 i18n:translate="">Section attendance for
+  <span i18n:name="section" tal:replace="context/label" i18n:translate="" /></h2>
+</metal:block>
+
+<metal:block metal:fill-slot="body">
+
+<p i18n:translate="">This section has no meetings today.</p>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/no_section_meeting.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/real_time.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/real_time.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/real_time.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,98 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate=""
+    ><span i18n:name="section" i18n:translate=""
+           tal:replace="context/label"/> attendance</title>
+</head>
+<body>
+
+<metal:block metal:fill-slot="content-header">
+<h2 tal:condition="view/homeroom" i18n:translate="">Homeroom attendance for
+  <span i18n:name="section" tal:replace="context/label" i18n:translate="" />
+  at <span i18n:name="date" tal:replace="view/date" />
+  period <span i18n:name="period_id" tal:replace="view/period_id" /></h2>
+<h2 tal:condition="not:view/homeroom" i18n:translate="">Section attendance for
+  <span i18n:name="section" tal:replace="context/label" i18n:translate="" />
+  at <span i18n:name="date" tal:replace="view/date" />
+  period <span i18n:name="period_id" tal:replace="view/period_id" /></h2>
+</metal:block>
+
+<metal:block metal:fill-slot="body">
+<form tal:attributes="action request/URL" method="POST">
+
+<input type="hidden" name="date" tal:attributes="value view/date" />
+<input type="hidden" name="period_id" tal:attributes="value view/period_id" />
+
+<div class="error" tal:condition="view/error" tal:content="view/error"
+     i18n:translate="">
+</div>
+
+<div class="attendance-legend">
+  <h3 i18n:translate="">Legend</h3>
+  <p i18n:translate="">
+  The sparkline (the little graph next to each student's name) shows the
+  student's attendance for the last ten schooldays section had meetings on.  If
+  attendance status for a day is unknown the sparkline shows a dot. The whisker
+  points upwards if the student was present during the homeroom period. An
+  unexplained absence for a meeting is coloured red, and an unexplained absence
+  for homeroom period is yellow.
+  </p>
+  <p i18n:translate="">The student names are colored according to
+  their attendance during today:</p>
+  <ul>
+    <li class="attendance-clear">no records</li>
+    <li class="attendance-present">present</li>
+    <li class="attendance-explained">was absent with explanation
+        earlier today</li>
+    <li class="attendance-absent">was absent without explanation</li>
+    <li class="attendance-alert">was present and absent earlier today</li>
+  </ul>
+</div>
+
+<table class="attendance-table">
+  <tr>
+    <th>&nbsp;</th>
+    <th i18n:translate="">Name</th>
+    <th i18n:translate="">Status</th>
+  </tr>
+
+  <tal:loop repeat="info view/listMembers">
+  <tr class="attendance-row"
+      tal:define="check_id python:'%s_check' % info.name">
+    <td>
+      <input type="checkbox"
+             tal:attributes="
+                  name check_id;
+                  id check_id;
+                  disabled info/disabled;
+                  checked python:view.error and check_id in request"/>
+    </td>
+    <td tal:attributes="class info/color">
+       <label tal:attributes="for check_id"
+              tal:content="info/title">Name</label>
+    </td>
+    <td>
+      <img alt="attendance graph for the last 10 days" i18n:attributes="alt"
+           width="30" height="13" tal:attributes="src info/sparkline_url" />
+      <span tal:replace="info/symbol" />
+    </td>
+  </tr>
+  </tal:loop>
+</table>
+
+<div class="controls">
+  <input type="submit" name="ABSENT" value="Mark as absent"
+         i18n:attributes="value" tal:condition="view/unknowns" />
+  <tal:block condition="not:view/unknowns">
+  <input type="submit" name="TARDY" value="Make tardy"
+         i18n:attributes="value" />
+  <label for="arrival" i18n:translate="">Minutes late:</label>
+  <input type="text" id="arrival" name="arrival"
+       tal:attributes="value python:view.error and request['arrival'] or ''"/>
+  </tal:block>
+</div>
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/real_time.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/retro.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/retro.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/retro.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,93 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate=""
+    ><span i18n:name="section" i18n:translate=""
+           tal:replace="context/label"/> attendance</title>
+</head>
+<body>
+
+<metal:block metal:fill-slot="content-header">
+<h2 tal:condition="view/homeroom" i18n:translate="">Homeroom attendance for
+  <span i18n:name="section" tal:replace="context/label" i18n:translate="" />
+  at <span i18n:name="date" tal:replace="view/date" />
+  period <span i18n:name="period_id" tal:replace="view/period_id" /></h2>
+<h2 tal:condition="not:view/homeroom" i18n:translate="">Section attendance for
+  <span i18n:name="section" tal:replace="context/label" i18n:translate="" />
+  at <span i18n:name="date" tal:replace="view/date" />
+  period <span i18n:name="period_id" tal:replace="view/period_id" /></h2>
+</metal:block>
+
+<metal:block metal:fill-slot="body">
+<form tal:attributes="action request/URL" method="POST">
+
+<input type="hidden" name="date" tal:attributes="value view/date" />
+<input type="hidden" name="period_id" tal:attributes="value view/period_id" />
+
+<div class="error" tal:condition="view/error" tal:content="view/error"
+     i18n:translate="">
+</div>
+
+<p i18n:translate="">For Tardy, enter a number of minutes late. This
+  field is optional.</p>
+
+<table class="attendance-table">
+  <tr class="attendance-retro-row">
+    <th i18n:translate="" class="first">Name</th>
+    <th i18n:translate="" class="other">Present</th>
+    <th i18n:translate="" class="other">Absent</th>
+    <th i18n:translate="" class="other">Tardy, mins late/arrival time</th>
+  </tr>
+
+  <tal:loop repeat="info view/listMembers">
+  <tr class="attendance-retro-row"
+      tal:define="map python:{'-': 'A', '+': 'P', 'T': 'T', ' ': 'P'};
+           default python:map[info.symbol];
+           value python:request.form.get(info.name, default);
+           disabled python:info.symbol != ' '">
+    <td tal:attributes="class info/color" class="first">
+       <label tal:content="info/title"
+              tal:attributes="class python:disabled and 'disabled' or None">
+          Name
+       </label>
+    </td>
+    <td class="other">
+      <input type="radio" value="P"
+             tal:attributes="name info/name;
+                             disabled disabled;
+                             checked python:value == 'P' or None"/>
+    </td>
+    <td class="other">
+      <input type="radio" value="A"
+             tal:attributes="name info/name;
+                             disabled disabled;
+                             checked python:value == 'A' or None"/>
+    </td>
+    <td tal:define="error python:view.arrival_errors.get(info.name)"
+        tal:attributes="class python: error and 'other error' or 'other'">
+      <input type="radio" value="T"
+             tal:attributes="name info/name;
+                             disabled disabled;
+                             checked python:value == 'T' or None"/>
+      <input type="text"
+             tal:define="name string:${info/name}_tardy;
+                         default python:info.arrival_time
+                                 and info.arrival_time.strftime('%H:%M')"
+             tal:attributes="name name;
+                             disabled disabled;
+                             value python:request.get(name, default)"/>
+      <p tal:condition="error" tal:content="error" class="error"
+         i18n:translate=""/>
+    </td>
+  </tr>
+  </tal:loop>
+</table>
+
+<div class="controls">
+  <input type="submit" name="SUBMIT" value="Submit" class="button-ok"
+         i18n:attributes="value"/>
+</div>
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/retro.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5 @@
+<a tal:define="href view/attendanceLink"
+   tal:condition="href"
+   tal:attributes="href href"
+   i18n:translate=""
+   i18n:domain="schooltool">Attendance</a>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/student-attendance.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/student-attendance.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/student-attendance.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,168 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate=""
+    >Attendance of <span i18n:name="person" i18n:translate=""
+           tal:replace="context/title"/></title>
+</head>
+<body>
+
+<metal:block metal:fill-slot="content-header">
+<h2 i18n:translate="">Attendance of <span i18n:name="person"
+    tal:replace="context/title" /></h2>
+</metal:block>
+
+<metal:block metal:fill-slot="body"
+             tal:define="unresolved_absences
+                            python:list(view.unresolvedAbsencesForDisplay());
+                         unresolved_explained_absences
+                            python: [ar for ar in unresolved_absences
+                                     if ar['explanation']];
+                         unresolved_unexplained_absences
+                            python: [ar for ar in unresolved_absences
+                                     if not ar['explanation']];">
+
+<div class="info" tal:repeat="status view/statuses"
+     tal:content="status" i18n:translate="">
+  (status message)
+</div>
+<div class="error" tal:repeat="error view/errors"
+     tal:content="error" i18n:translate="">
+  (error message)
+</div>
+
+<tal:else condition="not:unresolved_absences">
+<p i18n:translate="">There are no unresolved absences.</p>
+</tal:else>
+
+<tal:if_there_are_any_explained condition="unresolved_explained_absences">
+
+<form id="attendance_explain_resolve" action="." method="post"
+      tal:attributes="action request/URL">
+
+<h3 i18n:translate="">Unresolved explained absences</h3>
+
+<div class="attendance_record"
+     tal:repeat="absence unresolved_explained_absences">
+  <input type="checkbox" tal:attributes="name absence/id; id absence/id" />
+  <label tal:attributes="for absence/id" tal:content="absence/text"
+         i18n:translate="" />
+  <div class="explanation" tal:content="absence/explanation">
+    (explanation)
+  </div>
+</div>
+
+<div class="row">
+  <div class="row" tal:define="widget nocall:view/code_widget">
+    <div metal:use-macro="context/@@form_macros/widget_row" />
+  </div>
+</div>
+
+<div class="row">
+  <div><input type="radio" name="resolve" id="do_not_resolve" value=""
+              checked="checked" />
+  <label for="do_not_resolve">Do not resolve</label>
+  </div>
+  <div><input type="radio" name="resolve" id="accept" value="accept" />
+  <label for="accept">Accept</label>
+  </div>
+  <div><input type="radio" name="resolve" id="reject" value="reject" />
+  <label for="reject">Reject</label>
+  </div>
+</div>
+
+<div class="controls">
+  <input type="submit" class="button-ok" name="UPDATE" value="Update" />
+</div>
+
+</form>
+</tal:if_there_are_any_explained>
+
+<tal:if_there_are_any_unexplained condition="unresolved_unexplained_absences">
+
+<form id="attendance_explain_resolve" action="." method="post"
+      tal:attributes="action request/URL">
+
+<h3 i18n:translate="">Unresolved unexplained absences</h3>
+
+<div class="attendance_record"
+     tal:repeat="absence unresolved_unexplained_absences">
+  <input type="checkbox" tal:attributes="name absence/id; id absence/id" />
+  <label tal:attributes="for absence/id" tal:content="absence/text"
+         i18n:translate="" />
+</div>
+
+<div class="row">
+  <div class="label">
+  <label for="explanation">Add an explanation<label>
+  </div>
+  <div class="field">
+  <textarea id="explanation" name="explanation" cols="60" rows="5"></textarea>
+  </div>
+</div>
+<div class="row">
+  <div class="row" tal:define="widget nocall:view/code_widget">
+    <div metal:use-macro="context/@@form_macros/widget_row" />
+  </div>
+</div>
+<div class="row">
+  <div><input type="radio" name="resolve" id="do_not_resolve" value=""
+              checked="checked" />
+  <label for="do_not_resolve">Do not resolve</label>
+  </div>
+  <div><input type="radio" name="resolve" id="accept" value="accept" />
+  <label for="accept">Accept</label>
+  </div>
+  <div><input type="radio" name="resolve" id="reject" value="reject" />
+  <label for="reject">Reject</label>
+  </div>
+  <div><input type="radio" name="resolve" id="tardy" value="tardy" />
+  <label for="tardy">Make Tardy</label> <input type="text" name="tardy_time" />
+  </div>
+  <div class="error" tal:condition="view/tardy_error"
+       tal:content="view/tardy_error" i18n:translate="" />
+</div>
+
+<div class="controls">
+  <input type="submit" class="button-ok" name="UPDATE" value="Update" />
+</div>
+
+</form>
+</tal:if_there_are_any_unexplained>
+
+<tal:summary_by_term define="terms python:list(view.summaryPerTerm())">
+<h2 i18n:translate="">Summary</h2>
+
+<p i18n:translate="" tal:condition="not:terms">There are no terms defined.</p>
+
+<table class="attendance_summary_per_term" tal:condition="terms">
+<tr><th i18n:translate="" rowspan="2">Term</th><th colspan="2">Homeroom attendance</th><th colspan="2">Section attendance</th></tr>
+<tr><th i18n:translate="">Absences</th><th i18n:translate="">Tardies</th><th i18n:translate="">Absences</th><th i18n:translate="">Tardies</th></tr>
+<tr tal:repeat="term terms">
+  <td><a tal:attributes="href string:?term=${term/name}" tal:content="term/title">(term)</a></td>
+  <td class="number" tal:content="term/homeroom_absences">(h_a)</td>
+  <td class="number" tal:content="term/homeroom_tardies">(h_t)</td>
+  <td class="number" tal:content="term/section_absences">(s_a)</td>
+  <td class="number" tal:content="term/section_tardies">(s_t)</td>
+</tr>
+</table>
+
+<tal:if_detailed_summary_wanted define="term view/term_for_detailed_summary"
+                                condition="term">
+<h2 tal:content="term/title">(term)</h2>
+<tal:block tal:define="absences python:view.absencesForTerm(term)">
+<ul tal:condition="absences">
+  <li tal:repeat="absence absences"
+      tal:content="absence"
+      i18n:translate="" />
+</ul>
+<tal:else condition="not:absences">
+<p i18n:translate="">There were no absences in this term.</p>
+</tal:else>
+</tal:block>
+</tal:if_detailed_summary_wanted>
+
+</tal:summary_by_term>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/templates/student-attendance.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_attendance.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_attendance.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_attendance.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3208 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for SchoolTool attendance views
+
+$Id: test_attendance.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+
+import unittest
+import datetime
+import itertools
+import logging
+from pprint import pprint
+
+from pytz import utc, timezone
+from zope.testing import doctest
+from zope.app.testing import ztapi, setup
+from zope.publisher.browser import TestRequest
+from zope.interface import implements, Interface
+from zope.component import adapts, provideAdapter
+from zope.app.testing.setup import setUpAnnotations
+from zope.i18n import translate
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.attendance.interfaces import IAttendancePreferences
+from schooltool.common import DateRange
+from schooltool.timetable import ICompositeTimetables
+from schooltool.timetable import TimetableActivity
+from schooltool.timetable.model import TimetableCalendarEvent
+from schooltool.calendar.simple import ImmutableCalendar
+from schooltool.calendar.simple import SimpleCalendarEvent
+from schooltool.calendar.utils import utcnow, stub_utcnow
+from schooltool.course.interfaces import ISection
+from schooltool.testing.util import fakePath
+from schooltool.relationship.tests import setUpRelationships
+from schooltool.attendance.tests import stubProcessDefinition
+from schooltool.attendance.interfaces import NEW, ACCEPTED, REJECTED
+from schooltool.attendance.interfaces import PRESENT, ABSENT, TARDY, UNKNOWN
+from schooltool.attendance.interfaces import IHomeroomAttendance
+from schooltool.attendance.interfaces import ISectionAttendance
+from schooltool.attendance.interfaces import IHomeroomAttendanceRecord
+from schooltool.attendance.interfaces import ISectionAttendanceRecord
+from schooltool.attendance.interfaces import AttendanceError
+from schooltool import SchoolToolMessage as _
+
+
+some_dt = datetime.datetime(2006, 4, 14, 12, 13, tzinfo=utc)
+
+
+class TermStub(object):
+    def __init__(self, y, m1, d1, m2, d2):
+        self.first = datetime.date(y, m1, d1)
+        self.last = datetime.date(y, m2, d2)
+    def __str__(self):
+        return '<TermStub: %s..%s>' % (self.first, self.last)
+
+
+class AttendancePreferencesStub(object):
+    adapts(ISchoolToolApplication)
+    implements(IAttendancePreferences)
+    def __init__(self):
+        self.attendanceRetroactiveTimeout = 60
+        self.attendanceStatusCodes = {'001': 'excused', '002': 'unexcused'}
+        self.homeroomTardyGracePeriod = 5
+
+
+class SchoolToolApplicationStub(object):
+    adapts(None)
+    implements(ISchoolToolApplication)
+    _terms = {'2004-fall': TermStub(2004, 9, 1, 12, 22),
+              '2005-spring': TermStub(2005, 2, 1, 5, 21),
+              '2005-fall': TermStub(2005, 9, 1, 12, 22),
+              '2006-spring': TermStub(2006, 2, 1, 5, 21)}
+    _attendancePrefs = AttendancePreferencesStub()
+    def __init__(self, context):
+        pass
+    def __getitem__(self, name):
+        return {'terms': self._terms}[name]
+    def __conform__(self, it):
+        if it is IAttendancePreferences:
+            return self._attendancePrefs
+
+
+class ApplicationPreferencesStub(object):
+    adapts(ISchoolToolApplication)
+    implements(IApplicationPreferences)
+    timezone = 'UTC'
+    def __init__(self, context):
+        pass
+
+
+class TimetableDayStub(object):
+    def __init__(self, periods, homeroom_period_ids):
+        self.periods = periods
+        self.homeroom_period_ids = homeroom_period_ids
+
+
+class TimetableStub(object):
+    def __init__(self, days):
+        self._days = days
+    def __getitem__(self, day_id):
+        return self._days[day_id]
+
+
+class TimetableActivityStub(object):
+    def __init__(self, timetable, title):
+        self.timetable = timetable
+        self.title = title
+
+
+class StubCalendar(object):
+
+    adapts(Interface)
+    implements(ISchoolToolCalendar)
+
+    def __init__(self, context):
+        self.context = context
+        self._tt = TimetableStub({
+                        'D1': TimetableDayStub(['A', 'D'], []),
+                        'D2': TimetableDayStub(['B', 'C'], ['B']),
+                   })
+
+    def __iter__(self):
+        events = [
+            TimetableCalendarEvent(
+                datetime.datetime(2005, 12, 14, 10, 00, tzinfo=utc),
+                datetime.timedelta(minutes=45),
+                "Math", day_id='D1', period_id="A",
+                activity=TimetableActivityStub(self._tt, "Math")),
+            TimetableCalendarEvent(
+                datetime.datetime(2005, 12, 14, 11, 00, tzinfo=utc),
+                datetime.timedelta(minutes=45),
+                "Arts", day_id='D1', period_id="D",
+                activity=TimetableActivityStub(self._tt, "Arts")),
+            TimetableCalendarEvent(
+                datetime.datetime(2005, 12, 15, 10, 00, tzinfo=utc),
+                datetime.timedelta(minutes=45),
+                "Math", day_id='D2', period_id="B",
+                activity=TimetableActivityStub(self._tt, "Math")),
+            TimetableCalendarEvent(
+                datetime.datetime(2005, 12, 15, 11, 00, tzinfo=utc),
+                datetime.timedelta(minutes=45),
+                "Arts", day_id='D2', period_id="C",
+                activity=TimetableActivityStub(self._tt, "Arts")),
+            ]
+        return iter(events)
+
+
+class StubTimetables(object):
+    adapts(Interface)
+    implements(ICompositeTimetables)
+    def __init__(self, context):
+        self.context = context
+
+    def makeTimetableCalendar(self, first, last):
+        calendar = StubCalendar(self.context)
+        return ImmutableCalendar([e for e in calendar
+                                  if first <= e.dtstart.date() <= last])
+
+
+class BaseAttendanceRecordStub(object):
+    explanations = ()
+    def __init__(self, section, dt, status, person=None, explained=False):
+        self.section = section
+        self.date = dt.date()
+        self.late_arrival = dt + datetime.timedelta(minutes=15)
+        self.datetime = dt
+        self.status = status
+        self._explained = explained
+    def isAbsent(self): return self.status == ABSENT
+    def isTardy(self): return self.status == TARDY
+    def isExplained(self): return self._explained
+
+    def _raiseError(self, *args):
+        raise AttendanceError("An error")
+
+    def acceptExplanation(self, code):
+        print "Accepted explanation"
+
+
+class SectionAttendanceRecordStub(BaseAttendanceRecordStub):
+    implements(ISectionAttendanceRecord)
+
+
+class HomeroomAttendanceRecordStub(BaseAttendanceRecordStub):
+    implements(IHomeroomAttendanceRecord)
+
+
+class AttendanceStub(object):
+
+    def __init__(self, person):
+        self.person = person
+        self._records = getattr(person, self.attribute, [])
+
+    def __iter__(self):
+        return iter(self._records)
+
+    def filter(self, first, last):
+        status = itertools.cycle([PRESENT, ABSENT, TARDY, PRESENT])
+        sections = itertools.cycle([SectionStub('math42'),
+                                    SectionStub('grammar3'),
+                                    SectionStub('relativity97')])
+        time = datetime.time(9, 30)
+        midpoint = first + (last - first) / 2
+        return [self.factory(sections.next(),
+                             utc.localize(datetime.datetime.combine(day, time)),
+                             status.next(), day < midpoint)
+                for day in DateRange(first, last)]
+
+    def record(self, section, datetime, duration, period_id, present):
+        print 'Recording: %s -> %s' % (self.get(section, datetime), present)
+
+    def get(self, section, datetime):
+        return self.template % (self.person, datetime, section)
+
+    def getAllForDay(self, date):
+        return [self.template % (self.person, date, c) for c in 'a', 'b']
+
+
+class SectionAttendanceStub(AttendanceStub):
+    adapts(None)
+    implements(ISectionAttendance)
+
+    factory = SectionAttendanceRecordStub
+    template = 's_%s_%s_%s'
+    attribute = '_section_attendance_records'
+
+
+class HomeroomAttendanceStub(AttendanceStub):
+    adapts(None)
+    implements(IHomeroomAttendance)
+
+    factory = HomeroomAttendanceRecordStub
+    template = 'h_%s_%s_%s'
+    attribute = '_homeroom_attendance_records'
+
+
+class CalendarEventViewletManagerStub(object):
+    pass
+
+
+class EventForDisplayStub(object):
+    def __init__(self, event, tz=utc):
+        self.context = event
+        self.dtstarttz = event.dtstart.astimezone(tz)
+
+
+class SectionStub(object):
+    implements(ISection)
+
+    members = ()
+
+    def __init__(self, title='a_section'):
+        self.__name__ = title
+        self._title = title
+
+    @property
+    def label(self):
+        return _('$title', mapping={'title': self._title})
+
+
+class PersonStub(object):
+    pass
+
+
+def print_and_return_True(text):
+    def inner(*args):
+        print text
+        return True
+    return inner
+
+
+def print_and_return_False(text):
+    def inner(*args):
+        print text
+        return False
+    return inner
+
+
+def setUpAttendanceAdapters():
+    from schooltool.attendance.attendance import getSectionAttendance
+    from schooltool.attendance.attendance import getHomeroomAttendance
+    from schooltool.person.interfaces import IPerson
+    ztapi.provideAdapter(IPerson, ISectionAttendance, getSectionAttendance)
+    ztapi.provideAdapter(IPerson, IHomeroomAttendance, getHomeroomAttendance)
+
+
+def doctest_AttendancePreferencesView():
+    r"""Test for AttendancePreferencesView.
+
+    We need to setup a SchoolToolApplication site:
+
+        >>> app = ISchoolToolApplication(None)
+        >>> prefs = IAttendancePreferences(app)
+        >>> from zope.app.form.interfaces import IInputWidget
+        >>> from zope.app.form.browser.textwidgets import IntWidget
+        >>> from zope.schema.interfaces import IInt
+        >>> ztapi.browserViewProviding(IInt, IntWidget, IInputWidget)
+
+    Make sure we can create a view:
+
+        >>> request = TestRequest()
+        >>> from schooltool.attendance.browser.attendance import AttendancePreferencesView
+        >>> view = AttendancePreferencesView(app, request)
+
+    Check setting retroactive timeout and homeroom tardy grace period values:
+
+        >>> prefs.attendanceRetroactiveTimeout
+        60
+        >>> prefs.homeroomTardyGracePeriod
+        5
+        >>> request = TestRequest(form={
+        ...     'UPDATE_SUBMIT': 'Update',
+        ...     'field.attendanceRetroactiveTimeout': '10',
+        ...     'field.homeroomTardyGracePeriod': '1'})
+        >>> view = AttendancePreferencesView(app, request)
+        >>> view.update()
+        >>> prefs.attendanceRetroactiveTimeout
+        10
+        >>> prefs.homeroomTardyGracePeriod
+        1
+
+    Restore original values:
+
+        >>> prefs.attendanceRetroactiveTimeout = 60
+        >>> prefs.homeroomTardyGracePeriod = 5
+
+    Now we can setup a post and add/edit/remove codes:
+
+        >>> def printCodes():
+        ...     print '\n'.join(map(str, sorted(prefs.attendanceStatusCodes.items())))
+
+        >>> printCodes()
+        ('001', 'excused')
+        ('002', 'unexcused')
+
+        >>> request = TestRequest(form={
+        ...     'UPDATE_SUBMIT': 'Update',
+        ...     'key_002': '003',
+        ...     'value_002': 'discarded'})
+        >>> view = AttendancePreferencesView(app, request)
+        >>> view.update()
+        >>> printCodes()
+        ('001', 'excused')
+        ('003', 'discarded')
+
+        >>> request = TestRequest(form={
+        ...     'ADD': 'Add',
+        ...     'new_key': '404',
+        ...     'new_value': 'discarded'})
+        >>> view = AttendancePreferencesView(app, request)
+        >>> view.update()
+        >>> printCodes()
+        ('001', 'excused')
+        ('003', 'discarded')
+        >>> view.error
+        'Description fields must be unique'
+
+        >>> request = TestRequest(form={
+        ...     'ADD': 'Add',
+        ...     'new_key': '404',
+        ...     'new_value': 'not found'})
+        >>> view = AttendancePreferencesView(app, request)
+        >>> view.update()
+        >>> printCodes()
+        ('001', 'excused')
+        ('003', 'discarded')
+        ('404', 'not found')
+
+        >>> request = TestRequest(form={
+        ...     'REMOVE_003': 'Remove'})
+        >>> view = AttendancePreferencesView(app, request)
+        >>> view.update()
+        >>> printCodes()
+        ('001', 'excused')
+        ('404', 'not found')
+
+    """
+
+
+def doctest_getCurrentSectionMeeting():
+    r"""Doctest for getCurrentSectionMeeting
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...     import getCurrentSectionMeeting
+
+        >>> section = StubTimetables(None)
+
+    On a day with no meetings you get None
+
+        >>> dt = utc.localize(datetime.datetime(2005, 12, 12, 9, 30))
+        >>> print getCurrentSectionMeeting(section, dt)
+        None
+
+    The timetable for 2005-12-14 looks like this:
+
+        >>> date = datetime.date(2005, 12, 14)
+        >>> for ev in section.makeTimetableCalendar(date, date):
+        ...     dtend = ev.dtstart + ev.duration
+        ...     print '%s--%s %s' % (ev.dtstart.strftime('%Y-%m-%d %H:%M'),
+        ...                          dtend.strftime('%H:%M'), ev.title)
+        2005-12-14 10:00--10:45 Math
+        2005-12-14 11:00--11:45 Arts
+
+    Let's poke around then
+
+        >>> datetimes = []
+        >>> for time in ('9:30, 10:00, 10:30, 10:45, '
+        ...              '10:50, 11:00, 11:30, 11:45, 11:50').split(', '):
+        ...     h, m = map(int, time.split(':'))
+        ...     dt = utc.localize(datetime.datetime(2005, 12, 14, h, m))
+        ...     datetimes.append(dt)
+
+        >>> for dt in datetimes:
+        ...     ev = getCurrentSectionMeeting(section, dt)
+        ...     print '%s %s' % (dt.strftime('%H:%M'), ev.title)
+        09:30 Math
+        10:00 Math
+        10:30 Math
+        10:45 Arts
+        10:50 Arts
+        11:00 Arts
+        11:30 Arts
+        11:45 Arts
+        11:50 Arts
+
+    Same thing happens if you change the ordering of events returned by
+    makeTimetableCalendar:
+
+        >>> section.makeTimetableCalendar = lambda *a: \
+        ...     reversed(list(StubTimetables(None).makeTimetableCalendar(*a)))
+
+        >>> for dt in datetimes:
+        ...     ev = getCurrentSectionMeeting(section, dt)
+        ...     print '%s %s' % (dt.strftime('%H:%M'), ev.title)
+        09:30 Math
+        10:00 Math
+        10:30 Math
+        10:45 Arts
+        10:50 Arts
+        11:00 Arts
+        11:30 Arts
+        11:45 Arts
+        11:50 Arts
+
+    And what if you have overlapping periods?
+
+        >>> section.makeTimetableCalendar = lambda *a: ImmutableCalendar([
+        ...     TimetableCalendarEvent(
+        ...         datetime.datetime(2005, 12, 14, 10, 00, tzinfo=utc),
+        ...         datetime.timedelta(minutes=45),
+        ...         "Math", day_id='D1', period_id="A",
+        ...         activity=None),
+        ...     TimetableCalendarEvent(
+        ...         datetime.datetime(2005, 12, 14, 10, 45, tzinfo=utc),
+        ...         datetime.timedelta(minutes=15),
+        ...         "Lunch break", day_id='D1', period_id="B",
+        ...         activity=None),
+        ...     TimetableCalendarEvent(
+        ...         datetime.datetime(2005, 12, 14, 11, 00, tzinfo=utc),
+        ...         datetime.timedelta(minutes=45),
+        ...         "Arts", day_id='D1', period_id="D",
+        ...         activity=None),
+        ...     TimetableCalendarEvent(
+        ...         datetime.datetime(2005, 12, 14, 11, 40, tzinfo=utc),
+        ...         datetime.timedelta(minutes=45),
+        ...         "Noise", day_id='D1', period_id="Q",
+        ...         activity=None),
+        ...     ])
+
+        >>> for ev in section.makeTimetableCalendar(date, date):
+        ...     dtend = ev.dtstart + ev.duration
+        ...     print '%s--%s %s' % (ev.dtstart.strftime('%Y-%m-%d %H:%M'),
+        ...                          dtend.strftime('%H:%M'), ev.title)
+        2005-12-14 10:00--10:45 Math
+        2005-12-14 10:45--11:00 Lunch break
+        2005-12-14 11:00--11:45 Arts
+        2005-12-14 11:40--12:25 Noise
+
+        >>> for dt in datetimes:
+        ...     ev = getCurrentSectionMeeting(section, dt)
+        ...     print '%s %s' % (dt.strftime('%H:%M'), ev.title)
+        09:30 Math
+        10:00 Math
+        10:30 Math
+        10:45 Lunch break
+        10:50 Lunch break
+        11:00 Arts
+        11:30 Arts
+        11:45 Noise
+        11:50 Noise
+
+    What if you use outlandish timezones, and cross the date line?
+
+        >>> tokyo = timezone('Pacific/Rarotonga')
+        >>> dt = datetimes[0].astimezone(tokyo)
+
+        >>> dt.astimezone(utc) == datetimes[0]
+        True
+        >>> dt.date() != datetimes[0].date()
+        True
+
+        >>> for dt in datetimes:
+        ...     ev = getCurrentSectionMeeting(section, dt.astimezone(tokyo))
+        ...     print '%s %s' % (dt.strftime('%H:%M'), ev.title)
+        09:30 Math
+        10:00 Math
+        10:30 Math
+        10:45 Lunch break
+        10:50 Lunch break
+        11:00 Arts
+        11:30 Arts
+        11:45 Noise
+        11:50 Noise
+
+    """
+
+
+def doctest_getPeriodEventForSection():
+    r"""Doctest for getPeriodEventForSection
+
+    When traversing to the realtime attendance form, we want to verify
+    that the section has the given period takes place on the given
+    date.  We have a utility function for that:
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...     import getPeriodEventForSection
+
+        >>> section = StubTimetables(None)
+
+    Now we can try our helper function:
+
+        >>> for date in [datetime.date(2005, 12, d) for d in (14, 15, 16)]:
+        ...     for period_id in 'A', 'B', 'C', 'D':
+        ...         result = getPeriodEventForSection(section, date, period_id)
+        ...         print date, period_id, result and result.dtstart
+        2005-12-14 A 2005-12-14 10:00:00+00:00
+        2005-12-14 B None
+        2005-12-14 C None
+        2005-12-14 D 2005-12-14 11:00:00+00:00
+        2005-12-15 A None
+        2005-12-15 B 2005-12-15 10:00:00+00:00
+        2005-12-15 C 2005-12-15 11:00:00+00:00
+        2005-12-15 D None
+        2005-12-16 A None
+        2005-12-16 B None
+        2005-12-16 C None
+        2005-12-16 D None
+
+    """
+
+
+def doctest_AttendanceCalendarEventViewlet():
+    r"""Tests for AttendanceCalendarEventViewlet
+
+    Set up security:
+
+        >>> from zope.app.security.settings import PermissionSetting
+        >>> class FakePermissionManager:
+        ...     setting = PermissionSetting('Allow')
+        ...     def __init__(self, context):
+        ...         pass
+        ...     def getPermissionsForPrincipal(self, principalid):
+        ...         if principalid == 'manager':
+        ...             return [('schooltool.viewAttendance', self.setting)]
+        ...         return []
+        >>> class FakePrincipal:
+        ...     id = 'manager'
+
+        >>> from zope.app.securitypolicy.interfaces import IPrincipalPermissionManager
+        >>> ztapi.provideAdapter(ISection, IPrincipalPermissionManager,
+        ...                      FakePermissionManager)
+
+    Create viewlet:
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...     import AttendanceCalendarEventViewlet
+        >>> viewlet = AttendanceCalendarEventViewlet()
+        >>> viewlet.request = TestRequest()
+        >>> viewlet.request._principal = FakePrincipal()
+
+    Viewlets have a ``manager`` attribute that points to the viewlet manager.
+
+        >>> viewlet.manager = CalendarEventViewletManagerStub()
+
+    CalendarEventViewletManagerStub exports an ``event`` attribute, which
+    provides IEventForDisplay.  Section meeting events are all
+    ITimetableCalendarEvent.
+
+        >>> section = SectionStub()
+        >>> fakePath(section, u'/sections/math4a')
+        >>> activity = TimetableActivity(title="Math", owner=section)
+        >>> section_event = TimetableCalendarEvent(
+        ...     datetime.datetime(2005, 12, 16, 16, 15, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45),
+        ...     "Math", day_id='D3', period_id="P4", activity=activity)
+        >>> viewlet.manager.event = EventForDisplayStub(section_event)
+
+    The viewlet knows how to compute a link to the section attendance form
+
+        >>> viewlet.attendanceLink()
+        'http://127.0.0.1/sections/math4a/attendance/2005-12-16/P4'
+
+    The date in the link depends on the configured timezone
+
+        >>> tokyo = timezone('Asia/Tokyo')
+        >>> viewlet.manager.event = EventForDisplayStub(section_event, tokyo)
+        >>> viewlet.manager.event.dtstarttz
+        datetime.datetime(2005, 12, 17, 1, 15, ...)
+        >>> viewlet.attendanceLink()
+        'http://127.0.0.1/sections/math4a/attendance/2005-12-17/P4'
+
+    If the event is not a section meeting event, the link is empty
+
+        >>> person = PersonStub()
+        >>> activity = TimetableActivity(title="Math study", owner=person)
+        >>> nonsection_event = TimetableCalendarEvent(
+        ...     datetime.datetime(2005, 12, 16, 16, 15, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45),
+        ...     activity.title, day_id='D3', period_id="P3", activity=activity)
+        >>> viewlet.manager.event = EventForDisplayStub(nonsection_event)
+        >>> viewlet.attendanceLink()
+
+    The link is also empty if the event is not a timetable event.
+
+        >>> random_event = SimpleCalendarEvent(
+        ...     datetime.datetime(2005, 12, 16, 16, 15, tzinfo=utc),
+        ...     datetime.timedelta(minutes=15),
+        ...     "Snacks")
+        >>> viewlet.manager.event = EventForDisplayStub(random_event)
+        >>> viewlet.attendanceLink()
+
+    """
+
+
+def doctest_AttendanceView():
+    r"""Tests for AttendanceView.
+
+        >>> from schooltool.attendance.browser.attendance import AttendanceView
+        >>> request = TestRequest()
+        >>> view = AttendanceView(None, request)
+
+    Calling the view during or before the section meeting should
+    update the form and render the realtime template:
+
+        >>> def update():
+        ...     print "Updated form."
+        >>> def realtime_template():
+        ...     return "The real-time template"
+        >>> view.update = update
+        >>> view.realtime_template = realtime_template
+        >>> view.sectionMeetingFinished = lambda: False
+        >>> view.verifyParameters = lambda: True
+
+        >>> view()
+        Updated form.
+        'The real-time template'
+
+    Calling the view some time after the section meeting should
+    update the form and render the retroactive template:
+
+        >>> def retro_update():
+        ...     print "Updated retro form."
+        >>> def retro_template():
+        ...     return "The retro template"
+        >>> view.retro_update = retro_update
+        >>> view.retro_template = retro_template
+        >>> view.sectionMeetingFinished = lambda: True
+
+        >>> view()
+        Updated retro form.
+        'The retro template'
+
+    Unless verifyParameters raises NoSectionMeetingToday exception:
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...      import NoSectionMeetingToday
+        >>> def verify_parameters():
+        ...     raise NoSectionMeetingToday
+        >>> view.verifyParameters = verify_parameters
+        >>> def nsmt_template():
+        ...     return "The nsmt template"
+        >>> view.no_section_meeting_today_template = nsmt_template
+
+        >>> view()
+        'The nsmt template'
+
+    """
+
+
+def doctest_AttendanceView_listMembers():
+    r"""Test for AttendanceView.listMembers
+
+    First, let's register getSectionAttendance as an adapter:
+
+        >>> setUpAttendanceAdapters()
+
+    We'll need timetabling too:
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, StubTimetables)
+
+    Let's set up a view:
+
+        >>> from schooltool.attendance.browser.attendance import \
+        ...     AttendanceView, getPeriodEventForSection
+        >>> from schooltool.course.section import Section
+        >>> section = Section()
+        >>> fakePath(section, '/section/absentology')
+        >>> view = AttendanceView(section, TestRequest())
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date,
+        ...                                         view.period_id)
+        >>> view.homeroom = False
+
+    If the section does not have any members, listMembers returns an
+    empty list:
+
+        >>> view.listMembers()
+        []
+
+    Let's add some students:
+
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person, PersonContainer
+        >>> person1 = Person('person1', title='Person1')
+        >>> person2 = Person('person2', title='Person2')
+        >>> person3 = Person('person3', title='Person3')
+        >>> person4 = Person('person4', title='Person4')
+
+        >>> persons = PersonContainer()
+        >>> persons[''] = person1
+        >>> persons[''] = person2
+        >>> persons[''] = person3
+        >>> persons[''] = person4
+
+        >>> section.members.add(person1)
+        >>> section.members.add(person2)
+
+
+    These members should appear in the output
+
+        >>> pprint(view.listMembers())
+        [RealtimeInfo(u'person1', 'Person1', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person1&date=2005-12-15'),
+         RealtimeInfo(u'person2', 'Person2', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person2&date=2005-12-15')]
+
+    So should transitive members:
+
+        >>> form = Group('Form1')
+        >>> form.members.add(person3)
+        >>> form.members.add(person4)
+        >>> section.members.add(form)
+
+        >>> pprint(view.listMembers())
+        [RealtimeInfo(u'person1', 'Person1', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person1&date=2005-12-15'),
+         RealtimeInfo(u'person2', 'Person2', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person2&date=2005-12-15'),
+         RealtimeInfo(u'person3', 'Person3', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person3&date=2005-12-15'),
+         RealtimeInfo(u'person4', 'Person4', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person4&date=2005-12-15')]
+
+    Let's add an absence record to one person:
+
+        >>> attendance = ISectionAttendance(person4)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 10, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'B', False)
+
+    Now the members' list displays a new status:
+
+        >>> pprint(view.listMembers())
+        [RealtimeInfo(u'person1', 'Person1', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person1&date=2005-12-15'),
+         RealtimeInfo(u'person2', 'Person2', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person2&date=2005-12-15'),
+         RealtimeInfo(u'person3', 'Person3', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person3&date=2005-12-15'),
+         RealtimeInfo(u'person4', 'Person4', 'attendance-absent', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person4&date=2005-12-15')]
+
+    Let's add some absences in this period:
+
+        >>> attendance = ISectionAttendance(person4)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 11, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'C', False)
+
+        >>> attendance = ISectionAttendance(person2)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 11, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'C', False)
+        >>> ar = attendance.get(section,
+        ...            datetime.datetime(2005, 12, 15, 11, 00, tzinfo=utc))
+        >>> ar.makeTardy(datetime.datetime(2005, 12, 15, 11, 05, tzinfo=utc))
+
+        >>> attendance = ISectionAttendance(person3)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 11, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'C', True)
+
+        >>> pprint(view.listMembers())
+        [RealtimeInfo(u'person1', 'Person1', 'attendance-clear', ' ', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person1&date=2005-12-15'),
+         RealtimeInfo(u'person2', 'Person2', 'attendance-absent', 'T', True, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person2&date=2005-12-15'),
+         RealtimeInfo(u'person3', 'Person3', 'attendance-present', '+', True, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person3&date=2005-12-15'),
+         RealtimeInfo(u'person4', 'Person4', 'attendance-absent', '-', False, 'http://127.0.0.1/section/absentology/@@sparkline.png?person=person4&date=2005-12-15')]
+
+    """
+
+
+def doctest_AttendanceView_getDaysAttendanceRecords():
+    r"""Tests for AttendanceView.getDaysAttendanceRecords.
+
+        >>> provideAdapter(SectionAttendanceStub)
+        >>> provideAdapter(HomeroomAttendanceStub, provides=IHomeroomAttendance)
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...         import AttendanceView
+        >>> view = AttendanceView(None, None)
+
+        >>> view.getDaysAttendanceRecords('stud1', datetime.date(2006, 1, 3))
+        ['s_stud1_2006-01-03_a', 's_stud1_2006-01-03_b',
+         'h_stud1_2006-01-03_a', 'h_stud1_2006-01-03_b']
+
+    """
+
+
+def doctest_AttendanceView_studentStatus():
+    r"""Tests for AttendanceView.studentStatus
+
+    First, let's register getSectionAttendance as an adapter:
+
+        >>> setUpAttendanceAdapters()
+
+    We will need a view
+
+        >>> from schooltool.attendance.browser.attendance import \
+        ...     AttendanceView
+        >>> from schooltool.course.section import Section
+        >>> section = Section()
+        >>> view = AttendanceView(section, TestRequest())
+        >>> view.date = datetime.date(2005, 12, 15)
+
+    Let's add some members to the group:
+
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person, PersonContainer
+        >>> person1 = Person('person1', title='Person1')
+        >>> person2 = Person('person2', title='Person2')
+        >>> person3 = Person('person3', title='Person3')
+        >>> person4 = Person('person4', title='Person4')
+
+        >>> persons = PersonContainer()
+        >>> persons[''] = person1
+        >>> persons[''] = person2
+        >>> persons[''] = person3
+        >>> persons[''] = person4
+
+        >>> section.members.add(person1)
+        >>> section.members.add(person2)
+
+    Initially the student's absence is 'clear' (no records):
+
+        >>> view.studentStatus(person1)
+        'attendance-clear'
+
+    Let's record an unexplained absence for the student:
+
+        >>> attendance = ISectionAttendance(person1)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 10, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'B', False)
+
+    Now that the student has an unexplained absence, and no presence
+    records, the status is 'absent':
+
+        >>> view.studentStatus(person1)
+        'attendance-absent'
+
+    If we add a presence record for the same day, the status becomes 'alert':
+
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 11, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'C', True)
+        >>> view.studentStatus(person1)
+        'attendance-alert'
+
+    Let's take another student.  It's a good student, she's been
+    present to all sections:
+
+        >>> attendance = ISectionAttendance(person2)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 10, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'B', True)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 11, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'C', True)
+        >>> view.studentStatus(person2)
+        'attendance-present'
+
+    Let's take another yet student.  He's broken his leg and is
+    excused for the whole two months:
+
+        >>> attendance = ISectionAttendance(person3)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 10, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'B', False)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 11, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'C', False)
+        >>> for record in attendance.getAllForDay(view.date):
+        ...     record.addExplanation("Broken leg")
+        ...     record.explanations[-1].status = ACCEPTED
+        >>> view.studentStatus(person3)
+        'attendance-explained'
+
+    Yet another student was tardy.  The status shows that he's been absent:
+
+        >>> attendance = ISectionAttendance(person4)
+        >>> attendance.record(
+        ...     section, datetime.datetime(2005, 12, 15, 10, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45), 'B', False)
+        >>> ar = attendance.getAllForDay(view.date).next()
+        >>> ar.makeTardy(datetime.datetime(2005, 12, 15, 10, 9, tzinfo=utc))
+        >>> view.studentStatus(person4)
+        'attendance-absent'
+
+    """
+
+
+def doctest_AttendanceView_update():
+    r"""Tests for AttendanceView.update
+
+    Let's set up the section attendance adapter:
+
+        >>> setUpAttendanceAdapters()
+
+    We'll need timetabling stubbed too:
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, StubTimetables)
+
+    Let's create a section and a view:
+
+        >>> from schooltool.attendance.browser.attendance import \
+        ...     AttendanceView, getPeriodEventForSection
+        >>> from schooltool.course.section import Section
+        >>> class MySection(Section):
+        ...     def __repr__(self): return '<Section>'
+        >>> section = MySection()
+
+    Let's add some members to the section:
+
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person, PersonContainer
+        >>> person1 = Person('person1', title='Person1')
+        >>> person2 = Person('person2', title='Person2')
+        >>> person3 = Person('person3', title='Person3')
+        >>> person4 = Person('person4', title='Person4')
+        >>> person5 = Person('person5', title='Person5')
+
+        >>> persons = PersonContainer()
+        >>> persons[''] = person1
+        >>> persons[''] = person2
+        >>> persons[''] = person3
+        >>> persons[''] = person4
+        >>> persons[''] = person5
+
+        >>> section.members.add(person1)
+        >>> section.members.add(person2)
+        >>> section.members.add(person3)
+        >>> section.members.add(person4)
+        >>> section.members.add(person5)
+
+    Let's call update with an empty request:
+
+        >>> request = TestRequest()
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.homeroom = False
+
+        >>> view.update()
+
+    The students don't have attendance data for this section yet, so a
+    flag is set on the view:
+
+        >>> view.unknowns
+        True
+
+    Let's instantiate the view:
+
+        >>> request = TestRequest(form={'person1_check': 'on',
+        ...                             'person2_check': 'on',
+        ...                             'person5_check': 'on',
+        ...                             'ABSENT': 'Make absent'})
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.homeroom = False
+
+    Now we can call update:
+
+        >>> view.update()
+
+    Now all students have attendance data set, so the status is changed:
+
+        >>> view.unknowns
+        False
+
+    Let's see the attendance data for these persons:
+
+        >>> records = list(ISectionAttendance(person1))
+        >>> len(records)
+        1
+        >>> pprint(records)
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), ABSENT)]
+        >>> list(ISectionAttendance(person2))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), ABSENT)]
+        >>> list(ISectionAttendance(person3))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), PRESENT)]
+        >>> list(ISectionAttendance(person4))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), PRESENT)]
+        >>> list(ISectionAttendance(person5))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), ABSENT)]
+
+    Let's call the view again, nothing changed:
+
+        >>> request = TestRequest(form={'ABSENT': 'Make absent'})
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.homeroom = False
+
+        >>> view.update()
+
+        >>> list(ISectionAttendance(person1))
+        [SectionAttendanceRecord(<Section>,
+        datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), ABSENT)]
+        >>> list(ISectionAttendance(person2))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), ABSENT)]
+        >>> list(ISectionAttendance(person3))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), PRESENT)]
+        >>> list(ISectionAttendance(person4))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), PRESENT)]
+
+    If we call an absent person absent again, nothing breaks:
+
+        >>> request = TestRequest(form={'ABSENT': 'Make absent',
+        ...                             'person1_check': 'on'})
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.homeroom = False
+
+        >>> view.update()
+
+        >>> list(ISectionAttendance(person1))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), ABSENT)]
+        >>> list(ISectionAttendance(person2))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), ABSENT)]
+        >>> list(ISectionAttendance(person3))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), PRESENT)]
+        >>> list(ISectionAttendance(person4))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), PRESENT)]
+
+    If we call a present person absent, nothing breaks:
+
+        >>> request = TestRequest(form={'ABSENT': 'Make absent',
+        ...                             'person3_check': 'on'})
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.homeroom = False
+
+        >>> view.update()
+
+    But the person remains present.  We can silently ignore this error
+    because the checkbox is disabled.
+
+        >>> list(ISectionAttendance(person3))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), PRESENT)]
+
+    Now, let's try to make a present person and an absent person
+    tardy, but without a specified time:
+
+        >>> tick = datetime.datetime.utcnow().replace(tzinfo=utc)
+        >>> request = TestRequest(form={'TARDY': 'Make tardy',
+        ...                             'person3_check': 'on',
+        ...                             'person1_check': 'on',
+        ...                             'arrival': ''})
+        >>> view = AttendanceView(section, request)
+        >>> view.sectionMeetingFinished = lambda: False
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.homeroom = False
+
+        >>> view.update()
+        >>> tock = datetime.datetime.utcnow().replace(tzinfo=utc)
+
+    The status of the present person must be unchanged:
+
+        >>> list(ISectionAttendance(person3))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), PRESENT)]
+
+    But the previously absent person must have changed to tardy:
+
+        >>> list(ISectionAttendance(person1))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), TARDY)]
+
+    The arrival time is the time when the form was submitted:
+
+        >>> ar = iter(ISectionAttendance(person1)).next()
+        >>> tick <= ar.late_arrival <= tock
+        True
+
+    If the arrival time is incorrect, the error attribute on the view is set:
+
+        >>> request = TestRequest(form={'TARDY': 'Make tardy',
+        ...                             'person2_check': 'on',
+        ...                             'arrival': '80'})
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.homeroom = False
+
+        >>> view.update()
+
+        >>> list(ISectionAttendance(person2))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), TARDY)]
+
+        >>> ar = iter(ISectionAttendance(person2)).next()
+        >>> ar.late_arrival
+        datetime.datetime(2005, 12, 15, 12, 20, tzinfo=<UTC>)
+
+    If the arrival time is incorrect, the error attribute on the view is set:
+
+        >>> request = TestRequest(form={'TARDY': 'Make tardy',
+        ...                             'person5_check': 'on',
+        ...                             'arrival': 'late!'})
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.homeroom = False
+
+        >>> view.update()
+
+        >>> view.error
+        u'The arrival time you entered is invalid.  Please use HH:MM format'
+
+    If the arrival time is not specified on the retroactive form, no
+    arrival time is set (tardy is tardy):
+
+        >>> request = TestRequest(form={'TARDY': 'Make tardy',
+        ...                             'person5_check': 'on',
+        ...                             'arrival': ''})
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.sectionMeetingFinished = lambda: True
+        >>> view.homeroom = False
+
+        >>> view.update()
+
+        >>> list(ISectionAttendance(person5))
+        [SectionAttendanceRecord(<Section>,
+              datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>), TARDY)]
+
+        >>> print list(ISectionAttendance(person5))[0].late_arrival
+        None
+
+    """
+
+
+def doctest_AttendanceView_update_homeroom():
+    r"""Tests for AttendanceView.update
+
+    We need an ICompositeTimetables adapter in order to verify that a given
+    period is valid for a given day:
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, StubTimetables)
+
+    The ``update`` method is able to tell the difference between regular
+    section meetings and the homeroom meeting.
+
+        >>> from schooltool.attendance.browser.attendance import AttendanceView
+        >>> from schooltool.attendance.browser.attendance \
+        ...     import getPeriodEventForSection
+        >>> section = SectionStub()
+        >>> request = TestRequest()
+        >>> view = AttendanceView(section, request)
+
+    The 'C' period on 2005-12-15 is a regular section meeting
+
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.update()
+        >>> view.homeroom
+        False
+
+    The 'B' period, on the other hand, is the homeroom period
+
+        >>> view.period_id = 'B'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'B')
+        >>> view.update()
+        >>> view.homeroom
+        True
+
+    """
+
+
+def doctest_AttendanceView_update_homeroom():
+    r"""Tests for AttendanceView.update
+
+    We need an ICompositeTimetables adapter in order to verify that a given
+    period is valid for a given day:
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, StubTimetables)
+
+    The ``update`` method is able to tell the difference between regular
+    section meetings and the homeroom meeting.
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...     import AttendanceView, getPeriodEventForSection
+        >>> section = SectionStub()
+        >>> request = TestRequest()
+        >>> view = AttendanceView(section, request)
+
+    The 'C' period on 2005-12-15 is a regular section meeting
+
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'C')
+        >>> view.update()
+
+    The 'B' period, on the other hand, is the homeroom period
+
+        >>> view.period_id = 'B'
+        >>> view.meeting = getPeriodEventForSection(section, view.date, 'B')
+        >>> view.update()
+
+    """
+
+
+def doctest_AttendanceView_update_set_homeroom():
+    r"""Tests for AttendanceView.update
+
+    We need an ICompositeTimetables adapter in order to verify that a given
+    period is valid for a given day:
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, StubTimetables)
+
+    We will also need attendance adapters.
+
+        >>> setUpAttendanceAdapters()
+
+    The AttendanceView is used both for regular section meetings,
+    and for homeroom attendance.
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...     import AttendanceView, getPeriodEventForSection
+        >>> section = SectionStub()
+        >>> request = TestRequest()
+        >>> view = AttendanceView(section, request)
+
+    We will need at least one person.
+
+        >>> from schooltool.person.person import Person
+        >>> person1 = Person('person1', title='Person1')
+        >>> person1.__name__ = 'p1'
+        >>> person2 = Person('person2', title='Person1')
+        >>> person2.__name__ = 'p2'
+        >>> section.members = [person1, person2]
+
+    The 'B' period is the homeroom period
+
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'B'
+        >>> view.meeting = getPeriodEventForSection(section, view.date,
+        ...                                         view.period_id)
+        >>> view.homeroom = True
+
+    If you mark some absences, they will be recorded as homeroom
+    absences, not just section absences.
+
+        >>> view.request = TestRequest(form={'ABSENT': 'Absent',
+        ...                                  'p1_check': 'on'})
+        >>> view.update()
+
+        >>> list(IHomeroomAttendance(person1))
+        [HomeroomAttendanceRecord(<...SectionStub...>,
+             datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), ABSENT)]
+        >>> list(IHomeroomAttendance(person2))
+        [HomeroomAttendanceRecord(<...SectionStub...>,
+             datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), PRESENT)]
+
+    We can see that section attendance data was recorded too:
+
+        >>> list(ISectionAttendance(person1))
+        [SectionAttendanceRecord(<...SectionStub...>,
+             datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), ABSENT)]
+        >>> list(ISectionAttendance(person2))
+        [SectionAttendanceRecord(<...SectionStub...>,
+             datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), PRESENT)]
+
+    """
+
+
+def doctest_AttendanceView_retro_update():
+    r"""This is an update method for the retroactive attendance form.
+
+    We'll need some timetabling and attendance adapters:
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, StubTimetables)
+        >>> setUpAttendanceAdapters()
+
+    The AttendanceView is used both for regular section meetings,
+    and for homeroom attendance.
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...     import AttendanceView, getPeriodEventForSection
+        >>> section = SectionStub()
+        >>> request = TestRequest()
+        >>> view = AttendanceView(section, request)
+
+    We will need several persons:
+
+        >>> from schooltool.person.person import Person
+        >>> person1 = Person('person1', title='Person1')
+        >>> person1.__name__ = 'p1'
+        >>> person2 = Person('person2', title='Person2')
+        >>> person2.__name__ = 'p2'
+        >>> person3 = Person('person3', title='Person3')
+        >>> person3.__name__ = 'p3'
+        >>> person4 = Person('person4', title='Person4')
+        >>> person4.__name__ = 'p4'
+        >>> section.members = [person1, person2, person3, person4]
+
+    The 'B' period is the homeroom period:
+
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'B'
+        >>> view.meeting = getPeriodEventForSection(section, view.date,
+        ...                                         view.period_id)
+        >>> view.homeroom = True
+
+    Let's say the first person was present, the other was absent, the
+    third was tardy, and we're undecided about the last one:
+
+        >>> view.request = TestRequest(form={'p1': 'P', 'p2': 'A',
+        ...                                  'p3': 'T', 'p3_tardy': '10',
+        ...                                  'p4': 'U'})
+        >>> view.retro_update()
+
+    When there's no submit in the request, nothing happens:
+
+        >>> list(ISectionAttendance(person1))
+        []
+
+    Now we press the submit button:
+
+        >>> view.request = TestRequest(form={'p1': 'P', 'p2': 'A',
+        ...                                  'p3': 'T', 'p3_tardy': '10',
+        ...                                  'p4': 'U', 'SUBMIT': 'Go!'})
+        >>> view.retro_update()
+
+        >>> list(ISectionAttendance(person1))
+        [SectionAttendanceRecord(<...SectionStub...>,
+             datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), PRESENT)]
+
+        >>> list(ISectionAttendance(person2))
+        [SectionAttendanceRecord(<...SectionStub...>,
+             datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), ABSENT)]
+
+        >>> list(ISectionAttendance(person3))
+        [SectionAttendanceRecord(<...SectionStub...>,
+             datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), TARDY)]
+        >>> list(ISectionAttendance(person3))[0].late_arrival
+        datetime.datetime(2005, 12, 15, 10, 10, tzinfo=<UTC>)
+
+        >>> list(ISectionAttendance(person4))
+        []
+
+    The homeroom records are updated as well:
+
+        >>> list(IHomeroomAttendance(person1))
+        [HomeroomAttendanceRecord(<...SectionStub...>,
+         datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), PRESENT)]
+
+        >>> list(IHomeroomAttendance(person2))
+        [HomeroomAttendanceRecord(<...SectionStub...>,
+         datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), ABSENT)]
+
+        >>> list(IHomeroomAttendance(person3))
+        [HomeroomAttendanceRecord(<...SectionStub...>,
+         datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>), TARDY)]
+
+        >>> list(IHomeroomAttendance(person4))
+        []
+
+    Let's test the error handling of the arrival times:
+
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date,
+        ...                                         view.period_id)
+        >>> view.homeroom = False
+        >>> view.request = TestRequest(form={'p1': 'P', 'p1_tardy': '12',
+        ...                                  'p2': 'T', 'p2_tardy': '',
+        ...                                  'p3': 'T', 'p3_tardy': '10 mins',
+        ...                                  'p4': 'T', 'p4_tardy': '10',
+        ...                                  'SUBMIT': 'Go!'})
+        >>> view.retro_update()
+        >>> view.arrivals
+        {'p2': None, 'p4': datetime.datetime(2005, 12, 15, 11, 10, tzinfo=<UTC>)}
+        >>> pprint(view.arrival_errors)
+        {'p1': u'Arrival times only apply to tardy students',
+         'p3': u'The minutes late value you entered is
+                 invalid.  Please use an integer number of minutes.'}
+
+    When there were errors, even the valid record was not updated:
+
+        >>> list(ISectionAttendance(person4))
+        []
+
+    """
+
+
+def doctest_AttendanceView_getAttendanceRecord():
+    r"""Tests for AttendanceView._getAttendanceRecord
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...         import AttendanceView
+        >>> request = TestRequest()
+        >>> view = AttendanceView('math', request)
+
+        >>> from schooltool.timetable.model import TimetableCalendarEvent
+        >>> person = 'jonas'
+        >>> view.date = datetime.date(2005, 1, 16)
+        >>> view.period_id = 'p4'
+        >>> view.meeting = TimetableCalendarEvent(
+        ...     datetime.datetime(2005, 1, 16, 10, 25, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45),
+        ...     "Math", day_id='D1', period_id="p4",
+        ...     activity=None)
+
+        >>> view._getAttendanceRecord(SectionAttendanceStub(person))
+        's_jonas_2005-01-16 10:25:00+00:00_math'
+
+        >>> view._getAttendanceRecord(HomeroomAttendanceStub(person))
+        'h_jonas_2005-01-16 10:25:00+00:00_math'
+
+    """
+
+
+def doctest_AttendanceView_record():
+    r"""Tests for AttendanceView._record
+
+        >>> provideAdapter(SectionAttendanceStub)
+        >>> provideAdapter(HomeroomAttendanceStub, provides=IHomeroomAttendance)
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...         import AttendanceView
+        >>> request = TestRequest()
+        >>> view = AttendanceView('math', request)
+
+        >>> from schooltool.timetable.model import TimetableCalendarEvent
+        >>> person = 'jonas'
+        >>> view.date = datetime.date(2005, 1, 16)
+        >>> view.period_id = 'p4'
+        >>> view.meeting = TimetableCalendarEvent(
+        ...     datetime.datetime(2005, 1, 16, 10, 25, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45),
+        ...     "Math", day_id='D1', period_id="p4",
+        ...     activity=None)
+
+        >>> attendance = ISectionAttendance(person)
+        >>> view._record(attendance, False)
+        Recording: s_jonas_2005-01-16 10:25:00+00:00_math -> False
+
+    """
+
+
+def doctest_AttendanceView_getArrival():
+    r"""Tests for AttendanceView.getArrival
+
+    We'll need person preferences for a timezone:
+
+        >>> from schooltool.person.interfaces import IPerson
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> from schooltool.person.preference import getPersonPreferences
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> from schooltool.attendance.browser.attendance \
+        ...     import getPeriodEventForSection
+        >>> ztapi.provideAdapter(IPerson, IPersonPreferences,
+        ...                      getPersonPreferences)
+
+    We'll need timetables:
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, StubTimetables)
+
+    Let's create a section and a view:
+
+        >>> from schooltool.attendance.browser.attendance import \
+        ...     AttendanceView
+        >>> from schooltool.course.section import Section
+        >>> section = Section()
+
+    If no arrival time was entered in the retroactive attendance form,
+    None is returned:
+
+        >>> view = AttendanceView(section, TestRequest())
+        >>> view.sectionMeetingFinished = lambda: True
+        >>> view.getArrival()
+
+    In the realtime form, current time is returned:
+
+        >>> view.sectionMeetingFinished = lambda: False
+        >>> tick = datetime.datetime.utcnow().replace(tzinfo=utc)
+        >>> arrival = view.getArrival()
+        >>> tock = datetime.datetime.utcnow().replace(tzinfo=utc)
+
+        >>> tick <= arrival <= tock
+        True
+
+    A number of minutes the student was late can be entered on the
+    form:
+
+        >>> request = TestRequest(form={'arrival': '5'})
+        >>> view = AttendanceView(section, request)
+
+    We'll need to know the datetime of the meeting:
+
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.period_id = 'C'
+        >>> view.meeting = getPeriodEventForSection(section, view.date,
+        ...                                         view.period_id)
+
+        >>> view.getArrival()
+        datetime.datetime(2005, 12, 15, 11, 5, tzinfo=<UTC>)
+
+    If the time in the request is invalid, we just pass the ValueError along:
+
+        >>> request = TestRequest(form={'arrival': '2212adsf'})
+        >>> view = AttendanceView(section, request)
+        >>> view.date = datetime.date(2005, 12, 29)
+        >>> view.getArrival()
+        Traceback (most recent call last):
+          ...
+        ValueError: invalid literal for int(): 2212adsf
+
+    """
+
+
+def doctest_AttendanceView_publishTraverse():
+    r"""Tests for AttendanceView.publishTraverse
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...          import AttendanceView
+
+    Now we can try the typical case:
+
+        >>> request = TestRequest()
+        >>> section = 'section'
+        >>> view = AttendanceView(section, request)
+        >>> view.date, view.period_id
+        (None, None)
+
+        >>> view.publishTraverse(request, '2005-12-15') is view
+        True
+        >>> view.date, view.period_id
+        (datetime.date(2005, 12, 15), None)
+
+        >>> view.publishTraverse(request, 'B') is view
+        True
+        >>> view.date, view.period_id
+        (datetime.date(2005, 12, 15), 'B')
+
+    If you try to traverse too much, you get an error
+
+        >>> view.publishTraverse(request, 'quux')
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: 'section', name: 'quux'
+
+    What if the date is invalid?
+
+        >>> view = AttendanceView(section, request)
+        >>> view.publishTraverse(request, "some time last week")
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: 'section', name: 'some time last week'
+
+    """
+
+
+def doctest_AttendanceView_verifyParameters():
+    r"""Tests for AttendanceView.verifyParameters
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...          import AttendanceView
+
+    We need an ICompositeTimetables adapter in order to verify that a given
+    period is valid for a given day:
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, StubTimetables)
+
+    What if we try to render the view without specifying both the
+    date and the period id?  We try to find the closest section meeting
+    for today, but there aren't any.
+
+        >>> request = TestRequest()
+        >>> section = 'section'
+        >>> view = AttendanceView(section, request)
+        >>> view.__name__ = 'attendance'
+        >>> view.date, view.period_id
+        (None, None)
+
+        >>> view.verifyParameters()
+        Traceback (most recent call last):
+          ...
+        NoSectionMeetingToday
+
+    What if we specify incomplete data?
+
+        >>> view.date = datetime.date(2005, 12, 15)
+        >>> view.verifyParameters()
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: 'section', name: 'attendance'
+
+    What if the period is invalid?
+
+        >>> view.period_id = 'QUUX'
+        >>> view.verifyParameters()
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: 'section', name: 'attendance'
+
+    And now suppose everything is fine
+
+        >>> view.period_id = 'B'
+        >>> view.verifyParameters()
+
+    If everything is fine, verifyParameters saves the meeting
+    (timetable calendar event), and if it is a homeroom period:
+
+        >>> view.meeting
+        <schooltool.timetable.model.TimetableCalendarEvent object at ...>
+        >>> view.meeting.period_id
+        'B'
+        >>> view.meeting.dtstart
+        datetime.datetime(2005, 12, 15, 10, 0, tzinfo=<UTC>)
+        >>> view.homeroom
+        True
+
+    Let's try a non-homeroom period:
+
+        >>> view.period_id = 'C'
+        >>> view.verifyParameters()
+        >>> view.meeting.period_id
+        'C'
+        >>> view.meeting.dtstart
+        datetime.datetime(2005, 12, 15, 11, 0, tzinfo=<UTC>)
+        >>> view.homeroom
+        False
+
+    """
+
+
+def doctest_AttendanceView_sectionMeetingFinished():
+    """Tests for AttendanceView.sectionMeetingFinished
+
+    This method tells us whether to show the realtime or retroactive
+    attendance form.
+
+        >>> from schooltool.attendance.browser.attendance import AttendanceView
+
+        >>> section = object()
+        >>> view = AttendanceView(section, TestRequest())
+        >>> now = datetime.datetime(2006, 4, 14, 12, 0, tzinfo=utc)
+        >>> stub_utcnow(now)
+
+    If the meeting is still in progress, sectionMeetingFinished,
+    obviously, returns false:
+
+        >>> view.meeting = TimetableCalendarEvent(
+        ...     datetime.datetime(2006, 4, 14, 11, 50, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45),
+        ...     "Math", day_id='D1', period_id="p4",
+        ...     activity=None)
+        >>> view.sectionMeetingFinished()
+        False
+
+    Well before the meeting, it also returns False:
+
+        >>> view.meeting = TimetableCalendarEvent(
+        ...     datetime.datetime(2006, 4, 14, 13, 00, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45),
+        ...     "Math", day_id='D1', period_id="p4",
+        ...     activity=None)
+        >>> view.sectionMeetingFinished()
+        False
+
+    Immediately after the meeting, it also returns False:
+
+        >>> view.meeting = TimetableCalendarEvent(
+        ...     datetime.datetime(2006, 4, 14, 11, 14, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45),
+        ...     "Math", day_id='D1', period_id="p4",
+        ...     activity=None)
+        >>> view.sectionMeetingFinished()
+        False
+
+    However, 1 hour after the meeting has finished, it returns True:
+
+        >>> view.meeting = TimetableCalendarEvent(
+        ...     datetime.datetime(2006, 4, 14, 10, 14, tzinfo=utc),
+        ...     datetime.timedelta(minutes=45),
+        ...     "Math", day_id='D1', period_id="p4",
+        ...     activity=None)
+        >>> view.sectionMeetingFinished()
+        True
+
+    """
+
+
+def doctest_AttendanceView_findClosestMeeting():
+    r"""Tests for AttendanceView.findClosestMeeting
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...          import AttendanceView
+
+        >>> request = TestRequest()
+        >>> section = 'section'
+        >>> view = AttendanceView(section, request)
+
+    If we have date and period_id in the request, then we're processing a form
+    and should use them.
+
+        >>> request.form['date'] = '2005-10-12'
+        >>> request.form['period_id'] = 'quux'
+        >>> view.findClosestMeeting()
+        >>> view.date
+        datetime.date(2005, 10, 12)
+        >>> view.period_id
+        'quux'
+
+    Otherwise look at the current date and time.
+
+        >>> del request.form['date']
+        >>> del request.form['period_id']
+
+        >>> from schooltool.attendance.browser import attendance
+        >>> real_getCurrentSectionMeeting = attendance.getCurrentSectionMeeting
+        >>> asked_for = [None, None]
+        >>> def getCurrentSectionMeeting_stub(section, time, asked_for=asked_for):
+        ...     asked_for[:] = time, section
+        ...     return TimetableCalendarEvent(
+        ...         datetime.datetime(2005, 12, 14, 10, 00, tzinfo=utc),
+        ...         datetime.timedelta(minutes=45),
+        ...         "Math", day_id='D1', period_id="qwerty", activity=None)
+        >>> attendance.getCurrentSectionMeeting = getCurrentSectionMeeting_stub
+
+        >>> before = utc.localize(datetime.datetime.utcnow())
+        >>> view.findClosestMeeting()
+        >>> after = utc.localize(datetime.datetime.utcnow())
+
+        >>> before <= asked_for[0] <= after
+        True
+        >>> asked_for[1] == section
+        True
+
+        >>> before.date() <= view.date <= after.date()
+        True
+        >>> view.period_id
+        'qwerty'
+
+    If there are no meetings, raise NoSectionMeetingToday
+
+        >>> attendance.getCurrentSectionMeeting = lambda *args: None
+        >>> view.findClosestMeeting()
+        Traceback (most recent call last):
+          ...
+        NoSectionMeetingToday
+
+    Done
+
+        >>> attendance.getCurrentSectionMeeting = real_getCurrentSectionMeeting
+
+    """
+
+
+def doctest_AttendanceInheritanceMixin_hasParentHomeroom():
+    r"""Tests for AttendanceInheritanceMixin.hasParentHomeroom
+
+        >>> hr_ar = HomeroomAttendanceRecordStub(None,
+        ...             datetime.datetime(2005, 1, 1, 10, 15),
+        ...             TARDY)
+        >>> class HomeroomAttendanceStub(object):
+        ...     def getHomeroomPeriodForRecord(self, record):
+        ...         if record.date == hr_ar.date:
+        ...             return hr_ar
+        ...         return HomeroomAttendanceRecordStub(None, record.datetime,
+        ...                                             UNKNOWN)
+        >>> homeroom_attendance = HomeroomAttendanceStub()
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...         import AttendanceInheritanceMixin
+        >>> view = AttendanceInheritanceMixin()
+
+    If the corresponding homeroom attendance record is not an absence/tardy,
+    return False:
+
+        >>> section = SectionStub("English")
+        >>> section_ar = SectionAttendanceRecordStub(section,
+        ...                  datetime.datetime(2005, 1, 2, 10, 15),
+        ...                  TARDY)
+        >>> view.hasParentHomeroom(section_ar, homeroom_attendance)
+        False
+
+    If there is a homeroom that the given attendance record inherits from then
+    return True:
+
+        >>> section_ar = SectionAttendanceRecordStub(section,
+        ...                  datetime.datetime(2005, 1, 1, 10, 15),
+        ...                  TARDY)
+        >>> view.hasParentHomeroom(section_ar, homeroom_attendance)
+        True
+
+    Unless you were too late:
+
+        >>> section_ar = SectionAttendanceRecordStub(section,
+        ...                   datetime.datetime(2005, 1, 1, 10, 21),
+        ...                   TARDY)
+        >>> view.hasParentHomeroom(section_ar, homeroom_attendance)
+        False
+
+    """
+
+
+def doctest_AttendanceInheritanceMixin_inheritsFrom():
+    r"""Tests for AttendanceInheritanceMixin.inheritsFrom.
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...         import AttendanceInheritanceMixin
+        >>> view = AttendanceInheritanceMixin()
+
+    If student was absent on the homeroom period, homeroom attendance
+    record should cover all of associated section attendance records:
+
+        >>> view.inheritsFrom(HomeroomAttendanceRecordStub(
+        ...                       None,
+        ...                       datetime.datetime(2005, 1, 1),
+        ...                       ABSENT),
+        ...                   None)
+        True
+
+    If student was late to the homeroom only attendance records with
+    arrival time upto the late_arival + 5 minutes should be considered
+    as inheriting:
+
+        >>> hr_ar = HomeroomAttendanceRecordStub(None,
+        ...             datetime.datetime(2005, 1, 1, 10, 15),
+        ...             TARDY)
+        >>> section_ar = SectionAttendanceRecordStub(None,
+        ...                 datetime.datetime(2005, 1, 1, 10, 15),
+        ...                 TARDY)
+
+        >>> view.inheritsFrom(hr_ar, section_ar)
+        True
+
+        >>> section_ar.late_arrival += datetime.timedelta(minutes=5)
+        >>> view.inheritsFrom(hr_ar, section_ar)
+        True
+
+        >>> section_ar.late_arrival += datetime.timedelta(minutes=1)
+        >>> view.inheritsFrom(hr_ar, section_ar)
+        False
+
+    """
+
+
+def doctest_AttendanceInheritanceMixin_homeroomTardyGracePeriod():
+    r"""
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...         import AttendanceInheritanceMixin
+        >>> mixin = AttendanceInheritanceMixin()
+        >>> mixin.homeroomTardyGracePeriod
+        datetime.timedelta(0, 300)
+
+    The value comes from the attendance preferences.
+
+        >>> app = ISchoolToolApplication(None)
+        >>> IAttendancePreferences(app).homeroomTardyGracePeriod = 10
+
+        >>> mixin.homeroomTardyGracePeriod
+        datetime.timedelta(0, 600)
+
+    """
+
+
+def doctest_StudentAttendanceView():
+    r"""Tests for StudentAttendanceView.
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> request = TestRequest()
+        >>> view = StudentAttendanceView(None, request)
+
+    Calling the view should update the form and render the template:
+
+        >>> def update():
+        ...     print "Updated form."
+        >>> def template():
+        ...     return "The template"
+        >>> view.update = update
+        >>> view.template = template
+
+        >>> view()
+        Updated form.
+        'The template'
+
+    """
+
+
+def doctest_StudentAttendanceView_parseArrivalTime():
+    r"""Tests for AttendanceView.parseArrivalTime
+
+    We'll need person preferences for a timezone:
+
+        >>> from schooltool.person.interfaces import IPerson
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> from schooltool.person.preference import getPersonPreferences
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> ztapi.provideAdapter(IPerson, IPersonPreferences,
+        ...                      getPersonPreferences)
+
+
+    Let's create a section and a view:
+
+        >>> from schooltool.attendance.browser.attendance import \
+        ...     StudentAttendanceView
+
+    If no arrival time was passed None is returned:
+
+        >>> view = StudentAttendanceView(None, TestRequest())
+        >>> arrival = view.parseArrivalTime(None, "")
+        >>> arrival is None
+        True
+
+    However if some time was given it should get parsed and combined
+    with the date:
+
+        >>> vno = timezone('Europe/Vilnius')
+
+        >>> request = TestRequest()
+        >>> view = StudentAttendanceView(None, request)
+        >>> dt = vno.localize(datetime.datetime(2005, 12, 29, 22, 0))
+        >>> view.parseArrivalTime(dt, '13')
+        datetime.datetime(2005, 12, 29, 22, 13,
+                          tzinfo=<DstTzInfo 'Europe/Vilnius' EET+2:00:00 STD>)
+
+    If the time is invalid, we just pass the ValueError along:
+
+        >>> view = StudentAttendanceView(None, request)
+        >>> view.parseArrivalTime(dt, 'late')
+        Traceback (most recent call last):
+          ...
+        ValueError: ...
+
+    """
+
+
+def doctest_StudentAttendanceView_makeTardy():
+    r"""Tests for StudentAttendanceView.makeTardy
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> view.errors = []
+
+        >>> ar = HomeroomAttendanceRecordStub(None,
+        ...          datetime.datetime(2006, 1, 29, tzinfo=utc), ABSENT)
+        >>> def makeTardy(dt):
+        ...     print "Made tardy %s" % dt
+        >>> ar.makeTardy = makeTardy
+
+        >>> view._makeTardy(ar, "15", {'absence': 'THIS ABSENCE'})
+        Made tardy 2006-01-29 00:15:00+00:00
+        True
+        >>> view.errors
+        []
+
+        >>> ar.makeTardy = ar._raiseError
+        >>> view._makeTardy(ar, "15", {'absence': 'THIS ABSENCE'})
+        False
+
+        >>> for err in view.errors:
+        ...     print translate(err)
+        Could not convert THIS ABSENCE absence intoa homeroom tardy
+
+    Only homeroom attendance records can be converted into tardies:
+
+        >>> view.errors = []
+        >>> view._makeTardy("tsmee", "22:15", {'absence': 'THIS ABSENCE'})
+        False
+
+        >>> for err in view.errors:
+        ...     print translate(err)
+        THIS ABSENCE is not a homeroom absence, only homeroom absences can be
+        converted into tardies
+
+    If we supply an invalid time - tardy_error is set:
+
+        >>> def valueError(date, time):
+        ...     raise ValueError()
+        >>> view.parseArrivalTime = valueError
+        >>> view._makeTardy(ar, "22:15", {'absence': 'THIS ABSENCE'})
+        False
+
+        >>> view.tardy_error
+        u'The arrival time you entered is invalid.  Please use HH:MM format'
+
+    If no arrival_time was provided a different error message should
+    appear:
+
+        >>> view.errors  = []
+
+        >>> view.tardy_error = None
+        >>> view.parseArrivalTime = lambda date, time: None
+        >>> ar = HomeroomAttendanceRecordStub(None,
+        ...          datetime.datetime(2006, 1, 29, tzinfo=utc), ABSENT)
+        >>> ar.makeTardy = makeTardy
+        >>> view._makeTardy(ar, "", {'absence': 'THIS ABSENCE'})
+        Made tardy None
+        True
+
+        >>> view.tardy_error
+
+        >>> view.errors
+        []
+
+    """
+
+
+def doctest_StudentAttendanceView_term_for_detailed_summary():
+    r"""Tests for StudentAttendanceView.term_for_detailed_summary
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> request = TestRequest()
+        >>> view = StudentAttendanceView(None, request)
+
+    Empty request:
+
+        >>> print view.term_for_detailed_summary
+        None
+
+        >>> request.form['term'] = ''
+        >>> print view.term_for_detailed_summary
+        None
+
+    Invalid request:
+
+        >>> request.form['term'] = 'no-such-term'
+        >>> print view.term_for_detailed_summary
+        None
+
+    Term name in the request:
+
+        >>> request.form['term'] = '2005-fall'
+        >>> print view.term_for_detailed_summary
+        <TermStub: 2005-09-01..2005-12-22>
+
+    """
+
+
+def doctest_StudentAttendanceView_formatAttendanceRecord():
+    r"""Tests for StudentAttendanceView.formatAttendanceRecord
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+
+        >>> ar = HomeroomAttendanceRecordStub(SectionStub('math17'),
+        ...             datetime.datetime(2006, 1, 14, 17, 3, tzinfo=utc), ABSENT)
+        >>> print translate(view.formatAttendanceRecord(ar))
+        2006-01-14 17:03: absent from homeroom
+
+        >>> ar = HomeroomAttendanceRecordStub(SectionStub('math17'),
+        ...             datetime.datetime(2006, 1, 14, 17, 3, tzinfo=utc), TARDY)
+        >>> print translate(view.formatAttendanceRecord(ar))
+        2006-01-14 17:03: late for homeroom, arrived on 17:18
+
+        >>> ar = SectionAttendanceRecordStub(SectionStub('math17'),
+        ...             datetime.datetime(2006, 1, 14, 17, 3, tzinfo=utc), ABSENT)
+        >>> print translate(view.formatAttendanceRecord(ar))
+        2006-01-14 17:03: absent from math17
+
+        >>> ar = SectionAttendanceRecordStub(SectionStub('math17'),
+        ...             datetime.datetime(2006, 1, 14, 17, 3, tzinfo=utc), TARDY)
+        >>> print translate(view.formatAttendanceRecord(ar))
+        2006-01-14 17:03: late for math17, arrived on 17:18
+
+    """
+
+
+def doctest_StudentAttendanceView_interleaveAttendanceRecords():
+    r"""Tests for StudentAttendanceView.interleaveAttendanceRecords
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+
+    Let's use trivial stubs
+
+        >>> class ARStub(object):
+        ...     def __init__(self, datetime):
+        ...         self.datetime = datetime
+        ...         self.date = datetime
+        ...     def __repr__(self):
+        ...         return '%s%d' % (self.prefix, self.date)
+        >>> class HAR(ARStub):
+        ...     prefix = 'h'
+        >>> class SAR(ARStub):
+        ...     prefix = 's'
+
+        >>> day = [HAR(d) for d in 1, 2, 5, 6, 7, 8]
+        >>> section = [SAR(d) for d in 2, 2, 3, 4, 5, 8, 9, 10, 11]
+        >>> print list(view.interleaveAttendanceRecords(day, section))
+        [h1, h2, s2, s2, s3, s4, h5, s5, h6, h7, h8, s8, s9, s10, s11]
+
+        >>> day = [HAR(d) for d in 2, 5, 6, 7, 8]
+        >>> section = [SAR(d) for d in 1, 3, 4, 4, 5, 5]
+        >>> print list(view.interleaveAttendanceRecords(day, section))
+        [s1, h2, s3, s4, s4, h5, s5, s5, h6, h7, h8]
+
+        >>> day = []
+        >>> section = [SAR(d) for d in 1, 2]
+        >>> print list(view.interleaveAttendanceRecords(day, section))
+        [s1, s2]
+
+        >>> day = [HAR(d) for d in 2, 5, 6]
+        >>> section = []
+        >>> print list(view.interleaveAttendanceRecords(day, section))
+        [h2, h5, h6]
+
+        >>> day = []
+        >>> section = []
+        >>> print list(view.interleaveAttendanceRecords(day, section))
+        []
+
+    """
+
+
+def doctest_StudentAttendanceView_unresolvedAttendanceRecords():
+    r"""Test for StudentAttendanceView.unresolvedAttendanceRecords
+
+        >>> provideAdapter(HomeroomAttendanceStub, provides=IHomeroomAttendance)
+        >>> provideAdapter(SectionAttendanceStub)
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> student = PersonStub()
+        >>> request = TestRequest()
+        >>> view = StudentAttendanceView(student, request)
+
+    Simple case first: when there are no recorded absences/tardies, we get an
+    empty list.
+
+        >>> student._homeroom_attendance_records = []
+        >>> student._section_attendance_records = []
+        >>> list(view.unresolvedAttendanceRecords())
+        []
+
+    An unresolved absence is marked by an attendance record that is
+    tardy or absent and is not yet explained:
+
+        >>> absences = [True, True, False, False]
+        >>> tardies = [False, False, True, False]
+        >>> explanations = [True, False, False, False]
+
+        >>> class AttendanceRecordStub(object):
+        ...     def __init__(self, absent, tardy, explained):
+        ...         self.isAbsent = lambda: absent
+        ...         self.isTardy = lambda: tardy
+        ...         self.isExplained = lambda: explained
+
+        >>> ars = []
+        >>> for absent, tardy, explained in zip(absences, tardies, explanations):
+        ...      ars.append(AttendanceRecordStub(absent, tardy, explained))
+        >>> student._homeroom_attendance_records = ars
+        >>> result = list(view.unresolvedAttendanceRecords())
+        >>> [ar in result for ar in ars]
+        [False, True, True, False]
+
+    """
+
+
+def doctest_StudentAttendanceView_pigeonholeAttendanceRecords():
+    """Tests for StudentAttendanceView.pigeonholeAttendanceRecords
+
+        >>> from schooltool.attendance.browser.attendance import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+
+        >>> class AttendanceRecordStub(object):
+        ...     def __init__(self, name, year, month, day):
+        ...         self.name = name
+        ...         self.date = datetime.date(year, month, day)
+        ...     def __repr__(self):
+        ...         return self.name
+
+    When given an empty list the method returns an empty list:
+
+        >>> attendance_records = []
+        >>> view.unresolvedAttendanceRecords = lambda : attendance_records
+        >>> view.pigeonholeAttendanceRecords()
+        []
+
+    If there are any attendance records they are placed into sublists
+    by their date:
+
+        >>> attendance_records = [AttendanceRecordStub('ar1', 2005, 1, 1),
+        ...                       AttendanceRecordStub('ar2', 2005, 1, 1),
+        ...                       AttendanceRecordStub('ar3', 2005, 1, 2),
+        ...                       AttendanceRecordStub('ar4', 2005, 1, 2),
+        ...                       AttendanceRecordStub('ar5', 2005, 1, 3),
+        ...                       AttendanceRecordStub('ar6', 2005, 1, 4)]
+        >>> view.unresolvedAttendanceRecords = lambda : attendance_records
+        >>> view.pigeonholeAttendanceRecords()
+        [[ar1, ar2], [ar3, ar4], [ar5], [ar6]]
+
+    """
+
+
+def doctest_StudentAttendanceView_getInheritingRecords():
+    """Tests for StudentAttendanceView.getInheritingRecords
+
+        >>> hr_ar = HomeroomAttendanceRecordStub(None,
+        ...             datetime.datetime(2005, 1, 1, 10, 15),
+        ...             TARDY)
+        >>> class HomeroomAttendanceStub(object):
+        ...     adapts(None)
+        ...     implements(IHomeroomAttendance)
+        ...     def __init__(self, person):
+        ...         pass
+        ...     def getHomeroomPeriodForRecord(self, record):
+        ...         if record.date == hr_ar.date:
+        ...             return hr_ar
+
+        >>> provideAdapter(HomeroomAttendanceStub, provides=IHomeroomAttendance)
+
+        >>> from schooltool.attendance.browser.attendance import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+
+    If there are no attendance records, return an empty list:
+
+        >>> view.getInheritingRecords(hr_ar, [])
+        []
+
+
+    If not, only records that have the hr_ar as their parent homeroom
+    period and should inherit from it are returned:
+
+        >>> section = SectionStub("English")
+        >>> section_records = [SectionAttendanceRecordStub(section,
+        ...                        datetime.datetime(2005, 1, 1, 10, 15),
+        ...                        TARDY),
+        ...                    SectionAttendanceRecordStub(section,
+        ...                        datetime.datetime(2005, 1, 2, 10, 15),
+        ...                        TARDY),
+        ...                    SectionAttendanceRecordStub(section,
+        ...                        datetime.datetime(2005, 1, 1, 10, 21),
+        ...                        TARDY)]
+        >>> [translate(view.formatAttendanceRecord(ar))
+        ...  for ar in view.getInheritingRecords(hr_ar, section_records)]
+        [u'2005-01-01 10:15: late for English, arrived on 10:30']
+
+    """
+
+
+def doctest_StudentAttendanceView_hideInheritingRecords():
+    """Tests for StudentAttendanceView.hideInheritingRecords
+
+    Method removes all section attendance records that have a parent
+    homeroom attendance record from the list:
+
+        >>> from schooltool.attendance.browser.attendance import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+
+        >>> provideAdapter(HomeroomAttendanceStub)
+
+    Method hasParentHomeroom is used when checking whether attendance
+    record is inheriting from any of attendance records in the day:
+
+        >>> view.hasParentHomeroom = lambda ar, hr_attendance: len(ar) > 3
+
+    So
+
+        >>> days = [['hr1', 'ar1', 'hr1ar1'],
+        ...         ['hr2', 'hr2ar1', 'hr2ar2', 'ar3']]
+        >>> view.hideInheritingRecords(days)
+        [['hr1', 'ar1'],
+         ['hr2', 'ar3']]
+
+    """
+
+
+def doctest_StudentAttendanceView_flattenDays():
+    r"""Tests for StudentAttendanceView.flattenDays
+
+    Flatten day takes a list of days and puts all the attendance
+    records into a flat list with dicts for each attendance record:
+
+        >>> from schooltool.attendance.browser.attendance import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> days = [['ar1'], ['ar4', 'ar5']]
+        >>> view.makeId = lambda x: "Id for %s" % x
+        >>> view.formatAttendanceRecord = lambda x: "Text for %s" % x
+        >>> view.outstandingExplanation = lambda x: "Explanations for %s" % x
+        >>> view.flattenDays(days)
+        [{'text': 'Text for ar1',
+          'attendance_record': 'ar1',
+          'explanation': 'Explanations for ar1',
+          'id': 'Id for ar1',
+          'day': ['ar1']},
+         {'text': 'Text for ar4',
+          'attendance_record': 'ar4',
+          'explanation': 'Explanations for ar4',
+          'id': 'Id for ar4',
+          'day': ['ar4', 'ar5']},
+         {'text': 'Text for ar5',
+          'attendance_record': 'ar5',
+          'explanation': 'Explanations for ar5',
+          'id': 'Id for ar5',
+          'day': ['ar4', 'ar5']}]
+
+    """
+
+
+def doctest_StudentAttendanceView_unresolvedAbsencesForDisplay():
+    r"""Tests for StudentAttendanceView.unresolvedAbsencesForDisplay
+
+    This method takes a list of pigenholed attendance records, removes
+    inheriting attendance records from it and flattens the resulting
+    list of days:
+
+        >>> from schooltool.attendance.browser.attendance import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> view.pigeonholeAttendanceRecords = lambda: 'list of days'
+        >>> def hideInheritingRecords(days):
+        ...     return "%s without ineriting records" % days
+        >>> view.hideInheritingRecords = hideInheritingRecords
+        >>> def flattenDays(days):
+        ...     return "Flattened %s." % days
+        >>> view.flattenDays = flattenDays
+        >>> view.unresolvedAbsencesForDisplay()
+        'Flattened list of days without ineriting records.'
+
+    """
+
+
+def doctest_StudentAttendanceView_unresolvedAbsences():
+    r"""Tests for StudentAttendanceView.unresolvedAbsences
+
+    We shall use some simple attendance adapters for this test
+
+        >>> provideAdapter(HomeroomAttendanceStub, provides=IHomeroomAttendance)
+        >>> provideAdapter(SectionAttendanceStub)
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> student = PersonStub()
+        >>> request = TestRequest()
+        >>> view = StudentAttendanceView(student, request)
+
+    Simple case first: when there are no recorded absences/tardies, we get an
+    empty list.
+
+        >>> student._homeroom_attendance_records = []
+        >>> student._section_attendance_records = []
+        >>> list(view.unresolvedAbsences())
+        []
+
+    Let's create some attendances.
+
+        >>> first = datetime.date(2006, 1, 21)
+        >>> last = datetime.date(2006, 1, 28)
+        >>> time = datetime.time(9, 30)
+        >>> sections = itertools.cycle([SectionStub('math42'),
+        ...                             SectionStub('grammar3'),
+        ...                             SectionStub('relativity97')])
+        >>> dts = [utc.localize(datetime.datetime.combine(day, time))
+        ...        for day in DateRange(first, last)]
+        >>> statii = 5*[PRESENT, ABSENT, TARDY, PRESENT]
+
+        >>> student._homeroom_attendance_records = [
+        ...         HomeroomAttendanceRecordStub(None,
+        ...                 dt,
+        ...                 status,
+        ...                 'person',
+        ...                 dt.date() >= datetime.date(2006, 1, 26))
+        ...         for dt, status in zip(dts, statii)]
+
+        >>> student._section_attendance_records = [
+        ...         SectionAttendanceRecordStub(section,
+        ...                 dt,
+        ...                 status,
+        ...                 'person',
+        ...                 dt.date() >= datetime.date(2006, 1, 26))
+        ...         for section, dt, status in zip(sections, dts, statii)]
+
+        >>> for absence in view.unresolvedAbsences():
+        ...     print translate(absence['text'])
+        2006-01-22 09:30: absent from homeroom
+        2006-01-22 09:30: absent from grammar3
+        2006-01-23 09:30: late for homeroom, arrived on 09:45
+        2006-01-23 09:30: late for relativity97, arrived on 09:45
+
+    """
+
+
+def doctest_StudentAttendanceView_absencesForTerm():
+    r"""Tests for StudentAttendanceView.absencesForTerm
+
+    We shall use some simple attendance adapters for this test
+
+        >>> provideAdapter(HomeroomAttendanceStub, provides=IHomeroomAttendance)
+        >>> provideAdapter(SectionAttendanceStub)
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> student = PersonStub()
+        >>> request = TestRequest()
+        >>> view = StudentAttendanceView(student, request)
+
+        >>> term = TermStub(2006, 2, 20, 3, 7)
+        >>> for a in view.absencesForTerm(term):
+        ...     print translate(a)
+        2006-02-21 09:30: absent from homeroom
+        2006-02-21 09:30: absent from grammar3
+        2006-02-22 09:30: late for homeroom, arrived on 09:45
+        2006-02-22 09:30: late for relativity97, arrived on 09:45
+        2006-02-25 09:30: absent from homeroom
+        2006-02-25 09:30: absent from relativity97
+        2006-02-26 09:30: late for homeroom, arrived on 09:45
+        2006-02-26 09:30: late for math42, arrived on 09:45
+        2006-03-01 09:30: absent from homeroom
+        2006-03-01 09:30: absent from math42
+        2006-03-02 09:30: late for homeroom, arrived on 09:45
+        2006-03-02 09:30: late for grammar3, arrived on 09:45
+        2006-03-05 09:30: absent from homeroom
+        2006-03-05 09:30: absent from grammar3
+        2006-03-06 09:30: late for homeroom, arrived on 09:45
+        2006-03-06 09:30: late for relativity97, arrived on 09:45
+
+    """
+
+
+def doctest_StudentAttendanceView_terms():
+    r"""Tests for StudentAttendanceView.terms
+
+    A little stubbing
+
+        >>> provideAdapter(SchoolToolApplicationStub)
+
+    and we can test that StudentAttendanceView.terms returns all the terms
+    in chronological order
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> for term in view.terms():
+        ...     print term.first, '--', term.last
+        2004-09-01 -- 2004-12-22
+        2005-02-01 -- 2005-05-21
+        2005-09-01 -- 2005-12-22
+        2006-02-01 -- 2006-05-21
+
+    """
+
+
+def doctest_StudentAttendanceView_countAbsences():
+    r"""Tests for StudentAttendanceView.countAbsences
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+        >>> a = AttendanceRecord(None, some_dt, ABSENT, 'person')
+        >>> p = AttendanceRecord(None, some_dt, PRESENT, 'person')
+        >>> t = AttendanceRecord(None, some_dt, UNKNOWN, 'person')
+        >>> t.status = TARDY
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> view.countAbsences([])
+        (0, 0)
+        >>> view.countAbsences([a, p, a, t])
+        (2, 1)
+
+    """
+
+
+def doctest_StudentAttendanceView_summaryPerTerm():
+    r"""Tests for StudentAttendanceView.summaryPerTerm
+
+    We shall use some simple attendance adapters for this test
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+        >>> a = AttendanceRecord(None, some_dt, ABSENT, 'person')
+        >>> p = AttendanceRecord(None, some_dt, PRESENT, 'person')
+        >>> t = AttendanceRecord(None, some_dt, UNKNOWN, 'person')
+        >>> t.status = TARDY
+
+        >>> class TermStub(object):
+        ...     def __init__(self, name):
+        ...         self.__name__ = name
+        ...         self.title = name
+        ...         self.first = name
+        ...         self.last = name
+
+        >>> class HomeroomAttendanceStub(object):
+        ...     adapts(None)
+        ...     implements(IHomeroomAttendance)
+        ...     def __init__(self, context):
+        ...         pass
+        ...     def filter(self, first, last):
+        ...         return {'term1': [p, p, p, a, p, a, t, t, a, p, p],
+        ...                 'term2': [a, a, p, t, p],
+        ...                 'term3': [p, p, p]}[first]
+        >>> provideAdapter(HomeroomAttendanceStub)
+        >>> class SectionAttendanceStub(object):
+        ...     adapts(None)
+        ...     implements(ISectionAttendance)
+        ...     def __init__(self, context):
+        ...         pass
+        ...     def filter(self, first, last):
+        ...         return {'term1': [p, p, p],
+        ...                 'term2': [a, t, p, t, p],
+        ...                 'term3': [p, a, p, p, a]}[first]
+        >>> provideAdapter(SectionAttendanceStub)
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> student = 'pretend this is a student'
+        >>> request = TestRequest()
+        >>> view = StudentAttendanceView(student, request)
+        >>> view.terms = lambda: [TermStub('term1'), TermStub('term2'),
+        ...                       TermStub('term3')]
+
+        >>> for term in view.summaryPerTerm():
+        ...     print ('%(title)s  %(homeroom_absences)d %(homeroom_tardies)d'
+        ...            '  %(section_absences)d %(section_tardies)d' % term)
+        term1  3 2  0 0
+        term2  2 1  1 2
+        term3  0 0  2 0
+
+    """
+
+
+def doctest_StudentAttendanceView_makeId():
+    r"""Tests for StudentAttendanceView.makeId
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+
+        >>> from schooltool.attendance.attendance import HomeroomAttendanceRecord
+        >>> dt = utc.localize(datetime.datetime(2006, 1, 29, 14, 30))
+        >>> a = HomeroomAttendanceRecord(SectionStub(u'Some section \u1234'),
+        ...                              dt, ABSENT, 'person')
+
+        >>> view.makeId(a)
+        'h_2006-01-29_14:30:00+00:00_homeroom'
+
+        >>> from schooltool.attendance.attendance import SectionAttendanceRecord
+        >>> a = SectionAttendanceRecord(SectionStub(u'Some section \u1234'),
+        ...                             dt, ABSENT, 'person')
+
+        >>> view.makeId(a)
+        's_2006-01-29_14:30:00+00:00_U29tZSBzZWN0aW9uIOGItA=='
+
+    """
+
+
+def doctest_StudentAttendanceView_outstandingExplanation():
+    r"""Tests for StudentAttendanceView.outstandingExplanation
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+
+
+        >>> from schooltool.attendance.attendance import HomeroomAttendanceRecord
+        >>> a = HomeroomAttendanceRecord(None,
+        ...         datetime.datetime(2006, 1, 29, tzinfo=utc),
+        ...         ABSENT, 'person')
+
+        >>> print view.outstandingExplanation(a)
+        None
+
+        >>> a.addExplanation('Burumburum')
+        >>> print view.outstandingExplanation(a)
+        Burumburum
+
+        >>> a.rejectExplanation()
+        Rejected explanation
+        >>> print view.outstandingExplanation(a)
+        None
+
+        >>> a.addExplanation('Qua qua')
+        >>> print view.outstandingExplanation(a)
+        Qua qua
+
+        >>> a.acceptExplanation('001')
+        Accepted explanation
+        >>> print view.outstandingExplanation(a)
+        None
+
+    """
+
+
+def doctest_StudentAttendanceView_update():
+    r"""Tests for StudentAttendanceView.update
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> request = TestRequest()
+        >>> view = StudentAttendanceView(None, request)
+
+    For the purpose of this test let's allow everyone to update
+    attendance information:
+
+        >>> view.canUpdate = lambda: True
+        >>> def _process(ar, text, explanation, resolve, code, late_arrival):
+        ...     print ar
+        ...     if explanation: print 'Explaining %s: %s' % (text, explanation)
+        ...     if resolve == 'accept':
+        ...         print 'Accepting %s (code %r)' % (text, code)
+        ...     if resolve == 'reject': print 'Rejecting %s' % text
+        ...     if resolve == 'tardy': print 'Converting %s to tardy on %s' % (text, late_arrival)
+        >>> view._process = _process
+        >>> view.unresolvedAbsences = lambda: [
+        ...     {'id': 'ar123', 'attendance_record': '<ar123>',
+        ...      'text': 'Attendance Record #123', 'day': ['<ar124>']},
+        ...     {'id': 'ar124', 'attendance_record': '<ar124>',
+        ...      'text': 'Attendance Record #124', 'day': ['<ar123>']},
+        ...     {'id': 'ar125', 'attendance_record': '<ar125>',
+        ...      'text': 'Attendance Record #125', 'day': []},
+        ... ]
+        >>> view.getInheritingRecords = lambda ar, day: []
+        >>> view.formatAttendanceRecord = lambda ar: ar
+
+    No 'UPDATE' button in request -- nothing happens.
+
+        >>> view.update()
+
+    No checkboxes in request -- nothing happens.
+
+        >>> request.form['UPDATE'] = u'Do it!'
+        >>> view.update()
+
+    No explanation or radio buttons -- nothing significant happens
+
+        >>> request.form['UPDATE'] = u'Do it!'
+        >>> request.form['ar123'] = 'on'
+        >>> request.form['ar125'] = 'on'
+        >>> view.update()
+        <ar123>
+        <ar125>
+
+    Let's add an explanation and accept:
+
+        >>> request.form['UPDATE'] = u'Do it!'
+        >>> request.form['ar123'] = 'on'
+        >>> request.form['ar125'] = 'on'
+        >>> request.form['explanation'] = 'yada yada'
+        >>> request.form['field.code'] = 'excused'
+        >>> request.form['resolve'] = 'accept'
+        >>> view.update()
+        <ar123>
+        Explaining Attendance Record #123: yada yada
+        Accepting Attendance Record #123 (code '001')
+        <ar125>
+        Explaining Attendance Record #125: yada yada
+        Accepting Attendance Record #125 (code '001')
+
+   If attendance record has inheriting attendance records - they
+   should be updated too:
+
+        >>> request.form = {}
+        >>> request.form['UPDATE'] = u'Do it!'
+        >>> request.form['ar123'] = 'on'
+        >>> request.form['explanation'] = 'yada yada'
+        >>> request.form['field.code'] = 'excused'
+        >>> request.form['resolve'] = 'accept'
+        >>> view.getInheritingRecords = lambda ar, day: ['<ar126>', '<ar127>']
+        >>> view.update()
+        <ar123>
+        Explaining Attendance Record #123: yada yada
+        Accepting Attendance Record #123 (code '001')
+        <ar126>
+        Explaining <ar126>: yada yada
+        Accepting <ar126> (code '001')
+        <ar127>
+        Explaining <ar127>: yada yada
+        Accepting <ar127> (code '001')
+
+    Make tardy should not be inherited, as this form should allow only
+    homeroom periods to be converted into tardies:
+
+        >>> request.form = {}
+        >>> request.form['UPDATE'] = u'Do it!'
+        >>> request.form['ar123'] = 'on'
+        >>> request.form['resolve'] = 'tardy'
+        >>> request.form['tardy_time'] = '15:56'
+        >>> view.getInheritingRecords = lambda ar, day: ['<ar126>', '<ar127>']
+        >>> view.update()
+        <ar123>
+        Converting Attendance Record #123 to tardy on 15:56
+
+    If updating of the attendance information is not allowed update
+    should not perform anything, but appends an error message to
+    errors list:
+
+        >>> view = StudentAttendanceView(None, request)
+        >>> view.canUpdate = lambda: False
+        >>> view.update()
+        >>> view.errors
+        [u'You are not allowed to modify attendance information.']
+
+    """
+
+
+def doctest_StudentAttendanceView_process():
+    r"""Tests for StudentAttendanceView._process
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> view.errors = []
+        >>> view.statuses = []
+        >>> view._addExplanation = print_and_return_True('addExplanation')
+        >>> view._acceptExplanation = print_and_return_True('acceptExplanation')
+        >>> view._rejectExplanation = print_and_return_True('rejectExplanation')
+        >>> view._makeTardy = print_and_return_True('makeTardy')
+
+        >>> ar = 'attendance_record'
+        >>> text = 'THIS ABSENCE'
+        >>> view._process(ar, text, '', 'ignore', '', '')
+
+    Nothing happened.
+
+        >>> view.statuses
+        []
+
+    Let's add an explanation; nothing else
+
+        >>> view._process(ar, text, 'explainexplainexplain', 'ignore', '', '')
+        addExplanation
+        >>> for status in view.statuses:
+        ...     print translate(status)
+        Added an explanation for THIS ABSENCE
+
+    Let's accept an explanation; nothing else
+
+        >>> view.statuses = []
+        >>> view._process(ar, text, '', 'accept', '001', '')
+        acceptExplanation
+        >>> for status in view.statuses:
+        ...     print translate(status)
+        Resolved THIS ABSENCE
+
+    Let's reject an explanation; nothing else
+
+        >>> view.statuses = []
+        >>> view._process(ar, text, '', 'reject', '', '')
+        rejectExplanation
+        >>> for status in view.statuses:
+        ...     print translate(status)
+        Rejected explanation for THIS ABSENCE
+
+    Ok, now let's both add and accept an explanation
+
+        >>> view.statuses = []
+        >>> view._process(ar, text, 'gugugu', 'accept', '001', '')
+        addExplanation
+        acceptExplanation
+        >>> for status in view.statuses:
+        ...     print translate(status)
+        Resolved THIS ABSENCE
+
+    Let's reject an explanation; nothing else
+
+        >>> view.statuses = []
+        >>> view._process(ar, text, 'baaaa', 'reject', '', '')
+        addExplanation
+        rejectExplanation
+        >>> for status in view.statuses:
+        ...     print translate(status)
+        Rejected explanation for THIS ABSENCE
+
+    Let's make this absence into a tardy:
+
+        >>> view.statuses = []
+        >>> view._process(ar, text, '', 'tardy', '', '15:23')
+        makeTardy
+        >>> for status in view.statuses:
+        ...     print translate(status)
+        Made THIS ABSENCE a tardy
+
+    """
+
+
+def doctest_StudentAttendanceView_process_error_handling():
+    r"""Tests for StudentAttendanceView._process
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> view.errors = []
+        >>> view.statuses = []
+        >>> view._addExplanation = print_and_return_False('addExplanation')
+        >>> view._acceptExplanation = print_and_return_True('acceptExplanation')
+        >>> view._rejectExplanation = print_and_return_True('rejectExplanation')
+
+        >>> ar = 'attendance_record'
+        >>> text = 'THIS ABSENCE'
+
+    Let's add an explanation, when you cannot add an explanation
+
+        >>> view._process(ar, text, 'explainexplainexplain', 'ignore', '', '')
+        addExplanation
+        >>> view.statuses
+        []
+
+    You cannot accept/reject anything if addExplanation fails
+
+        >>> view._process(ar, text, 'explainexplainexplain', 'accept', '001', '')
+        addExplanation
+        >>> view._process(ar, text, 'explainexplainexplain', 'reject', '', '')
+        addExplanation
+        >>> view.statuses
+        []
+
+    Ok, suppose you could add an explanation, but accept/reject borks
+
+        >>> view._addExplanation = print_and_return_True('addExplanation')
+        >>> view._acceptExplanation = print_and_return_False('acceptExplanation')
+        >>> view._rejectExplanation = print_and_return_False('rejectExplanation')
+
+        >>> view._process(ar, text, 'explainexplainexplain', 'accept', '001', '')
+        addExplanation
+        acceptExplanation
+        >>> for status in view.statuses:
+        ...     print translate(status)
+        Added an explanation for THIS ABSENCE
+
+        >>> view.statuses = []
+        >>> view._process(ar, text, 'explainexplainexplain', 'reject', '', '')
+        addExplanation
+        rejectExplanation
+        >>> for status in view.statuses:
+        ...     print translate(status)
+        Added an explanation for THIS ABSENCE
+
+    Ok, suppose you did not add an explanation, and accept/reject borks
+
+        >>> view.statuses = []
+        >>> view._process(ar, text, '', 'accept', '001', '')
+        acceptExplanation
+        >>> view.statuses
+        []
+
+        >>> view.statuses = []
+        >>> view._process(ar, text, '', 'reject', '', '')
+        rejectExplanation
+        >>> view.statuses
+        []
+
+    """
+
+
+def doctest_StudentAttendanceView_addExplanation():
+    r"""Tests for StudentAttendanceView._addExplanation
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> view.errors = []
+
+        >>> ar = HomeroomAttendanceRecordStub(None,
+        ...         datetime.datetime(2006, 1, 29, tzinfo=utc),
+        ...         ABSENT)
+
+        >>> def addExplanation(explanation):
+        ...     print "Added explanation:", explanation
+        >>> ar.addExplanation = addExplanation
+        >>> view._addExplanation(ar, 'Bububu', {'absence': 'THIS ABSENCE'})
+        Added explanation: Bububu
+        True
+        >>> view.errors
+        []
+
+        >>> ar.addExplanation = ar._raiseError
+        >>> view._addExplanation(ar, 'Bububu', {'absence': 'THIS ABSENCE'})
+        False
+
+        >>> for err in view.errors:
+        ...     print translate(err)
+        Cannot add new explanation for THIS ABSENCE:
+            old explanation not accepted/rejected
+
+    """
+
+
+def doctest_StudentAttendanceView_acceptExplanation():
+    r"""Tests for StudentAttendanceView._acceptExplanation
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> view.errors = []
+
+        >>> ar = HomeroomAttendanceRecordStub(None,
+        ...          datetime.datetime(2006, 1, 29, tzinfo=utc), ABSENT)
+        >>> view._acceptExplanation(ar, '001', {'absence': 'THIS ABSENCE'})
+        Accepted explanation
+        True
+        >>> view.errors
+        []
+
+        >>> ar.acceptExplanation = ar._raiseError
+        >>> view._acceptExplanation(ar, '001', {'absence': 'THIS ABSENCE'})
+        False
+
+        >>> for err in view.errors:
+        ...     print translate(err)
+        There are no outstanding explanations to accept for THIS ABSENCE
+
+    """
+
+
+def doctest_StudentAttendanceView_rejectExplanation():
+    r"""Tests for StudentAttendanceView._rejectExplanation
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...        import StudentAttendanceView
+        >>> view = StudentAttendanceView(None, None)
+        >>> view.errors = []
+
+        >>> ar = HomeroomAttendanceRecordStub(None,
+        ...          datetime.datetime(2006, 1, 29, tzinfo=utc), ABSENT)
+        >>> def rejectExplanation():
+        ...     print "Rejected explanation"
+        >>> ar.rejectExplanation = rejectExplanation
+        >>> view._rejectExplanation(ar, {'absence': 'THIS ABSENCE'})
+        Rejected explanation
+        True
+        >>> view.errors
+        []
+
+        >>> ar.rejectExplanation = ar._raiseError
+        >>> view._rejectExplanation(ar, {'absence': 'THIS ABSENCE'})
+        False
+
+        >>> for err in view.errors:
+        ...     print translate(err)
+        There are no outstanding explanations to reject for THIS ABSENCE
+
+    """
+
+
+def doctest_AttendancePanelView_getItems():
+    r"""Tests for AttendancePanelView.getItems.
+
+        >>> from schooltool.attendance.browser.attendance import \
+        ...     AttendancePanelView
+        >>> from schooltool.attendance.interfaces import IUnresolvedAbsenceCache
+
+    We'll need a few stubs:
+
+        >>> class PersonStub(object):
+        ...     def __init__(self, title):
+        ...         self.title = title
+        ...     def __repr__(self):
+        ...         return self.title.lower()
+
+        >>> class AppStub(object):
+        ...     def __getitem__(self, key):
+        ...         if key == 'persons':
+        ...             return {'person': PersonStub('Person'),
+        ...                     'archangel': PersonStub('Archangel'),
+        ...                     'zorro': PersonStub('Zorro')}
+
+        >>> class UnresolvedAbsenceCacheStub(object):
+        ...     adapts(AppStub)
+        ...     implements(IUnresolvedAbsenceCache)
+        ...     def __init__(self, context):
+        ...         pass
+        ...     def __iter__(self):
+        ...         yield ('person', 'absences of person')
+        ...         yield ('archangel', 'absences of archangel')
+        ...         yield ('zorro', 'absences of zorro')
+        >>> provideAdapter(UnresolvedAbsenceCacheStub)
+
+    All items:
+
+        >>> app = AppStub()
+        >>> request = TestRequest()
+        >>> view = AttendancePanelView(app, request)
+
+        >>> for item in view.getItems():
+        ...     print item['person'], item['title'], item['absences']
+        person Person absences of person
+        archangel Archangel absences of archangel
+        zorro Zorro absences of zorro
+
+    Check filtering:
+
+        >>> for item in view.getItems('zo'):
+        ...     print item['person'], item['title'], item['absences']
+        zorro Zorro absences of zorro
+
+    """
+
+
+def doctest_AttendancePanelView_update():
+    r"""Tests for AttendancePanelView.update.
+
+        >>> from schooltool.attendance.browser.attendance import \
+        ...     AttendancePanelView
+        >>> from schooltool.attendance.interfaces import IUnresolvedAbsenceCache
+
+        >>> har = HomeroomAttendanceRecordStub(None, some_dt, None)
+        >>> sar = SectionAttendanceRecordStub(None, some_dt, None)
+        >>> p = PersonStub()
+        >>> provideAdapter(HomeroomAttendanceStub, adapts=[PersonStub])
+
+        >>> app = None
+        >>> request = TestRequest()
+        >>> view = AttendancePanelView(app, request)
+        >>> def getItemsStub(search_str):
+        ...     print 'getItems(%r)' % search_str
+        ...     return [{'person': p, 'title': 'Person', 'absences': 'h'},
+        ...             {'person': p, 'title': 'Archangel', 'absences': 's'},
+        ...             {'person': p, 'title': 'Zorro', 'absences': 'ssh'}]
+        >>> view.getItems = getItemsStub
+        >>> def countAbsencesStub(absences, homeroom_attendance):
+        ...     return absences.count('h'), absences.count('s')
+        >>> view.countAbsences = countAbsencesStub
+
+    We call update():
+
+        >>> view.update()
+        getItems('')
+
+        >>> view.batch.start
+        0
+        >>> view.batch.size
+        10
+        >>> [item['title'] for item in view.batch]
+        ['Archangel', 'Person', 'Zorro']
+        >>> [item['hr_absences'] for item in view.batch]
+        [0, 1, 1]
+        >>> [item['section_absences'] for item in view.batch]
+        [1, 0, 2]
+
+    Let's chect that arguments in the request are reacted to:
+
+        >>> request.form['batch_start'] = 2
+        >>> request.form['batch_size'] = 3
+        >>> view.update()
+        getItems('')
+        >>> view.batch.start
+        2
+        >>> view.batch.size
+        3
+        >>> [item['title'] for item in view.batch]
+        ['Zorro']
+
+    Test searching:
+
+        >>> request.form['SEARCH'] = 'FoO'
+        >>> view.update()
+        getItems('FoO')
+        >>> request.form['SEARCH']
+        'FoO'
+
+    If CLEAR_SEARCH is set, SEARCH will be reset:
+
+        >>> request.form['CLEAR_SEARCH'] = 'Clear'
+        >>> view.update()
+        getItems('')
+        >>> request.form['SEARCH']
+        ''
+
+    """
+
+
+def doctest_AttendancePanelView_countAbsences():
+    r"""Tests for AttendancePanelView.countAbsences
+
+        >>> from schooltool.attendance.browser.attendance \
+        ...         import AttendancePanelView
+
+        >>> class HomeroomAttendanceStub(object):
+        ...     def getHomeroomPeriodForRecord(self, section_ar):
+        ...         return HomeroomAttendanceRecordStub(None, some_dt, UNKNOWN)
+        >>> homeroom_attendance = HomeroomAttendanceStub()
+
+        >>> view = AttendancePanelView(None, None)
+        >>> har = HomeroomAttendanceRecordStub(None, some_dt, ABSENT)
+        >>> sar = SectionAttendanceRecordStub(None, some_dt, ABSENT)
+
+    Simple cases
+
+        >>> view.countAbsences([], homeroom_attendance)
+        (0, 0)
+        >>> view.countAbsences([har], homeroom_attendance)
+        (1, 0)
+        >>> view.countAbsences([sar], homeroom_attendance)
+        (0, 1)
+
+        >>> view.countAbsences([sar, har, har, sar, sar], homeroom_attendance)
+        (2, 3)
+
+    Section attendanced that have a matching homeroom attendance are not
+    counted.
+
+        >>> class HomeroomAttendanceStub(object):
+        ...     def getHomeroomPeriodForRecord(self, section_ar):
+        ...         return HomeroomAttendanceRecordStub(None, some_dt, ABSENT)
+        >>> homeroom_attendance = HomeroomAttendanceStub()
+
+        >>> view.countAbsences([sar, har, har, sar, sar], homeroom_attendance)
+        (2, 0)
+
+    """
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpTraversal()
+    setUpAnnotations()
+    setUpRelationships()
+    stubProcessDefinition()
+    provideAdapter(SchoolToolApplicationStub)
+    provideAdapter(ApplicationPreferencesStub)
+    logging.getLogger('attendance').disabled = True
+    SchoolToolApplicationStub._attendancePrefs.homeroomTardyGracePeriod = 5
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+    logging.getLogger('attendance').disabled = False
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(
+            optionflags=doctest.ELLIPSIS|doctest.NORMALIZE_WHITESPACE,
+            setUp=setUp, tearDown=tearDown),
+        doctest.DocTestSuite(
+            "schooltool.attendance.browser.attendance",
+            optionflags=doctest.ELLIPSIS,
+            setUp=setUp, tearDown=tearDown)
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_attendance.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_sparkline.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_sparkline.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_sparkline.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,134 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for SchoolTool attendance sparkline views
+
+$Id: test_sparkline.py 6047 2006-05-11 18:31:03Z mg $
+"""
+import unittest
+from datetime import date
+from persistent import Persistent
+
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+
+from schooltool.attendance.interfaces import IHomeroomAttendance
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.testing import setup as stsetup
+from schooltool.attendance.browser.sparkline import AttendanceSparklineView
+
+
+def setUp(test):
+    setup.placefulSetUp()
+    setup.setUpTraversal()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+class HomeroomAttendanceStub:
+    pass
+
+
+class PersonStub(Persistent):
+    username = 'boy'
+
+    def __conform__(self, interface):
+        if interface is IHomeroomAttendance:
+            return HomeroomAttendanceStub()
+
+
+class CalendarStub:
+    def expand(self, *args):
+        pass
+
+
+class TimetablesStub:
+    def makeTimetableCalendar(self):
+        return CalendarStub()
+
+
+class SectionStub:
+    def __conform__(self, interface):
+        if interface is ICompositeTimetables:
+            return TimetablesStub()
+
+
+def doctest_AttendanceSparklineView_call():
+    """Doctest for AttendanceSparklineView.__call__ method.
+
+    Set up all infrastructure:
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> context = None
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> view = AttendanceSparklineView(context, request)
+        >>> view.update = lambda: None
+        >>> view.person = PersonStub()
+        >>> view.section = SectionStub()
+        >>> view.date = date(2005, 10, 20)
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.app.app import getApplicationPreferences
+        >>> ztapi.provideAdapter(ISchoolToolApplication,
+        ...                      IApplicationPreferences,
+        ...                      getApplicationPreferences)
+
+    And look what we get:
+
+        >>> image = view()
+        >>> print image.encode('base64')
+        iVBORw0KGgoAAAANSUhEUgAAAB4AAAANCAIAAAAxEEnAAAAAhUlEQVR4nGL8//8/A20AAAAA//9i
+        opG5DAwMAAAAAP//oqHRAAAAAP//oqHRAAAAAP//oqHRAAAAAP//oqHRAAAAAP//oqHRAAAAAP//
+        oqHRAAAAAP//oqHRAAAAAP//oqHRAAAAAP//oqHRAAAAAP//oqHRAAAAAP//oqHRAAAAAP//AwAK
+        rQMX3Fm3sgAAAABJRU5ErkJggg==
+        <BLANKLINE>
+
+    """
+
+
+def doctest_AttendanceSparklineView_update():
+    """Doctest for AttendanceSparklineView.update method.
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest(form={'person': 'boy', 'date': '2005-10-20'})
+        >>> context = 'Section'
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> app['persons']['boy'] = PersonStub()
+        >>> view = AttendanceSparklineView(context, request)
+        >>> view.update()
+        >>> view.section
+        'Section'
+        >>> view.person
+        <schooltool.attendance.browser.tests.test_sparkline.PersonStub ...>
+        >>> view.date
+        datetime.date(2005, 10, 20)
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(
+            optionflags=doctest.ELLIPSIS|doctest.NORMALIZE_WHITESPACE,
+            setUp=setUp, tearDown=tearDown)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/browser/tests/test_sparkline.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,188 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:wfmc="http://namespaces.zope.org/wfmc"
+           xmlns:security="http://schooltool.org/securitypolicy"
+           i18n_domain="schooltool">
+
+  <class class=".attendance.SectionAttendance">
+    <require permission="schooltool.view"
+             interface=".interfaces.IReadSectionAttendance" />
+    <require permission="schooltool.add"
+             interface=".interfaces.IAddAttendance" />
+  </class>
+
+  <class class=".attendance.SectionAttendanceRecord">
+    <allow interface=".interfaces.ISectionAttendanceRecord" />
+  </class>
+
+  <class class=".attendance.SectionAttendanceLoggingProxy">
+    <allow interface=".interfaces.ISectionAttendanceRecord" />
+  </class>
+
+  <adapter
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      provides=".interfaces.IAttendancePreferences"
+      factory=".attendance.getAttendancePreferences"
+      trusted="true"
+  />
+
+  <adapter
+        for="schooltool.person.interfaces.IPerson"
+        provides=".interfaces.ISectionAttendance"
+        factory=".attendance.getSectionAttendance"
+        trusted="true"
+  />
+
+  <adapter
+        for="schooltool.app.interfaces.ISchoolToolApplication"
+        provides=".interfaces.IUnresolvedAbsenceCache"
+        factory=".attendance.getUnresolvedAbsenceCache"
+        trusted="true"
+  />
+
+  <class class=".attendance.UnresolvedAbsenceCache">
+    <require permission="schooltool.edit"
+             interface=".interfaces.IUnresolvedAbsenceCache" />
+  </class>
+
+  <class class=".attendance.HomeroomAttendance">
+    <require permission="schooltool.view"
+             interface=".interfaces.IReadHomeroomAttendance" />
+    <require permission="schooltool.add"
+             interface=".interfaces.IAddAttendance" />
+  </class>
+
+  <class class=".attendance.HomeroomAttendanceRecord">
+    <allow interface=".interfaces.IHomeroomAttendanceRecord" />
+  </class>
+
+  <class class=".attendance.HomeroomAttendanceLoggingProxy">
+    <allow interface=".interfaces.IHomeroomAttendanceRecord" />
+  </class>
+
+  <adapter
+        for="schooltool.person.interfaces.IPerson"
+        provides=".interfaces.IHomeroomAttendance"
+        factory=".attendance.getHomeroomAttendance"
+        trusted="true"
+  />
+
+  <class class=".attendance.AbsenceExplanation">
+    <allow interface=".interfaces.IAbsenceExplanation" />
+  </class>
+
+
+  <!-- Attendance workflow subscribers -->
+  <subscriber
+      for="zope.wfmc.interfaces.IProcessStarted"
+      handler=".attendance.addAttendanceRecordToCache"
+      />
+
+  <subscriber
+      for="zope.wfmc.interfaces.IProcessFinished"
+      handler=".attendance.removeAttendanceRecordFromCache"
+      />
+
+  <!-- Process Definition for Explanation workflow -->
+  <wfmc:xpdl
+      file="explanation.xpdl"
+      process="explanation"
+      id="schooltool.attendance.explanation"
+      integration="zope.wfmc.adapter.integration"
+      />
+
+  <!-- Participant: AttendanceAdmin -->
+  <adapter
+     for="zope.wfmc.interfaces.IActivity"
+     provides="zope.wfmc.interfaces.IParticipant"
+     factory=".attendance.AttendanceAdmin"
+     name=".attendanceAdmin"
+     />
+
+  <!-- Applications -->
+
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".attendance.WaitForExplanation"
+      name=".WaitForExplanation"
+      />
+
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".attendance.MakeTardy"
+      name=".MakeTardy"
+      />
+
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".attendance.AcceptExplanation"
+      name=".AcceptExplanation"
+      />
+
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".attendance.RejectExplanation"
+      name=".RejectExplanation"
+      />
+
+  <include package=".browser" />
+
+  <!-- Calendar Provider subscriber -->
+
+  <subscriber
+      for="schooltool.app.interfaces.ISchoolToolCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.app.browser.cal.ICalendarProvider"
+      factory=".attendance.AttendanceCalendarProvider"
+      />
+
+  <!-- Sample data -->
+
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+
+    <utility
+        factory=".sampledata.SampleAttendancePlugin"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="attendance"
+        />
+  </configure>
+
+  <adapter
+      factory=".attendance.getAttendanceOwner"
+      provides="schooltool.person.interfaces.IPerson"
+      for="schooltool.attendance.interfaces.IAttendance " />
+
+  <security:crowd
+      factory=".attendance.AttendanceEditorsCrowd"
+      name="attendance_editors" />
+
+  <security:allow
+      interface="schooltool.attendance.interfaces.IAttendance"
+      crowds="administration owner person_instructors"
+      permission="schooltool.view" />
+  <security:allow
+      interface="schooltool.attendance.interfaces.IAttendance"
+      crowds="administration attendance_editors"
+      permission="schooltool.edit" />
+  <security:allow
+      interface="schooltool.attendance.interfaces.IAttendance"
+      crowds="administration person_instructors"
+      permission="schooltool.add" />
+
+  <security:setting
+      key="teachers_can_modify_attendance_records"
+      text="Teachers can modify attendance records"
+      default="False" />
+
+  <security:allow
+      interface="schooltool.attendance.interfaces.IUnresolvedAbsenceCache"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/explanation.xpdl
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/explanation.xpdl	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/explanation.xpdl	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Package Id="explanation" Name="Attendance Explanation" xmlns="http://www.wfmc.org/2002/XPDL1.0" xmlns:xpdl="http://www.wfmc.org/2002/XPDL1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.wfmc.org/2002/XPDL1.0 http://wfmc.org/standards/docs/TC-1025_schema_10_xpdl.xsd">
+    <PackageHeader>
+        <XPDLVersion>1.0</XPDLVersion>
+        <Vendor>Together</Vendor>
+        <Created>2005-12-02 00:08:55</Created>
+    </PackageHeader>
+    <RedefinableHeader PublicationStatus="UNDER_TEST"/>
+    <ConformanceClass GraphConformance="NON_BLOCKED"/>
+    <WorkflowProcesses>
+        <WorkflowProcess AccessLevel="PUBLIC" Id="explanation" Name="Explanation">
+            <ProcessHeader DurationUnit="D">
+                <Created>2005-12-02 00:14:00</Created>
+            </ProcessHeader>
+            <RedefinableHeader PublicationStatus="UNDER_TEST"/>
+            <FormalParameters>
+                <FormalParameter Id="attendanceRecord" Mode="IN">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                </FormalParameter>
+                <FormalParameter Id="student" Mode="IN">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                </FormalParameter>
+            </FormalParameters>
+            <DataFields>
+                <DataField Id="attendanceRecord" IsArray="FALSE" Name="Attendance Record">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                </DataField>
+                <DataField Id="arrivalTime" IsArray="FALSE">
+                    <DataType>
+                        <BasicType Type="DATETIME"/>
+                    </DataType>
+                </DataField>
+                <DataField Id="outcome" IsArray="FALSE">
+                    <DataType>
+                        <BasicType Type="STRING"/>
+                    </DataType>
+                </DataField>
+                <DataField Id="code" IsArray="FALSE" Name="Code">
+                    <DataType>
+                        <BasicType Type="STRING"/>
+                    </DataType>
+                </DataField>
+                <DataField Id="student" IsArray="FALSE" Name="Student">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                </DataField>
+            </DataFields>
+            <Participants>
+                <Participant Id="attendanceAdmin" Name="Attendance Administrator">
+                    <ParticipantType Type="ROLE"/>
+                </Participant>
+            </Participants>
+            <Applications>
+                <Application Id="WaitForExplanation">
+                    <FormalParameters>
+                        <FormalParameter Id="attendanceRecord" Mode="IN">
+                            <DataType>
+                                <BasicType Type="REFERENCE"/>
+                            </DataType>
+                        </FormalParameter>
+                        <FormalParameter Id="outcome" Mode="OUT">
+                            <DataType>
+                                <BasicType Type="STRING"/>
+                            </DataType>
+                        </FormalParameter>
+                        <FormalParameter Id="arrivalTime" Mode="OUT">
+                            <DataType>
+                                <BasicType Type="DATETIME"/>
+                            </DataType>
+                        </FormalParameter>
+                        <FormalParameter Id="code" Mode="OUT">
+                            <DataType>
+                                <BasicType Type="STRING"/>
+                            </DataType>
+                        </FormalParameter>
+                    </FormalParameters>
+                </Application>
+                <Application Id="MakeTardy">
+                    <FormalParameters>
+                        <FormalParameter Id="attendanceRecord" Mode="IN">
+                            <DataType>
+                                <BasicType Type="REFERENCE"/>
+                            </DataType>
+                        </FormalParameter>
+                        <FormalParameter Id="arrivalTime" Mode="IN">
+                            <DataType>
+                                <BasicType Type="DATETIME"/>
+                            </DataType>
+                        </FormalParameter>
+                    </FormalParameters>
+                </Application>
+                <Application Id="AcceptExplanation">
+                    <FormalParameters>
+                        <FormalParameter Id="attendanceRecord" Mode="IN">
+                            <DataType>
+                                <BasicType Type="REFERENCE"/>
+                            </DataType>
+                        </FormalParameter>
+                        <FormalParameter Id="code" Mode="IN">
+                            <DataType>
+                                <BasicType Type="STRING"/>
+                            </DataType>
+                        </FormalParameter>
+                    </FormalParameters>
+                </Application>
+                <Application Id="RejectExplanation">
+                    <FormalParameters>
+                        <FormalParameter Id="attendanceRecord" Mode="IN">
+                            <DataType>
+                                <BasicType Type="REFERENCE"/>
+                            </DataType>
+                        </FormalParameter>
+                    </FormalParameters>
+                </Application>
+            </Applications>
+            <Activities>
+                <Activity Id="explain" Name="Explain">
+                    <Implementation>
+                        <Tool Id="WaitForExplanation" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>attendanceRecord</ActualParameter>
+                                <ActualParameter>outcome</ActualParameter>
+                                <ActualParameter>arrivalTime</ActualParameter>
+                                <ActualParameter>code</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>attendanceAdmin</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <TransitionRestrictions>
+                        <TransitionRestriction>
+                            <Join Type="XOR"/>
+                            <Split Type="XOR">
+                                <TransitionRefs>
+                                    <TransitionRef Id="explain_to_excuse"/>
+                                    <TransitionRef Id="explain_to_reject"/>
+                                    <TransitionRef Id="explain_to_tardy"/>
+                                </TransitionRefs>
+                            </Split>
+                        </TransitionRestriction>
+                    </TransitionRestrictions>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_OFFSET" Value="410,30"/>
+                        <ExtendedAttribute Name="JaWE_GRAPH_PARTICIPANT_ID" Value="attendanceAdmin"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="reject" Name="Reject">
+                    <Implementation>
+                        <Tool Id="RejectExplanation" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>attendanceRecord</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>attendanceAdmin</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_OFFSET" Value="500,110"/>
+                        <ExtendedAttribute Name="JaWE_GRAPH_PARTICIPANT_ID" Value="attendanceAdmin"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="makeTardy" Name="Make Tardy">
+                    <Implementation>
+                        <Tool Id="MakeTardy" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>attendanceRecord</ActualParameter>
+                                <ActualParameter>arrivalTime</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>attendanceAdmin</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_OFFSET" Value="320,110"/>
+                        <ExtendedAttribute Name="JaWE_GRAPH_PARTICIPANT_ID" Value="attendanceAdmin"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="excuse" Name="Excuse">
+                    <Implementation>
+                        <Tool Id="AcceptExplanation" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>attendanceRecord</ActualParameter>
+                                <ActualParameter>code</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>attendanceAdmin</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_OFFSET" Value="610,60"/>
+                        <ExtendedAttribute Name="JaWE_GRAPH_PARTICIPANT_ID" Value="attendanceAdmin"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="create" Name="Create Absence">
+                    <Implementation>
+                        <No/>
+                    </Implementation>
+                    <Performer>attendanceAdmin</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_OFFSET" Value="250,40"/>
+                        <ExtendedAttribute Name="JaWE_GRAPH_PARTICIPANT_ID" Value="attendanceAdmin"/>
+                        <ExtendedAttribute Name="AttendanceRecord"/>
+                        <ExtendedAttribute Name="Person"/>
+                    </ExtendedAttributes>
+                </Activity>
+            </Activities>
+            <Transitions>
+                <Transition From="create" Id="create_to_explain" To="explain">
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_TRANSITION_STYLE" Value="NO_ROUTING_ORTHOGONAL"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="explain" Id="explain_to_tardy" To="makeTardy">
+                    <Condition Type="CONDITION">outcome == 'tardy'</Condition>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_TRANSITION_STYLE" Value="NO_ROUTING_ORTHOGONAL"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="makeTardy" Id="tardy_to_explain" To="explain">
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_TRANSITION_STYLE" Value="NO_ROUTING_ORTHOGONAL"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="explain" Id="explain_to_reject" To="reject">
+                    <Condition Type="CONDITION">outcome == 'reject'</Condition>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_TRANSITION_STYLE" Value="NO_ROUTING_ORTHOGONAL"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="reject" Id="reject_to_explain" To="explain">
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_TRANSITION_STYLE" Value="NO_ROUTING_ORTHOGONAL"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="explain" Id="explain_to_excuse" To="excuse">
+                    <Condition Type="CONDITION">outcome == 'accept'</Condition>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="JaWE_GRAPH_TRANSITION_STYLE" Value="NO_ROUTING_ORTHOGONAL"/>
+                    </ExtendedAttributes>
+                </Transition>
+            </Transitions>
+            <ExtendedAttributes>
+                <ExtendedAttribute Name="JaWE_GRAPH_END_OF_WORKFLOW" Value="JaWE_GRAPH_PARTICIPANT_ID=attendanceAdmin,CONNECTING_ACTIVITY_ID=excuse,X_OFFSET=761,Y_OFFSET=111,JaWE_GRAPH_TRANSITION_STYLE=NO_ROUTING_ORTHOGONAL,TYPE=END_DEFAULT"/>
+                <ExtendedAttribute Name="JaWE_GRAPH_START_OF_WORKFLOW" Value="JaWE_GRAPH_PARTICIPANT_ID=attendanceAdmin,CONNECTING_ACTIVITY_ID=create,X_OFFSET=131,Y_OFFSET=71,JaWE_GRAPH_TRANSITION_STYLE=NO_ROUTING_ORTHOGONAL,TYPE=START_DEFAULT"/>
+                <ExtendedAttribute Name="JaWE_GRAPH_WORKFLOW_PARTICIPANT_ORDER" Value="attendanceAdmin"/>
+            </ExtendedAttributes>
+        </WorkflowProcess>
+    </WorkflowProcesses>
+    <ExtendedAttributes>
+        <ExtendedAttribute Name="EDITING_TOOL" Value="Together Workflow Editor Community Edition"/>
+        <ExtendedAttribute Name="EDITING_TOOL_VERSION" Value="2.0-2-C-20060228-0902"/>
+    </ExtendedAttributes>
+</Package>

Added: schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional Testing Utilities for attendance
+
+$Id: ftesting.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+import os
+
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+attendance_functional_layer = ZCMLLayer(filename,
+                                        __name__,
+                                        'attendance_functional_layer')


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.attendance" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,256 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Attendance tracking interfaces.
+
+$Id: interfaces.py 6251 2006-06-15 14:45:05Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+
+
+from zope.interface import Interface
+from zope.schema import Text, TextLine, Choice, List, Object
+from zope.schema import Date, Datetime, Timedelta, Dict, Int
+
+from schooltool import SchoolToolMessage as _
+from schooltool.course.interfaces import ISection
+
+
+class IAttendancePreferences(Interface):
+    """Attendance preferences stored in an annotation on the SchoolTool app."""
+
+    attendanceStatusCodes = Dict(
+        title=_("Attendance status codes"),
+        description=_("Dictionary of abbreviated attendance status codes"),
+        required=True)
+
+    attendanceRetroactiveTimeout = Int(
+        title=_("Retroactive attendance timeout"),
+        description=_("""
+            The period of time in minutes that must pass after the
+            section meeting is completed before the attendance form
+            changes from realtime to retroactive."""),
+        required=True)
+
+    homeroomTardyGracePeriod = Int(
+        title=_("Homeroom tardy grace period"),
+        description=_("""
+            The period of time in minutes you can be late for section after
+            beeing late for homeroom period without giving separate
+            explanation."""),
+        required=True)
+
+
+class IAttendance(Interface):
+    """Common functions for attendance tracking."""
+
+    def __iter__():
+        """Return all recorded attendance records.
+
+        None of the returned records will have status == UNKNOWN.
+        """
+
+    def filter(first, last):
+        """Return all recorded attendance records within a given date range.
+
+        Considers only those attendace records (ar) for which
+        first <= ar.date <= last, and ar.status is ABSENT or TARDY.
+
+        None of the returned records will have status == UNKNOWN.
+        """
+
+    def makeCalendar():
+        """Return attendance incidents as calendar events.
+
+        Lists all the attendace records (ar).
+        """
+
+
+class IAddAttendance(Interface):
+
+    def record(section, datetime, duration, period_id, present):
+        """Record the student's absence or presence.
+
+        You can record the absence or presence only once for a given
+        (section, datetime) pair.
+        """
+
+
+class IReadSectionAttendance(IAttendance):
+
+    def get(section, datetime):
+        """Return the attendance record for a specific section meeting.
+
+        Always succeeds, but the returned attendance record may be
+        "unknown".
+        """
+
+    def getAllForDay(date):
+        """Return all recorded attendance records for a specific day."""
+
+
+class ISectionAttendance(IReadSectionAttendance, IAddAttendance):
+    """A set of all student's section attendance records."""
+
+
+class IReadHomeroomAttendance(IReadSectionAttendance):
+
+    def getHomeroomPeriodForRecord(section_attendance_record):
+        """Return homeroom AR that the given section AR belongs to."""
+
+
+class IHomeroomAttendance(IReadHomeroomAttendance, IAddAttendance):
+    """A set of all student's homeroom attendance records."""
+
+
+NEW = 'NEW'
+ACCEPTED = 'ACCEPTED'
+REJECTED = 'REJECTED'
+
+
+class IAbsenceExplanation(Interface):
+    """An explanation of the absence"""
+
+    status = Choice(
+        title=u"Status",
+        description=u"""
+        Status of the explanation: NEW, ACCEPTED, or REJECTED.
+        """,
+        values=[NEW, ACCEPTED, REJECTED])
+
+    text = Text(
+        title=u"Text",
+        description=u"""Text of the explanation""")
+
+    def isAccepted():
+        """True if status is ACCEPTED"""
+
+    def isProcessed():
+        """True if status is not NEW"""
+
+
+UNKNOWN = 'UNKNOWN'
+PRESENT = 'PRESENT'
+ABSENT = 'ABSENT'
+TARDY = 'TARDY'
+
+
+class IAttendanceRecord(Interface):
+    """A single attendance record for a day/section."""
+
+    section = Object(
+        title=u"Section.",
+        schema=ISection)
+
+    datetime = Datetime(
+        title=u"Date/time",
+        description=u"""The date and time of the section meeting.""")
+
+    duration = Timedelta(
+        title=u"Duration",
+        description=u"""The duration of the section meeting.""")
+
+    period_id = TextLine(
+        title=u"ID of the period.")
+
+    date = Date(
+        title=u"Date",
+        description=u"""
+        Date of the record.
+        """)
+
+    status = Choice(
+        title=u"Status",
+        description=u"""
+        Attendance status (UNKNOWN, PRESENT, ABSENT, TARDY).
+        """,
+        values=[UNKNOWN, PRESENT, ABSENT, TARDY])
+
+    late_arrival = Datetime(
+        title=u"Date/time of late arrival",
+        description=u"""
+        Date and time of a late arrival.
+
+        None if status != TARDY.
+        """)
+
+    explanations = List(
+        title=u"Explanations",
+        description=u"""
+        A list of explanations for this record.
+
+        Only valid if the status is ABSENT or TARDY.
+        """,
+        value_type=Object(schema=IAbsenceExplanation))
+
+    def isUnknown(): """True if status == UNKNOWN."""
+    def isPresent(): """True if status == PRESENT."""
+    def isAbsent():  """True if status == ABSENT."""
+    def isTardy():   """True if status == TARDY."""
+
+    def isExplained():
+        """Is the absence/tardy explained?
+
+        Raises AttendanceError when status == UNKNOWN or PRESENT.
+        """
+
+    def addExplanation(text):
+        """Adds a new explanation for this attendance record."""
+
+    def acceptExplanation(code):
+        """Make the current (last) explanation accepted"""
+
+    def rejectExplanation():
+        """Make the current (last) explanation rejected"""
+
+    def makeTardy(arrived):
+        """Convert an absence to a tardy.
+
+        `arrived` is a datetime.datetime.
+
+        Raises AttendanceError when status != ABSENT.
+        """
+
+
+class ISectionAttendanceRecord(IAttendanceRecord):
+    """A single attendance record for a section."""
+
+
+class IHomeroomAttendanceRecord(IAttendanceRecord):
+    """A single attendance record for a homeroom period."""
+
+
+class IUnresolvedAbsenceCache(Interface):
+    """A set of unresolved absences."""
+
+    def add(student, record):
+        """Register an unresolved absence record for a student."""
+
+    def remove(student, record):
+        """Unregister an absence record that has been resolved."""
+
+    def __iter__():
+        """Iterate over absences.
+
+        Returns a sequence of tuples (user_name, [absence1, absence2, ...]).
+        """
+
+
+class AttendanceError(Exception):
+    """Attendance tracking error."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,183 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Attendance sample data generation.
+
+$Id: sampledata.py 6470 2006-11-08 16:44:06Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+
+import random
+import datetime
+
+import transaction
+from zope.interface import implements
+from zope.security.proxy import removeSecurityProxy
+
+from schooltool.attendance.interfaces import IHomeroomAttendance
+from schooltool.attendance.interfaces import ISectionAttendance
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.timetable.interfaces import ICompositeTimetables
+
+
+class SampleAttendancePlugin(object):
+    """Section and day attendance sample data generator.
+
+    Generates attendance data for the fall term of 2005 only.
+    """
+
+    implements(ISampleDataPlugin)
+
+    name = "attendance"
+    dependencies = ("section_timetables", )
+
+    term_to_use = '2005-fall'
+
+    day_absence_rate = 0.15 # A student skips 15% of days on average
+
+    absence_rate = 0.03     # A student skips 3% of meetings on average
+    tardy_rate = 0.90       # A student is late to 90% of absences on average
+    explanation_rate = 0.80 # Student explains 80% of his absences and tardies
+    excuse_rate = 0.80      # 80% of explained tardies/absences are excused
+    reject_rate = 0.30      # 30% of explained tardies/absences are rejected
+
+    only_last_n_days = 14   # Instead of generating attendance data
+                            # for the whole term (which is slow),
+                            # generate it only for the last N days
+
+    def applyExplanation(self, ar, (explained, processed, accepted)):
+        if explained:
+            ar.addExplanation("My car broke!")
+        if accepted:
+            ar.acceptExplanation('001')
+        elif processed:
+            ar.rejectExplanation()
+
+    def generateExplanation(self):
+        explained = False
+        processed = False
+        accepted = False
+        if self.rng.random() < self.explanation_rate:
+            explained = True
+            if self.rng.random() < self.excuse_rate:
+                processed = True
+                accepted = True
+            elif self.rng.random() < self.reject_rate:
+                processed = True
+                accepted = False
+        return (explained, processed, accepted)
+
+    def generateHomeroomAttendanceDay(self):
+        day = {}
+        persons = self.app['persons']
+        for person_name in persons:
+            if not person_name.startswith("student"):
+                continue
+            person = persons[person_name]
+            present = self.rng.random() > self.day_absence_rate
+
+            if not present:
+                day[person_name] = self.generateExplanation()
+        return day
+
+    def generateHomeroomAttendance(self):
+        """Generate sample data for homeroom attendance."""
+        hr_absences = {}
+        persons = self.app['persons']
+        for day in self.term:
+            if day < self.start_date:
+                continue
+            if day > self.end_date:
+                continue
+
+            strdate = day.strftime("%Y-%m-%d")
+            if self.term.isSchoolday(day):
+                hr_absences[strdate] = self.generateHomeroomAttendanceDay()
+        return hr_absences
+
+    def generateSectionAttendance(self, hr_absences):
+        """Generate sample data for section attendance."""
+        for section in self.app['sections'].values():
+            meetings = ICompositeTimetables(section).makeTimetableCalendar(self.start_date,
+                                                                           self.end_date)
+            for meeting in meetings:
+
+                timetable = meeting.activity.timetable
+                homeroom_period_ids = timetable[meeting.day_id].homeroom_period_ids
+                homeroom = (meeting.period_id in homeroom_period_ids)
+
+                for student in section.members:
+
+                    present = self.rng.random() > self.absence_rate
+                    tardy = self.rng.random() < self.tardy_rate
+
+                    datestr = meeting.dtstart.strftime("%Y-%m-%d")
+                    hr_absence = (datestr in hr_absences and
+                                  student.__name__ in hr_absences[datestr])
+
+                    if hr_absence:
+                        present = False
+                        hr_explanation = hr_absences[datestr][student.__name__]
+                    elif homeroom and not tardy:
+                        present = True
+
+                    if not present and not hr_absence:
+                        explanation = self.generateExplanation()
+
+                    def recordStatus(attendance):
+                        attendance.record(section, meeting.dtstart,
+                                          meeting.duration, meeting.period_id,
+                                          present)
+                        record = attendance.get(section, meeting.dtstart)
+                        if hr_absence:
+                            self.applyExplanation(record, hr_explanation)
+                        return record
+
+                    attendances = [ISectionAttendance(student)]
+                    if homeroom:
+                        attendances.append(IHomeroomAttendance(student))
+
+                    for attendance in attendances:
+                        ar = recordStatus(attendance)
+                        if not present and not hr_absence:
+                            if tardy:
+                                ar.makeTardy(meeting.dtstart + datetime.timedelta(minutes=15))
+                            self.applyExplanation(ar, explanation)
+
+            # Use a savepoint to keep memory usage low, yet still be
+            # able to rollback whole sample data generation if
+            # something fails.
+            transaction.savepoint(optimistic=True)
+
+    def generate(self, app, seed=None):
+        # You cannot store proxied objects in the ZODB.  It is safe to
+        # unwrap, since only managers can invoke sample data.
+        self.app = removeSecurityProxy(app)
+        self.rng = random.Random(seed)
+        self.term = app['terms'][self.term_to_use]
+
+        # interval in which attendance records will be generated
+        self.start_date = self.term.first
+        self.end_date = self.term.last
+        if self.only_last_n_days:
+            timedelta = datetime.timedelta(self.only_last_n_days - 1)
+            self.start_date = self.end_date - timedelta
+
+        hr_absences = self.generateHomeroomAttendance()
+        self.generateSectionAttendance(hr_absences)


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/sparkline.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/sparkline.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/sparkline.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,181 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Attendance sparkline.
+
+$Id: sparkline.py 5996 2006-04-27 18:57:17Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+
+
+import StringIO
+import datetime
+import pytz
+
+from PIL import Image, ImageDraw
+
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.term.term import getTermForDate
+from schooltool.attendance.interfaces import ISectionAttendance
+from schooltool.attendance.interfaces import IHomeroomAttendance
+
+
+class AttendanceSparkline(object):
+    """Attendance sparkline generator.
+
+    Shows the attendance of a given student and a given section for the
+    last several school days.
+    """
+
+    width = 10  # Minimum number of data points
+
+    # Predefined color palette
+    colors = {'black': '#000000', 'red': '#ff0000', 'yellow': '#ffc000'}
+
+
+    def __init__(self, person, section, date):
+        self.person = person
+        self.section = section
+        self.date = date
+
+    def getLastSchooldays(self):
+        """Return last schoolday dates (generator)"""
+        date = self.date
+        term = getTermForDate(date)
+        if not term:
+            return
+        date -= datetime.date.resolution
+        while date >= term.first:
+            if term.isSchoolday(date):
+                yield date
+            date -= datetime.date.resolution
+
+    def getRecordsForDay(self, date):
+        """Get all records for ``date`` corresponding to our section."""
+        section_attendance = ISectionAttendance(self.person)
+        all_records = section_attendance.getAllForDay(date)
+        return [record for record in all_records
+                if record.section == self.section]
+
+    def getWorstRecordForDay(self, date):
+        """Get 'worst' attendance record for day"""
+        records = self.getRecordsForDay(date)
+        for rec in records:
+            if (rec.isAbsent() or rec.isTardy()) and not rec.isExplained():
+                return rec
+        for rec in records:
+            if rec.isAbsent() or rec.isTardy():
+                return rec
+        for rec in records:
+            if rec.isPresent():
+                return rec
+        return None
+
+    def sectionMeetsOn(self, day, tz, section_calendar):
+        """Does a section have a meeting on a given day?
+
+        ``tz`` is the school-wide timezone used to determine when exactly a
+        schoolday starts and ends.
+
+        ``section_calendar`` is a calendar containing section meetings
+        """
+        day_start = tz.localize(datetime.datetime.combine(day, datetime.time()))
+        day_end = day_start + datetime.timedelta(1)
+        return bool(list(section_calendar.expand(day_start, day_end)))
+
+    def getLastSectionDays(self, count=10):
+        section_calendar = ICompositeTimetables(self.section).makeTimetableCalendar()
+        timezone = IApplicationPreferences(getSchoolToolApplication()).timezone
+        tz = pytz.timezone(timezone)
+        result = []
+        for day in self.getLastSchooldays():
+            if self.sectionMeetsOn(day, tz, section_calendar):
+                result.append(day)
+                count -= 1
+                if count == 0:
+                    break
+        result.reverse()
+        return result
+
+    def getData(self):
+        """Get all the data necessary to draw the sparkline.
+
+        Returns list of tuples: (whisker_size, color, sign).
+        """
+        days = self.getLastSectionDays(self.width)
+        hr_attendance = IHomeroomAttendance(self.person)
+        data = []
+        for day in days:
+            section_record = self.getWorstRecordForDay(day)
+            hr_period = None
+            if section_record:
+                hr_period = hr_attendance.getHomeroomPeriodForRecord(section_record)
+            if not section_record or section_record.isUnknown():
+                data.append(('dot', 'black', '+'))
+            elif section_record.isPresent():
+                data.append(('full', 'black', '+'))
+            elif section_record.isExplained():
+                data.append(('full', 'black', '-'))
+            elif hr_period.isPresent():
+                data.append(('full', 'red', '-'))
+            else:
+                data.append(('full', 'yellow', '-'))
+        return data
+
+    def render(self, height=13, point_width=2, spacing=1):
+        """Render sparkline of specified size and return as PIL image."""
+        attrs = self.getData()
+        number_of_days = len(attrs)
+        left_margin = 0
+        if number_of_days < self.width:
+            left_margin = self.width - number_of_days
+        width = (left_margin + number_of_days) * (point_width + spacing)
+        image = Image.new('RGB', (width, height), 'white')
+        draw = ImageDraw.Draw(image)
+        middle = height/2
+        for nr, attr in enumerate(attrs):
+            size, color_id, sign = attr
+            color = self.colors[color_id]
+            x = (left_margin + nr) * (point_width + spacing)
+            if size == 'dot':
+                real_size = 0
+            elif size == 'full':
+                real_size = height/2
+            else:
+                real_size = height/4
+            if sign == '-':
+                draw.rectangle((x, middle, x+point_width-1, middle+real_size),
+                               fill=color)
+            else:
+                draw.rectangle((x, middle, x+point_width-1, middle-real_size),
+                               fill=color)
+        return image
+
+    def renderAsPngData(self, *args, **kw):
+        """Render the sparkline and return PNG data as a string.
+
+        Takes the same arguments as ``render``.
+        """
+        image = self.render(*args, **kw)
+        im_data = StringIO.StringIO()
+        image.save(im_data, 'PNG')
+        return im_data.getvalue()
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/sparkline.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,53 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+from zope.interface import directlyProvides
+from zope.wfmc.interfaces import IProcessDefinition
+from zope.component import provideAdapter, provideUtility
+
+from schooltool.attendance.interfaces import TARDY, ACCEPTED, REJECTED
+
+
+class WorkItemStub(object):
+
+    def __init__(self, attendance_record):
+        self.attendance_record = attendance_record
+
+    def acceptExplanation(self, code):
+        print "Accepted explanation"
+        self.attendance_record.explanations[-1].status = ACCEPTED
+
+    def rejectExplanation(self):
+        print "Rejected explanation"
+        self.attendance_record.explanations[-1].status = REJECTED
+
+    def makeTardy(self, arrival_time):
+        self.attendance_record.status = TARDY
+        self.attendance_record.late_arrival = arrival_time
+
+
+class SilentProcessDef(object):
+    def start(self, arg, person):
+        arg._work_item = WorkItemStub(arg)
+
+directlyProvides(SilentProcessDef, IProcessDefinition)
+
+
+def stubProcessDefinition():
+    provideUtility(SilentProcessDef, IProcessDefinition,
+                   name='schooltool.attendance.explanation')


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_attendance.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_attendance.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_attendance.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1701 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.attendance.
+
+$Id: test_attendance.py 6359 2006-07-17 23:51:51Z alga $
+"""
+__docformat__ = 'reStructuredText'
+
+
+import unittest
+import datetime
+import logging
+
+from pytz import utc, timezone
+from persistent import Persistent
+from zope.interface import implements, directlyProvides
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup
+from zope.annotation.interfaces import IAnnotations, IAttributeAnnotatable
+from zope.wfmc.interfaces import IParticipant, IProcessDefinition
+from zope.component import provideAdapter, provideUtility
+from zope.app.testing import ztapi
+from zope.security.management import endInteraction
+from zope.security.management import newInteraction
+from zope.security.management import restoreInteraction
+from zope.publisher.browser import TestRequest
+
+import schooltool.app # Dead chicken to appease the circle of import gods
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.person.interfaces import IPerson
+from schooltool.calendar.interfaces import ICalendarEvent
+from schooltool.attendance.interfaces import IHomeroomAttendance
+from schooltool.attendance.interfaces import IHomeroomAttendanceRecord
+from schooltool.attendance.interfaces import ISectionAttendance
+from schooltool.attendance.interfaces import ISectionAttendanceRecord
+from schooltool.attendance.interfaces import UNKNOWN, PRESENT, ABSENT, TARDY
+from schooltool.attendance.interfaces import ACCEPTED, REJECTED
+from schooltool.attendance.interfaces import AttendanceError
+from schooltool.attendance.tests import stubProcessDefinition
+
+
+#
+# Stubs
+#
+
+class PersonStub(object):
+    implements(IPerson, IAttributeAnnotatable)
+
+    def __init__(self, name=None):
+        self.__name__ = name
+
+
+class SectionStub(object):
+
+    def __init__(self, title=None, name=None):
+        self.title = title
+        self.__name__ = name
+
+    def __repr__(self):
+        if self.title:
+            return 'SectionStub(%r)' % self.title
+        else:
+            return 'SectionStub()'
+
+
+some_dt = datetime.datetime(2006, 4, 14, 12, 13, tzinfo=utc)
+
+
+class ExplanationStub(object):
+    pass
+
+
+class AttendanceRecordStub(object):
+
+    def __init__(self, date, status):
+        self.date = date
+        self.status = status
+
+    def isTardy(self):
+        return self.status == TARDY
+
+    def isAbsent(self):
+        return self.status == ABSENT
+
+    def makeTardy(self, arrival_time):
+        print "made tardy (%s)" % arrival_time
+
+    def addExplanation(self, explanation):
+        print "added an explanation"
+
+    def acceptExplanation(self, code):
+        print "accepted the explanation"
+
+    def rejectExplanation(self):
+        print "rejected the explanation"
+
+    def __cmp__(self, other):
+        return cmp((self.__class__, self.date, self.status),
+                   (other.__class__, other.date, other.status),)
+
+
+class ApplicationStub(object):
+    implements(ISchoolToolApplication, IApplicationPreferences)
+
+    timezone = 'UTC'
+
+
+class ActivityStub(object):
+
+    def workItemFinished(self, work_item, *args):
+        print "workItemFinished: %s %r" % (work_item.__class__.__name__, args)
+
+
+class ParticipantStub(object):
+    activity = ActivityStub()
+
+
+def doctest_getRequestFromInteraction():
+    """Tests for getRequestFromInteraction.
+
+        >>> endInteraction()
+
+    If there is no interaction - function returns None:
+
+        >>> from schooltool.attendance.attendance import getRequestFromInteraction
+        >>> getRequestFromInteraction() is None
+        True
+
+
+        >>> from zope.app.appsetup.appsetup import SystemConfigurationParticipation
+        >>> newInteraction(SystemConfigurationParticipation())
+        >>> getRequestFromInteraction() is None
+        True
+
+        >>> restoreInteraction()
+        >>> endInteraction()
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> newInteraction(request)
+        >>> getRequestFromInteraction() is request
+        True
+
+        >>> restoreInteraction()
+
+    """
+
+
+def doctest_AttendanceLoggingProxy():
+    """Tests for AttendanceLoggingProxy.
+
+        >>> endInteraction()
+
+        >>> from schooltool.attendance.attendance import AttendanceLoggingProxy
+        >>> proxy = AttendanceLoggingProxy("record", "person")
+        >>> proxy._getLogger() is logging.getLogger("attendance")
+        True
+
+        >>> print proxy.__dict__
+        {'person': 'person', 'attendance_record': 'record'}
+
+        >>> proxy._getLoggedInPerson() is None
+        True
+
+        >>> request = TestRequest()
+        >>> request.setPrincipal(PersonStub(name="Jonas"))
+        >>> newInteraction(request)
+        >>> proxy._getLoggedInPerson()
+        'Jonas'
+
+        >>> restoreInteraction()
+
+    """
+
+
+class LoggerStub(object):
+
+    def info(self, message):
+        # XXX - setting up handlers to the real logger would be
+        # cleaner
+        print message
+
+
+def doctest_AttendanceLoggingProxy_logging():
+    """Tests for AttendanceLoggingProxy logging facilities.
+
+        >>> from schooltool.attendance.attendance import AttendanceLoggingProxy
+        >>> class DummyLogger(AttendanceLoggingProxy):
+        ...     def _getLoggedInPerson(self):
+        ...         return "john"
+        ...     def _getLogger(self):
+        ...         return LoggerStub()
+
+        >>> proxy = DummyLogger(AttendanceRecordStub("2005-01-01", ABSENT),
+        ...                     PersonStub(name="peter"))
+        >>> repr(proxy)
+        '<schooltool.attendance.tests.test_attendance.AttendanceRecordStub object at ...>'
+
+        >>> proxy.log("dummy message")
+        2...-...-...,
+        john,
+        <...AttendanceRecordStub object at ...> of peter:
+        dummy message
+
+        >>> proxy.addExplanation("explanation")
+        added an explanation
+        2..., john, <...> of peter: added an explanation
+
+        >>> proxy.acceptExplanation('001')
+        accepted the explanation
+        2..., john, <...> of peter: accepted explanation
+
+        >>> proxy.rejectExplanation()
+        rejected the explanation
+        2..., john, <...> of peter: rejected explanation
+
+        >>> proxy.makeTardy("arrival time")
+        made tardy (arrival time)
+        2..., john, <...> of peter: made attendance record a tardy, arrival time (arrival time)
+
+    Proxy should not interfere with the comparison operator of wrapped
+    objects:
+
+        >>> proxy2 = DummyLogger(AttendanceRecordStub("2005-01-01", ABSENT),
+        ...                      PersonStub(name="peter"))
+
+        >>> proxy == proxy2
+        True
+
+    """
+
+
+def doctest_SectionAttendanceLoggingProxy():
+    r"""Tests for SectionAttendanceLoggingProxy.
+
+        >>> from schooltool.attendance.attendance import \
+        ...     SectionAttendanceLoggingProxy
+        >>> proxy = SectionAttendanceLoggingProxy(None, None)
+
+        >>> ISectionAttendanceRecord.providedBy(proxy)
+        True
+
+    """
+
+
+def doctest_HomeroomAttendanceLoggingProxy():
+    r"""Tests for HomeroomAttendanceLoggingProxy.
+
+        >>> from schooltool.attendance.attendance import \
+        ...     HomeroomAttendanceLoggingProxy
+        >>> proxy = HomeroomAttendanceLoggingProxy(None, None)
+
+        >>> IHomeroomAttendanceRecord.providedBy(proxy)
+        True
+
+    """
+
+
+#
+# Attendance record classes
+#
+
+class FakeProcessDef(object):
+    def start(self, arg, person):
+        print "starting process for %r" % arg
+        print person
+
+directlyProvides(FakeProcessDef, IProcessDefinition)
+
+
+def doctest_AttendanceRecord():
+    """Tests for AttendanceRecord.
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+        >>> section = SectionStub()
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> ar = AttendanceRecord(section, dt, UNKNOWN, 'person')
+
+        >>> from schooltool.attendance.interfaces import IAttendanceRecord
+        >>> verifyObject(IAttendanceRecord, ar)
+        True
+
+    """
+
+def doctest_AttendanceRecord_cmp():
+    """Tests for AttendanceRecord.__cmp__.
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+        >>> section = SectionStub()
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> ar = AttendanceRecord(section, dt, UNKNOWN, 'person')
+
+        >>> ar == ar
+        True
+        >>> ar == AttendanceRecord(section, dt, UNKNOWN, 'person')
+        True
+        >>> ar == AttendanceRecord(section, dt, ABSENT, 'person')
+        False
+        >>> ar > AttendanceRecord(section, dt, ABSENT, 'person')
+        True
+
+    """
+
+
+def doctest_AttendanceRecord_createWorkflow():
+    """Tests for AttendanceRecord._createWorkflow
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+        >>> ar = AttendanceRecord(None, some_dt, UNKNOWN, None)
+
+        >>> provideUtility(FakeProcessDef, IProcessDefinition,
+        ...                name='schooltool.attendance.explanation')
+
+        >>> ar._createWorkflow('person')
+        starting process for <schooltool.attendance.attendance.AttendanceRecord ...>
+        person
+
+    """
+
+
+def doctest_AttendanceRecord_isUnknown_isPresent_isAbsent_isTardy():
+    r"""Tests for AttendanceRecord.isSomething functions
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+
+        >>> for status in (UNKNOWN, PRESENT, ABSENT, TARDY):
+        ...     ar = AttendanceRecord(None, some_dt, UNKNOWN, 'person')
+        ...     ar.status = status
+        ...     print "%-7s %-5s %-5s %-5s %-5s" % (ar.status,
+        ...                 ar.isUnknown(), ar.isPresent(), ar.isAbsent(),
+        ...                 ar.isTardy())
+        UNKNOWN True  False False False
+        PRESENT False True  False False
+        ABSENT  False False True  False
+        TARDY   False False False True
+
+    """
+
+
+def doctest_AttendanceRecord_makeTardy():
+    r"""Tests for AttendanceRecord.makeTardy
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+
+    If you have an absence
+
+        >>> ar = AttendanceRecord(None, some_dt, ABSENT, 'person')
+        >>> ar._createWorkflow('person')
+
+    you can convert it to a tardy
+
+        >>> ar.makeTardy(datetime.datetime(2005, 12, 16, 15, 03))
+
+        >>> ar.isTardy()
+        True
+        >>> ar.late_arrival
+        datetime.datetime(2005, 12, 16, 15, 3)
+
+    In all other cases you can't.
+
+        >>> for status in (UNKNOWN, PRESENT, TARDY):
+        ...     ar = AttendanceRecord(None, some_dt, UNKNOWN, 'person')
+        ...     ar.status = status
+        ...     try:
+        ...         ar.makeTardy(datetime.datetime(2005, 12, 16, 15, 03))
+        ...     except AttendanceError:
+        ...         pass
+        ...     else:
+        ...         print "no AttendanceError when status=%s" % status
+
+    The arrival time can be None:
+
+        >>> ar = AttendanceRecord(None, some_dt, ABSENT, 'person')
+        >>> ar._createWorkflow('person')
+        >>> ar.makeTardy(None)
+        >>> ar.isTardy()
+        True
+        >>> ar.late_arrival
+
+    """
+
+
+def doctest_AttendanceRecord_isExplained_addExplanation():
+    r"""Tests for AttendanceRecord.addExplanation
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+
+    If you have an absence
+
+        >>> ar = AttendanceRecord(None, some_dt, ABSENT, 'fake person')
+        >>> ar._createWorkflow('fake person')
+
+    In the beginning it is not explained:
+
+        >>> ar.isExplained()
+        False
+
+    You can add an explanation to it:
+
+        >>> ar.addExplanation("Was ill")
+        >>> len(ar.explanations)
+        1
+
+    If you have any unprocessed explanations - you can't add another
+    one:
+
+        >>> ar.addExplanation("Was very ill")
+        Traceback (most recent call last):
+          ...
+        AttendanceError: you have unprocessed explanations.
+
+    Having explanations in itself does not make the absence explained:
+
+        >>> ar.isExplained()
+        False
+
+    However, if explanation is accepted, the workflow will procede
+    into AcceptExplanation activity:
+
+        >>> ar.acceptExplanation('001')
+        Accepted explanation
+
+    That should set the status of the last explanation to ACCEPTED:
+
+        >>> ar.isExplained()
+        True
+
+    There even can be unaccepted and rejected explanations, though we
+    will need a new attendance record for that, because we can't add
+    explanations to an explained record:
+
+        >>> ar.addExplanation("Dog ate homework")
+        Traceback (most recent call last):
+          ...
+        AttendanceError: can't add an explanation to an explained absence.
+
+    Now with a new record:
+
+        >>> ar = AttendanceRecord(None, some_dt, ABSENT, 'bad pupil')
+        >>> ar._createWorkflow('bad pupil')
+        >>> ar.addExplanation("Dog ate homework")
+
+    Rejecting it proceeds with the workflow:
+
+        >>> ar.rejectExplanation()
+        Rejected explanation
+
+    And sets the status of the last explanation:
+
+        >>> ar.addExplanation("Solar eclipse")
+        >>> len(ar.explanations)
+        2
+        >>> ar.acceptExplanation('001')
+        Accepted explanation
+
+    If the record's status is not ABSENT or TARDY, isExplained raises
+    an exception:
+
+        >>> ar = AttendanceRecord(None, some_dt, UNKNOWN, 'person')
+        >>> ar.isExplained()
+        Traceback (most recent call last):
+          ...
+        AttendanceError: only absences and tardies can be explained.
+
+        >>> ar.status = PRESENT
+        >>> ar.isExplained()
+        Traceback (most recent call last):
+          ...
+        AttendanceError: only absences and tardies can be explained.
+
+        >>> ar.status = TARDY
+        >>> ar.isExplained()
+        False
+
+    Likewise for addExplanation, it is only legal for absences and tardies:
+
+        >>> ar.status = UNKNOWN
+        >>> ar.addExplanation("whatever")
+        Traceback (most recent call last):
+          ...
+        AttendanceError: only absences and tardies can be explained.
+
+        >>> ar.status = PRESENT
+        >>> ar.addExplanation("whatever")
+        Traceback (most recent call last):
+          ...
+        AttendanceError: only absences and tardies can be explained.
+
+        >>> ar = AttendanceRecord(None, some_dt, ABSENT, 'person')
+        >>> ar.status = TARDY
+        >>> ar.addExplanation("whatever")
+        >>> ar.explanations[-1]
+        <schooltool.attendance.attendance.AbsenceExplanation object at ...>
+
+    """
+
+
+def doctest_AttendanceRecord_accept_reject_explaination():
+    r"""Tests for AttendanceRecord.accept/rejectExplanation.
+
+        >>> from schooltool.attendance.attendance import AttendanceRecord
+        >>> from schooltool.attendance.interfaces import ABSENT
+        >>> ar = AttendanceRecord(None, some_dt, ABSENT, None)
+
+    If there are no explanations, you cannot accept nor reject them.
+
+        >>> ar.acceptExplanation('001')
+        Traceback (most recent call last):
+          ...
+        AttendanceError: there are no outstanding explanations.
+
+        >>> ar.rejectExplanation()
+        Traceback (most recent call last):
+          ...
+        AttendanceError: there are no outstanding explanations.
+
+    """
+
+
+def doctest_AbsenceExplanation():
+    """Absence explanation is a text with a status
+
+        >>> from schooltool.attendance.attendance import AbsenceExplanation
+        >>> from schooltool.attendance.attendance import ACCEPTED, REJECTED
+        >>> from schooltool.attendance.interfaces import IAbsenceExplanation
+        >>> expn = AbsenceExplanation("My dog ate my pants")
+        >>> verifyObject(IAbsenceExplanation, expn)
+        True
+
+        >>> expn.text
+        'My dog ate my pants'
+
+    First the explanation is not accepted and not processed:
+
+        >>> expn.isAccepted()
+        False
+        >>> expn.isProcessed()
+        False
+
+        >>> expn.status
+        'NEW'
+
+    If it's status is ACCEPTED it becomes an accepted explanation:
+
+        >>> expn.status = ACCEPTED
+        >>> expn.isAccepted()
+        True
+
+    And it is marked as a processed explanation:
+
+        >>> expn.isProcessed()
+        True
+
+    If not - it is unaccepted explanation:
+
+        >>> expn.status = REJECTED
+        >>> expn.isAccepted()
+        False
+        >>> expn.isProcessed()
+        True
+
+    """
+
+
+def doctest_SectionAttendanceRecord():
+    r"""Tests for SectionAttendanceRecord
+
+        >>> from schooltool.attendance.attendance \
+        ...     import SectionAttendanceRecord
+
+    Let's create an UNKNOWN record
+
+        >>> section = SectionStub()
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> ar = SectionAttendanceRecord(section, dt, UNKNOWN, 'person')
+        >>> verifyObject(ISectionAttendanceRecord, ar)
+        True
+
+        >>> isinstance(ar, Persistent)
+        True
+
+        >>> ar.status == UNKNOWN
+        True
+        >>> ar.section == section
+        True
+        >>> ar.datetime == dt
+        True
+
+        >>> ar.duration
+        datetime.timedelta(0)
+        >>> ar.period_id is None
+        True
+        >>> ar.late_arrival is None
+        True
+        >>> ar.explanations
+        ()
+
+    Let's create a regular record
+
+        >>> section = SectionStub()
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> duration = datetime.timedelta(minutes=45)
+        >>> period_id = 'Period A'
+        >>> ar = SectionAttendanceRecord(section, dt, PRESENT, 'person',
+        ...                              duration, period_id)
+
+        >>> ar.status == PRESENT
+        True
+        >>> ar.section == section
+        True
+        >>> ar.datetime == dt
+        True
+        >>> ar.duration == duration
+        True
+        >>> ar.period_id == period_id
+        True
+
+        >>> ar.late_arrival is None
+        True
+        >>> ar.explanations
+        ()
+
+    """
+
+
+def doctest_SectionAttendanceRecord_date():
+    r"""Tests for SectionAttendanceRecord
+
+        >>> from schooltool.attendance.attendance \
+        ...     import SectionAttendanceRecord
+
+    The date of an attendance record usually matches the date portion of the
+    section meeting datetime.
+
+        >>> section = SectionStub()
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> ar = SectionAttendanceRecord(section, dt, UNKNOWN, 'person')
+        >>> ar.date == dt.date()
+        True
+
+    Sometimes the date portion may differ.  2005-11-23 23:00 UTC is
+    2005-11-24 08:00 Tokyo time.  The timezone of the school is determined
+    from the application preferences.
+
+        >>> app = ISchoolToolApplication(None)
+        >>> IApplicationPreferences(app).timezone = 'Asia/Tokyo'
+
+        >>> dt = datetime.datetime(2005, 11, 23, 23, 00, tzinfo=utc)
+        >>> ar = SectionAttendanceRecord(section, dt, UNKNOWN, 'person')
+        >>> ar.date
+        datetime.date(2005, 11, 24)
+
+    """
+
+
+def doctest_HomeroomAttendanceRecord():
+    r"""Tests for HomeroomAttendanceRecord
+
+        >>> from schooltool.attendance.attendance \
+        ...     import HomeroomAttendanceRecord
+
+    Homeroom attendance record acts the same as section attendance
+    record does, but has different str, repr and implements a diffrent
+    interface:
+
+        >>> from schooltool.attendance.interfaces import IHomeroomAttendanceRecord
+        >>> section = SectionStub(name='Art')
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> ar = HomeroomAttendanceRecord(section, dt, UNKNOWN, 'person')
+        >>> IHomeroomAttendanceRecord.providedBy(ar)
+        True
+
+        >>> str(ar)
+        'HomeroomAttendanceRecord(2005-11-23 14:55:00+00:00, UNKNOWN, section=Art)'
+
+        >>> repr(ar)
+        'HomeroomAttendanceRecord(SectionStub(),
+             datetime.datetime(2005, 11, 23, 14, 55, tzinfo=<UTC>),
+             UNKNOWN)'
+
+    """
+
+#
+# Attendance storage classes
+#
+
+def doctest_AttendanceFilteringMixin_filter():
+    r"""Tests for AttendanceFilteringMixin.filter
+
+        >>> d1 = datetime.date(2005, 12, 5)
+        >>> d2 = datetime.date(2005, 12, 7)
+        >>> d3 = datetime.date(2005, 12, 9)
+
+        >>> dt1 = datetime.datetime(2005, 12, 5, tzinfo=utc)
+        >>> dt2 = datetime.datetime(2005, 12, 7, tzinfo=utc)
+        >>> dt3 = datetime.datetime(2005, 12, 9, tzinfo=utc)
+
+        >>> from schooltool.attendance.attendance \
+        ...         import AttendanceFilteringMixin
+        >>> from schooltool.attendance.attendance import SectionAttendanceRecord
+        >>> class AttendanceStub(AttendanceFilteringMixin):
+        ...     def __iter__(self):
+        ...         return iter(SectionAttendanceRecord(None, dt, status, None)
+        ...                     for (dt, status) in [(dt1, PRESENT),
+        ...                                          (dt2, PRESENT),
+        ...                                          (dt2, ABSENT),
+        ...                                          (dt3, PRESENT)])
+
+        >>> attendance = AttendanceStub()
+
+        >>> def print_for(first, last):
+        ...     for r in attendance.filter(first, last):
+        ...         print r.date, r.isPresent()
+
+        >>> print_for(d1, d1)
+        2005-12-05 True
+
+        >>> print_for(d1, d2)
+        2005-12-05 True
+        2005-12-07 True
+        2005-12-07 False
+
+        >>> print_for(d2, d3)
+        2005-12-07 True
+        2005-12-07 False
+        2005-12-09 True
+
+        >>> print_for(d1, d3)
+        2005-12-05 True
+        2005-12-07 True
+        2005-12-07 False
+        2005-12-09 True
+
+        >>> print_for(d3, d1)
+
+    """
+
+
+def doctest_AttendanceCalendarMixin_makeCalendar():
+    r"""Tests for AttendanceCalendarMixin.makeCalendar
+
+        >>> from schooltool.attendance.attendance \
+        ...         import AttendanceCalendarMixin
+        >>> class MixinUserStub(AttendanceCalendarMixin):
+        ...     def __init__(self):
+        ...         self.events = []
+        ...     def __iter__(self):
+        ...         return iter(self.events)
+        ...     def incidentDescription(self, record):
+        ...         return "Description"
+        >>> acm = MixinUserStub()
+
+    When there are no incidents stored, makeCalendar returns an empty
+    ImmutableCalendar:
+
+        >>> cal = acm.makeCalendar()
+        >>> cal
+        <schooltool.calendar.simple.ImmutableCalendar object at ...>
+        >>> list(cal)
+        []
+
+    Let's add some incidents:
+
+        >>> dt1a = datetime.datetime(2005, 12, 5, 13, 30)
+        >>> dt1b = datetime.datetime(2005, 12, 5, 15, 30)
+        >>> dt2a = datetime.datetime(2005, 12, 7, 13, 30)
+        >>> dt2b = datetime.datetime(2005, 12, 7, 15, 30)
+        >>> dt3a = datetime.datetime(2005, 12, 9, 13, 30)
+
+        >>> r1 = AttendanceRecordStub(dt1a, PRESENT)
+        >>> r2 = AttendanceRecordStub(dt2a, PRESENT)
+        >>> r3 = AttendanceRecordStub(dt2a, ABSENT)
+        >>> r4 = AttendanceRecordStub(dt2b, TARDY)
+        >>> r5 = AttendanceRecordStub(dt3a, PRESENT)
+
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> acm.events = [r1, r2, r3, r4, r5]
+        >>> acm.absenceEventTitle = lambda record: 'Was absent'
+        >>> acm.tardyEventTitle = lambda record: 'Was late'
+        >>> acm.makeCalendarEvent = lambda r, title, desc: SimpleCalendarEvent(
+        ...                             r.date, datetime.timedelta(0), title)
+
+    Now let's inspect the calendar:
+
+        >>> def display():
+        ...     def key(event):
+        ...         return (event.dtstart, event.title)
+        ...     for ev in sorted(acm.makeCalendar(), key=key):
+        ...         print ev.dtstart, ev.title
+
+        >>> display()
+        2005-12-07 13:30:00+00:00 Was absent
+        2005-12-07 15:30:00+00:00 Was late
+
+    """
+
+
+def doctest_AttendanceCalendarMixin_incidentDescription():
+    r"""Tests for AttendanceCalendarMixin.incidentDescription
+
+        >>> from schooltool.attendance.attendance import AttendanceCalendarMixin
+        >>> acm = AttendanceCalendarMixin()
+        >>> class RecordStub(object):
+        ...     def __init__(self, explained):
+        ...         self.explained = explained
+        ...     def isExplained(self):
+        ...         return self.explained
+
+        >>> acm.incidentDescription(RecordStub(False))
+        u'Is not explanained yet.'
+
+        >>> acm.incidentDescription(RecordStub(True))
+        u'Explanation was accepted.'
+
+    """
+
+
+def doctest_SectionAttendance():
+    """Test for SectionAttendance
+
+        >>> from schooltool.attendance.attendance import SectionAttendance
+        >>> person = object()
+        >>> sa = SectionAttendance(person)
+        >>> sa.person is person
+        True
+        >>> verifyObject(ISectionAttendance, sa)
+        True
+
+        >>> isinstance(sa, Persistent)
+        True
+
+    """
+
+
+def doctest_SectionAttendance_record():
+    """Tests for SectionAttendance.record
+
+        >>> from schooltool.attendance.attendance import SectionAttendance
+        >>> sa = SectionAttendance(PersonStub())
+
+        >>> len(list(sa))
+        0
+
+    Let's record a presence
+
+        >>> section = SectionStub()
+        >>> dt = datetime.datetime(2005, 12, 9, 13, 30, tzinfo=utc)
+        >>> duration = datetime.timedelta(minutes=45)
+        >>> period_id = 'P1'
+        >>> sa.record(section, dt, duration, period_id, True)
+
+    We can check that it is there
+
+        >>> len(list(sa))
+        1
+
+        >>> ar = sa.get(section, dt)
+        >>> ar
+        SectionAttendanceRecord(SectionStub(),
+                datetime.datetime(2005, 12, 9, 13, 30, tzinfo=<UTC>),
+                PRESENT)
+        >>> ISectionAttendanceRecord.providedBy(ar)
+        True
+
+    It has all the data
+
+        >>> ar.section is section
+        True
+        >>> ar.datetime == dt
+        True
+        >>> ar.duration == duration
+        True
+        >>> ar.period_id == period_id
+        True
+        >>> ar.status == PRESENT
+        True
+
+    Let's record an absence for the same section
+
+        >>> dt = datetime.datetime(2005, 12, 9, 14, 30, tzinfo=utc)
+        >>> duration = datetime.timedelta(minutes=30)
+        >>> period_id = 'P2'
+        >>> sa.record(section, dt, duration, period_id, False)
+
+    We can check that it is there
+
+        >>> len(list(sa))
+        2
+
+        >>> ar = sa.get(section, dt)
+        >>> ar.section is section
+        True
+        >>> ar.datetime == dt
+        True
+        >>> ar.duration == duration
+        True
+        >>> ar.period_id == period_id
+        True
+        >>> ar.status == ABSENT
+        True
+
+    Let's record a presence for another section at the same time
+
+        >>> section2 = SectionStub()
+        >>> sa.record(section2, dt, duration, period_id, True)
+
+        >>> len(list(sa))
+        3
+
+        >>> ar = sa.get(section2, dt)
+        >>> ar.section is section2
+        True
+
+    However we cannot override existing records
+
+        >>> sa.record(section2, dt, duration, period_id, True)
+        Traceback (most recent call last):
+          ...
+        AttendanceError: record for SectionStub() at 2005-12-09 14:30:00+00:00
+                         already exists
+
+    """
+
+
+def doctest_SectionAttendance_get():
+    """Tests for SectionAttendance.get
+
+        >>> from schooltool.attendance.attendance import SectionAttendance
+        >>> sa = SectionAttendance(PersonStub())
+
+        >>> section1 = SectionStub()
+        >>> section2 = SectionStub()
+        >>> dt = datetime.datetime(2005, 12, 9, 13, 30, tzinfo=utc)
+
+    If you try to see the attendance record that has never been
+    recorded, you get a "null object".
+
+        >>> ar = sa.get(section1, dt)
+        >>> ar
+        SectionAttendanceRecord(SectionStub(),
+                datetime.datetime(2005, 12, 9, 13, 30, tzinfo=<UTC>),
+                UNKNOWN)
+        >>> ISectionAttendanceRecord.providedBy(ar)
+        True
+        >>> ar.status == UNKNOWN
+        True
+        >>> ar.section == section1
+        True
+        >>> ar.datetime == dt
+        True
+
+    Most of the attributes do not make much sense
+
+        >>> ar.duration
+        datetime.timedelta(0)
+        >>> ar.period_id
+
+    Otherwise you get the correct record for a (section, datetime) pair.
+
+        >>> dt1 = datetime.datetime(2005, 12, 9, 13, 30, tzinfo=utc)
+        >>> dt2 = datetime.datetime(2005, 12, 10, 13, 0, tzinfo=utc)
+        >>> duration = datetime.timedelta(minutes=50)
+        >>> sa.record(section1, dt1, duration, 'P1', True)
+        >>> sa.record(section2, dt1, duration, 'P2', False)
+        >>> sa.record(section1, dt2, duration, 'P3', False)
+        >>> sa.record(section2, dt2, duration, 'P4', True)
+
+        >>> for dt in (dt1, dt2):
+        ...     for section in (section1, section2):
+        ...         ar = sa.get(section, dt)
+        ...         assert ar.section == section
+        ...         assert ar.datetime == dt
+        ...         print ar.period_id, ar.isPresent()
+        P1 True
+        P2 False
+        P3 False
+        P4 True
+
+    Real objects are getting wrapped too:
+
+        >>> type(sa.get(section1, dt1))
+        <class 'schooltool.attendance.attendance.SectionAttendanceLoggingProxy'>
+
+    """
+
+
+def doctest_SectionAttendance_getAllForDay():
+    """Tests for SectionAttendance.getAllForDay
+
+        >>> from schooltool.attendance.attendance import SectionAttendance
+        >>> sa = SectionAttendance(PersonStub())
+
+        >>> section1 = SectionStub('Math')
+        >>> section2 = SectionStub('Chem')
+        >>> dt1a = datetime.datetime(2005, 12, 5, 13, 30, tzinfo=utc)
+        >>> dt1b = datetime.datetime(2005, 12, 5, 15, 30, tzinfo=utc)
+        >>> dt2a = datetime.datetime(2005, 12, 7, 13, 30, tzinfo=utc)
+        >>> dt2b = datetime.datetime(2005, 12, 7, 15, 30, tzinfo=utc)
+        >>> dt3a = datetime.datetime(2005, 12, 9, 13, 30, tzinfo=utc)
+        >>> dt3b = datetime.datetime(2005, 12, 9, 15, 30, tzinfo=utc)
+        >>> duration = datetime.timedelta(minutes=45)
+
+        >>> sa.record(section1, dt1a, duration, 'A', True)
+        >>> sa.record(section1, dt2a, duration, 'A', True)
+        >>> sa.record(section2, dt2a, duration, 'A', False)
+        >>> sa.record(section1, dt2b, duration, 'B', False)
+        >>> sa.record(section2, dt3a, duration, 'A', True)
+
+        >>> def print_for(day):
+        ...     def key(ar):
+        ...         return (ar.datetime, ar.section.title)
+        ...     for ar in sorted(sa.getAllForDay(day), key=key):
+        ...         print ar.date, ar.period_id, ar.section.title, ar.isPresent()
+
+        >>> print_for(dt1a.date())
+        2005-12-05 A Math True
+
+        >>> print_for(dt2a.date())
+        2005-12-07 A Chem False
+        2005-12-07 A Math True
+        2005-12-07 B Math False
+
+        >>> print_for(dt3a.date())
+        2005-12-09 A Chem True
+
+        >>> print_for(datetime.date(2005, 12, 4))
+
+    """
+
+
+def doctest_SectionAttendance_tardyEventTitle():
+    r"""Tests for SectionAttendance.tardyEventTitle
+
+        >>> from schooltool.attendance.attendance import SectionAttendance
+        >>> from schooltool.attendance.attendance \
+        ...     import SectionAttendanceRecord
+        >>> sa = SectionAttendance(None)
+
+        >>> section = SectionStub(title="Lithomancy")
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> duration = datetime.timedelta(minutes=45)
+        >>> period_id = 'Period A'
+        >>> ar = SectionAttendanceRecord(section, dt, ABSENT, duration,
+        ...                              period_id)
+        >>> minutes_late = 14
+        >>> ar.makeTardy(dt + datetime.timedelta(minutes=minutes_late))
+
+        >>> print sa.tardyEventTitle(ar)
+        Was late for Lithomancy (14 minutes).
+
+    """
+
+
+def doctest_SectionAttendance_absenceEventTitle():
+    r"""Tests for SectionAttendance.absenceEventTitle
+
+        >>> from schooltool.attendance.attendance import SectionAttendance
+        >>> from schooltool.attendance.attendance \
+        ...     import SectionAttendanceRecord
+        >>> sa = SectionAttendance(None)
+
+        >>> section = SectionStub(title="Lithomancy")
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> duration = datetime.timedelta(minutes=45)
+        >>> period_id = 'Period A'
+        >>> ar = SectionAttendanceRecord(section, dt, ABSENT, duration,
+        ...                              period_id)
+
+        >>> print sa.absenceEventTitle(ar)
+        Was absent from Lithomancy.
+
+    """
+
+
+def doctest_SectionAttendance_filter():
+    """Tests for SectionAttendance.filter
+
+        >>> from schooltool.attendance.attendance import SectionAttendance
+        >>> sa = SectionAttendance(None)
+
+        >>> class BTreeStub(object):
+        ...     records = []
+        ...     def values(self, **kwargs):
+        ...         print sorted(kwargs.items())
+        ...         return self.records
+
+        >>> sa._records = BTreeStub()
+
+    Filter uses facilities provided by OOBTree to get the values:
+
+        >>> list(sa.filter(datetime.date(2005, 11, 23),
+        ...                datetime.date(2005, 11, 27)))
+        [('excludemax', True),
+         ('max', datetime.datetime(2005, 11, 28, 0, 0, tzinfo=<UTC>)),
+         ('min', datetime.datetime(2005, 11, 23, 0, 0, tzinfo=<UTC>))]
+        []
+
+    And then extracts the records themselves:
+
+        >>> sa._records.records = [('record1', 'record2',), ('record3',), ()]
+        >>> list(sa.filter(datetime.date(2005, 11, 21),
+        ...                datetime.date(2005, 11, 27)))
+        [('excludemax', True),
+         ('max', datetime.datetime(2005, 11, 28, 0, 0, tzinfo=<UTC>)),
+         ('min', datetime.datetime(2005, 11, 21, 0, 0, tzinfo=<UTC>))]
+        ['record1', 'record2', 'record3']
+
+    """
+
+
+def doctest_SectionAttendance_makeCalendarEvent():
+    r"""Tests for SectionAttendance.makeCalendarEvent
+
+        >>> from schooltool.attendance.attendance import SectionAttendance
+        >>> from schooltool.attendance.attendance \
+        ...     import SectionAttendanceRecord
+        >>> sa = SectionAttendance(None)
+
+        >>> section = SectionStub()
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> duration = datetime.timedelta(minutes=45)
+        >>> period_id = 'Period A'
+        >>> ar = SectionAttendanceRecord(section, dt, ABSENT, 'person',
+        ...                              duration, period_id)
+
+        >>> ev = sa.makeCalendarEvent(ar, 'John was bad today', 'Very bad')
+        >>> ICalendarEvent.providedBy(ev)
+        True
+        >>> print ev.dtstart, ev.duration, ev.title, ev.description
+        2005-11-23 14:55:00+00:00 0:45:00 John was bad today Very bad
+
+    """
+
+
+def doctest_HomeroomAttendance_wrapRecordForLogging():
+    r"""Tests for HomeroomAttendance._wrapRecordForLogging
+
+        >>> from schooltool.attendance.attendance import HomeroomAttendance
+        >>> ha = HomeroomAttendance(None)
+
+        >>> from schooltool.attendance.attendance import HomeroomAttendanceRecord
+        >>> dt = datetime.datetime(2005, 11, 23, 14, 55, tzinfo=utc)
+        >>> ar = HomeroomAttendanceRecord(None, dt, UNKNOWN)
+
+    _wrapRecordForLogging should wrap atendance records in a
+    HomeroomAttendanceLoggingProxy:
+
+        >>> proxied_ar = ha._wrapRecordForLogging(ar)
+        >>> type(proxied_ar)
+        <class 'schooltool.attendance.attendance.HomeroomAttendanceLoggingProxy'>
+
+        >>> proxied_ar.attendance_record is ar
+        True
+
+    """
+
+
+def doctest_HomeroomAttendance_wrapRecordForLogging():
+    r"""Tests for HomeroomAttendance.getHomeroomPeriodForRecord.
+
+        >>> from schooltool.attendance.attendance import HomeroomAttendance
+        >>> ha = HomeroomAttendance(None)
+
+    getHomeroomPeriodForRecord returns homeroom AR that the given
+    section AR belongs to, which means the closest attendance record
+    recorded at the same time or before the given section attendance
+    record:
+
+        >>> section = SectionStub('History')
+        >>> def makeDT(hour, minutes):
+        ...     return datetime.datetime(2005, 1, 1, hour, minutes, tzinfo=utc)
+        >>> timestamps = [makeDT(hour, 0) for hour in range(10, 14)]
+
+        >>> from schooltool.attendance.attendance import HomeroomAttendanceRecord
+        >>> def getAllForDay(self):
+        ...     return [HomeroomAttendanceRecord(section, dt, PRESENT, 'p')
+        ...             for dt in timestamps]
+        >>> ha.getAllForDay = getAllForDay
+
+        >>> from schooltool.attendance.attendance import SectionAttendanceRecord
+        >>> ar = SectionAttendanceRecord(section, makeDT(10, 55), PRESENT, 'p')
+        >>> str(ha.getHomeroomPeriodForRecord(ar))
+        'HomeroomAttendanceRecord(2005-01-01 10:00:00+00:00, PRESENT, section=None)'
+
+        >>> from schooltool.attendance.attendance import SectionAttendanceRecord
+        >>> ar = SectionAttendanceRecord(section, makeDT(10, 0), PRESENT, 'p')
+        >>> str(ha.getHomeroomPeriodForRecord(ar))
+        'HomeroomAttendanceRecord(2005-01-01 10:00:00+00:00, PRESENT, section=None)'
+
+        >>> from schooltool.attendance.attendance import SectionAttendanceRecord
+        >>> ar = SectionAttendanceRecord(section, makeDT(11, 0), PRESENT, 'p')
+        >>> str(ha.getHomeroomPeriodForRecord(ar))
+        'HomeroomAttendanceRecord(2005-01-01 11:00:00+00:00, PRESENT, section=None)'
+
+        >>> from schooltool.attendance.attendance import SectionAttendanceRecord
+        >>> ar = SectionAttendanceRecord(section, makeDT(16, 0), PRESENT, 'p')
+        >>> str(ha.getHomeroomPeriodForRecord(ar))
+        'HomeroomAttendanceRecord(2005-01-01 13:00:00+00:00, PRESENT, section=None)'
+
+    If there is no such record a HomeroomAttendanceRecord with status
+    UNKNOWN, matching datetime and the same section is returned:
+
+        >>> ar = SectionAttendanceRecord(section, makeDT(9, 55), PRESENT, 'p')
+        >>> str(ha.getHomeroomPeriodForRecord(ar))
+        "HomeroomAttendanceRecord(SectionStub('History'),
+             datetime.datetime(2005, 1, 1, 9, 55, tzinfo=<UTC>), UNKNOWN)"
+
+    """
+
+#
+# Adapters
+#
+
+def doctest_getSectionAttendance():
+    """Tests for getSectionAttendance.
+
+        >>> setup.setUpAnnotations()
+        >>> from schooltool.attendance.attendance import getSectionAttendance
+        >>> provideAdapter(getSectionAttendance, [IPerson], ISectionAttendance)
+
+    getSectionAttendance lets us get ISectionAttendance for a person
+
+        >>> person = PersonStub()
+        >>> attendance = ISectionAttendance(person)
+        >>> attendance
+        <schooltool.attendance.attendance.SectionAttendance object at ...>
+
+    The attendance object is stored in person's annotations
+
+        >>> annotations = IAnnotations(person)
+        >>> attendance is annotations['schooltool.attendance.SectionAttendance']
+        True
+
+    If you adapt more than once, you will get the same object
+
+        >>> attendance is ISectionAttendance(person)
+        True
+
+    Attendance object has a reference to the person:
+
+        >>> attendance.person is person
+        True
+
+    """
+
+
+#
+# Workflow
+#
+
+def doctest_AttendanceAdmin():
+    """Tests for AttendanceAdmin.
+
+        >>> from schooltool.attendance.attendance import AttendanceAdmin
+        >>> participant = AttendanceAdmin('activity')
+        >>> participant.activity
+        'activity'
+
+    Well, it does nothing else.  Move along.
+    """
+
+
+def doctest_WaitForExplanation():
+    """Tests for WaitForExplanation.
+
+        >>> from schooltool.attendance.attendance import WaitForExplanation
+        >>> participant = ParticipantStub()
+        >>> work_item = WaitForExplanation(participant)
+
+    When you start the work item, it gets recorded as an attribute of
+    the attendance record.
+
+        >>> ar = AttendanceRecordStub(None, None)
+        >>> work_item.start(ar)
+        >>> ar._work_item is work_item
+        True
+
+    One way to complete the work item is to mark a tardy arrival
+
+        >>> late_arrival_time = datetime.datetime(2005, 12, 30, 13, 21)
+        >>> work_item.makeTardy(late_arrival_time)
+        workItemFinished: WaitForExplanation ('tardy', datetime.datetime(2005, 12, 30, 13, 21), None)
+
+    Another way to complete it is to reject an explanation
+
+        >>> work_item.rejectExplanation()
+        workItemFinished: WaitForExplanation ('reject', None, None)
+
+    Or accept it is to reject an explanation
+
+        >>> work_item.acceptExplanation('001')
+        workItemFinished: WaitForExplanation ('accept', None, '001')
+
+    """
+
+
+def doctest_MakeTardy():
+    """Tests for MakeTardy.
+
+        >>> from schooltool.attendance.attendance import MakeTardy
+        >>> participant = ParticipantStub()
+        >>> work_item = MakeTardy(participant)
+
+    When you start the work item, it gets finished in record time
+
+        >>> ar = AttendanceRecordStub(None, None)
+        >>> late_arrival_time = datetime.datetime(2005, 12, 30, 13, 21)
+        >>> work_item.start(ar, late_arrival_time)
+        workItemFinished: MakeTardy ()
+
+    The state of the attendance record changes
+
+        >>> ar.status == TARDY
+        True
+        >>> ar.late_arrival
+        datetime.datetime(2005, 12, 30, 13, 21)
+
+    """
+
+
+def doctest_AcceptExplanation():
+    """Tests for AcceptExplanation.
+
+        >>> from schooltool.attendance.attendance import AcceptExplanation
+        >>> participant = ParticipantStub()
+        >>> work_item = AcceptExplanation(participant)
+
+    When you start the work item, it gets finished in record time
+
+        >>> ar = AttendanceRecordStub(None, None)
+        >>> ar.explanations = [ExplanationStub()]
+        >>> work_item.start(ar, '001')
+        workItemFinished: AcceptExplanation ()
+
+        >>> ar.explanations[-1].status == ACCEPTED
+        True
+
+    """
+
+
+def doctest_RejectExplanation():
+    """Tests for RejectExplanation.
+
+        >>> from schooltool.attendance.attendance import RejectExplanation
+        >>> participant = ParticipantStub()
+        >>> work_item = RejectExplanation(participant)
+
+    When you start the work item, it gets finished in record time
+
+        >>> ar = AttendanceRecordStub(None, None)
+        >>> ar.explanations = [ExplanationStub()]
+        >>> work_item.start(ar)
+        workItemFinished: RejectExplanation ()
+
+        >>> ar.explanations[-1].status == REJECTED
+        True
+
+    """
+
+
+def doctest_UnresolvedAbsenceCache_add_remove():
+    r"""Tests for UnresolvedAbsenceCache.
+
+    Some setup:
+
+        >>> from schooltool.attendance.attendance import UnresolvedAbsenceCache
+        >>> from schooltool.attendance.interfaces import \
+        ...     IUnresolvedAbsenceCache
+
+    Check the interface:
+
+        >>> cache = UnresolvedAbsenceCache()
+        >>> verifyObject(IUnresolvedAbsenceCache, cache)
+        True
+
+    The contents are stored in the attribute `_cache`:
+
+        >>> dict(cache._cache.items())
+        {}
+
+    Let's test the add and remove operations:
+
+        >>> class StudentStub:
+        ...     __name__ = 'student'
+        ...     def __repr__(self): return 'student'
+        >>> student = StudentStub()
+        >>> from schooltool.attendance.interfaces import ABSENT
+        >>> class RecordStub:
+        ...     status = ABSENT
+        ...     def __repr__(self): return 'absence'
+
+    When we add a record, a bucket should be created:
+
+        >>> absence = RecordStub()
+        >>> cache.add(student, absence)
+        >>> dict(cache._cache.items())
+        {'student': [absence]}
+
+    The next record should just append to the list:
+
+        >>> absence2 = RecordStub()
+        >>> cache.add(student, absence2)
+        >>> dict(cache._cache.items())
+        {'student': [absence, absence]}
+
+    Let's check __iter__ on our way:
+
+        >>> list(cache)
+        [('student', [absence, absence])]
+
+    Remove works:
+
+        >>> cache.remove(student, absence)
+        >>> dict(cache._cache.items())
+        {'student': [absence]}
+
+    If no absences are left for a student, the bucket is deleted:
+
+        >>> cache.remove(student, absence2)
+        >>> dict(cache._cache.items())
+        {}
+
+    """
+
+
+def doctest_getUnresolvedAbsenceCache():
+    r"""Tests for getUnresolvedAbsenceCache.
+
+        >>> setup.setUpAnnotations()
+        >>> from schooltool.attendance.attendance import \
+        ...     getUnresolvedAbsenceCache
+
+        >>> class Annotatable(object):
+        ...     implements(IAttributeAnnotatable)
+        >>> adminstub = Annotatable()
+        >>> groupstub = {'administrators': adminstub}
+        >>> appstub = {'groups': groupstub}
+
+    Now the cache does not yet exist in annotations:
+
+        >>> IAnnotations(adminstub)
+        {}
+
+    But if we ask for one, it will be created:
+
+        >>> cache = getUnresolvedAbsenceCache(appstub)
+
+        >>> IAnnotations(adminstub)
+        {'schooltool.attendance.absencecache':
+           <...attendance.UnresolvedAbsenceCache ...>}
+
+        >>> from schooltool.attendance.interfaces import \
+        ...     IUnresolvedAbsenceCache
+        >>> verifyObject(IUnresolvedAbsenceCache, cache)
+        True
+
+        >>> cache2 = getUnresolvedAbsenceCache(appstub)
+        >>> cache is cache2
+        True
+
+    """
+
+
+def doctest_add_or_removeAttendanceRecordFromCache():
+    r"""Tests for addAttendanceRecordToCache, removeAttendanceRecordFromCache.
+
+    Some setup:
+
+        >>> ztapi.provideAdapter(None, ISchoolToolApplication,
+        ...                      lambda none: 'virtual schooltool')
+        >>> from schooltool.attendance.interfaces import \
+        ...     IUnresolvedAbsenceCache
+        >>> class CacheStub(object):
+        ...     def __init__(self):
+        ...         self._cache = {}
+        ...     def add(self, student, record):
+        ...         self._cache[record] = student
+        ...     def remove(self, student, record):
+        ...         del self._cache[record]
+        >>> cache = CacheStub()
+        >>> def cacheAdapter(app):
+        ...     assert app == 'virtual schooltool'
+        ...     return cache
+        >>> ztapi.provideAdapter(None, IUnresolvedAbsenceCache,
+        ...                      cacheAdapter)
+
+        >>> class ARStub(object):
+        ...     def __repr__(self): return 'ar'
+        >>> ar = ARStub()
+
+    We can get away with this, because the event is not modified:
+
+        >>> pdi = 'schooltool.attendance.explanation'
+        >>> class Event(object):
+        ...     class process(object):
+        ...         process_definition_identifier = pdi
+        ...         class workflowRelevantData(object):
+        ...             student = 'a student'
+        ...             attendanceRecord = ar
+
+        >>> event = Event()
+
+    We can add the record to the cache:
+
+        >>> from schooltool.attendance.attendance import \
+        ...     addAttendanceRecordToCache, removeAttendanceRecordFromCache
+        >>> addAttendanceRecordToCache(event)
+
+    And it has landed there!
+
+        >>> cache._cache
+        {ar: 'a student'}
+
+    Let's test removal too:
+
+        >>> removeAttendanceRecordFromCache(event)
+
+        >>> cache._cache
+        {}
+
+    """
+
+
+def doctest_AttendanceCalendarProvider_getAuthenticatedUser():
+    """Tests for AttendanceCalendarProvider._getAuthenticatedUser.
+
+        >>> from schooltool.attendance.attendance import AttendanceCalendarProvider
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> provider = AttendanceCalendarProvider(None, request)
+
+    If principal of the request can't be adapted to IPerson method returns None:
+
+        >>> provider._getAuthenticatedUser() is None
+        True
+
+    If the principal can be adapted - it returns the resulting Person:
+
+        >>> ztapi.provideAdapter(None, IPerson, lambda ctx: "IPerson(%s)" % ctx)
+
+        >>> request.setPrincipal("principal")
+
+        >>> print provider._getAuthenticatedUser()
+        IPerson(principal)
+
+    """
+
+
+def doctest_AttendanceCalendarProvider_isLookingAtOwnCalendar():
+    """Tests for AttendanceCalendarProvider._isLookingAtOwnCalendar.
+
+    Some set up:
+
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> calendar = object()
+        >>> ztapi.provideAdapter(None, ISchoolToolCalendar, lambda ctx: calendar)
+
+    If the calendar of the user passed to this function is not the
+    same as the context of the provider - the user is looking at the
+    calendar of someone else:
+
+        >>> from schooltool.attendance.attendance import AttendanceCalendarProvider
+        >>> provider = AttendanceCalendarProvider(None, None)
+
+        >>> provider._isLookingAtOwnCalendar("User")
+        False
+
+    If it is the same calendar - the function should return True:
+
+        >>> provider.context = calendar
+        >>> provider._isLookingAtOwnCalendar("User")
+        True
+
+    """
+
+
+def doctest_AttendanceCalendarProvider():
+    """Tests for AttendanceCalendarProvider.
+
+        >>> from schooltool.attendance.attendance import AttendanceCalendarProvider
+        >>> provider = AttendanceCalendarProvider(None, None)
+
+    If there is no principal in the request (no users logged in) -
+    attendance calendar is not visible:
+
+        >>> provider._getAuthenticatedUser = lambda: False
+        >>> list(provider.getCalendars())
+        []
+
+    Let's log someone in:
+
+        >>> provider._getAuthenticatedUser = lambda: "User"
+
+    If user is looking at the calendar of some one else - he will not
+    see anything either:
+
+        >>> provider._isLookingAtOwnCalendar = lambda user: False
+        >>> list(provider.getCalendars())
+        []
+
+    If he is looking at the calendar of his own - his daily and
+    section attendance calendars should be in the list (we'll stub
+    them first):
+
+        >>> class AttendanceStub(object):
+        ...     def __init__(self, name):
+        ...         self.name = name
+        ...     def makeCalendar(self):
+        ...         return "%s" % self.name
+
+        >>> ztapi.provideAdapter(None, ISectionAttendance,
+        ...     lambda user: AttendanceStub("SectionAttendance calendar"))
+
+        >>> provider._isLookingAtOwnCalendar = lambda user: True
+        >>> list(provider.getCalendars())
+        [('SectionAttendance calendar', '#aa0000', '#ff0000')]
+
+    """
+
+
+def doctest_date_to_schoolday_start():
+    """Tests for date_to_schoolday_start.
+
+    Given a date this function should return the datetime of the
+    beginning of the day.
+
+        >>> from schooltool.attendance.attendance import date_to_schoolday_start
+        >>> date_to_schoolday_start(datetime.date(2005, 1, 1))
+        datetime.datetime(2005, 1, 1, 0, 0, tzinfo=<UTC>)
+
+    Application timezone is taken into account.
+
+        >>> app = ISchoolToolApplication(None)
+        >>> IApplicationPreferences(app).timezone = 'Europe/Vilnius'
+        >>> date_to_schoolday_start(datetime.date(2005, 1, 1))
+        datetime.datetime(2005, 1, 1, 0, 0,
+            tzinfo=<DstTzInfo 'Europe/Vilnius' EET+2:00:00 STD>)
+
+    """
+
+
+def doctest_date_to_schoolday_end():
+    """Tests for date_to_schoolday_end.
+
+    Given a date, returns the datetime of the end of the day.
+
+        >>> from schooltool.attendance.attendance import date_to_schoolday_end
+        >>> date_to_schoolday_end(datetime.date(2005, 1, 1))
+        datetime.datetime(2005, 1, 2, 0, 0, tzinfo=<UTC>)
+
+    Takes application timezone into account.
+
+        >>> app = ISchoolToolApplication(None)
+        >>> IApplicationPreferences(app).timezone = 'Europe/Vilnius'
+        >>> date_to_schoolday_end(datetime.date(2005, 1, 1))
+        datetime.datetime(2005, 1, 2, 0, 0,
+            tzinfo=<DstTzInfo 'Europe/Vilnius' EET+2:00:00 STD>)
+
+    """
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    app = ApplicationStub()
+    provideAdapter(lambda x: app, [None], ISchoolToolApplication)
+    stubProcessDefinition()
+    logging.getLogger('attendance').disabled = True
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+    logging.getLogger('attendance').disabled = False
+
+
+def test_suite():
+    optionflags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
+    return doctest.DocTestSuite(optionflags=optionflags,
+                                setUp=setUp, tearDown=tearDown)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_attendance.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,507 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.attendance.sampledata.
+
+$Id: test_sampledata.py 5996 2006-04-27 18:57:17Z ignas $
+"""
+
+__docformat__ = 'reStructuredText'
+
+import unittest
+import datetime
+import random
+
+from zope.testing import doctest
+from zope.interface.verify import verifyObject
+from zope.app.testing import ztapi, setup
+
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.timetable.interfaces import ICompositeTimetables
+
+
+class TermStub(object):
+    first = datetime.date(2005, 9, 1)
+    last = datetime.date(2005, 9, 14)
+
+    def __iter__(self):
+        date = self.first
+        while date <= self.last:
+            yield date
+            date += datetime.date.resolution
+
+    def isSchoolday(self, date):
+        return date.day % 2 == 1
+
+
+class SectionStub(object):
+    members = ()
+    def __init__(self, name):
+        self.name = name
+    def __str__(self):
+        return self.name
+
+
+class PersonStub(object):
+
+    def __init__(self, name):
+        self.__name__ = name
+
+    def __repr__(self):
+        return "%s" % self.__name__
+
+
+class TimetableActivityDayStub(object):
+
+    homeroom_period_ids = ['p1']
+
+    def __getitem__(self, key):
+        return self
+
+    @property
+    def timetable(self):
+        return self
+
+
+class TimetableCalendarEventStub(object):
+    def __init__(self, dtstart, duration, period_id):
+        self.dtstart = dtstart
+        self.duration = duration
+        self.period_id = period_id
+        self.activity = TimetableActivityDayStub()
+        self.day_id = None
+
+
+class FakeTimetablesAdapter(object):
+    def __init__(self, section):
+        self.section = section
+    def makeTimetableCalendar(self, first, last):
+        events = []
+        while first <= last:
+            dtstart = datetime.datetime.combine(first, datetime.time(9, 30))
+            duration = datetime.timedelta(minutes=45)
+            period_id = 'p1'
+            e = TimetableCalendarEventStub(dtstart, duration, period_id)
+            events.append(e)
+
+            period_id = 'p2'
+            e = TimetableCalendarEventStub(dtstart, duration, period_id)
+            events.append(e)
+
+            first += datetime.timedelta(2)
+        return events
+
+
+class FakeAttendanceRecord(object):
+
+    explanations = ()
+
+    def __init__(self):
+        self.hasExplanations = False
+        self.accepted = False
+        self.rejected = False
+
+    def makeTardy(self, datetime):
+        print "Tardy at %s" % datetime
+
+    def addExplanation(self, explanation):
+        self.hasExplanations = True
+        print "Added explanation"
+
+    def acceptExplanation(self, code):
+        self.accepted = True
+        print "Accepted explanation"
+
+    def rejectExplanation(self):
+        self.rejected = True
+        print "Rejected explanation"
+
+    def isExplained(self):
+        return False
+
+
+class FakeAttendanceAdapter(object):
+    def __init__(self, person):
+        self.person = person
+
+    def record(self, section, dtstart, duration, period_id, present):
+        print "%s was %s on %s (%s, %s)" % (self.person,
+                    {True: 'present', False: 'absent'}[present], dtstart,
+                    period_id, section)
+
+    def get(self, section, datetime):
+        return FakeAttendanceRecord()
+
+class FakeHomeroomAttendanceAdapter(FakeAttendanceAdapter):
+
+    def record(self, section, dtstart, duration, period_id, present):
+        print "%s was %s on %s (%s, %s) in Homeroom Period" % (self.person,
+                    {True: 'present', False: 'absent'}[present], dtstart,
+                    period_id, section)
+
+
+def doctest_SampleAttendancePlugin_explainAttendanceRecord():
+    """Tests for SampleAttendancePlugin applyExplanation and generateExplanation.
+
+        >>> from schooltool.attendance.sampledata import SampleAttendancePlugin
+        >>> plugin = SampleAttendancePlugin()
+
+    Whether an attendance record will be explained or not depends on
+    the explanation_rate.
+
+        >>> plugin.rng = random.Random(42)
+        >>> plugin.explanation_rate = 1
+        >>> for i in range(100):
+        ...     ar = FakeAttendanceRecord()
+        ...     plugin.applyExplanation(ar, plugin.generateExplanation())
+        ...     assert(ar.hasExplanations)
+        Added explanation
+        ...
+        Accepted explanation
+
+    The explanation being accepted depends on the excuse_rate:
+
+        >>> plugin.excuse_rate = 1
+        >>> for i in range(100):
+        ...     ar = FakeAttendanceRecord()
+        ...     plugin.applyExplanation(ar, plugin.generateExplanation())
+        ...     assert(ar.hasExplanations)
+        ...     assert(ar.accepted)
+        Added explanation
+        ...
+        Accepted explanation
+
+     Rejection depends on reject_rate:
+
+        >>> plugin.excuse_rate = 0
+        >>> plugin.reject_rate = 1
+        >>> for i in range(100):
+        ...     ar = FakeAttendanceRecord()
+        ...     plugin.applyExplanation(ar, plugin.generateExplanation())
+        ...     assert(ar.hasExplanations)
+        ...     assert(ar.rejected)
+        Added explanation
+        ...
+        Rejected explanation
+
+    """
+
+
+def doctest_SampleAttendancePlugin_generateHomeroomAttendance():
+    """Tests for SampleAttendancePlugin.generateHomeroomAttendance
+
+        >>> from schooltool.attendance.sampledata import SampleAttendancePlugin
+        >>> plugin = SampleAttendancePlugin()
+
+        >>> app = {'terms': {'2005-fall': TermStub()},
+        ...        'persons': {'student_Jon': 'Jon',
+        ...                    'student_Ian': 'Ian',
+        ...                    'teacher_Ann': 'Ann'}}
+        >>> plugin.app = app
+        >>> plugin.term = app['terms']['2005-fall']
+        >>> plugin.start_date = plugin.term.last - datetime.timedelta(days=3)
+        >>> plugin.end_date = plugin.term.last
+        >>> plugin.rng = random.Random(42)
+        >>> plugin.day_absence_rate = 1
+
+    Only students are marked as absent/present:
+
+        >>> print sorted(plugin.generateHomeroomAttendance().items())
+        [('2005-09-11', {'student_Jon': (True, True, True),
+                         'student_Ian': (True, True, True)}),
+         ('2005-09-13', {'student_Jon': (True, True, True),
+                         'student_Ian': (True, True, True)})]
+
+    If explanation rate is 0, no explanations should get explained:
+
+        >>> plugin.explanation_rate = 0
+        >>> print sorted(plugin.generateHomeroomAttendance().items())
+        [('2005-09-11', {'student_Jon': (False, False, False),
+                         'student_Ian': (False, False, False)}),
+         ('2005-09-13', {'student_Jon': (False, False, False),
+                         'student_Ian': (False, False, False)})]
+
+    When the absence rate is 0, no absences are recorded:
+
+        >>> plugin.day_absence_rate = 0
+        >>> print sorted(plugin.generateHomeroomAttendance().items())
+        [('2005-09-11', {}),
+         ('2005-09-13', {})]
+
+    """
+
+
+def doctest_SampleAttendancePlugin_generateSectionAttendance():
+    """Tests for SampleAttendancePlugin.generateHomeroomAttendance
+
+        >>> from schooltool.attendance.sampledata import SampleAttendancePlugin
+        >>> plugin = SampleAttendancePlugin()
+
+    The plugin wants an application object with 'sections' and 'terms'
+    containers.  It is easier to use stubs:
+
+        >>> term = TermStub()
+        >>> app = {'terms': {'2005-fall': term},
+        ...        'sections': {'s1': SectionStub('s1'),
+        ...                     's2': SectionStub('s2')}}
+
+        >>> app['sections']['s1'].members = [PersonStub('Jon'),
+        ...                                  PersonStub('Ian')]
+        >>> app['sections']['s2'].members = [PersonStub('Ann')]
+        >>> plugin.app = app
+        >>> plugin.term = term
+        >>> plugin.start_date = term.first
+        >>> plugin.end_date = term.last
+        >>> plugin.rng = random.Random(42)
+
+    The "sections" need to be adaptable to ICompositeTimetables
+
+        >>> ztapi.provideAdapter(None, ICompositeTimetables, FakeTimetablesAdapter)
+
+    And section members need to be adaptable to ISectionAttendance
+
+        >>> from schooltool.attendance.interfaces import ISectionAttendance
+        >>> ztapi.provideAdapter(None, ISectionAttendance,
+        ...                      FakeAttendanceAdapter)
+        >>> from schooltool.attendance.interfaces import IHomeroomAttendance
+        >>> ztapi.provideAdapter(None, IHomeroomAttendance,
+        ...                      FakeHomeroomAttendanceAdapter)
+
+    Now we can generate some sample data
+
+        >>> plugin.generateSectionAttendance([])
+        Ann was present on 2005-09-01 09:30:00 (p1, s2)
+        Ann was present on 2005-09-01 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-01 09:30:00 (p2, s2)
+        Ann was present on 2005-09-03 09:30:00 (p1, s2)
+        Ann was present on 2005-09-03 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-03 09:30:00 (p2, s2)
+        Ann was present on 2005-09-05 09:30:00 (p1, s2)
+        Ann was present on 2005-09-05 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-05 09:30:00 (p2, s2)
+        Ann was absent on 2005-09-07 09:30:00 (p1, s2)
+        Tardy at 2005-09-07 09:45:00
+        Added explanation
+        Accepted explanation
+        Ann was absent on 2005-09-07 09:30:00 (p1, s2) in Homeroom Period
+        Tardy at 2005-09-07 09:45:00
+        Added explanation
+        Accepted explanation
+        Ann was present on 2005-09-07 09:30:00 (p2, s2)
+        Ann was present on 2005-09-09 09:30:00 (p1, s2)
+        Ann was present on 2005-09-09 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-09 09:30:00 (p2, s2)
+        Ann was present on 2005-09-11 09:30:00 (p1, s2)
+        Ann was present on 2005-09-11 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-11 09:30:00 (p2, s2)
+        Ann was present on 2005-09-13 09:30:00 (p1, s2)
+        Ann was present on 2005-09-13 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-13 09:30:00 (p2, s2)
+        Jon was present on 2005-09-01 09:30:00 (p1, s1)
+        Jon was present on 2005-09-01 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-01 09:30:00 (p1, s1)
+        Ian was present on 2005-09-01 09:30:00 (p1, s1) in Homeroom Period
+        Jon was present on 2005-09-01 09:30:00 (p2, s1)
+        Ian was present on 2005-09-01 09:30:00 (p2, s1)
+        Jon was present on 2005-09-03 09:30:00 (p1, s1)
+        Jon was present on 2005-09-03 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-03 09:30:00 (p1, s1)
+        Ian was present on 2005-09-03 09:30:00 (p1, s1) in Homeroom Period
+        Jon was present on 2005-09-03 09:30:00 (p2, s1)
+        Ian was present on 2005-09-03 09:30:00 (p2, s1)
+        Jon was present on 2005-09-05 09:30:00 (p1, s1)
+        Jon was present on 2005-09-05 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-05 09:30:00 (p1, s1)
+        Ian was present on 2005-09-05 09:30:00 (p1, s1) in Homeroom Period
+        Jon was present on 2005-09-05 09:30:00 (p2, s1)
+        Ian was present on 2005-09-05 09:30:00 (p2, s1)
+        Jon was present on 2005-09-07 09:30:00 (p1, s1)
+        Jon was present on 2005-09-07 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-07 09:30:00 (p1, s1)
+        Ian was present on 2005-09-07 09:30:00 (p1, s1) in Homeroom Period
+        Jon was present on 2005-09-07 09:30:00 (p2, s1)
+        Ian was present on 2005-09-07 09:30:00 (p2, s1)
+        Jon was present on 2005-09-09 09:30:00 (p1, s1)
+        Jon was present on 2005-09-09 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-09 09:30:00 (p1, s1)
+        Ian was present on 2005-09-09 09:30:00 (p1, s1) in Homeroom Period
+        Jon was present on 2005-09-09 09:30:00 (p2, s1)
+        Ian was present on 2005-09-09 09:30:00 (p2, s1)
+        Jon was present on 2005-09-11 09:30:00 (p1, s1)
+        Jon was present on 2005-09-11 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-11 09:30:00 (p1, s1)
+        Ian was present on 2005-09-11 09:30:00 (p1, s1) in Homeroom Period
+        Jon was present on 2005-09-11 09:30:00 (p2, s1)
+        Ian was present on 2005-09-11 09:30:00 (p2, s1)
+        Jon was present on 2005-09-13 09:30:00 (p1, s1)
+        Jon was present on 2005-09-13 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-13 09:30:00 (p1, s1)
+        Ian was present on 2005-09-13 09:30:00 (p1, s1) in Homeroom Period
+        Jon was present on 2005-09-13 09:30:00 (p2, s1)
+        Ian was present on 2005-09-13 09:30:00 (p2, s1)
+
+
+    Let's shift the start date a bit, and reset the rng:
+
+        >>> plugin.start_date = term.last - datetime.timedelta(days=3)
+        >>> plugin.rng = random.Random(42)
+        >>> plugin.generateSectionAttendance([])
+        Ann was present on 2005-09-11 09:30:00 (p1, s2)
+        Ann was present on 2005-09-11 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-11 09:30:00 (p2, s2)
+        Ann was present on 2005-09-13 09:30:00 (p1, s2)
+        Ann was present on 2005-09-13 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-13 09:30:00 (p2, s2)
+        Jon was present on 2005-09-11 09:30:00 (p1, s1)
+        Jon was present on 2005-09-11 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-11 09:30:00 (p1, s1)
+        Ian was present on 2005-09-11 09:30:00 (p1, s1) in Homeroom Period
+        Jon was absent on 2005-09-11 09:30:00 (p2, s1)
+        Tardy at 2005-09-11 09:45:00
+        Added explanation
+        Accepted explanation
+        Ian was present on 2005-09-11 09:30:00 (p2, s1)
+        Jon was present on 2005-09-13 09:30:00 (p1, s1)
+        Jon was present on 2005-09-13 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-13 09:30:00 (p1, s1)
+        Ian was present on 2005-09-13 09:30:00 (p1, s1) in Homeroom Period
+        Jon was present on 2005-09-13 09:30:00 (p2, s1)
+        Ian was present on 2005-09-13 09:30:00 (p2, s1)
+
+
+    If there was a day absence - the student should not be present in
+    any of the section events (even if absence_rate is zero):
+
+        >>> plugin.absence_rate = 0
+        >>> plugin.rng = random.Random(42)
+        >>> day_absences = {'2005-09-11': {'Jon': (False, False, False)},
+        ...                 '2005-09-13': {'Jon': (True, True, True),
+        ...                                'Ian': (True, False, False),
+        ...                                'Ann': (True, True, False)}}
+        >>> plugin.generateSectionAttendance(day_absences)
+        Ann was present on 2005-09-11 09:30:00 (p1, s2)
+        Ann was present on 2005-09-11 09:30:00 (p1, s2) in Homeroom Period
+        Ann was present on 2005-09-11 09:30:00 (p2, s2)
+        Ann was absent on 2005-09-13 09:30:00 (p1, s2)
+        Added explanation
+        Rejected explanation
+        Ann was absent on 2005-09-13 09:30:00 (p1, s2) in Homeroom Period
+        Added explanation
+        Rejected explanation
+        Ann was absent on 2005-09-13 09:30:00 (p2, s2)
+        Added explanation
+        Rejected explanation
+        Jon was absent on 2005-09-11 09:30:00 (p1, s1)
+        Jon was absent on 2005-09-11 09:30:00 (p1, s1) in Homeroom Period
+        Ian was present on 2005-09-11 09:30:00 (p1, s1)
+        Ian was present on 2005-09-11 09:30:00 (p1, s1) in Homeroom Period
+        Jon was absent on 2005-09-11 09:30:00 (p2, s1)
+        Ian was present on 2005-09-11 09:30:00 (p2, s1)
+        Jon was absent on 2005-09-13 09:30:00 (p1, s1)
+        Added explanation
+        Accepted explanation
+        Jon was absent on 2005-09-13 09:30:00 (p1, s1) in Homeroom Period
+        Added explanation
+        Accepted explanation
+        Ian was absent on 2005-09-13 09:30:00 (p1, s1)
+        Added explanation
+        Ian was absent on 2005-09-13 09:30:00 (p1, s1) in Homeroom Period
+        Added explanation
+        Jon was absent on 2005-09-13 09:30:00 (p2, s1)
+        Added explanation
+        Accepted explanation
+        Ian was absent on 2005-09-13 09:30:00 (p2, s1)
+        Added explanation
+
+    """
+
+
+def doctest_SampleAttendancePlugin_generate():
+    r"""Tests for SampleAttendancePlugin
+
+        >>> from schooltool.attendance.sampledata \
+        ...     import SampleAttendancePlugin
+        >>> plugin = SampleAttendancePlugin()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    Generate just sets up some attributes of the plugin and delegates
+    the generation of data to it's methods.
+
+    Let's stub those methods:
+
+        >>> def generateHomeroomAttendanceStub():
+        ...     print 'Generating day attendance data'
+        ...     return 'day_attendance_data'
+        >>> def generateSectionAttendanceStub(day_absences):
+        ...     print 'Generating section attendance data (%s)' % day_absences
+        >>> plugin.generateHomeroomAttendance = generateHomeroomAttendanceStub
+        >>> plugin.generateSectionAttendance = generateSectionAttendanceStub
+
+        >>> term = TermStub()
+        >>> app = {'terms': {'2005-fall': term}}
+
+    And generate the sample data:
+
+        >>> plugin.generate(app, 42)
+        Generating day attendance data
+        Generating section attendance data (day_attendance_data)
+
+        >>> plugin.app is app
+        True
+
+        >>> plugin.term is term
+        True
+
+        >>> plugin.start_date
+        datetime.date(2005, 9, 1)
+
+        >>> plugin.end_date
+        datetime.date(2005, 9, 14)
+
+        >>> plugin.rng
+        <random.Random object at ...>
+
+    Now if we set the only_last_n_days attribute, the start_date
+    should get shifted:
+
+        >>> plugin.only_last_n_days = 2
+        >>> plugin.generate(app, 42)
+        Generating day attendance data
+        Generating section attendance data (day_attendance_data)
+
+        >>> plugin.start_date
+        datetime.date(2005, 9, 13)
+
+        >>> plugin.end_date
+        datetime.date(2005, 9, 14)
+
+    """
+
+
+def test_suite():
+    optionflags = (doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS |
+                   doctest.REPORT_NDIFF)
+    return doctest.DocTestSuite(optionflags=optionflags,
+                                setUp=setup.placelessSetUp,
+                                tearDown=setup.placelessTearDown)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sparkline.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sparkline.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sparkline.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,425 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.attendance.sparkline
+
+$Id: test_sparkline.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+import datetime
+
+from pytz import utc, timezone
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.app.app import getApplicationPreferences
+from schooltool.calendar.simple import ImmutableCalendar, SimpleCalendarEvent
+from schooltool.term.term import Term
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.testing import setup as stsetup
+from schooltool.attendance.interfaces import UNKNOWN, PRESENT, ABSENT, TARDY
+from schooltool.attendance.interfaces import ISectionAttendance
+from schooltool.attendance.interfaces import IHomeroomAttendance
+
+
+def setUp(test):
+    setup.placefulSetUp()
+    stsetup.setUpCalendaring()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def show_image_as_text(img, extracolors={}):
+    r"""Represent a small PIL image as ASCII text.
+
+    The image should be 24-bit RGB data.
+
+    Each pixel is represented by a single character:
+
+        # -- black
+        - -- white
+        R/G/B/C/M/Y -- bright red/green/blue/cyan/magenta/yellow
+        ? -- all other colors
+
+    You can override or extend the mapping by passing in ``extracolors``,
+    which is a mapping of colors (3-character long strings '\xRR\xGG\xBB')
+    to characters.
+
+    Example:
+
+        show_img(img, extracolors={'\x80\x80\x80': '+'})
+
+    """
+    w, h = img.size
+    data = img.tostring()
+    assert len(data) == w*h*3
+    colormap = {'\x00\x00\x00': '#',
+                '\xFF\x00\x00': 'R',
+                '\x00\xFF\x00': 'G',
+                '\x00\x00\xFF': 'B',
+                '\x00\xFF\xFF': 'C',
+                '\xFF\x00\xFF': 'M',
+                '\xFF\xFF\x00': 'Y',
+                '\xFF\xFF\xFF': '-'}
+    colormap.update(extracolors)
+    unknown_colours = set()
+    for i in range(0, w*h*3, 3):
+        if data[i:i+3] not in colormap:
+            unknown_colours.add(data[i:i+3])
+    for j in range(0, w*h*3, w*3):
+        print ''.join(colormap.get(data[i:i+3], '?')
+                      for i in range(j, j+w*3, 3))
+    if unknown_colours:
+        print "Unrecognized colors:"
+        for c in sorted(unknown_colours):
+            print r"  '\x%02X\x%02X\x%02X'" % tuple(map(ord, c))
+
+
+class AttendanceRecordStub:
+    def __init__(self, status, explained=None, section=None, date=None):
+        self.status = status
+        self.explained = explained
+        self.section = section
+        self.date = date
+
+    def isUnknown(self):
+        return self.status == UNKNOWN
+    def isPresent(self):
+        return self.status == PRESENT
+    def isAbsent(self):
+        return self.status == ABSENT
+    def isTardy(self):
+        return self.status == TARDY
+    def isExplained(self):
+        return self.explained
+
+    def __str__(self):
+        expl = ''
+        if self.explained:
+            expl = ' (%s)' % self.explained
+        return str(self.status) + expl
+
+
+class SectionAttendanceStub:
+    def __init__(self, section):
+        self.section = section
+
+    def getAllForDay(self, date):
+        result = []
+
+        def add(*args, **kwargs):
+            result.append(AttendanceRecordStub(*args, **kwargs))
+
+        if date in [datetime.date(2005, 9, 20),
+                    datetime.date(2005, 9, 22),
+                    datetime.date(2005, 9, 27),
+                    datetime.date(2005, 10, 13),
+                    datetime.date(2005, 10, 18)]:
+            add(PRESENT, section=self.section, date=date)
+
+
+        if date == datetime.date(2005, 9, 29):
+            add(UNKNOWN, section=self.section, date=datetime.date(2005, 9, 29))
+        if date == datetime.date(2005, 10, 4):
+            add(UNKNOWN, section=self.section, date=datetime.date(2005, 10, 4))
+            add(TARDY, 'lazy', section=self.section, date=datetime.date(2005, 10, 4))
+            add(ABSENT, section=self.section, date=datetime.date(2005, 10, 4))
+        if date == datetime.date(2005, 10, 6):
+            add(PRESENT, section=self.section, date=datetime.date(2005, 10, 6))
+        if date == datetime.date(2005, 10, 11):
+            add(TARDY, 'ill', section=self.section, date=datetime.date(2005, 10, 11))
+        if date == datetime.date(2005, 10, 20):
+            add(ABSENT, section=self.section, date=datetime.date(2005, 10, 20))
+        return result
+
+
+class HomeroomAttendanceStub:
+
+    def getHomeroomPeriodForRecord(self, section_ar):
+        return self.get(section_ar.date)
+
+    def get(self, day):
+        if day == datetime.date(2005, 9, 20):
+            return AttendanceRecordStub(UNKNOWN)
+        if day == datetime.date(2005, 9, 22):
+            return AttendanceRecordStub(PRESENT)
+        if day == datetime.date(2005, 9, 27):
+            return AttendanceRecordStub(ABSENT, 'birthday')
+        if day == datetime.date(2005, 9, 29):
+            return AttendanceRecordStub(PRESENT)
+        if day == datetime.date(2005, 10, 4):
+            return AttendanceRecordStub(UNKNOWN)
+        if day == datetime.date(2005, 10, 6):
+            return AttendanceRecordStub(PRESENT)
+        if day == datetime.date(2005, 10, 11):
+            return AttendanceRecordStub(PRESENT)
+        if day == datetime.date(2005, 10, 13):
+            return AttendanceRecordStub(ABSENT)
+        if day == datetime.date(2005, 10, 18):
+            return AttendanceRecordStub(UNKNOWN)
+        if day == datetime.date(2005, 10, 20):
+            return AttendanceRecordStub(PRESENT)
+        unknown = AttendanceRecordStub(UNKNOWN)
+        return unknown
+
+
+class PersonStub:
+    def __init__(self, section):
+        self.section_attendance = SectionAttendanceStub(section)
+
+    def __conform__(self, iface):
+        if iface is ISectionAttendance:
+            return self.section_attendance
+        if iface is IHomeroomAttendance:
+            return HomeroomAttendanceStub()
+
+
+class CalendarStub:
+    events = [datetime.datetime(2005, 9, 29, 9, 0, tzinfo=utc),
+              datetime.datetime(2005, 10, 4, 9, 0, tzinfo=utc),
+              datetime.datetime(2005, 10, 6, 9, 0, tzinfo=utc),
+              datetime.datetime(2005, 10, 11, 9, 0, tzinfo=utc),
+              datetime.datetime(2005, 10, 20, 9, 0, tzinfo=utc)]
+
+    def expand(self, from_time, to_time):
+        for ev in self.events:
+            if from_time <= ev <= to_time:
+                return [ev]
+        return []
+
+
+class TimetablesStub:
+    def makeTimetableCalendar(self):
+        return CalendarStub()
+
+
+class SectionStub:
+
+    timetables = TimetablesStub()
+
+    def __conform__(self, iface):
+        if iface is ICompositeTimetables:
+            return self.timetables
+
+
+def doctest_AttendanceSparkline():
+    r"""Tests for AttendanceSparkline
+
+    Create simple sparkline:
+
+        >>> section = SectionStub()
+        >>> person = PersonStub(section)
+        >>> date = datetime.date(2005, 10, 25)
+        >>> from schooltool.attendance.sparkline import AttendanceSparkline
+        >>> sparkline = AttendanceSparkline(person, section, date)
+
+    Test AttendanceSparkline.getLastSchooldays.
+
+    We need schooltool application for timezone preference and terms.
+
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> ztapi.provideAdapter(ISchoolToolApplication,
+        ...                     IApplicationPreferences,
+        ...                     getApplicationPreferences)
+        >>> prefs = IApplicationPreferences(app)
+        >>> prefs.timezone = 'UTC'
+        >>> term = Term('test-term', datetime.date(2005, 9, 16),
+        ...             datetime.date(2005, 11, 1))
+        >>> term.addWeekdays(1, 3)
+        >>> app['terms']['test-term'] = term
+
+    Take look at last 12 schooldays (we should get only 10):
+
+        >>> last_days = list(sparkline.getLastSchooldays())[:12]
+        >>> for day in last_days:
+        ...     print day
+        2005-10-20
+        2005-10-18
+        2005-10-13
+        2005-10-11
+        2005-10-06
+        2005-10-04
+        2005-09-29
+        2005-09-27
+        2005-09-22
+        2005-09-20
+
+    Test AttendanceSparkline.getLastSectionDays:
+
+        >>> last_section_days = sparkline.getLastSectionDays(10)
+        >>> for day in last_section_days:
+        ...     print day
+        2005-09-29
+        2005-10-04
+        2005-10-06
+        2005-10-11
+        2005-10-20
+
+
+    Test AttendanceSparkline.getRecordsForDay:
+
+        >>> records = sparkline.getRecordsForDay(datetime.date(2005, 10, 4))
+        >>> for record in records:
+        ...     print record
+        UNKNOWN
+        TARDY (lazy)
+        ABSENT
+
+    Test AttendanceSparkline.getWorstRecordForDay:
+
+        >>> record = sparkline.getWorstRecordForDay(datetime.date(2005, 10, 4))
+        >>> print record
+        ABSENT
+
+    Test AttendanceSparkline.getData:
+
+        >>> data = sparkline.getData()
+        >>> for item in data:
+        ...     print item
+        ('dot', 'black', '+')
+        ('full', 'yellow', '-')
+        ('full', 'black', '+')
+        ('full', 'black', '-')
+        ('full', 'red', '-')
+
+    """
+
+
+def doctest_AttendanceSparkline_render():
+    r"""Tests for AttendanceSparkline render* methods.
+
+        >>> from schooltool.attendance.sparkline import AttendanceSparkline
+        >>> sparkline = AttendanceSparkline('person', 'section', 'date')
+        >>> sparkline.getData = lambda: [('dot', 'black', '+'),
+        ...                              ('half', 'black', '+'),
+        ...                              ('half', 'black', '-'),
+        ...                              ('dot', 'black', '+'),
+        ...                              ('full', 'green', '-'),
+        ...                              ('full', 'black', '+'),
+        ...                              ('full', 'black', '-'),
+        ...                              ('half', 'green', '-'),
+        ...                              ('dot', 'black', '+'),
+        ...                              ('full', 'red', '-')]
+        >>> sparkline.colors = {'black': '#000000', 'red': '#ff0000',
+        ...                     'green': '#00ff00'}
+
+    Test AttendanceSparkline.render and renderAsPngData:
+
+        >>> sparkline.width = 14
+        >>> png = sparkline.render()
+        >>> png
+        <PIL.Image.Image instance ...>
+
+        >>> show_image_as_text(png)
+        ---------------------------##-------------
+        ---------------------------##-------------
+        ---------------------------##-------------
+        ---------------##----------##-------------
+        ---------------##----------##-------------
+        ---------------##----------##-------------
+        ------------##-##-##-##-GG-##-##-GG-##-RR-
+        ------------------##----GG----##-GG----RR-
+        ------------------##----GG----##-GG----RR-
+        ------------------##----GG----##-GG----RR-
+        ------------------------GG----##-------RR-
+        ------------------------GG----##-------RR-
+        ------------------------GG----##-------RR-
+
+        >>> png_data = sparkline.renderAsPngData()
+        >>> print png_data.encode('base64')
+        iVBORw0KGgoAAAANSUhEUgAAACoAAAANCAIAAABQCGuCAAAAv0lEQVR4nGL8//8/A1UBIyMjAwMD
+        kcYCAAAA//9ioq7dpAIAAAAA//8aYOsBAAAA//8izXpGRkZI2FILAAAAAP//GmDfAwAAAP//GmDr
+        AQAAAP//Isp6zDCHiyAYDIyMDDjUwKQQ5jAyMjAyMjAwAAAAAP//YiHGenguwsxOxIjgkQIAAAD/
+        /xrgwAcAAAD//xpg6wEAAAD//yIq8DEBSWXlfwacigEAAAD//xpg3wMAAAD//xpg6wEAAAD//wMA
+        CH4aN2r6OOEAAAAASUVORK5CYII=
+        <BLANKLINE>
+
+    """
+
+
+def doctest_AttendanceSparkline_sectionMeetsOn():
+    """Tests for AttendanceSparkline.sectionMeetsOn.
+
+        >>> from schooltool.attendance.sparkline import AttendanceSparkline
+        >>> as = AttendanceSparkline(None, None, None)
+
+    Europe/Vilnius is a good timezone for unit tests, because its UTC offset
+    has changed historically, which lets you catch certain timezone-related
+    bugs.
+
+        >>> tz = timezone('Europe/Vilnius')
+
+    On 2005-07-28 the UTC offset is +03:00, and the school day starts on
+    2005-07-27 21:00 UTC and ends on 2005-07-28 21:00 UTC
+
+    On 2005-12-28 the UTC offset is +02:00, and the school day starts on
+    2005-12-27 22:00 UTC and ends on 2005-12-28 22:00 UTC
+
+        >>> section_calendar = ImmutableCalendar([
+        ...     SimpleCalendarEvent(datetime.datetime(2005, 7, 27, 21, 30),
+        ...                         datetime.timedelta(hours=1),
+        ...                         '2005-07-28 EEST'),
+        ...     SimpleCalendarEvent(datetime.datetime(2005, 7, 30, 19, 30),
+        ...                         datetime.timedelta(hours=1),
+        ...                         '2005-07-30 EEST'),
+        ...     SimpleCalendarEvent(datetime.datetime(2005, 12, 27, 22, 30),
+        ...                         datetime.timedelta(hours=1),
+        ...                         '2005-12-28 EET'),
+        ...     SimpleCalendarEvent(datetime.datetime(2005, 12, 30, 20, 30),
+        ...                         datetime.timedelta(hours=1),
+        ...                         '2005-12-30 EET'),
+        ... ])
+
+        >>> as.sectionMeetsOn(datetime.date(2005, 7, 27), tz, section_calendar)
+        False
+        >>> as.sectionMeetsOn(datetime.date(2005, 7, 28), tz, section_calendar)
+        True
+        >>> as.sectionMeetsOn(datetime.date(2005, 7, 29), tz, section_calendar)
+        False
+        >>> as.sectionMeetsOn(datetime.date(2005, 7, 30), tz, section_calendar)
+        True
+        >>> as.sectionMeetsOn(datetime.date(2005, 7, 31), tz, section_calendar)
+        False
+
+        >>> as.sectionMeetsOn(datetime.date(2005, 12, 27), tz, section_calendar)
+        False
+        >>> as.sectionMeetsOn(datetime.date(2005, 12, 28), tz, section_calendar)
+        True
+        >>> as.sectionMeetsOn(datetime.date(2005, 12, 29), tz, section_calendar)
+        False
+        >>> as.sectionMeetsOn(datetime.date(2005, 12, 30), tz, section_calendar)
+        True
+        >>> as.sectionMeetsOn(datetime.date(2005, 12, 31), tz, section_calendar)
+        False
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/attendance/tests/test_sparkline.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,409 @@
+SchoolBell calendaring library
+==============================
+
+schooltool.calendar is a calendaring library for Zope 3.
+
+
+Features
+--------
+
+- It can parse and generate iCalendar files.  Only a subset of the iCalendar
+  spec is supported, however it is a sensible subset that should be enough for
+  interoperation with desktop calendaring applications like Apple's iCal,
+  Mozilla Calendar, Evolution, and KOrganizer.
+
+- It is storage independent -- your application could store the calendar in
+  ZODB, in a relational database, or elsewhere, as long as the storage
+  component provides the necessary interface.
+
+- You can display several calendars in a single view by using calendar
+  composition.
+
+- It supports recurring events.
+
+
+Quick overview
+--------------
+
+At the moment schooltool.calendar contains building blocks for calendaring
+in your own application.
+
+schooltool.calendar.interfaces defines interfaces for calendars and calendar
+events.
+
+schooltool.calendar.simple defines simple calendar and calendar event classes.
+They are not tied into any particular storage system, so if you want to
+store your calendars in the ZODB or in a relational database, you will
+want to write your own.
+
+  TODO: there should be a standard Persistent calendar class in this package.
+
+schooltool.calendar.mixins defines mixins that make implementation of
+your own calendar and event classes easier.
+
+schooltool.calendar.icalendar lets you parse and generate iCalendar (RFC 2445)
+files.
+
+schooltool.calendar.browser defines some browser views for calendars.  It is
+very lean at the moment.
+
+  TODO: flesh out browser views.
+
+schooltool.calendar.recurrent defines some recurrence rules that let you
+describe events recurring daily, weekly, monthly or yearly.
+
+schooltool.calendar.utils contains a number of small standalone utility
+functions for manipulating dates and times.
+
+
+Calendars
+---------
+
+A calendar is a set of events.  A calendar event has a date and time, a
+duration, a title, and a bunch of other (optional) attributes like location
+or description.  Here's a sample calendar event:
+
+    >>> from pytz import utc
+    >>> from datetime import datetime, timedelta
+    >>> from schooltool.calendar.simple import SimpleCalendarEvent
+    >>> appointment = SimpleCalendarEvent(datetime(2004, 12, 28, 13, 40,
+    ...                                            tzinfo=utc),
+    ...                                   timedelta(hours=1),
+    ...                                   'Dentist')
+
+Calendar events are described by the ICalendarEvent interface.
+
+    >>> from schooltool.calendar.interfaces import ICalendarEvent
+    >>> ICalendarEvent.providedBy(appointment)
+    True
+
+Here's another calendar event.  It repeats every week:
+
+    >>> from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+    >>> meeting = SimpleCalendarEvent(datetime(2005, 2, 7, 18, 0, tzinfo=utc),
+    ...                               timedelta(hours=1),
+    ...                               'IRC meeting',
+    ...                               location='#schooltool',
+    ...                               recurrence=WeeklyRecurrenceRule())
+
+A calendar is a set of events.  Some calendars are read-only, while others
+are editable.  Here's a simple read-only calendar that contains two events:
+
+    >>> from schooltool.calendar.simple import ImmutableCalendar
+    >>> calendar = ImmutableCalendar([meeting, appointment])
+    >>> len(calendar)
+    2
+
+You can iterate over calendars to get all events in unspecified order.  You
+can then sort the events by date.  Let us define a simple function for
+listing calendar events sorted by date
+
+    >>> def print_cal(calendar):
+    ...     events = list(calendar)
+    ...     events.sort()
+    ...     for event in events:
+    ...         print event.dtstart.strftime('%Y-%m-%d'), event.title
+
+    >>> print_cal(calendar)
+    2004-12-28 Dentist
+    2005-02-07 IRC meeting
+
+Note that, although IRC meeting repeats weekly, it was printed only once.
+If you want to see all occurrences of repeating calendar events, you can
+call calendar.expand.  Since some events may repeat indefinitely, expand
+takes two datetime arguments and limits returned events to the specified
+datetime range.
+
+    >>> print_cal(calendar.expand(datetime(2005, 2, 1, tzinfo=utc),
+    ...                           datetime(2005, 3, 1, tzinfo=utc)))
+    2005-02-07 IRC meeting
+    2005-02-14 IRC meeting
+    2005-02-21 IRC meeting
+    2005-02-28 IRC meeting
+
+
+Storage of calendars
+--------------------
+
+SchoolBell was designed to allow flexibility in calendar storage: calendars
+may be stored in the ZODB, in a relational database, as iCalendar files on
+disk, or computed on the fly from some other data source.
+
+To achieve this, schooltool.calendar defines interfaces for calendars
+(ICalendar and IEditCalendar) and calendar events (ICalendarEvent) and relies
+on objects implementing those interfaces.
+
+You can define your own calendar and calendar event classes.  There are
+mixins (CalendarMixin, EditableCalendarMixin, CalendarEventMixin) defined
+in schooltool.calendar.mixins that you can use (if you want to) to implement
+some of calendar/calendar event operations.
+
+There are some simple implementations of calendars and calendar events in
+schooltool.calendar.simple: SimpleCalendarEvent and ImmutableCalendar.
+They are particularly useful for calendars that are generated on the fly.
+For example, suppose we have a list of (fictious) deadlines for a project:
+
+    >>> deadlines = [('2005-02-28', 'Feature freeze'),
+    ...              ('2005-03-05', 'Release candidate 1'),
+    ...              ('2005-03-15', 'Release')]
+
+We can generate a calendar like this
+
+    >>> from schooltool.calendar.simple import ImmutableCalendar
+    >>> from schooltool.calendar.simple import SimpleCalendarEvent
+    >>> from schooltool.calendar.utils import parse_datetimetz
+    >>> from datetime import timedelta
+
+    >>> deadline_calendar = ImmutableCalendar([
+    ...         SimpleCalendarEvent(parse_datetimetz(date + ' 00:00:00Z'),
+    ...                             timedelta(hours=1),
+    ...                             deadline)
+    ...         for date, deadline in deadlines])
+
+    >>> print_cal(deadline_calendar)
+    2005-02-28 Feature freeze
+    2005-03-05 Release candidate 1
+    2005-03-15 Release
+
+Note that every event will get a new randomly generated unique_id attribute.
+If you want to publish a computed calendar as an iCalendar file, you might
+want to generate deterministic unique IDs and explicitly pass them to
+SimpleCalendarEvent's constructor.
+
+
+iCalendar
+---------
+
+iCalendar (defined in `RFC 2445`__) is a popular calendar representation
+format.
+
+  __ http://www.ietf.org/rfc/rfc2445.txt
+
+There is a sample iCalendar file (created with Ximian Evolution) in
+schooltool.calendar.tests
+
+    >>> import os, schooltool.calendar
+    >>> filename = os.path.join(os.path.dirname(schooltool.calendar.__file__),
+    ...                         'tests', 'sample.ics')
+
+You can read an iCalendar file event by event:
+
+    >>> from schooltool.calendar.icalendar import read_icalendar
+    >>> print_cal(read_icalendar(open(filename)))
+    2005-02-09 SchoollTool 0.9 release
+    2005-02-09 SchoolTool release party!
+    2005-02-14 #schooltool meeting
+
+Note that read_icalendar returns an iterator, and not a calendar.  If you want
+a calendar object, you can create one as follows:
+
+    >>> from schooltool.calendar.simple import ImmutableCalendar
+    >>> sample_calendar = ImmutableCalendar(read_icalendar(open(filename)))
+    >>> len(sample_calendar)
+    3
+
+You can create an iCalendar file from a SchoolBell calendar.
+
+    >>> from schooltool.calendar.icalendar import convert_calendar_to_ical
+    >>> lines = convert_calendar_to_ical(sample_calendar)
+    >>> print "\n".join(lines)                          # doctest: +ELLIPSIS
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    BEGIN:VEVENT
+    UID:20050211T140836Z-19135-1013-8968-3 at muskatas
+    ...
+    DTSTART:20050209T183000Z
+    DURATION:PT3H
+    DTSTAMP:...
+    END:VEVENT
+    END:VCALENDAR
+
+iCalendar spec mandates lines (including the last one) are terminated by CR LF
+characters, so you should use something like
+
+    >>> output_as_string = "\r\n".join(lines + [''])
+
+TODO: this is inconvenient.  "".join(lines) should return a valid iCalendar
+stream.  fileobject.writelines(lines) should just work.  Although there
+are other complications with automatic LF -> CRLF transformations when
+file objects are opened in text mode.
+
+iCalendar is a large specification, and schooltool.calendar supports only a
+subset of it.  This subset should be enough to interoperate with most open
+source calendaring software, but you should keep in mind that reading an
+iCalendar file into SchoolBell objects and writing it back is a lossy
+transformation.
+
+
+Calendar composition
+--------------------
+
+It is often useful to display several calendars at the same time.  Rather
+than iterating over a number of calendars, you may want to construct a single
+calendar that contains all the events from those other calendars:
+
+    >>> from schooltool.calendar.simple import combine_calendars
+    >>> cal = combine_calendars(deadline_calendar, sample_calendar)
+    >>> len(cal) == len(deadline_calendar) + len(sample_calendar)
+    True
+    >>> print_cal(cal)
+    2005-02-09 SchoollTool 0.9 release
+    2005-02-09 SchoolTool release party!
+    2005-02-14 #schooltool meeting
+    2005-02-28 Feature freeze
+    2005-03-05 Release candidate 1
+    2005-03-15 Release
+
+TODO: when we display a combined calendar, we often want to know where each
+event came from.
+
+
+Recurring events
+----------------
+
+Recurring events are calendar events with a defined recurrence rule.  An
+example of a recurrence rule that says "this event repeats 5 times on every
+third day" is
+
+    >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+    >>> rule = DailyRecurrenceRule(count=5, interval=3)
+
+Currently there are four kinds of recurrence rules defined in
+schooltool.calendar.recurrent:
+
+- daily recurrences (e.g. "every second day")
+- weekly recurrences (e.g. "every week on Monday through Friday")
+- monthly recurrences (e.g. "every second Tuesday of a month" or
+  "15th of every second month")
+- yearly (e.g. "January 29th every year")
+
+All recurrence rules share some common attributes:
+
+- 'interval': to express "every third week" you would create a
+  WeeklyRecurrenceRule with an interval of 3.  An interval of 1 means simply
+  "every".  Intervals lower than 1 are not allowed.
+
+- 'count' and 'until': you can limit the number of occurrences by specifying
+  an explicit count (e.g. "every second year during the next 10 years" would
+  be expressed as YearlyRecurrenceRule(interval=2, count=5)), or by
+  specifying the date of the last occurrence (e.g. "every third day until
+  August 15th" would be expressed as DailyRecurrenceRule(interval=3,
+  until=datetime.date(2005, 8, 15))).  If neither 'count' not 'until' are
+  specified, the rule repeats forever.
+
+- 'exceptions': you can say "repeat every Monday except on February 21" as
+  WeeklyRecurrenceRule(weekdays=calendar.MONDAY,
+  exceptions=[date(2005, 2, 21)]).
+
+Weekly recurrence rules let you specify a set of weekdays that the event
+occurs on.  E.g. "every second weekend" can be expressed as
+WeeklyRecurrenceRule(interval=2, weekdays=[calendar.SATURDAY,
+calendar.SUNDAY])).
+
+Monthly recurrence rules also let you choose one of three variants:
+
+- same day of month (e.g. an event that occurrs on January 29 and has
+  a MonthlyRecurrenceRule(monthly='monthday') will recur on the 29th of
+  every month (except Februrary on non-leap years).
+
+- same day of week (e.g. "2nd Tuesday of a month" can be expressed as
+  a MonthlyRecurrenceRule(monthly='weekday'), if the recurrence rule is
+  assigned to an event that happens on the 2nd Tuesday of some month.
+
+- same day of week, but counting from the end of the month (e.g. "2nd last
+  Wednesday of a month" -- MonthlyRecurrenceRule(monthly='lastweekday')).
+
+Here's how you create recurring events:
+
+    >>> from schooltool.calendar.recurrent import YearlyRecurrenceRule
+    >>> event = SimpleCalendarEvent(datetime(2005, 1, 29, 12, tzinfo=utc),
+    ...                             timedelta(hours=1),
+    ...                             'My birthday',
+    ...                             recurrence=YearlyRecurrenceRule())
+
+Here's how you can get all recurrence dates of an event:
+
+    >>> iterator = event.recurrence.apply(event)
+    >>> iterator.next()
+    datetime.date(2005, 1, 29)
+    >>> iterator.next()
+    datetime.date(2006, 1, 29)
+    >>> iterator.next()
+    datetime.date(2007, 1, 29)
+
+Usually you will use ICalendar.expand.
+
+    >>> cal = ImmutableCalendar([event])
+    >>> print_cal(cal.expand(datetime(2003, 1, 1, tzinfo=utc),
+    ...                      datetime(2009, 1, 1, tzinfo=utc)))
+    2005-01-29 My birthday
+    2006-01-29 My birthday
+    2007-01-29 My birthday
+    2008-01-29 My birthday
+
+Sometimes a recurrence rule may exclude even the original occurrence:
+
+    >>> from datetime import date
+    >>> empty_event = SimpleCalendarEvent(datetime(2005, 2, 3, 12, tzinfo=utc),
+    ...                     timedelta(hours=1), 'Copious free time',
+    ...                     recurrence=YearlyRecurrenceRule(
+    ...                                     until=date(2005, 1, 1)))
+    >>> list(empty_event.recurrence.apply(event))
+    []
+
+You can check if an even is "empty" by calling event.hasOccurrences():
+
+    >>> event.hasOccurrences()
+    True
+    >>> empty_event.hasOccurrences()
+    False
+
+
+Utilities
+---------
+
+schooltool.calendar.utils contains a number of small standalone functions
+for parsing and manipulating dates.
+
+    >>> from schooltool.calendar.utils import parse_date, parse_datetime
+    >>> from schooltool.calendar.utils import parse_datetimetz
+    >>> parse_date('2004-02-11')
+    datetime.date(2004, 2, 11)
+    >>> parse_datetime('2004-02-11 15:35:44')
+    datetime.datetime(2004, 2, 11, 15, 35, 44)
+    >>> parse_datetimetz('2004-02-11 15:35:44Z')
+    datetime.datetime(2004, 2, 11, 15, 35, 44, tzinfo=<UTC>)
+
+    >>> from datetime import date
+    >>> from schooltool.calendar.utils import prev_month, next_month
+    >>> prev_month(date(2004, 2, 11))
+    datetime.date(2004, 1, 1)
+    >>> next_month(date(2004, 2, 11))
+    datetime.date(2004, 3, 1)
+
+    >>> from calendar import SUNDAY
+    >>> from schooltool.calendar.utils import week_start
+    >>> week_start(date(2004, 2, 11)).strftime('%a, %b %d %Y')
+    'Mon, Feb 09 2004'
+    >>> week_start(date(2004, 2, 11), SUNDAY).strftime('%a, %b %d %Y')
+    'Sun, Feb 08 2004'
+
+    >>> from schooltool.calendar.utils import weeknum_bounds
+    >>> s, e = [d.strftime('%a, %b %d') for d in weeknum_bounds(2005, 1)]
+    >>> print 'Week 1 of 2005 started on %s and ended on %s.' % (s, e)
+    Week 1 of 2005 started on Mon, Jan 03 and ended on Sun, Jan 09.
+
+    >>> from schooltool.calendar.utils import check_weeknum
+    >>> if check_weeknum(2004, 53):
+    ...     print "There was a 53-th week in 2004"
+    There was a 53-th week in 2004
+    >>> if not check_weeknum(2005, 53):
+    ...     print "There is no week 53 in 2005"
+    There is no week 53 in 2005
+
+
+Future goals
+------------
+
+- Ready to use calendar as a Zope 3 content component, with browser views


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,56 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Calendaring for Zope 3 applications.
+
+SchoolBell Calendar is a calendaring library for Zope 3.  Its main features are
+(currently most of these features are science fiction):
+
+- It can parse and generate iCalendar files.  Only a subset of the iCalendar
+  spec is supported, however it is a sensible subset that should be enough for
+  interoperation with desktop calendaring applications like Apple's iCal,
+  Mozilla Calendar, Evolution, and KOrganizer.
+
+- It has browser views for presenting calendars in various ways (daily, weekly,
+  monthly, yearly views).
+
+- It is storage independent -- your application could store the calendar in
+  ZODB, in a relational database, or elsewhere, as long as the storage
+  component provides the necessary interface.  A default content component
+  that stores data in ZODB is provided.
+
+- You can also generate calendars on the fly from other data (e.g. a bug
+  tracking system).  These calendars can be read-only (simpler) or read-write.
+
+- You can display several calendars in a single view by using calendar
+  composition.
+
+- It supports recurring events (daily, weekly, monthly and yearly).
+
+Things that are not currently supported:
+
+- Timezone handling (UTC times are converted into server's local time in the
+  iCalendar parser, but that's all).
+
+- All-day events (that is, events that only specify the date but not the time).
+
+- Informing the user when uploaded iCalendar files use features that are not
+  supported by SchoolBell.
+
+"""


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,145 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+r"""
+Browser views for schooltool.calendar.
+
+$Id: browser.py 4813 2005-08-18 17:20:09Z srichter $
+
+iCalendar views
+---------------
+
+CalendarICalendarView can export calendars in iCalendar format
+
+    >>> from datetime import datetime, timedelta
+    >>> from schooltool.calendar.simple import ImmutableCalendar
+    >>> from schooltool.calendar.simple import SimpleCalendarEvent
+    >>> event = SimpleCalendarEvent(datetime(2004, 12, 16, 11, 46, 16),
+    ...                             timedelta(hours=1), "doctests",
+    ...                             location=u"Matar\u00f3",
+    ...                             unique_id="12345678-5432 at example.com")
+    >>> calendar = ImmutableCalendar([event])
+
+    >>> from zope.publisher.browser import TestRequest
+    >>> view = CalendarICalendarView()
+    >>> view.context = calendar
+    >>> view.request = TestRequest()
+    >>> output = view.show()
+
+    >>> lines = output.splitlines(True)
+    >>> from pprint import pprint
+    >>> pprint(lines)
+    ['BEGIN:VCALENDAR\r\n',
+     'VERSION:2.0\r\n',
+     'PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN\r\n',
+     'BEGIN:VEVENT\r\n',
+     'UID:12345678-5432 at example.com\r\n',
+     'SUMMARY:doctests\r\n',
+     'LOCATION:Matar\xc3\xb3\r\n',
+     'DTSTART:20041216T114616Z\r\n',
+     'DURATION:PT1H\r\n',
+     'DTSTAMP:...\r\n',
+     'END:VEVENT\r\n',
+     'END:VCALENDAR\r\n']
+
+     The last line must end in '\r\n' see RFC 2445 4.4.
+
+We can also render just the Free/Busy component of iCal
+
+    >>> from datetime import datetime, timedelta
+    >>> from schooltool.calendar.simple import ImmutableCalendar
+    >>> from schooltool.calendar.simple import SimpleCalendarEvent
+    >>> event = SimpleCalendarEvent(datetime(2004, 12, 16, 11, 46, 16),
+    ...                             timedelta(hours=1), "doctests",
+    ...                             location=u"Matar\u00f3",
+    ...                             unique_id="12345678-5432 at example.com")
+    >>> calendar = ImmutableCalendar([event])
+
+    >>> from zope.publisher.browser import TestRequest
+    >>> view = CalendarVfbView()
+    >>> view.context = calendar
+    >>> view.request = TestRequest()
+    >>> output = view.show()
+
+    >>> lines = output.splitlines(True)
+    >>> from pprint import pprint
+    >>> pprint(lines)
+    ['BEGIN:VCALENDAR\r\n',
+     'VERSION:2.0\r\n',
+     'PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN\r\n',
+     'METHOD:PUBLISH\r\n',
+     'BEGIN:VFREEBUSY\r\n',
+     'FREEBUSY:20041216T114616/20041216T12461600Z\r\n',
+     'END:VFREEBUSY\r\n',
+     'END:VCALENDAR\r\n']
+
+Register the iCalendar read view in ZCML as
+
+    <browser:page
+        for="schooltool.calendar.interfaces.ICalendar"
+        name="calendar.ics"
+        permission="zope.Public"
+        class="schooltool.calendar.browser.CalendarICalendarView"
+        attribute="show"
+        />
+
+Register the VfbView as calendar.vfb
+
+    <browser:page
+        for="schooltool.calendar.interfaces.ICalendar"
+        name="calendar.vfb"
+        permission="zope.Public"
+        class="schooltool.calendar.browser.CalendarVfbView"
+        attribute="show"
+        />
+
+"""
+
+from schooltool.calendar.icalendar import convert_calendar_to_ical
+from schooltool.calendar.icalendar import convert_calendar_to_vfb
+
+
+class CalendarICalendarView(object):
+    """RFC 2445 (ICalendar) view for calendars."""
+
+    def show(self):
+        data = "\r\n".join(convert_calendar_to_ical(self.context)) + "\r\n"
+        request = self.request
+        # XXX why check ?
+        if request is not None:
+            request.response.setHeader('Content-Type',
+                                       'text/calendar; charset=UTF-8')
+            request.response.setHeader('Content-Length', len(data))
+
+        return data
+
+
+class CalendarVfbView(object):
+    """RFC 2445 (ICalendar) Free/Busy view for calendars."""
+
+    def show(self):
+        data = "\r\n".join(convert_calendar_to_vfb(self.context)) + "\r\n"
+        request = self.request
+        # XXX why check ?
+        if request is not None:
+            request.response.setHeader('Content-Type',
+                                       'text/calendar; charset=UTF-8')
+            request.response.setHeader('Content-Length', len(data))
+
+        return data
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/generate_vcal_dict.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/generate_vcal_dict.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/generate_vcal_dict.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+"""A script that generates vcal_dict.py.
+
+vcal_dict.py contains a dict of tuples (tzid, vcal_representation)
+indexed by their pytz id.
+
+To generate the file when new version of Olson database appears follow
+these steps:
+
+1. Download vzic source code from:
+
+  http://dspace.dial.pipex.com/prod/dialspace/town/pipexdsl/s/asbm26/vzic/
+
+2. Apply vzic.patch to it (the patch was created for version 1.2 of
+   vzic).
+
+3. Follow the instructions in vzic README file to generate a set of
+   ics files.
+
+4. Run this script passing the name of the generated zoneinfo
+   directory as the first and only parameter.
+
+"""
+import os
+import sys
+import pytz
+from textwrap import dedent
+
+
+def extract_tzlocation(path, file):
+    """Determine the id of the timezone."""
+    assert file.startswith(path + os.path.sep)
+    assert file.lower().endswith('.ics')
+    return file[len(path)+1:-4].replace(os.path.sep, '/')
+
+
+def walk_ics(path):
+    """Generator yielding tuples of timezone data for all ics files in the path.
+
+    Returns tuples containing (tzlocation, tzid, vcalendar) where:
+      tzlocation is the pytz timezone id.
+      tzid is the VCALENDAR timezone id.
+      vcalendar is a string containing the VCALENDAR represantation of
+      the timezone.
+
+    """
+    path = os.path.abspath(path)
+    for dir, subdirs, files in os.walk(path):
+        for file in files:
+            if file.endswith(".ics"):
+                tzlocation = extract_tzlocation(path, os.path.join(dir, file))
+                if tzlocation in pytz.all_timezones:
+                    pytz_tz = pytz.timezone(tzlocation)
+                    ics_file = open(os.path.join(dir, file))
+                    lines = ics_file.read().splitlines()
+                    vcalendar = "\n".join(lines[3:-1])
+                    tzid = lines[4].split(":")[1]
+                    yield tzlocation, tzid, vcalendar
+                else:
+                    print "Timezone %r was not found" % tzlocation
+
+
+def main(argv):
+    if len(argv) < 2:
+        print __doc__
+        sys.exit(1)
+
+    vcdict = open("vcal_dict.py", "w")
+    print >> vcdict, dedent("""\
+    #
+    # This file was generated by generate_vcal_dict.py, DO NOT EDIT!
+    # Instructions on updating this file can be found in generate_vcal_dict.py.
+    #
+    """)
+    print >> vcdict, "timezone_map = {"
+    for tzlocation, tzid, vcalendar in walk_ics(argv[1]):
+        print >> vcdict, "%r : (%r, '''%s''')," % (tzlocation, tzid, vcalendar)
+    print >> vcdict, "}"
+
+
+if __name__ == "__main__":
+    main(sys.argv)


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/generate_vcal_dict.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/icalendar.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/icalendar.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/icalendar.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1454 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+r"""
+iCalendar parsing and generating.
+
+iCalendar (RFC 2445) is a big and hard-to-read specification.  This module
+supports only a subset of it: VEVENT and VFREEBUSY components with a limited
+set of attributes and a limited recurrence model.  The subset should be
+sufficient for interoperation with desktop calendaring applications like
+Apple's iCal, Mozilla Calendar, Evolution and KOrganizer as well as the
+Outlook meeting planner.
+
+If you have a calendar, you can convert it to an iCalendar file like this:
+
+    >>> from pytz import timezone
+    >>> from datetime import datetime, timedelta
+    >>> from schooltool.calendar.simple import ImmutableCalendar
+    >>> from schooltool.calendar.simple import SimpleCalendarEvent
+    >>> event = SimpleCalendarEvent(datetime(2004, 12, 16, 10, 58, 47),
+    ...                             timedelta(hours=1), "doctests",
+    ...                             location=u"Matar\u00f3",
+    ...                             description=u"Writing doctests",
+    ...                             unique_id="12345678-5432 at example.com")
+    >>> calendar = ImmutableCalendar([event])
+
+    >>> ical_file_as_string = "\r\n".join(
+    ...         convert_calendar_to_ical(calendar) + [''])
+
+The returned string is in UTF-8.
+
+    >>> event.location.encode("UTF-8") in ical_file_as_string
+    True
+
+You can also parse iCalendar files back into calendars:
+
+    >>> event_iterator = read_icalendar(ical_file_as_string)
+    >>> new_calendar = ImmutableCalendar(event_iterator)
+    >>> [e.title for e in new_calendar]
+    [u'doctests']
+    >>> e == event
+    True
+
+There is some trickery to make empty calendars work:
+
+    >>> empty_calendar = ImmutableCalendar([])
+    >>> ical_file_as_string = "\r\n".join(
+    ...         convert_calendar_to_ical(empty_calendar) + [''])
+
+    >>> list(read_icalendar(ical_file_as_string))
+    []
+
+
+$Id: icalendar.py 6891 2007-04-25 12:56:26Z ignas $
+"""
+
+import datetime
+import calendar
+import re
+from cStringIO import StringIO
+from sets import Set
+
+import pytz
+from schooltool.calendar.simple import SimpleCalendarEvent
+from schooltool.calendar.vcal_dict import timezone_map
+
+
+EMPTY_CALENDAR_PLACEHOLDER = 'empty-calendar-placeholder at schooltool.org'
+
+def convert_event_to_vfb(event):
+    r"""Convert an ICalendarEvent to iCalendar FREEBUSY entry.
+
+    Returns a list of strings (without newlines) in UTF-8.
+
+        >>> from datetime import datetime, timedelta
+        >>> event = SimpleCalendarEvent(datetime(2004, 12, 16, 10, 7, 29),
+        ...                             timedelta(hours=1), "iCal rendering",
+        ...                             location="Big room",
+        ...                             description="Blah blah\nblah!",
+        ...                             unique_id="12345678-5432 at example.com")
+        >>> lines = convert_event_to_vfb(event)
+        >>> print "\n".join(lines)
+        FREEBUSY:20041216T100729/20041216T11072900Z
+
+    """
+    # XXX: not handling recurrence yet
+    # XXX: shouldn't assume event.dtstart is in UTC
+    assert event.dtstart.tzname() == 'UTC'
+    return ["FREEBUSY:%s/%s00Z" % (ical_datetime(event.dtstart),
+                               ical_datetime(event.dtstart + event.duration))]
+
+
+def convert_event_to_ical(event):
+    r"""Convert an ICalendarEvent to iCalendar VEVENT component.
+
+    Returns a list of strings (without newlines) in UTF-8.
+
+        >>> from datetime import datetime, timedelta
+        >>> event = SimpleCalendarEvent(datetime(2004, 12, 16, 10, 7, 29),
+        ...                             timedelta(hours=1), "iCal rendering",
+        ...                             location="Big room",
+        ...                             description="Blah blah\nblah!",
+        ...                             unique_id="12345678-5432 at example.com")
+        >>> lines = convert_event_to_ical(event)
+        >>> print "\n".join(lines)
+        BEGIN:VEVENT
+        UID:12345678-5432 at example.com
+        SUMMARY:iCal rendering
+        LOCATION:Big room
+        DESCRIPTION:Blah blah\nblah!
+        DTSTART:20041216T100729Z
+        DURATION:PT1H
+        DTSTAMP:...
+        END:VEVENT
+
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+        >>> event = SimpleCalendarEvent(datetime(2005, 2, 11, 22, 42, 50),
+        ...                             timedelta(minutes=15), "iCal tests",
+        ...                             recurrence=DailyRecurrenceRule(),
+        ...                             unique_id="12345678-9876 at example.com")
+        >>> lines = convert_event_to_ical(event)
+        >>> print "\n".join(lines)
+        BEGIN:VEVENT
+        UID:12345678-9876 at example.com
+        SUMMARY:iCal tests
+        RRULE:FREQ=DAILY;INTERVAL=1
+        DTSTART:20050211T224250Z
+        DURATION:PT15M
+        DTSTAMP:...
+        END:VEVENT
+
+    All-day events have DTSTART as a date:
+
+        >>> from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+        >>> event = SimpleCalendarEvent(datetime(2005, 2, 11, 0, 0, 0),
+        ...                             timedelta(days=2), "iCal tests",
+        ...                             recurrence=WeeklyRecurrenceRule(),
+        ...                             unique_id="12345678-9876 at example.com",
+        ...                             allday=True)
+        >>> lines = convert_event_to_ical(event)
+        >>> print "\n".join(lines)
+        BEGIN:VEVENT
+        UID:12345678-9876 at example.com
+        SUMMARY:iCal tests
+        RRULE:FREQ=WEEKLY;BYDAY=FR;INTERVAL=1
+        DTSTART;VALUE=DATE:20050211
+        DURATION:P2D
+        DTSTAMP:...
+        END:VEVENT
+
+    """
+    dtstamp = datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")
+    result = [
+        "BEGIN:VEVENT",
+        "UID:%s" % ical_text(event.unique_id),
+        "SUMMARY:%s" % ical_text(event.title)]
+    if event.location:
+        result.append("LOCATION:%s" % ical_text(event.location))
+    if event.description:
+        result.append("DESCRIPTION:%s" % ical_text(event.description))
+    if event.recurrence is not None:
+        start = event.dtstart
+        result.extend(event.recurrence.iCalRepresentation(start))
+
+    if event.allday:
+        dtstart = 'DTSTART;VALUE=DATE:%s' % ical_date(event.dtstart)
+    else:
+        # XXX: shouldn't assume event.dtstart is in UTC
+        assert event.dtstart.tzname() == 'UTC'
+        dtstart = 'DTSTART:%sZ' % ical_datetime(event.dtstart)
+    result += [dtstart,
+               "DURATION:%s" % ical_duration(event.duration),
+               "DTSTAMP:%s" % dtstamp,
+               "END:VEVENT"]
+    return result
+
+
+def convert_calendar_to_vfb(calendar):
+    r"""Convert an ICalendar to a VFREEBUSY component
+    Returns a list of strings (without newlines) in UTF-8.  They should be
+    joined with '\r\n' to get a valid iCalendar file.
+
+        >>> from schooltool.calendar.simple import ImmutableCalendar
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> from datetime import datetime, timedelta
+        >>> event1 = SimpleCalendarEvent(datetime(2004, 11, 16, 10, 7, 29),
+        ...                             timedelta(hours=1), "iCal rendering",
+        ...                             location="Big room",
+        ...                             unique_id="12345678-5432 at example.com")
+        >>> event2 = SimpleCalendarEvent(datetime(2004, 12, 16, 10, 7, 29),
+        ...                             timedelta(hours=2), "iCal rendering",
+        ...                             location="Big room",
+        ...                             unique_id="12345678-9876 at example.com")
+        >>> calendar = ImmutableCalendar([event1, event2])
+        >>> lines = convert_calendar_to_vfb(calendar)
+        >>> print "\n".join(lines)
+        BEGIN:VCALENDAR
+        VERSION:2.0
+        PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        METHOD:PUBLISH
+        BEGIN:VFREEBUSY
+        FREEBUSY:20041116T100729/20041116T11072900Z
+        FREEBUSY:20041216T100729/20041216T12072900Z
+        END:VFREEBUSY
+        END:VCALENDAR
+
+    XXX VFREEBUSY should just expand every occurence
+
+        >>> lines = convert_calendar_to_vfb(ImmutableCalendar())
+        >>> print "\n".join(lines)
+        BEGIN:VCALENDAR
+        VERSION:2.0
+        PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        METHOD:PUBLISH
+        BEGIN:VFREEBUSY
+        END:VFREEBUSY
+        END:VCALENDAR
+
+
+    """
+    header = ["BEGIN:VCALENDAR",
+              "VERSION:2.0",
+              "PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN",
+              "METHOD:PUBLISH",
+              "BEGIN:VFREEBUSY"]
+    events = []
+    for event in calendar:
+        events += convert_event_to_vfb(event)
+    footer = ["END:VFREEBUSY",
+              "END:VCALENDAR"]
+    return header + events + footer
+
+
+def convert_calendar_to_ical(calendar):
+    r"""Convert an ICalendar to iCalendar VCALENDAR component.
+
+    Returns a list of strings (without newlines) in UTF-8.  They should be
+    joined with '\r\n' to get a valid iCalendar file.
+
+        >>> from schooltool.calendar.simple import ImmutableCalendar
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> from datetime import datetime, timedelta
+        >>> event = SimpleCalendarEvent(datetime(2004, 12, 16, 10, 7, 29),
+        ...                             timedelta(hours=1), "iCal rendering",
+        ...                             location="Big room",
+        ...                             unique_id="12345678-5432 at example.com")
+        >>> calendar = ImmutableCalendar([event])
+        >>> lines = convert_calendar_to_ical(calendar)
+        >>> print "\n".join(lines)
+        BEGIN:VCALENDAR
+        VERSION:2.0
+        PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        BEGIN:VEVENT
+        UID:12345678-5432 at example.com
+        SUMMARY:iCal rendering
+        LOCATION:Big room
+        DTSTART:20041216T100729Z
+        DURATION:PT1H
+        DTSTAMP:...
+        END:VEVENT
+        END:VCALENDAR
+
+    Empty calendars are not allowed by RFC 2445, so we have to invent a dummy
+    event:
+
+        >>> lines = convert_calendar_to_ical(ImmutableCalendar())
+        >>> print "\n".join(lines)
+        BEGIN:VCALENDAR
+        VERSION:2.0
+        PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        BEGIN:VEVENT
+        UID:...
+        SUMMARY:Empty calendar
+        DTSTART:19700101T000000Z
+        DURATION:P0D
+        DTSTAMP:...
+        END:VEVENT
+        END:VCALENDAR
+
+    """
+    header = ["BEGIN:VCALENDAR",
+              "VERSION:2.0",
+              "PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN"]
+    footer = ["END:VCALENDAR"]
+    events = []
+    for event in calendar:
+        events += convert_event_to_ical(event)
+    if not events:
+        placeholder = SimpleCalendarEvent(datetime.datetime(1970, 1, 1),
+                                          datetime.timedelta(0),
+                                          "Empty calendar",
+                                          unique_id=EMPTY_CALENDAR_PLACEHOLDER)
+        events += convert_event_to_ical(placeholder)
+    return header + events + footer
+
+
+def ical_text(value):
+    r"""Format value according to iCalendar TEXT escaping rules.
+
+    Converts Unicode strings to UTF-8 as well.
+
+        >>> ical_text('Foo')
+        'Foo'
+        >>> ical_text(u'Matar\u00f3')
+        'Matar\xc3\xb3'
+        >>> ical_text('\\')
+        '\\\\'
+        >>> ical_text(';')
+        '\\;'
+        >>> ical_text(',')
+        '\\,'
+        >>> ical_text('\n')
+        '\\n'
+    """
+    return (value.encode('UTF-8')
+                 .replace('\\', '\\\\')
+                 .replace(';', '\\;')
+                 .replace(',', '\\,')
+                 .replace('\n', '\\n'))
+
+
+def ical_date(value):
+    """Format a date as an iCalendar DATE value.
+
+        >>> ical_date(datetime.date(2004, 3, 4))
+        '20040304'
+    """
+    return value.strftime("%Y%m%d")
+
+
+def ical_datetime(value):
+    """Format a datetime as an iCalendar DATETIME value.
+
+        >>> ical_datetime(datetime.datetime(2004, 12, 16, 10, 45, 07))
+        '20041216T104507'
+
+    """
+    return value.strftime('%Y%m%dT%H%M%S')
+
+
+def ical_duration(value):
+    """Format a timedelta as an iCalendar DURATION value.
+
+        >>> from datetime import timedelta
+        >>> ical_duration(timedelta(11))
+        'P11D'
+        >>> ical_duration(timedelta(-14))
+        '-P14D'
+        >>> ical_duration(timedelta(1, 7384))
+        'P1DT2H3M4S'
+        >>> ical_duration(timedelta(1, 7380))
+        'P1DT2H3M'
+        >>> ical_duration(timedelta(1, 7200))
+        'P1DT2H'
+        >>> ical_duration(timedelta(0, 7200))
+        'PT2H'
+        >>> ical_duration(timedelta(0, 7384))
+        'PT2H3M4S'
+        >>> ical_duration(timedelta(0, 184))
+        'PT3M4S'
+        >>> ical_duration(timedelta(0, 22))
+        'PT22S'
+        >>> ical_duration(timedelta(0, 3622))
+        'PT1H0M22S'
+
+    """
+    sign = ""
+    if value.days < 0:
+        sign = "-"
+    timepart = ""
+    if value.seconds:
+        timepart = "T"
+        hours = value.seconds // 3600
+        minutes = value.seconds % 3600 // 60
+        seconds = value.seconds % 60
+        if hours:
+            timepart += "%dH" % hours
+        if minutes or (hours and seconds):
+            timepart += "%dM" % minutes
+        if seconds:
+            timepart += "%dS" % seconds
+    if value.days == 0 and timepart:
+        return "%sP%s" % (sign, timepart)
+    else:
+        return "%sP%dD%s" % (sign, abs(value.days), timepart)
+
+
+def read_icalendar(icalendar_text, charset='UTF-8', fallback_tz=pytz.utc):
+    """Read an iCalendar file and return calendar events.
+
+    Returns an iterator over calendar events.
+
+    `icalendar_text` can be a file object or a string.  It is assumed that
+    the iCalendar file contains UTF-8 text.
+
+    `fallback_tz` is used for timestamps when the timezone is not specified
+    or not recognized.
+
+    Unsupported features of the iCalendar file (e.g. VTODO components, complex
+    recurrence rules, unknown properties) are silently ignored.
+    """
+
+    if not hasattr(icalendar_text, 'read'):
+        # It is not a file-like object -- let's assume it is a string
+        icalendar_text = StringIO(icalendar_text)
+
+    rows = RowParser.parse(icalendar_text, charset)
+    vccol = VCalendarCollection.parse(rows)
+
+    for calendar in vccol.vcalendars:
+        for vevent in calendar.events:
+            if vevent.uid == EMPTY_CALENDAR_PLACEHOLDER:
+                continue # Ignore empty calendar placeholder "event"
+
+            dtstart = vevent.dtstart
+            if not isinstance(dtstart, datetime.datetime):
+                dtstart = datetime.datetime.combine(dtstart,
+                                                    datetime.time(0))
+            # XXX regression test for events with a date as dtend
+            dtend = vevent.dtend
+            if not isinstance(dtend, datetime.datetime):
+                dtend = datetime.datetime.combine(dtend,
+                                                  datetime.time(0))
+
+            if dtstart.tzinfo is None:
+                dtstart_tz = calendar.timezones.get(vevent.dtstart_tzid, fallback_tz)
+                dtstart = dtstart_tz.localize(dtstart).astimezone(pytz.utc)
+            if dtend.tzinfo is None:
+                dtend_tz = calendar.timezones.get(vevent.dtend_tzid, fallback_tz)
+                dtend = dtend_tz.localize(dtend).astimezone(pytz.utc)
+            duration = dtend - dtstart
+
+            yield SimpleCalendarEvent(dtstart, duration,
+                                      vevent.summary or '',
+                                      location=vevent.location,
+                                      description=vevent.description,
+                                      unique_id=vevent.uid,
+                                      recurrence=vevent.rrule,
+                                      allday=vevent.all_day_event)
+
+
+#
+# The rest of this module could use some review and refactoring
+#
+
+
+ical_weekdays = ['MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU']
+
+
+class RowParser(object):
+
+    @staticmethod
+    def _parseRow(record_str):
+        """Parse a single content line.
+
+        A content line consists of a property name (optionally followed by a
+        number of parameters) and a value, separated by a colon.  Parameters
+        (if present) are separated from the property name and from each other
+        with semicolons.  Parameters are of the form name=value; value
+        can be double-quoted.
+
+        Returns a tuple (name, value, param_dict).  Case-insensitive values
+        (i.e. property names, parameter names, unquoted parameter values) are
+        uppercased.
+
+        Raises ICalParseError on syntax errors.
+
+        >>> RowParser._parseRow('foo:bar')
+        ('FOO', 'bar', {})
+        >>> RowParser._parseRow('foo;value=bar:BAZFOO')
+        ('FOO', 'BAZFOO', {'VALUE': 'BAR'})
+
+        """
+
+        it = iter(record_str)
+        getChar = it.next
+
+        def err(msg):
+            raise ICalParseError("%s in line:\n%s" % (msg, record_str))
+
+        try:
+            c = getChar()
+            # name
+            key = ''
+            while c.isalnum() or c == '-':
+                key += c
+                c = getChar()
+            if not key:
+                err("Missing property name")
+            key = key.upper()
+            # optional parameters
+            params = {}
+            while c == ';':
+                c = getChar()
+                # param name
+                param = ''
+                while c.isalnum() or c == '-':
+                    param += c
+                    c = getChar()
+                if not param:
+                    err("Missing parameter name")
+                param = param.upper()
+                # =
+                if c != '=':
+                    err("Expected '='")
+                # value (or rather a list of values)
+                pvalues = []
+                while True:
+                    c = getChar()
+                    if c == '"':
+                        c = getChar()
+                        pvalue = ''
+                        while c >= ' ' and c not in ('\177', '"'):
+                            pvalue += c
+                            c = getChar()
+                        # value is case-sensitive in this case
+                        if c != '"':
+                            err("Expected '\"'")
+                        c = getChar()
+                    else:
+                        # unquoted value
+                        pvalue = ''
+                        while c >= ' ' and c not in ('\177', '"', ';', ':',
+                                                     ','):
+                            pvalue += c
+                            c = getChar()
+                        pvalue = pvalue.upper()
+                    pvalues.append(pvalue)
+                    if c != ',':
+                        break
+                if len(pvalues) > 1:
+                    params[param] = pvalues
+                else:
+                    params[param] = pvalues[0]
+            # colon and value
+            if c != ':':
+                err("Expected ':'")
+            value = ''.join(it)
+        except StopIteration:
+            err("Syntax error")
+        else:
+            return (key, value, params)
+
+    @staticmethod
+    def parse(file, charset='UTF-8'):
+        """A generator that returns one record at a time, as a tuple of
+        (name, value, params).
+        """
+        record = []
+        for line in file:
+            if not line.strip():
+                continue
+            if line[0] in '\t ':
+                line = line[1:]
+            elif record:
+                row = "".join(record).decode(charset)
+                yield RowParser._parseRow(row)
+                record = []
+            if line.endswith('\r\n'):
+                record.append(line[:-2])
+            elif line.endswith('\n'):
+                # strictly speaking this is a violation of RFC 2445
+                record.append(line[:-1])
+            else:
+                # strictly speaking this is a violation of RFC 2445
+                record.append(line)
+        if record:
+            row = "".join(record).decode(charset)
+            yield RowParser._parseRow(row)
+
+
+def parse_block(rows):
+    """Read a block from BEGIN until END.
+
+    Returns a dict with sub blocks and a dict of properties.
+
+        >>> parse_block([])
+        ([], {})
+
+        >>> lines = ["BEGIN:VTIMEZONE",
+        ...          "SOME:Property",
+        ...          "END:VTIMEZONE"]
+        >>> parse_block(RowParser.parse(lines))
+        ([], {u'VTIMEZONE': [[(u'BEGIN', u'VTIMEZONE', {}),
+                              (u'SOME', u'Property', {}),
+                              (u'END', u'VTIMEZONE', {})]]})
+
+        >>> lines = ["BEGIN:VTIMEZONE",
+        ...          "SOME:Property",
+        ...          "END:VTIMEZONE",
+        ...          "PROP1: VAL1",
+        ...          "PROP2:",
+        ...          " VAL2",
+        ...          "prop3;value=bar:val3"]
+        >>> props, blocks = parse_block(RowParser.parse(lines))
+        >>> props
+        [(u'PROP1', u' VAL1', {}),
+         (u'PROP2', u'VAL2', {}),
+         (u'PROP3', u'val3', {u'VALUE': u'BAR'})]
+        >>> blocks
+        {u'VTIMEZONE': [[(u'BEGIN', u'VTIMEZONE', {}),
+                         (u'SOME', u'Property', {}),
+                         (u'END', u'VTIMEZONE', {})]]}
+
+        >>> lines = ["BEGIN:VTIMEZONE",
+        ...          "SOME:Property",
+        ...          "BEGIN:STANDARD",
+        ...          "OTHER:Property",
+        ...          "END:STANDARD",
+        ...          "END:VTIMEZONE",
+        ...          "BEGIN:VTIMEZONE",
+        ...          "SOME:Property",
+        ...          "BEGIN:DAYLIGHT",
+        ...          "ANOTHER:Property",
+        ...          "END:DAYLIGHT",
+        ...          "END:VTIMEZONE",
+        ...          "PROP1: VAL1",
+        ...          "PROP2:",
+        ...          " VAL2",
+        ...          "prop3;value=bar:val3"]
+        >>> props, blocks = parse_block(RowParser.parse(lines))
+        >>> props
+        [(u'PROP1', u' VAL1', {}),
+         (u'PROP2', u'VAL2', {}),
+         (u'PROP3', u'val3', {u'VALUE': u'BAR'})]
+        >>> blocks
+        {u'VTIMEZONE': [[(u'BEGIN', u'VTIMEZONE', {}),
+                         (u'SOME', u'Property', {}),
+                         (u'BEGIN', u'STANDARD', {}),
+                         (u'OTHER', u'Property', {}),
+                         (u'END', u'STANDARD', {}),
+                         (u'END', u'VTIMEZONE', {})],
+                        [(u'BEGIN', u'VTIMEZONE', {}),
+                         (u'SOME', u'Property', {}),
+                         (u'BEGIN', u'DAYLIGHT', {}),
+                         (u'ANOTHER', u'Property', {}),
+                         (u'END', u'DAYLIGHT', {}),
+                         (u'END', u'VTIMEZONE', {})]]}
+
+        >>> lines = ["BEGIN:VCALENDAR",
+        ...          "BEGIN:VEVENT",
+        ...          "DTSTART;VALUE=DATE:20010203"]
+        >>> props, blocks = parse_block(RowParser.parse(lines))
+        Traceback (most recent call last):
+        ...
+        ICalParseError: Mismatched BEGIN/END
+
+    """
+    blocks = {}
+    props = []
+    parse_stack = []
+    block = []
+    for key, value, params in rows:
+        if key == "BEGIN":
+            parse_stack.append(value)
+            # if this is the first time we encounter this block in
+            # top level
+            if (len(parse_stack) == 1 and
+                value not in blocks.keys()):
+                blocks[value] = []
+        if parse_stack:
+            block.append((key, value, params))
+        else:
+            props.append((key, value, params))
+        if key == "END":
+            if not parse_stack or parse_stack[-1] != value:
+                raise ICalParseError("Mismatched BEGIN/END")
+            if len(parse_stack) == 1:
+                blocks[parse_stack[0]].append(block)
+                block = []
+            parse_stack.pop(-1)
+    if parse_stack:
+        raise ICalParseError("Mismatched BEGIN/END")
+    return props, blocks
+
+
+class VCalendarCollection(object):
+
+    def __init__(self, vcalendars):
+        self.vcalendars = vcalendars
+
+    @staticmethod
+    def parse(rows):
+        """Parse a list of rows into a VCalendarCollection object."""
+        props, blocks = parse_block(rows)
+
+        if props:
+            raise ICalParseError("Text outside VCALENDAR component")
+
+        # Handle empty ics files
+        if not blocks:
+            vcalendars = []
+        elif 'VCALENDAR' not in blocks.keys():
+            raise ICalParseError('This is not iCalendar')
+        elif blocks.keys() != ['VCALENDAR']:
+            raise ICalParseError("Text outside VCALENDAR component")
+        else:
+            vcalendars = [VCalendar.parse(block)
+                          for block in blocks['VCALENDAR']]
+        return VCalendarCollection(vcalendars)
+
+
+class VCalendar(object):
+
+    def __init__(self, events, timezones):
+        self.events = events
+        self.timezones = timezones
+
+    @staticmethod
+    def parse(rows):
+        """Parse a list of rows into a VCalendar object."""
+        props, blocks = parse_block(rows[1:-1])
+
+        timezones = {'UTC': pytz.utc}
+        for block in blocks.get('VTIMEZONE', []):
+            vtimezone = VTimezone.parse(block)
+            tzinfo = vtimezone.getTzinfo()
+            if tzinfo is None:
+                continue # couldn't parse it :/
+                # TODO: the user should be informed
+            timezones[vtimezone.tzid.upper()] = tzinfo
+        events = [VEvent.parse(block)
+                  for block in blocks.get('VEVENT', [])]
+        return VCalendar(events, timezones)
+
+
+class VTimezone(object):
+
+    def __init__(self, tzid, tznames, x_lic_location=None):
+        tzid = tzid.encode('US-ASCII')
+        self.tzid = tzid
+        self.tznames = tznames
+        self.x_lic_location = x_lic_location
+
+    def getTzinfo(self):
+        """Deduce the pytz timezone from the VTIMEZONE block."""
+        if self.tzid in pytz.all_timezones:
+            return pytz.timezone(self.tzid)
+        elif self.x_lic_location in pytz.all_timezones:
+            return pytz.timezone(self.x_lic_location)
+        else:
+            for tzname in reversed(self.tznames):
+                if tzname in pytz.all_timezones:
+                    return pytz.timezone(tzname)
+        # We don't know
+        return None
+
+    @staticmethod
+    def parse(rows):
+        """Parse a list of rows into a VTimezone object."""
+        rows = list(rows)
+        props, blocks = parse_block(rows[1:-1])
+
+        tzid = None
+        x_lic_location = None
+        for key, value, params in props:
+            if key == 'TZID':
+                tzid = value
+            elif key == 'X-LIC-LOCATION':
+                x_lic_location = value
+        if not tzid:
+            raise ICalParseError("Missing TZID in VTIMEZONE block")
+
+        tznames = []
+        for block in blocks.get('STANDARD', []):
+            for key, value, params in block:
+                if key == 'TZNAME':
+                    tznames.append(value)
+        if not tznames:
+            raise ICalParseError("Missing STANDARD section in VTIMEZONE block")
+
+        return VTimezone(tzid, tznames, x_lic_location=x_lic_location)
+
+
+def parse_text(value):
+    r"""Parse iCalendar TEXT value.
+
+        >>> parse_text('Foo')
+        'Foo'
+        >>> parse_text('\\\\')
+        '\\'
+        >>> parse_text('\\;')
+        ';'
+        >>> parse_text('\\,')
+        ','
+        >>> parse_text('\\n')
+        '\n'
+        >>> parse_text('A string with\\; some\\\\ characters\\nin\\Nit')
+        'A string with; some\\ characters\nin\nit'
+        >>> parse_text('Unterminated \\')
+        Traceback (most recent call last):
+          ...
+        IndexError: string index out of range
+
+    """
+    if '\\' not in value:
+        return value
+    out = []
+    prev = 0
+    while True:
+        idx = value.find('\\', prev)
+        if idx == -1:
+            break
+        out.append(value[prev:idx])
+        if value[idx + 1] in 'nN':
+            out.append('\n')
+        else:
+            out.append(value[idx + 1])
+        prev = idx + 2
+    out.append(value[prev:])
+    return "".join(out)
+
+
+def parse_date(value):
+    """Parse iCalendar DATE value.  Returns a date instance.
+
+        >>> parse_date('20030405')
+        datetime.date(2003, 4, 5)
+        >>> parse_date('20030405T060708')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid iCalendar date: '20030405T060708'
+        >>> parse_date('')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid iCalendar date: ''
+        >>> parse_date('yyyymmdd')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid iCalendar date: 'yyyymmdd'
+    """
+    if len(value) != 8:
+        raise ValueError('Invalid iCalendar date: %r' % value)
+    try:
+        y, m, d = int(value[0:4]), int(value[4:6]), int(value[6:8])
+    except ValueError:
+        raise ValueError('Invalid iCalendar date: %r' % value)
+    else:
+        return datetime.date(y, m, d)
+
+
+def parse_date_time(value):
+    """Parse iCalendar DATE-TIME value.  Returns a datetime instance.
+
+    A simple usage example:
+
+    >>> parse_date_time('20030405T060708')
+    datetime.datetime(2003, 4, 5, 6, 7, 8)
+
+    >>> parse_date_time('20030405T060708Z')
+    datetime.datetime(2003, 4, 5, 6, 7, 8, tzinfo=<UTC>)
+
+    Examples of invalid arguments:
+
+    >>> parse_date_time('20030405T060708+05:00')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar date-time: '20030405T060708+05:00'
+
+    >>> parse_date_time('20030405T060708A')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar date-time: '20030405T060708A'
+
+    >>> parse_date_time('')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar date-time: ''
+
+    For timezone tests see tests.test_icalendar.TestParseDateTime.
+
+    """
+    datetime_rx = re.compile(r'(\d{4})(\d{2})(\d{2})'
+                             r'T(\d{2})(\d{2})(\d{2})(Z?)$')
+    match = datetime_rx.match(value)
+    if match is None:
+        raise ValueError('Invalid iCalendar date-time: %r' % value)
+    y, m, d, hh, mm, ss, utc = match.groups()
+    dt = datetime.datetime(int(y), int(m), int(d),
+                           int(hh), int(mm), int(ss))
+    if utc:
+        return pytz.utc.localize(dt)
+    return dt
+
+
+def parse_duration(value):
+    """Parse iCalendar DURATION value.  Returns a timedelta instance.
+
+    >>> parse_duration('+P11D')
+    datetime.timedelta(11)
+    >>> parse_duration('-P2W')
+    datetime.timedelta(-14)
+    >>> parse_duration('P1DT2H3M4S')
+    datetime.timedelta(1, 7384)
+    >>> parse_duration('P1DT2H3M')
+    datetime.timedelta(1, 7380)
+    >>> parse_duration('P1DT2H')
+    datetime.timedelta(1, 7200)
+    >>> parse_duration('PT2H')
+    datetime.timedelta(0, 7200)
+    >>> parse_duration('PT2H3M4S')
+    datetime.timedelta(0, 7384)
+    >>> parse_duration('PT3M4S')
+    datetime.timedelta(0, 184)
+    >>> parse_duration('PT22S')
+    datetime.timedelta(0, 22)
+    >>> parse_duration('')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar duration: ''
+    >>> parse_duration('xyzzy')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar duration: 'xyzzy'
+    >>> parse_duration('P')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar duration: 'P'
+    >>> parse_duration('P1WT2H')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar duration: 'P1WT2H'
+    """
+    date_part = r'(\d+)D'
+    time_part = r'T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?'
+    datetime_part = '(?:%s)?(?:%s)?' % (date_part, time_part)
+    weeks_part = r'(\d+)W'
+    duration_rx = re.compile(r'([-+]?)P(?:%s|%s)$'
+                             % (weeks_part, datetime_part))
+    match = duration_rx.match(value)
+    if match is None:
+        raise ValueError('Invalid iCalendar duration: %r' % value)
+    sign, weeks, days, hours, minutes, seconds = match.groups()
+    if weeks:
+        value = datetime.timedelta(weeks=int(weeks))
+    else:
+        if (days is None and hours is None
+            and minutes is None and seconds is None):
+            raise ValueError('Invalid iCalendar duration: %r'
+                             % value)
+        value = datetime.timedelta(days=int(days or 0),
+                                   hours=int(hours or 0),
+                                   minutes=int(minutes or 0),
+                                   seconds=int(seconds or 0))
+    if sign == '-':
+        value = -value
+    return value
+
+
+def parse_period(value):
+    """Parse iCalendar PERIOD value.  Returns a Period instance.
+
+    >>> p = parse_period('20030405T060708/20030405T060709')
+    >>> print repr(p).replace('),', '),\\n      ')
+    Period(datetime.datetime(2003, 4, 5, 6, 7, 8),
+           datetime.datetime(2003, 4, 5, 6, 7, 9))
+    >>> parse_period('20030405T060708/PT1H1M1S')
+    Period(datetime.datetime(2003, 4, 5, 6, 7, 8), datetime.timedelta(0, 3661))
+    >>> parse_period('xyzzy')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar period: 'xyzzy'
+    >>> parse_period('foo/foe')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid iCalendar period: 'foo/foe'
+    """
+    parts = value.split('/')
+    if len(parts) != 2:
+        raise ValueError('Invalid iCalendar period: %r' % value)
+    try:
+        start = parse_date_time(parts[0])
+        try:
+            end_or_duration = parse_date_time(parts[1])
+        except ValueError:
+            end_or_duration = parse_duration(parts[1])
+    except ValueError:
+        raise ValueError('Invalid iCalendar period: %r' % value)
+    else:
+        return Period(start, end_or_duration)
+
+
+def _parse_recurrence_weekly(args):
+    """Parse iCalendar weekly recurrence rule.
+
+    args is a mapping from attribute names in RRULE to their string values.
+
+    >>> _parse_recurrence_weekly({})
+    WeeklyRecurrenceRule(1, None, None, (), ())
+    >>> _parse_recurrence_weekly({'BYDAY': 'WE'})
+    WeeklyRecurrenceRule(1, None, None, (), (2,))
+    >>> _parse_recurrence_weekly({'BYDAY': 'MO,WE,SU'})
+    WeeklyRecurrenceRule(1, None, None, (), (0, 2, 6))
+
+    """
+    from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+    weekdays = []
+    days = args.get('BYDAY', None)
+    if days is not None:
+        for day in days.split(','):
+            weekdays.append(ical_weekdays.index(day))
+    return WeeklyRecurrenceRule(weekdays=weekdays)
+
+
+def _parse_recurrence_monthly(args):
+    """Parse iCalendar monthly recurrence rule.
+
+    args is a mapping from attribute names in RRULE to their string values.
+
+    Month-day recurrency is the default:
+
+    >>> _parse_recurrence_monthly({})
+    MonthlyRecurrenceRule(1, None, None, (), 'monthday')
+
+    3rd Tuesday in a month:
+
+    >>> _parse_recurrence_monthly({'BYDAY': '3TU'})
+    MonthlyRecurrenceRule(1, None, None, (), 'weekday')
+
+    Last Wednesday:
+
+    >>> _parse_recurrence_monthly({'BYDAY': '-1WE'})
+    MonthlyRecurrenceRule(1, None, None, (), 'lastweekday')
+    """
+    from schooltool.calendar.recurrent import MonthlyRecurrenceRule
+    if 'BYDAY' in args:
+        if args['BYDAY'][0] == '-':
+            monthly = 'lastweekday'
+        else:
+            monthly = 'weekday'
+    else:
+        monthly = 'monthday'
+    return MonthlyRecurrenceRule(monthly=monthly)
+
+
+def parse_recurrence_rule(value):
+    """Parse iCalendar RRULE entry.
+
+    Returns the corresponding subclass of RecurrenceRule.
+
+    params is a mapping from attribute names in RRULE to their string values,
+
+    A trivial example of a daily recurrence:
+
+    >>> parse_recurrence_rule('FREQ=DAILY')
+    DailyRecurrenceRule(1, None, None, ())
+
+    A slightly more complex example:
+
+    >>> parse_recurrence_rule('FREQ=DAILY;INTERVAL=5;COUNT=7')
+    DailyRecurrenceRule(5, 7, None, ())
+
+    An example that includes use of UNTIL:
+
+    >>> parse_recurrence_rule('FREQ=DAILY;UNTIL=20041008T000000')
+    DailyRecurrenceRule(1, None, datetime.date(2004, 10, 8), ())
+    >>> parse_recurrence_rule('FREQ=DAILY;UNTIL=20041008')
+    DailyRecurrenceRule(1, None, datetime.date(2004, 10, 8), ())
+
+    Of course, other recurrence frequencies may be used:
+
+    >>> parse_recurrence_rule('FREQ=WEEKLY;BYDAY=MO,WE,SU')
+    WeeklyRecurrenceRule(1, None, None, (), (0, 2, 6))
+    >>> parse_recurrence_rule('FREQ=MONTHLY')
+    MonthlyRecurrenceRule(1, None, None, (), 'monthday')
+    >>> parse_recurrence_rule('FREQ=YEARLY')
+    YearlyRecurrenceRule(1, None, None, ())
+
+    You have to provide a valid recurrence frequency, or you will get an error:
+
+    >>> parse_recurrence_rule('')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid frequency of recurrence: None
+    >>> parse_recurrence_rule('FREQ=bogus')
+    Traceback (most recent call last):
+      ...
+    ValueError: Invalid frequency of recurrence: 'bogus'
+
+    Unknown keys in params are ignored silently:
+
+    >>> parse_recurrence_rule('FREQ=DAILY;WHATEVER=IGNORED')
+    DailyRecurrenceRule(1, None, None, ())
+
+    """
+    from schooltool.calendar.recurrent import DailyRecurrenceRule
+    from schooltool.calendar.recurrent import YearlyRecurrenceRule
+
+    # split up the given value into parameters
+    params = {}
+    if value:
+        for pair in value.split(';'):
+            k, v = pair.split('=', 1)
+            params[k] = v
+
+    # parse common recurrency attributes
+    interval = int(params.pop('INTERVAL', '1'))
+    count = params.pop('COUNT', None)
+    if count is not None:
+        count = int(count)
+    until = params.pop('UNTIL', None)
+    if until is not None:
+        if len(until) == 8:
+            until = datetime.datetime.combine(parse_date(until),
+                                              datetime.time(0, 0))
+        else:
+            until = parse_date_time(until)
+
+    # instantiate the corresponding recurrence rule
+    freq = params.pop('FREQ', None)
+    if freq == 'DAILY':
+        rule = DailyRecurrenceRule()
+    elif freq == 'WEEKLY':
+        rule = _parse_recurrence_weekly(params)
+    elif freq == 'MONTHLY':
+        rule = _parse_recurrence_monthly(params)
+    elif freq == 'YEARLY':
+        rule = YearlyRecurrenceRule()
+    else:
+        raise ValueError('Invalid frequency of recurrence: %r' % freq)
+
+    return rule.replace(interval=interval, count=count, until=until)
+
+
+class VEventParser(object):
+    """iCalendar event.
+
+    Life cycle: when a VEvent is created, a number of properties should be
+    added to it using the add method.  Then validate should be called.
+    After that you can start using query methods (getOne, hasProp, iterDates).
+
+    Events are classified into two kinds:
+     - normal events
+     - all-day events
+
+    All-day events are identified by their DTSTART property having a DATE value
+    instead of the default DATE-TIME.  All-day events should satisfy the
+    following requirements (otherwise an exception will be raised):
+     - DURATION property (if defined) should be an integral number of days
+     - DTEND property (if defined) should have a DATE value
+     - any RDATE and EXDATE properties should only contain DATE values
+
+    The first two requirements are stated in RFC 2445; I'm not so sure about
+    the third one.
+    """
+
+    default_type = {
+        # Default value types for some properties
+        'DTSTAMP': 'DATE-TIME',
+        'DTSTART': 'DATE-TIME',
+        'CREATED': 'DATE-TIME',
+        'DTEND': 'DATE-TIME',
+        'DURATION': 'DURATION',
+        'LAST-MODIFIED': 'DATE-TIME',
+        'PRIORITY': 'INTEGER',
+        'RECURRENCE-ID': 'DATE-TIME',
+        'SEQUENCE': 'INTEGER',
+        'URL': 'URI',
+        'ATTACH': 'URI',
+        'EXDATE': 'DATE-TIME',
+        'EXRULE': 'RECUR',
+        'RDATE': 'DATE-TIME',
+        'RRULE': 'RECUR',
+        'LOCATION': 'TEXT',
+        'UID': 'TEXT',
+    }
+
+    converters = {
+        'INTEGER': int,
+        'DATE': parse_date,
+        'DATE-TIME': parse_date_time,
+        'DURATION': parse_duration,
+        'PERIOD': parse_period,
+        'TEXT': parse_text,
+        'RECUR': parse_recurrence_rule,
+    }
+
+    singleton_properties = Set([
+        'DTSTAMP',
+        'DTSTART',
+        'UID',
+        'CLASS',
+        'CREATED',
+        'DESCRIPTION',
+        'DTEND',
+        'DURATION',
+        'GEO',
+        'LAST-MODIFIED',
+        'LOCATION',
+        'ORGANIZER',
+        'PRIORITY',
+        'RECURRENCE-ID',
+        'SEQUENCE',
+        'STATUS',
+        'SUMMARY',
+        'TRANSP',
+        'URL',
+    ])
+
+    rdate_types = Set(['DATE', 'DATE-TIME', 'PERIOD'])
+    exdate_types = Set(['DATE', 'DATE-TIME'])
+
+    def __init__(self):
+        self._props = {}
+
+    def add(self, property, value, params=None):
+        """Add a property.
+
+        Property name is case insensitive.  Params should be a dict from
+        uppercased parameter names to their values.
+
+        Multiple calls to add with the same property name override the value.
+        This is sufficient for now, but will have to be changed soon.
+        """
+        if params is None:
+            params = {}
+        key = property.upper()
+        if key in self._props:
+            if key in self.singleton_properties:
+                raise ICalParseError("Property %s cannot occur more than once"
+                                     % key)
+            self._props[key].append((value, params))
+        else:
+            self._props[key] = [(value, params)]
+
+    def validate(self):
+        """Check that this event has all the necessary properties."""
+        if not self.hasProp('UID'):
+            raise ICalParseError("VEVENT must have a UID property")
+        if not self.hasProp('DTSTART'):
+            raise ICalParseError("VEVENT must have a DTSTART property")
+        if self._getType('DTSTART') not in ('DATE', 'DATE-TIME'):
+            raise ICalParseError("DTSTART property should have a DATE or"
+                                 " DATE-TIME value")
+        if self.hasProp('DTEND'):
+            if self._getType('DTEND') != self._getType('DTSTART'):
+                raise ICalParseError("DTEND property should have the same type"
+                                     " as DTSTART")
+            if self.hasProp('DURATION'):
+                raise ICalParseError("VEVENT cannot have both a DTEND"
+                                     " and a DURATION property")
+        if self.hasProp('DURATION'):
+            if self._getType('DURATION') != 'DURATION':
+                raise ICalParseError("DURATION property should have type"
+                                     " DURATION")
+
+    def parse(self):
+        """Construct the corresponding VEvent object.
+
+        Returns a VEvent.
+        """
+        self.validate()
+        uid = self.getOne('UID')
+        summary = self.getOne('SUMMARY')
+
+        all_day_event = self._getType('DTSTART') == 'DATE'
+
+        dtstart = self.getOne('DTSTART')
+        prop = self._props['DTSTART'][0]
+        dtstart_tzid = prop[1].get('TZID')
+
+        if self.hasProp('DURATION'):
+            duration = self.getOne('DURATION')
+            dtend = dtstart + duration
+            dtend_tzid = dtstart_tzid
+        else:
+            dtend = self.getOne('DTEND', None)
+            if dtend is not None:
+                dtend_tzid = self._props['DTEND'][0][1].get('TZID')
+            else:
+                dtend_tzid = dtstart_tzid
+            if dtend is None:
+                dtend = dtstart
+                if all_day_event:
+                    dtend += datetime.date.resolution
+
+        location = self.getOne('LOCATION', None)
+        description = self.getOne('DESCRIPTION', None)
+
+        if dtstart > dtend:
+            raise ICalParseError("Event start time should precede end time")
+        elif all_day_event and dtstart == dtend:
+            raise ICalParseError("Event start time should precede end time")
+
+        rdates = self._extractListOfDates('RDATE', self.rdate_types,
+                                          all_day_event)
+        exdates = self._extractListOfDates('EXDATE', self.exdate_types,
+                                           all_day_event)
+
+        rrule = self.getOne('RRULE', None)
+        if rrule is not None and exdates:
+            exceptions = [datetime.date(dt.year, dt.month, dt.day)
+                          for dt in exdates]
+            rrule = rrule.replace(exceptions=exceptions)
+
+        return VEvent(uid=uid, summary=summary, all_day_event=all_day_event,
+                      dtstart=dtstart, dtstart_tzid=dtstart_tzid, dtend=dtend,
+                      dtend_tzid=dtend_tzid, location=location,
+                      description=description, rrule=rrule, rdates=rdates,
+                      exdates=exdates)
+
+    def _extractListOfDates(self, key, accepted_types, all_day_event):
+        """Parse a comma separated list of values.
+
+        If all_day_event is True, only accepts DATE values.  Otherwise accepts
+        all value types listed in 'accepted_types'.
+        """
+        dates = []
+        default_type = self.default_type[key]
+        for value, params in self._props.get(key, []):
+            value_type = params.get('VALUE', default_type)
+            if value_type not in accepted_types:
+                raise ICalParseError('Invalid value type for %s: %s'
+                                     % (key, value_type))
+            if all_day_event and value_type != 'DATE':
+                raise ICalParseError('I do not understand how to interpret '
+                                     '%s values in %s for all-day events.'
+                                     % (value_type, key))
+            converter = self.converters.get(value_type)
+            dates.extend(map(converter, value.split(',')))
+        return dates
+
+    def _getType(self, property):
+        """Return the type of the property value.
+
+        Only call getType for properties that do not occur more than once.
+        """
+        key = property.upper()
+        values = self._props[key]
+        assert len(values) == 1
+        value, params = values[0]
+        default_type = self.default_type.get(key, 'TEXT')
+        return params.get('VALUE', default_type)
+
+    def getOne(self, property, default=None):
+        """Return the value of a property as an appropriate Python object.
+
+        Only call getOne for properties that do not occur more than once.
+        """
+        try:
+            values = self._props[property.upper()]
+            assert len(values) == 1
+            value, params = values[0]
+        except KeyError:
+            return default
+        else:
+            converter = self.converters.get(self._getType(property))
+            if converter is None:
+                return value
+            else:
+                return converter(value)
+
+    def hasProp(self, property):
+        """Return True if this VEvent has a named property."""
+        return property.upper() in self._props
+
+
+class VEvent(object):
+    """A calendar event.
+
+    Attributes:
+
+          uid               The unique id of this event
+          summary           Textual summary of this event
+          all_day_event     True if this is an all-day event
+          dtstart           start of the event (inclusive)
+          dtstart_tzid      timezone for the start of the event
+          dtend             end of the event (not inclusive)
+          dtend_tzid        timezone for the end of the event
+          location          location of the event
+          description       description of the event
+          rrule             recurrency rule
+          rdates            a list of recurrence dates or periods
+          exdates           a list of exception dates
+
+    """
+
+    def __init__(self, uid, summary, all_day_event, dtstart, dtstart_tzid,
+                 dtend, dtend_tzid, location, description, rrule, rdates,
+                 exdates):
+        self.uid = uid
+        self.summary = summary
+        self.all_day_event = all_day_event
+        self.dtstart = dtstart
+        self.dtstart_tzid = dtstart_tzid
+        self.dtend = dtend
+        self.dtend_tzid = dtend_tzid
+        self.location = location
+        self.description = description
+        self.rrule = rrule
+        self.rdates = rdates
+        self.exdates = exdates
+
+    @staticmethod
+    def parse(rows):
+        """Parse a list of rows into a VEvent object."""
+        parser = VEventParser()
+        props, blocks = parse_block(rows[1:-1])
+
+        for key, value, params in props:
+            parser.add(key, value, params)
+
+        return parser.parse()
+
+
+class Period(object):
+    """A period of time."""
+
+    def __init__(self, start, end_or_duration):
+        self.start = start
+        self.end_or_duration = end_or_duration
+        if isinstance(end_or_duration, datetime.timedelta):
+            self.duration = end_or_duration
+            self.end = self.start + self.duration
+        else:
+            self.end = end_or_duration
+            self.duration = self.end - self.start
+        if self.start > self.end:
+            raise ValueError("Start time is greater than end time")
+
+    def __repr__(self):
+        return "Period(%r, %r)" % (self.start, self.end_or_duration)
+
+    def __cmp__(self, other):
+        if not isinstance(other, Period):
+            raise NotImplementedError('Cannot compare Period with %r' % other)
+        return cmp((self.start, self.end), (other.start, other.end))
+
+    def overlaps(self, other):
+        if self.start > other.start:
+            return other.overlaps(self)
+        if self.start <= other.start < self.end:
+            return True
+        return False
+
+
+class ICalParseError(Exception):
+    """Invalid syntax in an iCalendar file."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/icalendar.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,398 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Interface definitions for SchoolBell calendars.
+
+There are two interfaces for calendars: `ICalendar` for read-only calendars,
+and `IEditCalendar` for read-write calendars.
+
+Semantically calendars are unordered sets of events.
+
+$Id: interfaces.py 6483 2006-11-13 17:53:16Z ignas $
+"""
+
+from zope.interface import Interface
+from zope.schema import Text, TextLine, Int, Datetime, Date, Timedelta
+from zope.schema import List, Set, Choice, Object, Bool
+
+
+Unchanged = object() # marker
+
+
+class ICalendar(Interface):
+    """Calendar.
+
+    A calendar is a set of calendar events (see ICalendarEvent).  Recurring
+    events are listed only once.
+    """
+
+    def __len__():
+        """Return the number of events in this calendar."""
+
+    def __iter__():
+        """Return an iterator over all events in this calendar.
+
+        The order of events is not defined.
+        """
+
+    def find(unique_id):
+        """Return an event with the given unique id.
+
+        Raises a KeyError if there is no event with this id.
+        """
+
+    def expand(first, last):
+        """Return an iterator over all expanded events in a given time period.
+
+        "Expanding" here refers to expanding recurring events, that is,
+        creating objects for all occurrences of recurring events.  If a
+        recurring event has occurreces that overlap the specified time
+        interval, every such occurrence is represented as a new calendar event
+        with the `dtstart` attribute replaced with the date and time of that
+        occurrence.  These events provide IExpandedCalendarEvent and have an
+        additional attribute which points to the original event.  Note that
+        only recurring events are replaced by proxies, nonrecurring events
+        are returned as-is.
+
+        `first` and `last` are datetime.datetimes and define a half-open
+        time interval.
+
+        The order of returned events is not defined.
+        """
+
+
+class IEditCalendar(ICalendar):
+    """Editable calendar.
+
+    Calendar events are read-only, so to change an event you need to remove
+    the old event, and add a replacement event in the calendar.
+    """
+
+    def clear():
+        """Remove all events."""
+
+    def addEvent(event):
+        """Add an event to the calendar.
+
+        Raises ValueError if an event with the same unique_id already exists
+        in the calendar.
+
+        Returns the newly added event (which may be a copy of the argument,
+        e.g. if the calendar needs its events to be instances of a particular
+        class).
+
+        It is perhaps not a good idea to add calendar events that have no
+        occurrences into calendars (see ICalendarEvent.hasOccurrences), as they
+        will be invisible in date-based of calendar views.
+
+        Do not call addEvent while iterating over the calendar.
+        """
+
+    def removeEvent(event):
+        """Remove event from the calendar.
+
+        Raises ValueError if event is not present in the calendar.
+
+        Do not call removeEvent while iterating over the calendar.
+        """
+
+
+class IRecurrenceRule(Interface):
+    """Base interface of the recurrence rules.
+
+    Recurrence rules are stored as attributes of ICalendarEvent.  They
+    are also immutable and comparable.  To modify the recurrence
+    rule of an event, you need to create a new recurrence rule, and a new
+    event:
+
+        replacement_rule = event.recurrence.replace(count=3, until=None)
+        replacement_event = event.replace(recurrence=replacement_rule)
+        calendar.removeEvent(event)
+        calendar.addEvent(replacement_event)
+
+    """
+
+    interval = Int(
+        title=u"Interval",
+        min=1,
+        description=u"""
+        Interval of recurrence (a positive integer).
+
+        For example, to indicate that an event occurs every second day,
+        you would create a DailyRecurrenceRule witl interval equal to 2.
+        """)
+
+    count = Int(
+        title=u"Count",
+        required=False,
+        description=u"""
+        Number of times the event is repeated.
+
+        Can be None or an integer value.  If count is not None then
+        until must be None.  If both count and until are None the
+        event repeats forever.
+        """)
+
+    until = Date(
+        title=u"Until",
+        required=False,
+        description=u"""
+        The date of the last recurrence of the event.
+
+        Can be None or a datetime.date instance.  If until is not None
+        then count must be None.  If both count and until are None the
+        event repeats forever.
+        """)
+
+    exceptions = List(
+        title=u"Exceptions",
+        value_type=Date(),
+        description=u"""
+        A list of days when this event does not occur.
+
+        Values in this list must be instances of datetime.date.
+        """)
+
+    def replace(interval=Unchanged, count=Unchanged, until=Unchanged,
+                exceptions=Unchanged):
+        """Return a copy of this recurrence rule with new specified fields."""
+
+    def __eq__(other):
+        """See if self == other."""
+
+    def __ne__(other):
+        """See if self != other."""
+
+    def apply(event, startdate=None, enddate=None):
+       """Apply this rule to an event.
+
+       This is a generator that returns the dates on which the event should
+       recur.  Be careful when iterating over these dates -- rules that do not
+       have either 'until' or 'count' attributes will go on forever.
+
+       The optional enddate attribute can be used to set a range on the dates
+       generated by this function (inclusive).
+       """
+
+    def iCalRepresentation(dtstart):
+       """Return the rule in iCalendar format.
+
+       Returns a list of strings, each corresponding to a line of iCalendar.
+       The first line is for the recurrence rule itself, the following ones
+       (if any) describe exception dates.
+
+       dtstart is a datetime representing the date that the recurring
+       event starts on.
+       """
+
+
+class IDailyRecurrenceRule(IRecurrenceRule):
+    """Daily recurrence."""
+
+
+class IYearlyRecurrenceRule(IRecurrenceRule):
+    """Yearly recurrence."""
+
+
+class IWeeklyRecurrenceRule(IRecurrenceRule):
+    """Weekly recurrence."""
+
+    weekdays = Set(
+        title=u"Weekdays",
+        value_type=Int(min=0, max=6),
+        description=u"""
+        A set of weekdays when this event occurs.
+
+        Weekdays are represented as integers from 0 (Monday) to 6 (Sunday).
+        This is what the `calendar` and `datetime` modules use.
+
+        The event repeats on the weekday of the first occurence even
+        if that weekday is not in this set.
+        """)
+
+    def replace(interval=Unchanged, count=Unchanged, until=Unchanged,
+                exceptions=Unchanged, weekdays=Unchanged):
+        """Return a copy of this recurrence rule with new specified fields."""
+
+
+class IMonthlyRecurrenceRule(IRecurrenceRule):
+    """Monthly recurrence."""
+
+    monthly = Choice(
+        title=u"Type",
+        values=('monthday', 'weekday', 'lastweekday'),
+        description=u"""
+        Specification of a monthly occurence.
+
+        Can be one of three values: 'monthday', 'weekday', 'lastweekday'.
+
+        'monthday'    specifies that the event recurs on the same day of month
+                      (e.g., 25th day of a month).
+
+        'weekday'     specifies that the event recurs on the same week
+                      within a month on the same weekday, indexed from the
+                      first (e.g. 3rd Friday of a month).
+
+        'lastweekday' specifies that the event recurs on the same week
+                      within a month on the same weekday, indexed from the
+                      end of month (e.g. 2nd last Friday of a month).
+        """)
+
+    def replace(interval=Unchanged, count=Unchanged, until=Unchanged,
+                exceptions=Unchanged, monthly=Unchanged):
+        """Return a copy of this recurrence rule with new specified fields."""
+
+
+class ICalendarEvent(Interface):
+    """A calendar event.
+
+    Calendar events are comparable.
+
+    Events are compared in chronological order, so lists of events can be
+    sorted.  If two events start at the same time, they are ordered according
+    to their titles.
+
+    While `unique_id` is a globally unique ID of a calendar event, you can
+    have several calendar event objects with the same value of `unique_id`,
+    and they will not be equal if any their attributes are different.
+    Semantically these objects are different versions of the same calendar
+    event.
+
+    """
+
+    unique_id = TextLine(
+        title=u"UID",
+        description=u"""
+        A globally unique id for this calendar event.
+
+        iCalendar (RFC 2445) recommeds using the RFC 822 addr-spec syntax
+        for unique IDs.  Put the current timestamp and a random number
+        on the left of the @ sign, and put the hostname on the right.
+        """)
+
+    dtstart = Datetime(
+        title=u"Start",
+        description=u"""
+        Date and time when the event starts.
+        """)
+
+    duration = Timedelta(
+        title=u"Duration",
+        description=u"""
+        The duration of the event (datetime.timedelta).
+
+        You can compute the event end date/time by adding duration to dtstart.
+        """)
+
+    title = TextLine(
+        title=u"Title",
+        description=u"""The title of the event.""")
+
+    description = Text(
+        title=u"Description",
+        required=False,
+        description=u"""A description of the event.""")
+
+    location = TextLine(
+        title=u"Location",
+        required=False,
+        description=u"""The location where this event takes place.""")
+
+    recurrence = Object(
+        title=u"Recurrence",
+        schema=IRecurrenceRule,
+        required=False,
+        description=u"""
+        The recurrence rule, if this is a recurring event, otherwise None.
+        """)
+
+    allday = Bool(
+        title=u"All Day Event",
+        required=False)
+
+    def __eq__(other):
+        """See if self == other."""
+
+    def __ne__(other):
+        """See if self != other."""
+
+    def __lt__(other):
+        """See if self < other."""
+
+    def __gt__(other):
+        """See if self > other."""
+
+    def __le__(other):
+        """See if self <= other."""
+
+    def __ge__(other):
+        """See if self >= other."""
+
+    def hasOccurrences():
+        """Does the event have any occurrences?
+
+        Normally all events have at least one occurrence.  However if you have
+        a repeating event that repeats a finite number of times, and all those
+        repetitions are listed as exceptions, then hasOccurrences() will return
+        False.  There are other corner cases as well (e.g. a recurring event
+        with until date that is earlier than dtstart).
+        """
+
+    def expand(first, last):
+        """Return an iterator over all expanded events in a given time period.
+
+        "Expanding" here refers to expanding recurring events, that
+        is, creating objects for all occurrences of this event if it
+        is a recurring event.  If a recurring event has occurreces
+        that overlap the specified time interval, every such
+        occurrence is represented as a new calendar event with the
+        `dtstart` attribute replaced with the date and time of that
+        occurrence.  These events provide IExpandedCalendarEvent and
+        have an additional attribute which points to the original
+        event.  Note that only recurring events are replaced by
+        proxies, nonrecurring events are returned as-is.
+
+        `first` and `last` are datetime.datetimes and define a half-open
+        time interval.
+
+        The order of returned events is not defined.
+        """
+
+
+class IExpandedCalendarEvent(ICalendarEvent):
+    """A single occurrence of a recurring calendar event.
+
+    The original event is stored in the `original` attribute.  The `dtstart`
+    attribute contains the date and time of this occurrence and may differ
+    from the `dtstart` attribute of the original event.  All other attributes
+    are the same.
+    """
+
+    dtstart = Datetime(
+        title=u"Start",
+        description=u"""
+        Date and time when this occurrence of the event starts.
+        """)
+
+    original = Object(
+        title=u"Original",
+        schema=ICalendarEvent,
+        description=u"""
+        The recurring event that generated this occurrence.
+        """)


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/mixins.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/mixins.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/mixins.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,383 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Mixins for implementing calendars.
+
+$Id: mixins.py 6483 2006-11-13 17:53:16Z ignas $
+"""
+
+import datetime
+from pytz import utc
+from zope.interface import implements
+from schooltool.calendar.interfaces import IExpandedCalendarEvent
+
+
+class CalendarMixin(object):
+    """Mixin for implementing ICalendar methods.
+
+    You do not have to use this mixin, however, it might make implementation
+    easier, albeit potentially slower.
+
+    A class that uses this mixin must already implement ICalendar.__iter__.
+
+        >>> from schooltool.calendar.interfaces import ICalendar
+        >>> from zope.interface import implements
+        >>> class MyCalendar(CalendarMixin):
+        ...     implements(ICalendar)
+        ...     def __iter__(self):
+        ...         return iter([])
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(ICalendar, MyCalendar())
+        True
+
+    """
+
+    def __len__(self):
+        """Return the number of events in this calendar.
+
+            >>> class MyCalendar(CalendarMixin):
+            ...     def __iter__(self):
+            ...         return iter(['event' for n in range(3)])
+
+            >>> cal = MyCalendar()
+            >>> len(cal)
+            3
+
+        """
+        count = 0
+        for i in self:
+            count += 1
+        return count
+
+    def find(self, unique_id):
+        """Find a calendar event with a given UID.
+
+        This particular implementation simply performs a linear search by
+        iterating over all events and looking at their UIDs.
+
+            >>> from schooltool.calendar.interfaces import ICalendar
+            >>> from zope.interface import implements
+
+            >>> class Event(object):
+            ...     def __init__(self, uid):
+            ...         self.unique_id = uid
+
+            >>> class MyCalendar(CalendarMixin):
+            ...     implements(ICalendar)
+            ...     def __iter__(self):
+            ...         return iter([Event(uid) for uid in 'a', 'b'])
+            >>> cal = MyCalendar()
+
+            >>> cal.find('a').unique_id
+            'a'
+            >>> cal.find('b').unique_id
+            'b'
+            >>> cal.find('c')
+            Traceback (most recent call last):
+              ...
+            KeyError: 'c'
+
+        """
+        for event in self:
+            if event.unique_id == unique_id:
+                return event
+        raise KeyError(unique_id)
+
+    def expand(self, first, last):
+        """Return an iterator over all expanded events in a given time period.
+
+        See ICalendar for more details.
+        """
+        assert first.tzname() is not None
+        assert last.tzname() is not None
+
+        for event in self:
+            for recurrence in event.expand(first, last):
+                yield recurrence
+
+
+class EditableCalendarMixin(object):
+    """Mixin for implementing some IEditCalendar methods.
+
+    This mixin implements `clear` by using `removeEvent`.
+
+        >>> class Event(object):
+        ...     def __init__(self, uid):
+        ...         self.unique_id = uid
+
+        >>> class SampleCalendar(EditableCalendarMixin):
+        ...     def __init__(self):
+        ...         self._events = {}
+        ...     def __iter__(self):
+        ...         return self._events.itervalues()
+        ...     def addEvent(self, event):
+        ...         self._events[event.unique_id] = event
+        ...     def removeEvent(self, event):
+        ...         del self._events[event.unique_id]
+
+        >>> cal = SampleCalendar()
+        >>> cal.addEvent(Event('a'))
+        >>> cal.addEvent(Event('b'))
+        >>> cal.addEvent(Event('c'))
+        >>> len(list(cal))
+        3
+
+        >>> cal.clear()
+        >>> list(cal)
+        []
+
+    """
+
+    def clear(self):
+        """Remove all events from the calendar."""
+        for event in list(self):
+            self.removeEvent(event)
+
+
+class CalendarEventMixin(object):
+    """Mixin for implementing ICalendarEvent comparison methods.
+
+    Calendar events are equal iff all their attributes are equal.  We can get a
+    list of those attributes easily because ICalendarEvent is a schema.
+
+        >>> from schooltool.calendar.interfaces import ICalendarEvent
+        >>> from zope.schema import getFieldNames
+        >>> all_attrs = getFieldNames(ICalendarEvent)
+        >>> 'unique_id' in all_attrs
+        True
+        >>> 'allday' in all_attrs
+        True
+        >>> '__eq__' not in all_attrs
+        True
+
+    We will create a bunch of Event objects that differ in exactly one
+    attribute and compare them.
+
+        >>> class Event(CalendarEventMixin):
+        ...     def __init__(self, **kw):
+        ...         for attr in all_attrs:
+        ...             setattr(self, attr, '%s_default_value' % attr)
+        ...         for attr, value in kw.items():
+        ...             setattr(self, attr, value)
+
+        >>> e1 = Event()
+        >>> for attr in all_attrs:
+        ...     e2 = Event()
+        ...     setattr(e2, attr, 'some other value')
+        ...     assert e1 != e2, 'change in %s was not noticed' % attr
+
+    If you have two events with the same values in all ICalendarEvent
+    attributes, they are equal
+
+        >>> e1 = Event()
+        >>> e2 = Event()
+        >>> e1 == e2
+        True
+
+    even if they have extra attributes
+
+        >>> e1 = Event()
+        >>> e1.annotation = 'a'
+        >>> e2 = Event()
+        >>> e2.annotation = 'b'
+        >>> e1 == e2
+        True
+
+    Events are ordered by their date and time, title and, finally, UID (to
+    break any ties and provide a stable consistent ordering).
+
+        >>> from datetime import datetime
+
+        >>> e1 = Event(dtstart=datetime(2004, 12, 15))
+        >>> e2 = Event(dtstart=datetime(2004, 12, 16))
+        >>> e1 < e2
+        True
+
+        >>> e1 = Event(dtstart=datetime(2004, 12, 15), title="A")
+        >>> e2 = Event(dtstart=datetime(2004, 12, 15), title="B")
+        >>> e1 < e2
+        True
+
+        >>> e1 = Event(dtstart=datetime(2004, 12, 1), title="A", unique_id="X")
+        >>> e2 = Event(dtstart=datetime(2004, 12, 1), title="A", unique_id="Y")
+        >>> e1 < e2
+        True
+
+    """
+
+    def __eq__(self, other):
+        """Check whether two calendar events are equal."""
+        return (self.unique_id, self.dtstart, self.duration, self.title,
+                self.description, self.location, self.recurrence, self.allday)\
+               == (other.unique_id, other.dtstart, other.duration, other.title,
+                   other.description, other.location, other.recurrence,
+                   other.allday)
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __lt__(self, other):
+        return (self.dtstart, self.title, self.unique_id) \
+               < (other.dtstart, other.title, other.unique_id)
+
+    def __gt__(self, other):
+        return (self.dtstart, self.title, self.unique_id) \
+               > (other.dtstart, other.title, other.unique_id)
+
+    def __le__(self, other):
+        return (self.dtstart, self.title, self.unique_id) \
+               <= (other.dtstart, other.title, other.unique_id)
+
+    def __ge__(self, other):
+        return (self.dtstart, self.title, self.unique_id) \
+               >= (other.dtstart, other.title, other.unique_id)
+
+    def hasOccurrences(self):
+        """Check whether the event has any occurrences."""
+        if self.recurrence is None:
+            # No recurrence rule implies one and only one occurrence.
+            return True
+        if self.recurrence.until is None and self.recurrence.count is None:
+            # Events that repeat forever always have occurrences.  There is a
+            # finite number of exceptions, so they cannon cover an infinite
+            # numer of recurrences.
+            return True
+        try:
+            self.recurrence.apply(self).next()
+        except StopIteration:
+            # No occurrences.
+            return False
+        else:
+            # At least one occurrence exists.
+            return True
+
+    def expand(self, first, last):
+        """Return an iterator over all expanded events in a given time period.
+
+        See ICalendarEvent for more details.
+        """
+        zero = datetime.timedelta(0)
+        epsilon = datetime.timedelta.resolution
+        if self.recurrence is not None:
+            # XXX mg: doesn't dtstart.time() already return UTC time?
+            naivetime = self.dtstart.time()
+            starttime = naivetime.replace(tzinfo=utc)
+            # XXX mg: I have a bad feeling about taking just the date part and
+            #         discarding the time and timezone.  It should at least
+            #         convert the dates to UTC!
+            for recdate in self.recurrence.apply(self, first.date(),
+                                                 last.date()):
+                dtstart = datetime.datetime.combine(recdate, starttime)
+                dtend = dtstart + self.duration
+                if self.duration == zero: # corner case: zero-length self
+                    dtend += epsilon      # treat it as a very short self
+                if dtend > first and dtstart < last:
+                    yield ExpandedCalendarEvent(self, dtstart=dtstart)
+        else:
+            dtstart = self.dtstart
+            dtend = dtstart + self.duration
+            if self.duration == zero: # corner case: zero-length self
+                dtend += epsilon      # treat it as a very short self
+            if dtend > first and dtstart < last:
+                yield self
+
+
+class ExpandedCalendarEvent(CalendarEventMixin):
+    """A single occurrence of a recurring calendar event.
+
+    When creating an expanded event, you must specify the original recurrent
+    event.
+
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+        >>> dtstart = datetime.datetime(2005, 2, 10, 1, 2)
+        >>> duration = datetime.timedelta(hours=3)
+        >>> recurrence = DailyRecurrenceRule()
+        >>> original = SimpleCalendarEvent(dtstart, duration, "An event",
+        ...                                description="Some description",
+        ...                                unique_id="some unique id",
+        ...                                location="Out in the open",
+        ...                                recurrence=recurrence)
+
+        >>> dtstart2 = datetime.datetime(2005, 2, 11, 1, 2,tzinfo=utc)
+        >>> dtstart2.date()
+        datetime.date(2005, 2, 11)
+        >>> dtstart2.time()
+        datetime.time(1, 2)
+        >>> dtstart2.tzname()
+        'UTC'
+        >>> evt = ExpandedCalendarEvent(original, dtstart2)
+
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(IExpandedCalendarEvent, evt)
+        True
+
+    The start date of the event will be the specified one:
+
+        >>> evt.dtstart.date()
+        datetime.date(2005, 2, 11)
+        >>> evt.dtstart.time()
+        datetime.time(1, 2)
+        >>> evt.dtstart.tzname()
+        'UTC'
+
+    Other attributes will be the same as in the original event:
+
+        >>> evt.duration
+        datetime.timedelta(0, 10800)
+
+        >>> evt.title
+        'An event'
+
+        >>> evt.description
+        'Some description'
+
+        >>> evt.location
+        'Out in the open'
+
+        >>> evt.recurrence
+        DailyRecurrenceRule(1, None, None, ())
+
+    Attribute values may not be modified:
+
+        >>> evt.dtstart = 'b0rk'
+        Traceback (most recent call last):
+        ...
+        AttributeError: can't set attribute
+
+        >>> evt.location = 'b0rk'
+        Traceback (most recent call last):
+        ...
+        AttributeError: can't set attribute
+
+    """
+
+    implements(IExpandedCalendarEvent)
+
+    def __init__(self, event, dtstart):
+        if dtstart.tzname() not in (None, 'UTC'):
+            raise ValueError, 'Can not store non UTC time info'
+        self.__dict__["original"] = event
+        self.__dict__["dtstart"] = dtstart.replace(tzinfo=utc)
+
+    def __getattr__(self, name):
+        return getattr(self.original, name)
+
+    def __setattr__(self, name, value):
+        raise AttributeError("can't set attribute")


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/mixins.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/recurrent.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/recurrent.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/recurrent.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,544 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Recurrence rules.
+
+$Id: recurrent.py 5783 2006-03-06 19:53:25Z mg $
+"""
+
+import datetime
+import calendar
+from sets import Set
+
+from zope.interface import implements
+
+from schooltool.calendar.icalendar import ical_weekdays
+from schooltool.calendar.icalendar import ical_date, ical_datetime
+from schooltool.calendar.interfaces import Unchanged
+from schooltool.calendar.interfaces import \
+    IDailyRecurrenceRule, IWeeklyRecurrenceRule, IMonthlyRecurrenceRule, \
+    IYearlyRecurrenceRule, IRecurrenceRule
+
+
+class RecurrenceRule(object):
+    """An abstract base class that implements common behaviour."""
+
+    implements(IRecurrenceRule)
+
+    interval = property(lambda self: self._interval)
+    count = property(lambda self: self._count)
+    until = property(lambda self: self._until)
+    exceptions = property(lambda self: self._exceptions)
+
+    # A string that represents the recurrence frequency in iCalendar.
+    # Must be overridden by subclasses.
+    ical_freq = None
+
+    def __init__(self, interval=1, count=None, until=None, exceptions=()):
+        self._interval = interval
+        self._count = count
+        if until and isinstance(until, datetime.datetime):
+            self._until = until.date()
+        else:
+            self._until = until
+        self._exceptions = tuple(exceptions) # XXX I'd prefer a set.
+        self._validate()
+
+    def _validate(self):
+        if self.count is not None and self.until is not None:
+            raise ValueError("count and until cannot be both set (%s, %s)"
+                             % (self.count, self.until))
+        if not self.interval >= 1:
+            raise ValueError("interval must be a positive integer (got %r)"
+                             % (self.interval, ))
+        for ex in self.exceptions:
+            if not isinstance(ex, datetime.date):
+                raise ValueError("Exceptions must be a sequence of"
+                                 " datetime.dates (got %r in exceptions)"
+                                 % (ex, ))
+
+    def replace(self, interval=Unchanged, count=Unchanged, until=Unchanged,
+                exceptions=Unchanged):
+        if interval is Unchanged:
+            interval = self.interval
+        if count is Unchanged:
+            count = self.count
+        if until is Unchanged:
+            until = self.until
+        if exceptions is Unchanged:
+            exceptions = self.exceptions
+        return self.__class__(interval, count, until, exceptions)
+
+    def __repr__(self):
+        return '%s(%r, %r, %r, %r)' % (self.__class__.__name__, self.interval,
+                                       self.count, self.until,
+                                       self.exceptions)
+
+    def _tupleForComparison(self):
+        return (self.__class__.__name__, self.interval, self.count,
+                self.until, tuple(self.exceptions))
+
+    def __eq__(self, other):
+        """See if self == other."""
+        if isinstance(other, RecurrenceRule):
+            return self._tupleForComparison() == other._tupleForComparison()
+        else:
+            return False
+
+    def __ne__(self, other):
+        """See if self != other."""
+        return not self == other
+
+    def __hash__(self):
+        """Return the hash value of this recurrence rule.
+
+        It is guaranteed that if recurrence rules compare equal, hash will
+        return the same value.
+        """
+        return hash(self._tupleForComparison())
+
+    def apply(self, event, startdate=None, enddate=None):
+        """Generator that generates dates of recurrences"""
+        if enddate:
+            assert isinstance(enddate, datetime.date), "enddate must be a date"
+            assert not isinstance(enddate, datetime.datetime), \
+                    "enddate must be a date, not a datetime"
+        if startdate is None:
+            startdate = event.dtstart.date()
+
+        count, cur = self._scroll(event, startdate)
+
+        while True:
+            if ((enddate and cur > enddate) or
+                (self.count is not None and count >= self.count) or
+                (self.until and cur > self.until)):
+                break
+            if cur not in self.exceptions and cur >= startdate:
+                yield cur
+            count += 1
+            cur = self._nextRecurrence(cur)
+
+    def _nextRecurrence(self, date):
+        """Add the basic step of recurrence to the date."""
+        return date + self.interval * date.resolution
+
+    def iCalRepresentation(self, dtstart):
+        """See IRecurrenceRule"""
+        assert self.ical_freq, 'RecurrenceRule.ical_freq must be overridden'
+
+        if self.count:
+            args = 'COUNT=%d;' % self.count
+        elif self.until:
+            args = 'UNTIL=%s;' % ical_datetime(self.until)
+        else:
+            args = ''
+        extra_args = self._iCalArgs(dtstart)
+        if extra_args is not None:
+            args += extra_args + ';'
+
+        result = ['RRULE:FREQ=%s;%sINTERVAL=%d'
+                  % (self.ical_freq, args, self.interval)]
+
+        if self.exceptions:
+            # Exceptions should include the exact time portion as well
+            # (this was implemented in revision 1860), however,
+            # Mozilla Calendar refuses to work with such exceptions.
+            dates = ','.join([ical_date(d) for d in self.exceptions])
+            result.append('EXDATE;VALUE=DATE:' + dates)
+        return result
+
+    def _iCalArgs(self, dtstart):
+        """Return extra iCal arguments as a string.
+
+        Should be overridden by child classes that have specific arguments.
+        The returned string must not include the semicolon separator.
+        If None is returned, no arguments are inserted.
+        """
+        pass
+
+
+class DailyRecurrenceRule(RecurrenceRule):
+    """Daily recurrence rule.
+
+    Immutable hashable object.
+    """
+    implements(IDailyRecurrenceRule)
+
+    ical_freq = 'DAILY'
+
+    def _scroll(self, event, startdate):
+        """Given a startdate, finds a nearest event recurrence and its nr"""
+        if startdate >= event.dtstart.date():
+            days = (startdate - event.dtstart.date()).days
+        else:
+            days = 0
+        count = days / self.interval
+        cur = event.dtstart.date() + datetime.timedelta(count * self.interval)
+        return count, cur
+
+
+
+class YearlyRecurrenceRule(RecurrenceRule):
+    """Yearly recurrence rule.
+
+    Immutable hashable object.
+    """
+    implements(IYearlyRecurrenceRule)
+
+    ical_freq = 'YEARLY'
+
+    def _nextRecurrence(self, date):
+        """Adds the basic step of recurrence to the date"""
+        delta = self.interval
+        while True:
+            try:
+                nextyear = date.year + delta
+                return date.replace(year=nextyear)
+            except ValueError:
+                # Jump over illegal leap days
+                delta += self.interval
+
+    def _scroll(self, event, startdate):
+        """Given a startdate, finds a nearest event recurrence and its nr"""
+        if startdate >= event.dtstart.date():
+            years = startdate.year - event.dtstart.date().year
+        else:
+            years = 0
+        count = years / self.interval
+        while True:
+            try:
+                newyear = event.dtstart.date().year + count * self.interval
+                cur = event.dtstart.date().replace(year=newyear)
+                return count, cur
+            except ValueError:
+                count -= self.interval
+
+    def _iCalArgs(self, dtstart):
+        """Return iCalendar parameters specific to monthly reccurence."""
+        # KOrganizer wants explicit BYMONTH and BYMONTHDAY arguments.
+        # Maybe it is a good idea to add them for the sake of explicitness.
+
+
+class WeeklyRecurrenceRule(RecurrenceRule):
+    """Weekly recurrence rule."""
+
+    implements(IWeeklyRecurrenceRule)
+
+    weekdays = property(lambda self: self._weekdays)
+
+    ical_freq = 'WEEKLY'
+
+    def __init__(self, interval=1, count=None, until=None, exceptions=(),
+                 weekdays=()):
+        self._interval = interval
+        self._count = count
+        if until and isinstance(until, datetime.datetime):
+            self._until = until.date()
+        else:
+            self._until = until
+        self._exceptions = tuple(exceptions)
+        self._weekdays = tuple(weekdays)
+        self._validate()
+
+    def __repr__(self):
+        return '%s(%r, %r, %r, %r, %r)' % (
+            self.__class__.__name__, self.interval,
+            self.count, self.until, self.exceptions, self.weekdays)
+
+    def _validate(self):
+        RecurrenceRule._validate(self)
+        for dow in self.weekdays:
+            if not isinstance(dow, int) or not 0 <= dow <= 6:
+                raise ValueError("Day of week must be an integer 0..6 (got %r)"
+                                 % (dow, ))
+
+    def replace(self, interval=Unchanged, count=Unchanged, until=Unchanged,
+                exceptions=Unchanged, weekdays=Unchanged, monthly=Unchanged):
+        if interval is Unchanged:
+            interval = self.interval
+        if count is Unchanged:
+            count = self.count
+        if until is Unchanged:
+            until = self.until
+        if exceptions is Unchanged:
+            exceptions = self.exceptions
+        if weekdays is Unchanged:
+            weekdays = self.weekdays
+        return self.__class__(interval, count, until, exceptions, weekdays)
+
+    def _tupleForComparison(self):
+        return (self.__class__.__name__, self.interval, self.count,
+                self.until, self.exceptions, self.weekdays)
+
+    def _scroll(self, event, startdate):
+        """Fast-forward to recurrences near startdate"""
+        start = event.dtstart.date()
+        if startdate >= start:
+            weeks = weekspan(start, startdate)
+        else:
+            weeks = 0
+        perweek = len(self.weekdays) + 1 # nr of recurrences per week
+        count = weeks / self.interval * perweek
+        if count > perweek:
+            count -= perweek # to get entries with weekday < that of start
+        offset = datetime.timedelta(7) * count / perweek * self.interval
+        return count, start + offset
+
+    def apply(self, event, startdate=None, enddate=None):
+        """Generate dates of recurrences."""
+        if enddate:
+            assert isinstance(enddate, datetime.date), "enddate must be a date"
+            assert not isinstance(enddate, datetime.datetime), \
+                    "enddate must be a date, not a datetime"
+        start = event.dtstart.date()
+        if startdate is None:
+            startdate = start
+        count, cur = self._scroll(event, startdate)
+        weekdays = Set(self.weekdays)
+        weekdays.add(event.dtstart.weekday())
+        while True:
+            if ((enddate and cur > enddate) or
+                (self.count is not None and count >= self.count) or
+                (self.until and cur > self.until)):
+                break
+            # Check that this is the correct week and
+            # the desired weekday
+            if (weekspan(start, cur) % self.interval == 0 and
+                cur.weekday() in weekdays):
+                if cur not in self.exceptions and cur >= startdate:
+                    yield cur
+                count += 1
+            cur = self._nextRecurrence(cur)
+
+    def _nextRecurrence(self, date):
+        """Add the basic step of recurrence to the date."""
+        return date + date.resolution
+
+    def _iCalArgs(self, dtstart):
+        """Return iCalendar parameters specific to weekly reccurence."""
+        if dtstart is not None:
+            weekdays = Set(self.weekdays)
+            weekdays.add(dtstart.weekday())
+            return 'BYDAY=' + ','.join([ical_weekdays[weekday]
+                                        for weekday in weekdays])
+
+
+class MonthlyRecurrenceRule(RecurrenceRule):
+    """Monthly recurrence rule.
+
+    Immutable hashable object.
+    """
+    implements(IMonthlyRecurrenceRule)
+
+    monthly = property(lambda self: self._monthly)
+
+    ical_freq = 'MONTHLY'
+
+    def __init__(self, interval=1, count=None, until=None, exceptions=(),
+                 monthly="monthday"):
+        self._interval = interval
+        self._count = count
+        self._until = until
+        self._exceptions = tuple(exceptions)
+        self._monthly = monthly
+        self._validate()
+
+    def __repr__(self):
+        return '%s(%r, %r, %r, %r, %r)' % (
+            self.__class__.__name__, self.interval,
+            self.count, self.until, self.exceptions, self.monthly)
+
+    def _validate(self):
+        RecurrenceRule._validate(self)
+        if self.monthly not in ("monthday", "weekday", "lastweekday"):
+            raise ValueError("monthly must be one of 'monthday', 'weekday',"
+                             " 'lastweekday'. Got %r" % (self.monthly, ))
+
+    def replace(self, interval=Unchanged, count=Unchanged, until=Unchanged,
+                exceptions=Unchanged, weekdays=Unchanged, monthly=Unchanged):
+        if interval is Unchanged:
+            interval = self.interval
+        if count is Unchanged:
+            count = self.count
+        if until is Unchanged:
+            until = self.until
+        if exceptions is Unchanged:
+            exceptions = tuple(self.exceptions)
+        if monthly is Unchanged:
+            monthly = self.monthly
+        return self.__class__(interval, count, until, exceptions, monthly)
+
+    def _tupleForComparison(self):
+        return (self.__class__.__name__, self.interval, self.count,
+                self.until, self.exceptions, self.monthly)
+
+    def _scroll(self, event, startdate):
+        """Given a startdate, finds a nearest event recurrence and its nr"""
+        dstart = event.dtstart.date()
+        if startdate > event.dtstart.date():
+            months = (12 * (startdate.year - dstart.year) +
+                      startdate.month - dstart.month)
+        else:
+            months = 0
+
+        count = months / self.interval
+        while True:
+            try:
+                year, month = divmod(dstart.year * 12 + dstart.month +
+                                     count * self.interval - 1, 12)
+                month += 1 # 1..12
+                cur = event.dtstart.date().replace(year=year, month=month)
+                return count, cur
+            except ValueError:
+                count -= 1
+
+    def _nextRecurrence(self, date):
+        """Add basic step of recurrence to the date."""
+        year = date.year
+        month = date.month
+        while True:
+            year, month = divmod(year * 12 + month - 1 + self.interval, 12)
+            month += 1 # convert 0..11 to 1..12
+            try:
+                return date.replace(year=year, month=month)
+            except ValueError:
+                continue
+
+    def apply(self, event, startdate=None, enddate=None):
+        if enddate:
+            assert isinstance(enddate, datetime.date), "enddate must be a date"
+            assert not isinstance(enddate, datetime.datetime), \
+                    "enddate must be a date, not a datetime"
+        if self.monthly == 'monthday':
+            for date in  RecurrenceRule.apply(self, event, startdate, enddate):
+                yield date
+        elif self.monthly == 'weekday':
+            for date in self._applyWeekday(event, startdate, enddate):
+                yield date
+        elif self.monthly == 'lastweekday':
+            for date in self._applyLastWeekday(event, startdate, enddate):
+                yield date
+
+    def _applyWeekday(self, event, startdate=None, enddate=None):
+        """Generator that generates dates of recurrences."""
+        start = event.dtstart.date()
+        weekday = start.weekday()
+        # Which week of the month is it
+        index = (start.day - 1) / 7 + 1
+
+        if startdate is None:
+            startdate = start
+
+        count, cur = self._scroll(event, startdate)
+        year = cur.year
+        month = cur.month
+
+        while True:
+            cur = monthindex(year, month, index, weekday)
+            if ((enddate and cur > enddate) or
+                (self.count is not None and count >= self.count) or
+                (self.until and cur > self.until)):
+                break
+            if cur not in self.exceptions and cur >= startdate:
+                yield cur
+            count += 1
+            # Next month, please.
+            year, month = divmod(year * 12 + month + self.interval - 1, 12)
+            month += 1
+
+    def _applyLastWeekday(self, event, startdate=None, enddate=None):
+        """Generator that generates dates of recurrences."""
+        start = event.dtstart.date()
+        weekday = start.weekday()
+        daysinmonth = calendar.monthrange(start.year, start.month)[1]
+        index = (start.day - daysinmonth - 1) / 7
+
+        if startdate is None:
+            startdate = start
+
+        count, cur = self._scroll(event, startdate)
+        year = cur.year
+        month = cur.month
+
+        while True:
+            cur = monthindex(year, month, index, weekday)
+            if ((enddate and cur > enddate) or
+                (self.count is not None and count >= self.count) or
+                (self.until and cur > self.until)):
+                break
+            if cur not in self.exceptions and cur >= startdate:
+                yield cur
+            count += 1
+            # Next month, please.
+            year, month = divmod(year * 12 + month + self.interval - 1, 12)
+            month += 1
+
+    def _iCalArgs(self, dtstart):
+        """Return iCalendar parameters specific to monthly reccurence."""
+        if self.monthly == 'monthday':
+            return 'BYMONTHDAY=%d' % dtstart.day
+        elif self.monthly == 'weekday':
+            week = dtstart.day / 7 + 1
+            return 'BYDAY=%d%s' % (week, ical_weekdays[dtstart.weekday()])
+        elif self.monthly == 'lastweekday':
+            return 'BYDAY=-1%s' % ical_weekdays[dtstart.weekday()]
+        else:
+            raise NotImplementedError(self.monthly)
+
+
+#
+# Calendaring functions
+#
+
+
+def weekspan(first, second):
+    """Return the distance in weeks between dates.
+
+    For days in the same ISO week, the result is 0.
+    For days in adjacent weeks, it is 1, etc.
+    """
+    firstmonday = first - datetime.timedelta(first.weekday())
+    secondmonday = second - datetime.timedelta(second.weekday())
+    return (secondmonday - firstmonday).days / 7
+
+
+def monthindex(year, month, index, weekday):
+    """Return the (index)th weekday of the month in a year.
+
+    May return a date beyond month if index is too big.
+    """
+    # make corrections for the negative index
+    # if index is negative, we're really interested in the next month's
+    # first weekday, minus n weeks
+    if index < 0:
+        yeardelta, month = divmod(month, 12)
+        year += yeardelta
+        month += 1
+        index += 1
+
+    # find first weekday
+    for day in range(1, 8):
+        if datetime.date(year, month, day).weekday() == weekday:
+            break
+
+    # calculate the timedelta to the index-th
+    shift = (index - 1) * datetime.timedelta(7)
+
+    # return the result
+    return datetime.date(year, month, day) + shift


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/recurrent.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/simple.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/simple.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/simple.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,193 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Simple calendar events and calendars.
+
+$Id: simple.py 6078 2006-05-18 17:39:46Z mg $
+"""
+
+import datetime
+import random
+import itertools
+import email.Utils
+
+from pytz import utc
+from zope.interface import implements
+
+from schooltool.calendar.interfaces import ICalendar, ICalendarEvent
+from schooltool.calendar.mixins import CalendarEventMixin, CalendarMixin
+
+
+class SimpleCalendarEvent(CalendarEventMixin):
+    """A simple implementation of ICalendarEvent.
+
+        >>> from datetime import datetime, timedelta
+        >>> from zope.interface.verify import verifyObject
+        >>> e = SimpleCalendarEvent(datetime(2004, 12, 15, 18, 57),
+        ...                         timedelta(minutes=15),
+        ...                         'Work on schooltool.calendar.simple')
+        >>> verifyObject(ICalendarEvent, e)
+        True
+
+    If you do not specify a unique ID, a random one is generated
+
+        >>> e.unique_id is not None
+        True
+
+    Additional iCal information is also supported
+
+        >>> e2 = SimpleCalendarEvent(datetime(2004, 12, 15, 18, 57),
+        ...                         timedelta(minutes=15),
+        ...                         'Work on schooltool.calendar.simple',
+        ...                         description="Python for fun and profit",
+        ...                         location="Mt. Vernon Stable",
+        ...                         recurrence='FakeRecurrance')
+        >>> e2.description
+        'Python for fun and profit'
+        >>> e2.location
+        'Mt. Vernon Stable'
+        >>> e2.recurrence
+        'FakeRecurrance'
+
+    We're going to store all datetime objects in UTC
+
+        >>> e2.dtstart.tzname()
+        'UTC'
+
+    """
+
+    implements(ICalendarEvent)
+
+    # Events in older versions had no allday events so this attribute
+    # must be initialized in here
+    allday = False
+
+    def __init__(self, dtstart, duration, title, description=None,
+                 location=None, unique_id=None, recurrence=None, allday=False):
+        assert title is not None, 'title is required'
+
+        if dtstart.tzname() not in (None, 'UTC'):
+            raise ValueError, 'Can not store non UTC time info'
+        self.dtstart = dtstart.replace(tzinfo=utc)
+
+        self.duration = duration
+        self.title = title
+        self.description = description
+        self.location = location
+        self.recurrence = recurrence
+        self.allday = allday
+        self.unique_id = unique_id
+        if not self.unique_id:
+            self.unique_id = new_unique_id()
+
+
+class ImmutableCalendar(CalendarMixin):
+    """A simple read-only calendar.
+
+        >>> from datetime import datetime, timedelta
+        >>> from zope.interface.verify import verifyObject
+        >>> e = SimpleCalendarEvent(datetime(2004, 12, 15, 18, 57),
+        ...                         timedelta(minutes=15),
+        ...                         'Work on schooltool.calendar.simple')
+        >>> calendar = ImmutableCalendar([e])
+        >>> verifyObject(ICalendar, calendar)
+        True
+
+        >>> [e.title for e in calendar]
+        ['Work on schooltool.calendar.simple']
+
+        >>> len(calendar)
+        1
+
+    """
+
+    implements(ICalendar)
+
+    def __init__(self, events=()):
+        self._events = tuple(events)
+
+    def __iter__(self):
+        return iter(self._events)
+
+    def __len__(self):
+        return len(self._events)
+
+
+def combine_calendars(*calendars):
+    r"""Combine events from several calendars into one read-only calendar.
+
+    Suppose you have several calendars with events
+
+        >>> from datetime import datetime, timedelta
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> e1 = SimpleCalendarEvent(datetime(2004, 12, 15, 18, 57),
+        ...                          timedelta(minutes=15),
+        ...                          'Work on schooltool.calendar.simple')
+        >>> calendar1 = ImmutableCalendar([e1])
+        >>> e2 = SimpleCalendarEvent(datetime(2005, 2, 2, 20, 28),
+        ...                          timedelta(minutes=10),
+        ...                          'Write a test for combine_calendars')
+        >>> calendar2 = ImmutableCalendar([e2])
+
+    You can combine them
+
+        >>> calendar = combine_calendars(calendar1, calendar2)
+        >>> titles = [e.title for e in calendar]
+        >>> titles.sort()
+        >>> print '\n'.join(titles)
+        Work on schooltool.calendar.simple
+        Write a test for combine_calendars
+
+    This calendar is read-only
+
+        >>> from schooltool.calendar.interfaces import IEditCalendar
+        >>> IEditCalendar.providedBy(calendar)
+        False
+
+        >>> from schooltool.calendar.interfaces import ICalendar
+        >>> ICalendar.providedBy(calendar)
+        True
+
+    """
+    return ImmutableCalendar(itertools.chain(*calendars))
+
+
+def new_unique_id():
+    """Generate a new unique ID for a calendar event.
+
+    UID is randomly generated and follows RFC 822 addr-spec:
+
+        >>> uid = new_unique_id()
+        >>> '@' in uid
+        True
+
+    Note that it does not have the angle brackets
+
+        >>> '<' not in uid
+        True
+        >>> '>' not in uid
+        True
+
+    """
+    more_uniqueness = '%d.%d' % (datetime.datetime.utcnow().microsecond,
+                                 random.randrange(10 ** 6, 10 ** 7))
+    # generate an rfc-822 style id and strip angle brackets
+    unique_id = email.Utils.make_msgid(more_uniqueness)[1:-1]
+    return unique_id
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/simple.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/Amsterdam.ics
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/Amsterdam.ics	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/Amsterdam.ics	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//Shuttleworth foundation//NONSGML SchoolTool//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Amsterdam
+X-LIC-LOCATION:Europe/Amsterdam
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR

Added: schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/Vilnius.ics
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/Vilnius.ics	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/tests/Europe/Vilnius.ics	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,22 @@
+BEGIN:VCALENDAR
+PRODID:-//Shuttleworth foundation//NONSGML SchoolTool//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Vilnius
+X-LIC-LOCATION:Europe/Vilnius
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR

Added: schooltool/branches/upstream/current/src/schooltool/calendar/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+"""Unit tests for SchoolBell calendaring"""


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/tests/sample.ics
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/tests/sample.ics	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/tests/sample.ics	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,66 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/Europe/Vilnius
+X-LIC-LOCATION:Europe/Vilnius
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20050211T140836Z-19135-1013-8968-3 at muskatas
+DTSTAMP:20050211T140836Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Vilnius:
+ 20050214T180000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Vilnius:
+ 20050214T190000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:#schooltool meeting
+LOCATION:#schooltool
+DESCRIPTION:Irc meeting
+CLASS:PUBLIC
+ORGANIZER;CN=Ignas Mikalajūnas:MAILTO:ignas at pov.lt
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;
+ RSVP=TRUE;CN=Ignas Mikalajūnas;LANGUAGE=en:MAILTO:ignas at pov.lt
+ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;
+ RSVP=TRUE;LANGUAGE=en:MAILTO:Marius Gedminas
+CREATED:20050211T140926
+LAST-MODIFIED:20050211T140926
+END:VEVENT
+BEGIN:VEVENT
+UID:20050211T141020Z-19203-1013-8968-7 at muskatas
+DTSTAMP:20050211T141020Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Vilnius:
+ 20050209T120000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Vilnius:
+ 20050209T133000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:SchoollTool 0.9 release
+DESCRIPTION:RELEASE!
+CLASS:PUBLIC
+CREATED:20050211T141043
+LAST-MODIFIED:20050211T141043
+END:VEVENT
+BEGIN:VEVENT
+UID:20050211T141058Z-19212-1013-8968-9 at muskatas
+DTSTAMP:20050211T141058Z
+DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Vilnius:
+ 20050209T203000
+DTEND;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Vilnius:
+ 20050209T233000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:SchoolTool release party!
+LOCATION:#schooltool
+CLASS:PUBLIC
+CREATED:20050211T141133
+LAST-MODIFIED:20050211T141133
+END:VEVENT
+END:VCALENDAR

Added: schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_generate_vcal_dict.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_generate_vcal_dict.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_generate_vcal_dict.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,114 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.calendar.generate_vcal_dict
+
+$Id: test_generate_vcal_dict.py 5899 2006-04-13 13:06:24Z gintas $
+"""
+import unittest
+
+from zope.testing import doctest
+
+
+def doctest_extract_tzlocation():
+    """Tests for extract_tzlocation.
+
+    Extracts tzlocation from a combination of a path and a filename:
+
+        >>> from schooltool.calendar.generate_vcal_dict import extract_tzlocation
+        >>> extract_tzlocation("/foo/bar/baz", "/foo/bar/baz/America/Foo.ics")
+        'America/Foo'
+
+    even if the id has more than 2 parts:
+
+        >>> extract_tzlocation("/foo/bar/baz",
+        ...                    "/foo/bar/baz/America/Indiana/Foo.ics")
+        'America/Indiana/Foo'
+
+    non-absolute paths are supported too:
+
+        >>> extract_tzlocation(".", "./America/Foo.ics")
+        'America/Foo'
+        >>> extract_tzlocation(".", "./America/Indiana/Foo.ics")
+        'America/Indiana/Foo'
+
+    """
+
+
+def doctest_walk_ics():
+    """Tests for walk_ics.
+
+        >>> from schooltool.calendar.generate_vcal_dict import walk_ics
+        >>> import schooltool.calendar.tests as tests
+        >>> import os
+        >>> path = os.path.dirname(tests.__file__)
+        >>> tzinfo = sorted(list(walk_ics(path)))
+        Timezone 'sample' was not found
+
+    There are 2 timezone files in the test directory:
+
+        >>> len(tzinfo)
+        2
+
+        >>> location, tzid, vtimezone = tzinfo[0]
+
+    One of them is for Amsterdam:
+
+        >>> location
+        'Europe/Amsterdam'
+
+        >>> tzid
+        '/schooltool.org/Olson_20060310_1/Europe/Amsterdam'
+
+    The proper VTIMEZONE block is extracted from the file:
+
+        >>> print vtimezone
+        BEGIN:VTIMEZONE
+        TZID:/schooltool.org/Olson_20060310_1/Europe/Amsterdam
+        X-LIC-LOCATION:Europe/Amsterdam
+        BEGIN:DAYLIGHT
+        TZOFFSETFROM:+0100
+        TZOFFSETTO:+0200
+        TZNAME:CEST
+        DTSTART:19700329T020000
+        RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        TZOFFSETFROM:+0200
+        TZOFFSETTO:+0100
+        TZNAME:CET
+        DTSTART:19701025T030000
+        RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+        END:STANDARD
+        END:VTIMEZONE
+
+    The other one is for Vilnius:
+
+        >>> location, tzid, vtimezone = tzinfo[1]
+        >>> location
+        'Europe/Vilnius'
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite()
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_generate_vcal_dict.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_icalendar.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_icalendar.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_icalendar.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1551 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.calendar.icalendar
+
+$Id: test_icalendar.py 6891 2007-04-25 12:56:26Z ignas $
+"""
+
+import unittest
+import difflib
+import time
+import os
+from pprint import pformat
+from textwrap import dedent
+from datetime import date, timedelta, datetime
+from StringIO import StringIO
+
+from zope.testing import doctest
+from zope.testing.doctestunit import pprint
+
+
+def diff(old, new, oldlabel="expected output", newlabel="actual output"):
+    """Display a unified diff between old text and new text."""
+    old = old.splitlines()
+    new = new.splitlines()
+
+    diff = ['--- %s' % oldlabel, '+++ %s' % newlabel]
+
+    def dump(tag, x, lo, hi):
+        for i in xrange(lo, hi):
+            diff.append(tag + x[i])
+
+    differ = difflib.SequenceMatcher(a=old, b=new)
+    for tag, alo, ahi, blo, bhi in differ.get_opcodes():
+        if tag == 'replace':
+            dump('-', old, alo, ahi)
+            dump('+', new, blo, bhi)
+        elif tag == 'delete':
+            dump('-', old, alo, ahi)
+        elif tag == 'insert':
+            dump('+', new, blo, bhi)
+        elif tag == 'equal':
+            dump(' ', old, alo, ahi)
+        else:
+            raise AssertionError('unknown tag %r' % tag)
+    return "\n".join(diff)
+
+
+class TimezoneTestMixin:
+    """A mixin for tests that fiddle with timezones."""
+
+    def setUp(self):
+        self.have_tzset = hasattr(time, 'tzset')
+        self.touched_tz = False
+        self.old_tz = os.getenv('TZ')
+
+    def tearDown(self):
+        if self.touched_tz:
+            self.setTZ(self.old_tz)
+
+    def setTZ(self, tz):
+        self.touched_tz = True
+        if tz is None:
+            os.unsetenv('TZ')
+        else:
+            os.putenv('TZ', tz)
+        time.tzset()
+
+
+class TestParseDateTime(TimezoneTestMixin, unittest.TestCase):
+
+    def test_timezones(self):
+        # The simple tests are in the doctest of parse_date_time.
+        from schooltool.calendar.icalendar import parse_date_time
+        from pytz import utc
+
+        if not self.have_tzset:
+            return # Do not run this test on Windows
+
+        self.setTZ('UTC')
+        dt = parse_date_time('20041029T125031Z')
+        self.assertEquals(dt, datetime(2004, 10, 29, 12, 50, 31, tzinfo=utc))
+
+        self.setTZ('EET-2EEST')
+        dt = parse_date_time('20041029T095031Z') # daylight savings
+        self.assertEquals(dt, datetime(2004, 10, 29, 9, 50, 31, tzinfo=utc))
+        dt = parse_date_time('20041129T095031Z') # no daylight savings
+        self.assertEquals(dt, datetime(2004, 11, 29, 9, 50, 31, tzinfo=utc))
+
+
+class TestPeriod(unittest.TestCase):
+
+    def test(self):
+        from schooltool.calendar.icalendar import Period
+        dt1 = datetime(2001, 2, 3, 14, 30, 5)
+        dt2 = datetime(2001, 2, 3, 16, 35, 20)
+        td = dt2 - dt1
+        p1 = Period(dt1, dt2)
+        self.assertEquals(p1.start, dt1)
+        self.assertEquals(p1.end, dt2)
+
+        p2 = Period(dt1, td)
+        self.assertEquals(p2.start, dt1)
+        self.assertEquals(p2.end, dt2)
+
+        self.assertEquals(p1, p2)
+
+        p = Period(dt1, timedelta(0))
+        self.assertEquals(p.start, dt1)
+        self.assertEquals(p.end, dt1)
+
+        self.assertRaises(ValueError, Period, dt2, dt1)
+        self.assertRaises(ValueError, Period, dt1, -td)
+
+    def test_overlap(self):
+        from schooltool.calendar.icalendar import Period
+        p1 = Period(datetime(2004, 1, 1, 12, 0), timedelta(hours=1))
+        p2 = Period(datetime(2004, 1, 1, 11, 30), timedelta(hours=1))
+        p3 = Period(datetime(2004, 1, 1, 12, 30), timedelta(hours=1))
+        p4 = Period(datetime(2004, 1, 1, 11, 0), timedelta(hours=3))
+
+        self.assert_(p1.overlaps(p2))
+        self.assert_(p2.overlaps(p1))
+
+        self.assert_(p1.overlaps(p3))
+        self.assert_(p3.overlaps(p1))
+
+        self.assert_(not p2.overlaps(p3))
+        self.assert_(not p3.overlaps(p2))
+
+        self.assert_(p1.overlaps(p4))
+        self.assert_(p4.overlaps(p1))
+
+        self.assert_(p1.overlaps(p1))
+
+    def test_cmp(self):
+        from schooltool.calendar.icalendar import Period
+        p1 = Period(datetime(2004, 1, 1, 12, 0), timedelta(hours=1))
+        p2 = Period(datetime(2004, 1, 1, 12, 0), timedelta(hours=1))
+        p3 = Period(datetime(2004, 1, 1, 12, 0), timedelta(hours=4))
+
+        self.assert_(p1 == p2)
+        self.assert_(p1 != p3)
+        self.assertRaises(NotImplementedError, p1.__cmp__, "NOT A PERIOD")
+
+
+class TestVEvent(unittest.TestCase):
+
+    def test_add(self):
+        from schooltool.calendar.icalendar import VEventParser, ICalParseError
+        vevent = VEventParser()
+        value, params = 'bar', {'VALUE': 'TEXT'}
+        vevent.add('foo', value, params)
+        self.assertEquals(vevent._props, {'FOO': [(value, params)]})
+        value2 = 'guug'
+        vevent.add('fie', value2)
+        self.assertEquals(vevent._props, {'FOO': [(value, params)],
+                                          'FIE': [(value2, {})]})
+        vevent.add('fie', value, params)
+        self.assertEquals(vevent._props, {'FOO': [(value, params)],
+                                          'FIE': [(value2, {}),
+                                                  (value, params)]})
+
+        # adding a singleton property twice
+        vevent.add('uid', '1')
+        self.assertRaises(ICalParseError, vevent.add, 'uid', '2')
+
+    def test_hasProp(self):
+        from schooltool.calendar.icalendar import VEventParser
+        vevent = VEventParser()
+        vevent.add('foo', 'bar', {})
+        self.assert_(vevent.hasProp('foo'))
+        self.assert_(vevent.hasProp('Foo'))
+        self.assert_(not vevent.hasProp('baz'))
+
+    def test__getType(self):
+        from schooltool.calendar.icalendar import VEventParser
+        vevent = VEventParser()
+        vevent.add('x-explicit', '', {'VALUE': 'INTEGER'})
+        vevent.add('dtstart', 'implicit type', {})
+        vevent.add('x-default', '', {})
+        self.assertEquals(vevent._getType('x-explicit'), 'INTEGER')
+        self.assertEquals(vevent._getType('dtstart'), 'DATE-TIME')
+        self.assertEquals(vevent._getType('x-default'), 'TEXT')
+        self.assertEquals(vevent._getType('X-Explicit'), 'INTEGER')
+        self.assertEquals(vevent._getType('DtStart'), 'DATE-TIME')
+        self.assertEquals(vevent._getType('X-Default'), 'TEXT')
+        self.assertRaises(KeyError, vevent._getType, 'nonexistent')
+
+    def test_getOne(self):
+        from schooltool.calendar.icalendar import VEventParser
+        vevent = VEventParser()
+
+        vevent.add('foo', 'bar', {})
+        self.assertEquals(vevent.getOne('foo'), 'bar')
+        self.assertEquals(vevent.getOne('Foo'), 'bar')
+        self.assertEquals(vevent.getOne('baz'), None)
+        self.assertEquals(vevent.getOne('baz', 'quux'), 'quux')
+        self.assertEquals(vevent.getOne('dtstart', 'quux'), 'quux')
+
+        vevent.add('int-foo', '42', {'VALUE': 'INTEGER'})
+        vevent.add('int-bad', 'xyzzy', {'VALUE': 'INTEGER'})
+        self.assertEquals(vevent.getOne('int-foo'), 42)
+        self.assertEquals(vevent.getOne('Int-Foo'), 42)
+        self.assertRaises(ValueError, vevent.getOne, 'int-bad')
+
+        vevent.add('date-foo', '20030405', {'VALUE': 'DATE'})
+        vevent.add('date-bad1', '20030405T1234', {'VALUE': 'DATE'})
+        vevent.add('date-bad2', '2003', {'VALUE': 'DATE'})
+        vevent.add('date-bad3', '200301XX', {'VALUE': 'DATE'})
+        self.assertEquals(vevent.getOne('date-Foo'), date(2003, 4, 5))
+        self.assertRaises(ValueError, vevent.getOne, 'date-bad1')
+        self.assertRaises(ValueError, vevent.getOne, 'date-bad2')
+        self.assertRaises(ValueError, vevent.getOne, 'date-bad3')
+
+        vevent.add('datetime-foo1', '20030405T060708', {'VALUE': 'DATE-TIME'})
+        vevent.add('datetime-foo2', '20030405T060708', {'VALUE': 'DATE-TIME'})
+        vevent.add('datetime-bad1', '20030405T010203444444',
+                                                        {'VALUE': 'DATE-TIME'})
+        vevent.add('datetime-bad2', '2003', {'VALUE': 'DATE-TIME'})
+        self.assertEquals(vevent.getOne('datetime-foo1'),
+                          datetime(2003, 4, 5, 6, 7, 8))
+        self.assertEquals(vevent.getOne('Datetime-Foo2'),
+                          datetime(2003, 4, 5, 6, 7, 8))
+        self.assertRaises(ValueError, vevent.getOne, 'datetime-bad1')
+        self.assertRaises(ValueError, vevent.getOne, 'datetime-bad2')
+
+        vevent.add('dur-foo1', '+P11D', {'VALUE': 'DURATION'})
+        vevent.add('dur-foo2', '-P2W', {'VALUE': 'DURATION'})
+        vevent.add('dur-foo3', 'P1DT2H3M4S', {'VALUE': 'DURATION'})
+        vevent.add('dur-foo4', 'PT2H', {'VALUE': 'DURATION'})
+        vevent.add('dur-bad1', 'xyzzy', {'VALUE': 'DURATION'})
+        self.assertEquals(vevent.getOne('dur-foo1'), timedelta(days=11))
+        self.assertEquals(vevent.getOne('Dur-Foo2'), -timedelta(weeks=2))
+        self.assertEquals(vevent.getOne('Dur-Foo3'),
+                          timedelta(days=1, hours=2, minutes=3, seconds=4))
+        self.assertEquals(vevent.getOne('DUR-FOO4'), timedelta(hours=2))
+        self.assertRaises(ValueError, vevent.getOne, 'dur-bad1')
+
+        vevent.add('unknown', 'magic', {'VALUE': 'UNKNOWN-TYPE'})
+        self.assertEquals(vevent.getOne('unknown'), 'magic')
+
+    def test_validate_error_cases(self):
+        from schooltool.calendar.icalendar import VEventParser, ICalParseError
+
+        vevent = VEventParser()
+        self.assertRaises(ICalParseError, vevent.validate)
+
+        vevent = VEventParser()
+        vevent.add('dtstart', 'xyzzy', {'VALUE': 'TEXT'})
+        self.assertRaises(ICalParseError, vevent.validate)
+
+        vevent = VEventParser()
+        vevent.add('dtstart', '20010203', {'VALUE': 'DATE'})
+        vevent.add('dtend', '20010203T0000', {'VALUE': 'DATE-TIME'})
+        self.assertRaises(ICalParseError, vevent.validate)
+
+        vevent = VEventParser()
+        vevent.add('dtstart', '20010203', {'VALUE': 'DATE'})
+        vevent.add('dtend', '20010203', {'VALUE': 'DATE'})
+        self.assertRaises(ICalParseError, vevent.validate)
+
+        vevent = VEventParser()
+        vevent.add('dtstart', '20010203', {'VALUE': 'DATE'})
+        self.assertRaises(ICalParseError, vevent.validate)
+
+    def test_validate_all_day_events(self):
+        from schooltool.calendar.icalendar import VEventParser, ICalParseError
+
+        parser = VEventParser()
+        parser.add('summary', 'An event', {})
+        parser.add('uid', 'unique', {})
+        parser.add('dtstart', '20010203', {'VALUE': 'DATE'})
+        vevent = parser.parse()
+        self.assert_(vevent.all_day_event)
+        self.assertEquals(vevent.summary, 'An event')
+        self.assertEquals(vevent.uid, 'unique')
+        self.assertEquals(vevent.dtend, date(2001, 2, 4))
+
+        parser = VEventParser()
+        parser.add('summary', 'An\\nevent\\; with backslashes', {})
+        parser.add('uid', 'unique2', {})
+        parser.add('dtstart', '20010203', {'VALUE': 'DATE'})
+        parser.add('dtend', '20010205', {'VALUE': 'DATE'})
+        vevent = parser.parse()
+        self.assertEquals(vevent.summary, 'An\nevent; with backslashes')
+        self.assert_(vevent.all_day_event)
+        self.assertEquals(vevent.dtstart, date(2001, 2, 3))
+        self.assertEquals(vevent.uid, 'unique2')
+        self.assertEquals(vevent.dtend, date(2001, 2, 5))
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203', {'VALUE': 'DATE'})
+        parser.add('uid', 'unique3', {})
+        parser.add('duration', 'P2D')
+        vevent = parser.parse()
+        self.assertEquals(vevent.summary, None)
+        self.assert_(vevent.all_day_event)
+        self.assertEquals(vevent.dtstart, date(2001, 2, 3))
+        self.assertEquals(vevent.uid, 'unique3')
+        self.assertEquals(vevent.dtend, date(2001, 2, 5))
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203', {'VALUE': 'DATE'})
+        parser.add('uid', 'unique4', {})
+        parser.add('dtend', '20010201', {'VALUE': 'DATE'})
+        self.assertRaises(ICalParseError, parser.parse)
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203', {'VALUE': 'DATE'})
+        parser.add('uid', 'unique5', {})
+        parser.add('dtend', '20010203', {'VALUE': 'DATE'})
+        self.assertRaises(ICalParseError, parser.parse)
+
+    def test_validate_not_all_day_events(self):
+        from schooltool.calendar.icalendar import VEventParser, ICalParseError
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040506')
+        parser.add('uid', 'unique', {})
+        vevent = parser.parse()
+        self.assert_(not vevent.all_day_event)
+        self.assertEquals(vevent.dtstart, datetime(2001, 2, 3, 4, 5, 6))
+        self.assertEquals(vevent.dtend, datetime(2001, 2, 3, 4, 5, 6))
+        self.assertEquals(vevent.rdates, [])
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040000')
+        parser.add('uid', 'unique', {})
+        parser.add('dtend', '20010204T050102')
+        vevent = parser.parse()
+        self.assert_(not vevent.all_day_event)
+        self.assertEquals(vevent.dtstart, datetime(2001, 2, 3, 4, 0, 0))
+        self.assertEquals(vevent.dtend, datetime(2001, 2, 4, 5, 1, 2))
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040000')
+        parser.add('uid', 'unique', {})
+        parser.add('duration', 'P1DT1H1M2S')
+        vevent = parser.parse()
+        self.assert_(not vevent.all_day_event)
+        self.assertEquals(vevent.dtstart, datetime(2001, 2, 3, 4, 0, 0))
+        self.assertEquals(vevent.dtend, datetime(2001, 2, 4, 5, 1, 2))
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T010203')
+        parser.add('uid', 'unique', {})
+        parser.add('rdate', '20010205T040506')
+        parser.add('exdate', '20010206T040506')
+        vevent = parser.parse()
+        self.assertEquals(vevent.rdates, [datetime(2001, 2, 5, 4, 5, 6)])
+        self.assertEquals(vevent.exdates, [datetime(2001, 2, 6, 4, 5, 6)])
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T010203')
+        parser.add('uid', 'unique', {})
+        parser.add('exdate', '20010206,20020307', {'VALUE': 'DATE'})
+        parser.add('rrule', 'FREQ=DAILY')
+        vevent = parser.parse()
+        self.assertEquals(vevent.exdates, [date(2001, 2, 6), date(2002, 3, 7)])
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T010203')
+        parser.add('uid', 'unique', {})
+        parser.add('dtend', '20010203T010202')
+        self.assertRaises(ICalParseError, parser.parse)
+
+    def test_timezones(self):
+        from schooltool.calendar.icalendar import VEventParser, ICalParseError
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040000', params={'TZID': 'Vilnius'})
+        parser.add('uid', 'unique', {})
+        parser.add('dtend', '20010204T050102', params={'TZID': 'Kaunas'})
+        vevent = parser.parse()
+        self.assert_(not vevent.all_day_event)
+        self.assertEquals(vevent.dtstart, datetime(2001, 2, 3, 4, 0, 0))
+        self.assertEquals(vevent.dtstart_tzid, 'Vilnius')
+        self.assertEquals(vevent.dtend, datetime(2001, 2, 4, 5, 1, 2))
+        self.assertEquals(vevent.dtend_tzid, 'Kaunas')
+
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040000', params={'TZID': 'Vilnius'})
+        parser.add('uid', 'unique', {})
+        parser.add('duration', 'P1DT1H1M2S')
+        vevent = parser.parse()
+        self.assert_(not vevent.all_day_event)
+        self.assertEquals(vevent.dtstart, datetime(2001, 2, 3, 4, 0, 0))
+        self.assertEquals(vevent.dtstart_tzid, 'Vilnius')
+        self.assertEquals(vevent.dtend, datetime(2001, 2, 4, 5, 1, 2))
+        self.assertEquals(vevent.dtend_tzid, 'Vilnius')
+
+    def test_validate_location(self):
+        from schooltool.calendar.icalendar import VEventParser
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040506')
+        parser.add('uid', 'unique5', {})
+        parser.add('location', 'Somewhere')
+        vevent = parser.parse()
+        self.assertEquals(vevent.location, 'Somewhere')
+
+    def test_validate_description(self):
+        from schooltool.calendar.icalendar import VEventParser
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040506')
+        parser.add('uid', 'unique5', {})
+        parser.add('description', 'Some long text')
+        vevent = parser.parse()
+        self.assertEquals(vevent.description, 'Some long text')
+
+    def test_validate_rrule(self):
+        from schooltool.calendar.icalendar import VEventParser
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040506')
+        parser.add('uid', 'unique5', {})
+        parser.add('location', 'Somewhere')
+        parser.add('rrule', 'FREQ=DAILY;COUNT=3')
+        vevent = parser.parse()
+
+        self.assertEquals(vevent.rrule.interval, 1)
+        self.assertEquals(vevent.rrule.count, 3)
+        self.assertEquals(vevent.rrule.until, None)
+        self.assertEquals(vevent.rrule.exceptions, ())
+
+    def test_validate_rrule_exceptions(self):
+        from schooltool.calendar.icalendar import VEventParser
+        parser = VEventParser()
+        parser.add('dtstart', '20010203T040506')
+        parser.add('uid', 'unique5', {})
+        parser.add('location', 'Somewhere')
+        parser.add('rrule', 'FREQ=MONTHLY;BYDAY=3MO')
+        parser.add('exdate', '19960402T010000,19960404T010000')
+        parser.add('exdate', '19960406T010000,19960408T010000')
+        vevent = parser.parse()
+
+        self.assertEquals(vevent.rrule.interval, 1)
+        self.assertEquals(vevent.rrule.count, None)
+        self.assertEquals(vevent.rrule.until, None)
+        self.assertEquals(vevent.rrule.monthly, 'weekday')
+        self.assertEquals(vevent.rrule.exceptions,
+                          (date(1996, 4, 2), date(1996, 4, 4),
+                           date(1996, 4, 6), date(1996, 4, 8)))
+        self.assert_(not isinstance(vevent.rrule.exceptions[0], datetime))
+
+    def test_extractListOfDates(self):
+        from schooltool.calendar.icalendar import VEventParser, Period, ICalParseError
+
+        vevent = VEventParser()
+        vevent.add('rdate', '20010205T040506')
+        vevent.add('rdate', '20010206T040506,20010207T000000')
+        vevent.add('rdate', '20010208', {'VALUE': 'DATE'})
+        vevent.add('rdate', '20010209T000000/20010210T000000',
+                   {'VALUE': 'PERIOD'})
+        rdates = vevent._extractListOfDates('RDATE', vevent.rdate_types, False)
+        expected = [datetime(2001, 2, 5, 4, 5, 6),
+                    datetime(2001, 2, 6, 4, 5, 6),
+                    datetime(2001, 2, 7, 0, 0, 0),
+                    date(2001, 2, 8),
+                    Period(datetime(2001, 2, 9), datetime(2001, 2, 10)),
+                   ]
+        self.assertEqual(expected, rdates,
+                         diff(pformat(expected), pformat(rdates)))
+
+        vevent = VEventParser()
+        vevent.add('rdate', '20010205T040506', {'VALUE': 'TEXT'})
+        self.assertRaises(ICalParseError, vevent._extractListOfDates, 'RDATE',
+                                          vevent.rdate_types, False)
+
+        vevent = VEventParser()
+        vevent.add('exdate', '20010205T040506/P1D', {'VALUE': 'PERIOD'})
+        self.assertRaises(ICalParseError, vevent._extractListOfDates, 'EXDATE',
+                                          vevent.exdate_types, False)
+
+        vevent = VEventParser()
+        vevent.add('rdate', '20010208', {'VALUE': 'DATE'})
+        rdates = vevent._extractListOfDates('RDATE', vevent.rdate_types, True)
+        expected = [date(2001, 2, 8)]
+        self.assertEqual(expected, rdates,
+                         diff(pformat(expected), pformat(rdates)))
+
+        vevent = VEventParser()
+        vevent.add('rdate', '20010205T040506', {'VALUE': 'DATE-TIME'})
+        self.assertRaises(ICalParseError, vevent._extractListOfDates, 'RDATE',
+                                          vevent.rdate_types, True)
+
+        vevent = VEventParser()
+        vevent.add('rdate', '20010209T000000/20010210T000000',
+                   {'VALUE': 'PERIOD'})
+        self.assertRaises(ICalParseError, vevent._extractListOfDates, 'RDATE',
+                                          vevent.rdate_types, True)
+
+
+class TestRowParser(unittest.TestCase):
+
+    def test_iterRow(self):
+        from schooltool.calendar.icalendar import RowParser
+        file = StringIO("key1\n"
+                        " :value1\n"
+                        " \n"
+                        "key2\n"
+                        " ;VALUE=foo\n"
+                        " :value2\n"
+                        "key3;VALUE=bar:value3\n")
+        self.assertEqual(list(RowParser.iterRow(file)),
+                         [('KEY1', 'value1', {}),
+                          ('KEY2', 'value2', {'VALUE': 'FOO'}),
+                          ('KEY3', 'value3', {'VALUE': 'BAR'})])
+
+        file = StringIO("key1:value1\n"
+                        "key2;VALUE=foo:value2\n"
+                        "key3;VALUE=bar:value3\n")
+        self.assertEqual(list(RowParser.iterRow(file)),
+                         [('KEY1', 'value1', {}),
+                          ('KEY2', 'value2', {'VALUE': 'FOO'}),
+                          ('KEY3', 'value3', {'VALUE': 'BAR'})])
+
+        file = StringIO("key1:value:with:colons:in:it\n")
+        self.assertEqual(list(RowParser.iterRow(file)),
+                         [('KEY1', 'value:with:colons:in:it', {})])
+
+        file = StringIO("ke\r\n y1\n\t:value\r\n  1 \r\n .")
+        self.assertEqual(list(RowParser.iterRow(file)),
+                         [('KEY1', 'value 1 .', {})])
+
+        file = StringIO("key;param=\xe2\x98\xbb:\r\n"
+                        " value \xe2\x98\xbb\r\n")
+        self.assertEqual(list(RowParser.iterRow(file)),
+                         [("KEY", u"value \u263B", {'PARAM': u'\u263B'})])
+
+    def test_parseRow(self):
+        from schooltool.calendar.icalendar import RowParser
+        parseRow = RowParser._parseRow
+        self.assertEqual(parseRow("key:"), ("KEY", "", {}))
+        self.assertEqual(parseRow("key:value"), ("KEY", "value", {}))
+        self.assertEqual(parseRow("key:va:lu:e"), ("KEY", "va:lu:e", {}))
+        self.assertRaises(ICalParseError, parseRow, "key but no value")
+        self.assertRaises(ICalParseError, parseRow, ":value but no key")
+        self.assertRaises(ICalParseError, parseRow, "bad name:")
+
+        self.assertEqual(parseRow("key;param=:value"),
+                         ("KEY", "value", {'PARAM': ''}))
+        self.assertEqual(parseRow("key;param=pvalue:value"),
+                         ("KEY", "value", {'PARAM': 'PVALUE'}))
+        self.assertEqual(parseRow('key;param=pvalue;param2=value2:value'),
+                         ("KEY", "value", {'PARAM': 'PVALUE',
+                                           'PARAM2': 'VALUE2'}))
+        self.assertEqual(parseRow('key;param="pvalue":value'),
+                         ("KEY", "value", {'PARAM': 'pvalue'}))
+        self.assertEqual(parseRow('key;param=pvalue;param2="value2":value'),
+                         ("KEY", "value", {'PARAM': 'PVALUE',
+                                           'PARAM2': 'value2'}))
+        self.assertRaises(ICalParseError, parseRow, "k;:no param")
+        self.assertRaises(ICalParseError, parseRow, "k;a?=b:bad param")
+        self.assertRaises(ICalParseError, parseRow, "k;a=\":bad param")
+        self.assertRaises(ICalParseError, parseRow, "k;a=\"\177:bad param")
+        self.assertRaises(ICalParseError, parseRow, "k;a=\001:bad char")
+        self.assertEqual(parseRow("key;param=a,b,c:value"),
+                         ("KEY", "value", {'PARAM': ['A', 'B', 'C']}))
+        self.assertEqual(parseRow('key;param=a,"b,c",d:value'),
+                         ("KEY", "value", {'PARAM': ['A', 'b,c', 'D']}))
+
+
+class TestReadIcalendar(unittest.TestCase):
+
+    example_ical = dedent("""\
+        BEGIN:VCALENDAR
+        VERSION
+         :2.0
+        PRODID
+         :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
+        METHOD
+         :PUBLISH
+        BEGIN:VEVENT
+        UID
+         :956630271
+        SUMMARY
+         :Christmas Day
+        CLASS
+         :PUBLIC
+        X-MOZILLA-ALARM-DEFAULT-UNITS
+         :minutes
+        X-MOZILLA-ALARM-DEFAULT-LENGTH
+         :15
+        X-MOZILLA-RECUR-DEFAULT-UNITS
+         :weeks
+        X-MOZILLA-RECUR-DEFAULT-INTERVAL
+         :1
+        DTSTART
+         ;VALUE=DATE
+         :20031225
+        DTEND
+         ;VALUE=DATE
+         :20031226
+        DTSTAMP
+         :20020430T114937Z
+        END:VEVENT
+        END:VCALENDAR
+        BEGIN:VCALENDAR
+        VERSION
+         :2.0
+        PRODID
+         :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
+        METHOD
+         :PUBLISH
+        BEGIN:VEVENT
+        UID
+         :911737808
+        SUMMARY
+         :Boxing Day
+        CLASS
+         :PUBLIC
+        X-MOZILLA-ALARM-DEFAULT-UNITS
+         :minutes
+        X-MOZILLA-ALARM-DEFAULT-LENGTH
+         :15
+        X-MOZILLA-RECUR-DEFAULT-UNITS
+         :weeks
+        X-MOZILLA-RECUR-DEFAULT-INTERVAL
+         :1
+        DTSTART
+         ;VALUE=DATE
+         :20030501
+        DTSTAMP
+         :20020430T114937Z
+        END:VEVENT
+        BEGIN:VEVENT
+        UID
+         :wh4t3v3r
+        DTSTART;VALUE=DATE:20031225
+        SUMMARY:Christmas again!
+        END:VEVENT
+
+        END:VCALENDAR
+        """)
+
+    ical_with_timezones = dedent("""\
+        BEGIN:VCALENDAR
+        VERSION:2.0
+        X-WR-CALNAME:testas
+        PRODID:-//Apple Computer\, Inc//iCal 1.5//EN
+        X-WR-RELCALID:42A41871-B382-11DA-BA4E-000A95CA5872
+        X-WR-TIMEZONE:Europe/Helsinki
+        CALSCALE:GREGORIAN
+        METHOD:PUBLISH
+        BEGIN:VTIMEZONE
+        TZID:Europe/Berlin
+        LAST-MODIFIED:20060314T174500Z
+        BEGIN:STANDARD
+        DTSTART:20051030T010000
+        TZOFFSETTO:+0100
+        TZOFFSETFROM:+0000
+        TZNAME:CET
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:20060326T020000
+        TZOFFSETTO:+0200
+        TZOFFSETFROM:+0100
+        TZNAME:CEST
+        END:DAYLIGHT
+        END:VTIMEZONE
+        BEGIN:VTIMEZONE
+        TZID:Asia/Shanghai
+        LAST-MODIFIED:20060314T174500Z
+        BEGIN:STANDARD
+        DTSTART:19321213T204552
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0000
+        TZNAME:CST
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:19400603T000000
+        TZOFFSETTO:+0900
+        TZOFFSETFROM:+0800
+        TZNAME:CDT
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        DTSTART:19401001T000000
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0900
+        TZNAME:CST
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:19410316T000000
+        TZOFFSETTO:+0900
+        TZOFFSETFROM:+0800
+        TZNAME:CDT
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        DTSTART:19411001T000000
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0900
+        TZNAME:CST
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:19860504T000000
+        TZOFFSETTO:+0900
+        TZOFFSETFROM:+0800
+        TZNAME:CDT
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        DTSTART:19860914T000000
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0900
+        TZNAME:CST
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:19870412T000000
+        TZOFFSETTO:+0900
+        TZOFFSETFROM:+0800
+        TZNAME:CDT
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        DTSTART:19870913T000000
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0900
+        TZNAME:CST
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:19880410T000000
+        TZOFFSETTO:+0900
+        TZOFFSETFROM:+0800
+        TZNAME:CDT
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        DTSTART:19880911T000000
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0900
+        TZNAME:CST
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:19890416T000000
+        TZOFFSETTO:+0900
+        TZOFFSETFROM:+0800
+        TZNAME:CDT
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        DTSTART:19890917T000000
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0900
+        TZNAME:CST
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:19900415T000000
+        TZOFFSETTO:+0900
+        TZOFFSETFROM:+0800
+        TZNAME:CDT
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        DTSTART:19900916T000000
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0900
+        TZNAME:CST
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:19910414T000000
+        TZOFFSETTO:+0900
+        TZOFFSETFROM:+0800
+        TZNAME:CDT
+        END:DAYLIGHT
+        BEGIN:STANDARD
+        DTSTART:19910915T000000
+        TZOFFSETTO:+0800
+        TZOFFSETFROM:+0900
+        TZNAME:CST
+        END:STANDARD
+        END:VTIMEZONE
+        BEGIN:VTIMEZONE
+        TZID:Europe/Helsinki
+        LAST-MODIFIED:20060314T174500Z
+        BEGIN:STANDARD
+        DTSTART:20051030T010000
+        TZOFFSETTO:+0200
+        TZOFFSETFROM:+0000
+        TZNAME:EET
+        END:STANDARD
+        BEGIN:DAYLIGHT
+        DTSTART:20060326T040000
+        TZOFFSETTO:+0300
+        TZOFFSETFROM:+0200
+        TZNAME:EEST
+        END:DAYLIGHT
+        END:VTIMEZONE
+        BEGIN:VEVENT
+        DTSTART;TZID=Europe/Helsinki:20060307T200000
+        SUMMARY:Europe/helsinki
+        UID:42A40DBE-B382-11DA-BA4E-000A95CA5872
+        SEQUENCE:1
+        DTSTAMP:20060314T174340Z
+        DURATION:PT1H
+        END:VEVENT
+        BEGIN:VEVENT
+        DTSTART;TZID=Asia/Shanghai:20060308T200000
+        SUMMARY:Asia/Shanghai
+        UID:42A411C1-B382-11DA-BA4E-000A95CA5872
+        SEQUENCE:2
+        DTSTAMP:20060314T174418Z
+        DURATION:PT1H
+        END:VEVENT
+        BEGIN:VEVENT
+        DTSTART;TZID=Europe/Berlin:20060309T200000
+        SUMMARY:Europe/Berlin
+        UID:42A4138F-B382-11DA-BA4E-000A95CA5872
+        SEQUENCE:2
+        DTSTAMP:20060314T174433Z
+        DURATION:PT1H
+        END:VEVENT
+        END:VCALENDAR
+        """)
+
+    def doctest_error_handling(self):
+        r"""Test for read_icalendar error handling.
+
+        Let's try parsing some invalid icalendar files:
+
+            >>> from schooltool.calendar.icalendar import read_icalendar
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             DTSTART;VALUE=DATE:20010203
+            ...             END:VEVENT
+            ...             END:VCALENDAR
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: VEVENT must have a UID property
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             UID:hello
+            ...             END:VEVENT
+            ...             END:VCALENDAR
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: VEVENT must have a DTSTART property
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             UID:hello
+            ...             DTSTART;VALUE=DATUM:20010203T101516
+            ...             END:VEVENT
+            ...             END:VCALENDAR
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: DTSTART property should have a DATE or DATE-TIME value
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             UID:hello
+            ...             DTSTART;VALUE=DATE-TIME:20010203T101516
+            ...             DTEND;VALUE=DATE:20010203
+            ...             END:VEVENT
+            ...             END:VCALENDAR
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: DTEND property should have the same type as DTSTART
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             UID:hello
+            ...             DTSTART;VALUE=DATE:20010201
+            ...             DTEND;VALUE=DATE:20010203
+            ...             DURATION:P1DT1H1M2S
+            ...             END:VEVENT
+            ...             END:VCALENDAR
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: VEVENT cannot have both a DTEND and a DURATION property
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             UID:hello
+            ...             DTSTART;VALUE=DATE:20010201
+            ...             DURATION;VALUE=DAYS:P1DT1H1M2S
+            ...             END:VEVENT
+            ...             END:VCALENDAR
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: DURATION property should have type DURATION
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             DTSTART;VALUE=DATE:20010203
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: Mismatched BEGIN/END
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             DTSTART;VALUE=DATE:20010203
+            ...             END:VCALENDAR
+            ...             END:VEVENT
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: Mismatched BEGIN/END
+
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VEVENT
+            ...             END:VEVENT
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: This is not iCalendar
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             END:VCALENDAR
+            ...             X-PROP:foo
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: Text outside VCALENDAR component
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             END:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             END:VEVENT
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: Text outside VCALENDAR component
+
+            >>> file = StringIO(dedent('''\
+            ...             BEGIN:VCALENDAR
+            ...             BEGIN:VEVENT
+            ...             DTSTART;VALUE=DATE:20010203
+            ...             END:VEVENT
+            ...             END:VCALENDAR
+            ...             END:UNIVERSE
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: Mismatched BEGIN/END
+
+            >>> file = StringIO(dedent('''\
+            ...             DTSTART;VALUE=DATE:20010203
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: Text outside VCALENDAR component
+
+            >>> file = StringIO(dedent('''\
+            ...             This is just plain text
+            ...             '''))
+            >>> list(read_icalendar(file))
+            Traceback (most recent call last):
+            ...
+            ICalParseError: Expected ':' in line:
+            This is just plain text
+
+        """
+
+    def test_read_icalendar_with_timezones(self):
+        from schooltool.calendar.icalendar import read_icalendar, ICalParseError
+        from pytz import utc
+
+        file = StringIO(self.ical_with_timezones)
+        result = list(read_icalendar(file))
+        self.assertEqual(len(result), 3)
+        event = result[0]
+
+        self.assertEqual(event.dtstart, datetime(2006, 3, 7, 18, 0, tzinfo=utc))
+
+        event = result[1]
+        self.assertEqual(event.dtstart, datetime(2006, 3, 8, 12, 0, tzinfo=utc))
+
+        event = result[2]
+        self.assertEqual(event.dtstart, datetime(2006, 3, 9, 19, 0, tzinfo=utc))
+
+    def test_read_icalendar(self):
+        from schooltool.calendar.icalendar import read_icalendar, ICalParseError
+        from pytz import utc
+        file = StringIO(self.example_ical)
+        result = list(read_icalendar(file))
+        self.assertEqual(len(result), 3)
+        event = result[0]
+
+
+        self.assertEqual(event.dtstart, datetime(2003, 12, 25, 0, 0, tzinfo=utc))
+        self.assertEqual(event.duration, timedelta(days=1))
+        event = result[1]
+        self.assertEqual(event.dtstart, datetime(2003, 5, 1, 0, 0, tzinfo=utc))
+        event = result[2]
+        self.assertEqual(event.duration, timedelta(days=1))
+
+        result = list(read_icalendar(StringIO(dedent("""\
+                    BEGIN:VCALENDAR
+
+                    BEGIN:VEVENT
+                    UID:hello
+                    DTSTART;VALUE=DATE:20010203
+                    BEGIN:VALARM
+                    X-PROP:foo
+                    END:VALARM
+                    END:VEVENT
+
+                    END:VCALENDAR
+                    """))))
+        self.assertEquals(len(result), 1)
+        event = result[0]
+        self.assertEquals(event.unique_id, 'hello')
+        self.assert_(event.dtstart)
+
+        file = StringIO("")
+        self.assertEquals(list(read_icalendar(file)), [])
+
+
+def doctest_read_icalendar_floating():
+    r"""Tests for reading of events with floating time.
+
+        >>> from schooltool.calendar.icalendar import read_icalendar
+        >>> calendar = dedent('''\
+        ...     BEGIN:VCALENDAR
+        ...     BEGIN:VEVENT
+        ...     UID:hello
+        ...     DTSTART;VALUE=DATE-TIME:20010203T101516
+        ...     BEGIN:VALARM
+        ...     X-PROP:foo
+        ...     END:VALARM
+        ...     END:VEVENT
+        ...
+        ...     END:VCALENDAR''')
+
+    If no fallback_tz is passed, floating time events are converted to
+    UTC:
+
+        >>> event = list(read_icalendar(calendar))[0]
+        >>> event.dtstart
+        datetime.datetime(2001, 2, 3, 10, 15, 16, tzinfo=<UTC>)
+
+    But if we pass a fallback_tz it should be used:
+
+        >>> import pytz
+        >>> tzinfo = pytz.timezone('Europe/Vilnius')
+        >>> event = list(read_icalendar(calendar, fallback_tz=tzinfo))[0]
+        >>> event.dtstart
+        datetime.datetime(2001, 2, 3, 8, 15, 16, tzinfo=<UTC>)
+
+    """
+
+
+def doctest_read_icalendar_unrecognized_timezone():
+    r"""Tests for reading of events with unrecognized timezone.
+
+    If event has a timezone we can't recognize set:
+
+        >>> from schooltool.calendar.icalendar import read_icalendar
+        >>> calendar = dedent('''\
+        ...     BEGIN:VCALENDAR
+        ...
+        ...     BEGIN:VTIMEZONE
+        ...     TZID:Yurop/Berlin
+        ...     BEGIN:STANDARD
+        ...     TZNAME:YNAME
+        ...     END:STANDARD
+        ...     END:VTIMEZONE
+        ...
+        ...     BEGIN:VEVENT
+        ...     UID:some-random-uid at example.com
+        ...     DTSTART;TZID=Yurop/Berlin:20050226T160000
+        ...     DURATION:PT6H
+        ...     DTSTAMP:20050203T150000
+        ...     END:VEVENT
+        ...
+        ...     END:VCALENDAR''')
+
+    they are treated as if they were happening in UTC:
+
+        >>> event = list(read_icalendar(calendar))[0]
+        >>> event.dtstart
+        datetime.datetime(2005, 2, 26, 16, 0, tzinfo=<UTC>)
+
+    But if we pass a fallback_tz it should be used:
+
+        >>> import pytz
+        >>> tzinfo = pytz.timezone('Europe/Vilnius')
+        >>> event = list(read_icalendar(calendar, fallback_tz=tzinfo))[0]
+        >>> event.dtstart
+        datetime.datetime(2005, 2, 26, 14, 0, tzinfo=<UTC>)
+
+    """
+
+
+def doctest_read_icalendar_allday_dtend():
+    r"""Tests for reading of allday events with DTEND.
+
+    Duration of all-day events should get properly calculated:
+
+        >>> from schooltool.calendar.icalendar import read_icalendar
+        >>> calendar = dedent('''\
+        ...     BEGIN:VCALENDAR
+        ...
+        ...     BEGIN:VEVENT
+        ...     UID:some-random-uid at example.com
+        ...     DTSTART;VALUE=DATE:20050226
+        ...     DTEND;VALUE=DATE:20050228
+        ...     DTSTAMP:20050203T150000
+        ...     END:VEVENT
+        ...
+        ...     END:VCALENDAR''')
+
+        >>> event = list(read_icalendar(calendar))[0]
+        >>> event.dtstart
+        datetime.datetime(2005, 2, 26, 0, 0, tzinfo=<UTC>)
+        >>> event.duration
+        datetime.timedelta(2)
+
+    """
+
+
+class TestRowParser(unittest.TestCase):
+
+    def test_parse(self):
+        from schooltool.calendar.icalendar import RowParser
+        file = StringIO("key1\n"
+                        " :value1\n"
+                        " \n"
+                        "key2\n"
+                        " ;VALUE=foo\n"
+                        " :value2\n"
+                        "key3;VALUE=bar:value3\n")
+        self.assertEqual(list(RowParser.parse(file)),
+                         [('KEY1', 'value1', {}),
+                          ('KEY2', 'value2', {'VALUE': 'FOO'}),
+                          ('KEY3', 'value3', {'VALUE': 'BAR'})])
+
+        file = StringIO("key1:value1\n"
+                        "key2;VALUE=foo:value2\n"
+                        "key3;VALUE=bar:value3\n")
+        self.assertEqual(list(RowParser.parse(file)),
+                         [('KEY1', 'value1', {}),
+                          ('KEY2', 'value2', {'VALUE': 'FOO'}),
+                          ('KEY3', 'value3', {'VALUE': 'BAR'})])
+
+        file = StringIO("key1:value:with:colons:in:it\n")
+        self.assertEqual(list(RowParser.parse(file)),
+                         [('KEY1', 'value:with:colons:in:it', {})])
+
+        file = StringIO("ke\r\n y1\n\t:value\r\n  1 \r\n .")
+        self.assertEqual(list(RowParser.parse(file)),
+                         [('KEY1', 'value 1 .', {})])
+
+        file = StringIO("key;param=\xe2\x98\xbb:\r\n"
+                        " value \xe2\x98\xbb\r\n")
+        self.assertEqual(list(RowParser.parse(file)),
+                         [("KEY", u"value \u263B", {'PARAM': u'\u263B'})])
+
+    def test_parseRow(self):
+        from schooltool.calendar.icalendar import RowParser, ICalParseError
+        parseRow = RowParser._parseRow
+        self.assertEqual(parseRow("key:"), ("KEY", "", {}))
+        self.assertEqual(parseRow("key:value"), ("KEY", "value", {}))
+        self.assertEqual(parseRow("key:va:lu:e"), ("KEY", "va:lu:e", {}))
+        self.assertRaises(ICalParseError, parseRow, "key but no value")
+        self.assertRaises(ICalParseError, parseRow, ":value but no key")
+        self.assertRaises(ICalParseError, parseRow, "bad name:")
+
+        self.assertEqual(parseRow("key;param=:value"),
+                         ("KEY", "value", {'PARAM': ''}))
+        self.assertEqual(parseRow("key;param=pvalue:value"),
+                         ("KEY", "value", {'PARAM': 'PVALUE'}))
+        self.assertEqual(parseRow('key;param=pvalue;param2=value2:value'),
+                         ("KEY", "value", {'PARAM': 'PVALUE',
+                                           'PARAM2': 'VALUE2'}))
+        self.assertEqual(parseRow('key;param="pvalue":value'),
+                         ("KEY", "value", {'PARAM': 'pvalue'}))
+        self.assertEqual(parseRow('key;param=pvalue;param2="value2":value'),
+                         ("KEY", "value", {'PARAM': 'PVALUE',
+                                           'PARAM2': 'value2'}))
+        self.assertRaises(ICalParseError, parseRow, "k;:no param")
+        self.assertRaises(ICalParseError, parseRow, "k;a?=b:bad param")
+        self.assertRaises(ICalParseError, parseRow, "k;a=\":bad param")
+        self.assertRaises(ICalParseError, parseRow, "k;a=\"\177:bad param")
+        self.assertRaises(ICalParseError, parseRow, "k;a=\001:bad char")
+        self.assertEqual(parseRow("key;param=a,b,c:value"),
+                         ("KEY", "value", {'PARAM': ['A', 'B', 'C']}))
+        self.assertEqual(parseRow('key;param=a,"b,c",d:value'),
+                         ("KEY", "value", {'PARAM': ['A', 'b,c', 'D']}))
+
+
+def doctest_VTimezone():
+    r"""Test for VTimezone.
+
+        >>> from schooltool.calendar.icalendar import VTimezone, RowParser
+        >>> tz = VTimezone('SchoolTool-Europe/Vilnius', ['foo'])
+        >>> tz.tzid
+        'SchoolTool-Europe/Vilnius'
+        >>> tz.tznames
+        ['foo']
+
+        >>> example_vtimezone = dedent('''
+        ... BEGIN:VTIMEZONE
+        ... TZID:Europe/Berlin
+        ... LAST-MODIFIED:20060314T174500Z
+        ... BEGIN:STANDARD
+        ... DTSTART:20051030T010000
+        ... TZOFFSETTO:+0100
+        ... TZOFFSETFROM:+0000
+        ... TZNAME:CET
+        ... END:STANDARD
+        ... BEGIN:DAYLIGHT
+        ... DTSTART:20060326T020000
+        ... TZOFFSETTO:+0200
+        ... TZOFFSETFROM:+0100
+        ... TZNAME:CEST
+        ... END:DAYLIGHT
+        ... END:VTIMEZONE
+        ... ''')
+
+        >>> rows = RowParser.parse(example_vtimezone.splitlines())
+        >>> vtz = VTimezone.parse(rows)
+
+        >>> vtz.tzid
+        'Europe/Berlin'
+        >>> vtz.tznames
+        [u'CET']
+
+    In Evolution calendars X-LIC-LOCATION is very useful for mapping to
+    actual pytz timezones, so we store it too if we find it:
+
+        >>> example_vtimezone = dedent('''
+        ... BEGIN:VTIMEZONE
+        ... TZID:Evolution-blahblah@@obscure_Europe/Berlin
+        ... X-LIC-LOCATION:Europe/Berlin
+        ... LAST-MODIFIED:20060314T174500Z
+        ... BEGIN:STANDARD
+        ... DTSTART:20051030T010000
+        ... TZOFFSETTO:+0100
+        ... TZOFFSETFROM:+0000
+        ... TZNAME:CET
+        ... END:STANDARD
+        ... END:VTIMEZONE
+        ... ''')
+        >>> rows = RowParser.parse(example_vtimezone.splitlines())
+        >>> vtz = VTimezone.parse(rows)
+        >>> vtz.tzid
+        'Evolution-blahblah@@obscure_Europe/Berlin'
+        >>> vtz.x_lic_location
+        u'Europe/Berlin'
+
+    """
+
+
+def doctest_VTimezone_getTzinfo():
+    """Tests for VTimezone.getTzinfo()
+
+        >>> from schooltool.calendar.icalendar import VTimezone
+
+    If tzid has a matching timezone, we use it, ignoring other
+    arguments:
+
+        >>> vtimezone = VTimezone("Europe/Berlin",
+        ...                       ['CET', 'CEST'],
+        ...                       x_lic_location="Europe/Vilnius")
+        >>> vtimezone.getTzinfo()
+        <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>
+
+    If not, we iterate through tzname list and return the first match:
+
+        >>> vtimezone = VTimezone("Evolution-blahblah@@obscure_Europe/Berlin",
+        ...                       ['CET', 'CEST'])
+        >>> vtimezone.getTzinfo()
+        <DstTzInfo 'CET' CET+1:00:00 STD>
+
+    We iterate from end to front, because in most ics files more
+    recent tznames are in the end of the list:
+
+        >>> vtimezone = VTimezone("Evolution-blahblah@@obscure_Europe/Berlin",
+        ...                       ['CET', 'EET'])
+        >>> vtimezone.getTzinfo()
+        <DstTzInfo 'EET' EET+2:00:00 STD>
+
+    If x_lic_location is supplied and has a matching timezone, tznames
+    are ignored. x_lic_location is used only if tzid has no matching
+    timezone:
+
+        >>> vtimezone = VTimezone("Evolution-blahblah@@obscure_Europe/Berlin",
+        ...                       ['CET', 'CEST'],
+        ...                       x_lic_location="Europe/Vilnius")
+        >>> vtimezone.getTzinfo()
+        <DstTzInfo 'Europe/Vilnius' WMT+1:24:00 STD>
+
+    """
+
+
+def doctest_VTimezone_errors():
+    r"""Test for VTimezone error handling.
+
+        >>> from schooltool.calendar.icalendar import VTimezone, RowParser
+
+    First, let's omit the timezone ID:
+
+        >>> example_vtimezone = dedent('''
+        ... BEGIN:VTIMEZONE
+        ... LAST-MODIFIED:20060314T174500Z
+        ... BEGIN:STANDARD
+        ... DTSTART:20051030T010000
+        ... TZOFFSETTO:+0100
+        ... TZOFFSETFROM:+0000
+        ... TZNAME:CET
+        ... END:STANDARD
+        ... END:VTIMEZONE
+        ... ''')
+        >>> rows = RowParser.parse(example_vtimezone.splitlines())
+        >>> VTimezone.parse(rows)
+        Traceback (most recent call last):
+            ...
+        ICalParseError: Missing TZID in VTIMEZONE block
+
+    Then omit the STANDARD section:
+
+        >>> example_vtimezone = dedent('''
+        ... BEGIN:VTIMEZONE
+        ... TZID:Europe/Berlin
+        ... LAST-MODIFIED:20060314T174500Z
+        ... END:VTIMEZONE
+        ... ''')
+        >>> rows = RowParser.parse(example_vtimezone.splitlines())
+        >>> VTimezone.parse(rows)
+        Traceback (most recent call last):
+            ...
+        ICalParseError: Missing STANDARD section in VTIMEZONE block
+
+    """
+
+
+def doctest_VCalendar():
+    """Test for VCalendar.
+
+        >>> from schooltool.calendar.icalendar import VCalendar, RowParser
+        >>> vcal = VCalendar(['event1'], ['timezone2'])
+        >>> vcal.events
+        ['event1']
+        >>> vcal.timezones
+        ['timezone2']
+
+    Now we will check the parser
+
+        >>> example_ical = dedent('''
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        ...
+        ... BEGIN:VTIMEZONE
+        ... TZID:Europe/Berlin
+        ... BEGIN:STANDARD
+        ... TZNAME:CET
+        ... END:STANDARD
+        ... END:VTIMEZONE
+        ...
+        ... BEGIN:VEVENT
+        ... UID:some-random-uid at example.com
+        ... DTSTART:20050226T160000
+        ... DURATION:PT6H
+        ... DTSTAMP:20050203T150000
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... ''')
+        >>> rows = list(RowParser.parse(example_ical.splitlines()))
+        >>> vcal = VCalendar.parse(rows)
+        >>> pprint(vcal.timezones)
+        {'EUROPE/BERLIN': <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>,
+         'UTC': <UTC>}
+        >>> vcal.events
+        [<schooltool.calendar.icalendar.VEvent object at ...>]
+
+    If there is a vtimezone block that we can't find a tzinfo for we
+    are skipping it:
+
+        >>> example_ical = dedent('''
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        ...
+        ... BEGIN:VTIMEZONE
+        ... TZID:Europe/Berlin
+        ... BEGIN:STANDARD
+        ... TZNAME:CET
+        ... END:STANDARD
+        ... END:VTIMEZONE
+        ...
+        ... BEGIN:VTIMEZONE
+        ... TZID:Yurop/Berlin
+        ... BEGIN:STANDARD
+        ... TZNAME:YNAME
+        ... END:STANDARD
+        ... END:VTIMEZONE
+        ...
+        ... BEGIN:VEVENT
+        ... UID:some-random-uid at example.com
+        ... DTSTART:20050226T160000
+        ... DURATION:PT6H
+        ... DTSTAMP:20050203T150000
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... ''')
+        >>> rows = list(RowParser.parse(example_ical.splitlines()))
+        >>> vcal = VCalendar.parse(rows)
+        >>> pprint(vcal.timezones)
+        {'EUROPE/BERLIN': <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>,
+         'UTC': <UTC>}
+        >>> vcal.events
+        [<schooltool.calendar.icalendar.VEvent object at ...>]
+
+    """
+
+
+def doctest_ical_reader_empty_summary():
+    r"""Regression test for read_icalendar
+
+    Mozilla Calendar allows events with an empty summary.  This used to be
+    read as a CalendarEvent with title = None in schooltool, which broke
+    things.
+
+        >>> from schooltool.calendar.icalendar import read_icalendar
+        >>> events = list(read_icalendar('''\
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        ... BEGIN:VEVENT
+        ... UID:some-random-uid at example.com
+        ... DTSTART:20050226T160000
+        ... DURATION:PT6H
+        ... DTSTAMP:20050203T150000
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... '''))
+        >>> [e.title for e in events]
+        ['']
+
+    We support reading calendars when ical files are using different
+    charset too:
+
+        >>> events = list(read_icalendar('''\
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        ... BEGIN:VEVENT
+        ... UID:some-random-uid at example.com
+        ... SUMMARY:LAN party %s
+        ... DTSTART:20050226T160000
+        ... DURATION:PT6H
+        ... DTSTAMP:20050203T150000
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... ''' %  chr(163), charset='latin-1'))
+        >>> titles = [e.title for e in events]
+        >>> titles[0]
+        u'LAN party \xa3'
+
+    """
+
+
+def doctest_read_icalendar_all_day():
+    r"""Test for generation of allday events.
+
+    SchoolTool should import all day events as such:
+
+        >>> from schooltool.calendar.icalendar import read_icalendar
+        >>> events = list(read_icalendar('''\
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        ... BEGIN:VEVENT
+        ... SUMMARY:All day event
+        ... UID:some-random-uid at example.com
+        ... DTSTART;VALUE=DATE:20050226
+        ... DURATION:P2D
+        ... DTSTAMP:20050203T150000
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... '''))
+        >>> len(events)
+        1
+
+        >>> event = list(events)[0]
+        >>> event.title
+        u'All day event'
+        >>> event.duration
+        datetime.timedelta(2)
+        >>> event.allday
+        True
+        >>> event.dtstart
+        datetime.datetime(2005, 2, 26, 0, 0, tzinfo=<UTC>)
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(
+                        optionflags=doctest.ELLIPSIS | doctest.REPORT_UDIFF |
+                                    doctest.NORMALIZE_WHITESPACE))
+    suite.addTest(doctest.DocTestSuite('schooltool.calendar.icalendar',
+                        optionflags=doctest.ELLIPSIS | doctest.REPORT_UDIFF |
+                                    doctest.NORMALIZE_WHITESPACE))
+    suite.addTest(unittest.makeSuite(TestRowParser))
+    suite.addTest(unittest.makeSuite(TestParseDateTime))
+    suite.addTest(unittest.makeSuite(TestPeriod))
+    suite.addTest(unittest.makeSuite(TestVEvent))
+    suite.addTest(unittest.makeSuite(TestReadIcalendar))
+    suite.addTest(unittest.makeSuite(TestRowParser))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_icalendar.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_recurrent.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_recurrent.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_recurrent.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,835 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.calendar.recurrent.
+
+$Id: test_recurrent.py 5661 2006-01-18 17:27:57Z mg $
+"""
+
+import time
+import unittest
+from datetime import datetime, date, timedelta
+
+import pytz
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+
+
+class RecurrenceRuleTestBase:
+    """Base tests for the recurrence rules"""
+
+    def test_comparison(self):
+        d = self.createRule()
+        d2 = d.replace()
+        d3 = d.replace(count=2)
+        assert d is not d2
+        self.assertEqual(d, d2)
+        assert not d != d2
+        self.assertEqual(hash(d), hash(d2))
+        assert d != None
+        assert d < None or d > None
+        assert d3 < d or d < d3
+
+    def test_replace(self):
+        rule = self.createRule(interval=1, until=date(2005, 1, 1))
+        assert rule == rule.replace()
+        rule2 = rule.replace(until=None, count=20)
+        assert rule != rule2
+        self.assertRaises(ValueError, rule.replace, count=20)
+
+    def test_validate(self):
+        self.assertRaises(ValueError, self.createRule, count=3,
+                          until=date.today())
+        self.assertRaises(ValueError, self.createRule, exceptions=(1,))
+        self.assertRaises(ValueError, self.createRule, interval=0)
+        self.assertRaises(ValueError, self.createRule, interval=-1)
+        self.createRule(exceptions=(date.today(),))
+        self.createRule(until=date.today())
+        self.createRule(count=42)
+
+    def test_iCalRepresentation(self):
+        # simple case
+        rule = self.createRule(interval=2)
+        freq = rule.ical_freq
+        self.assertEquals(rule.iCalRepresentation(None),
+                          ['RRULE:FREQ=%s;INTERVAL=2' % freq])
+
+        # count
+        rule = self.createRule(interval=3, count=5)
+        self.assertEquals(rule.iCalRepresentation(None),
+                          ['RRULE:FREQ=%s;COUNT=5;INTERVAL=3' % freq])
+
+        # until
+        rule = self.createRule(until=date(2004, 10, 20))
+        self.assertEquals(rule.iCalRepresentation(None),
+                          ['RRULE:FREQ=%s;UNTIL=20041020T000000;INTERVAL=1'
+                           % freq])
+
+        # exceptions
+        rule = self.createRule(exceptions=[date(2004, 10, 2*d)
+                                           for d in range(3, 6)])
+        self.assertEquals(rule.iCalRepresentation(None),
+                          ['RRULE:FREQ=%s;INTERVAL=1' % freq,
+                           'EXDATE;VALUE=DATE:20041006,20041008,20041010'])
+
+    def test_immutability(self):
+        r = self.createRule()
+        for attrname in ['interval', 'count', 'until', 'exceptions']:
+            self.assertRaises(AttributeError, setattr, r, attrname, 'not-ro')
+
+
+class TestDailyRecurrenceRule(unittest.TestCase, RecurrenceRuleTestBase):
+
+    def createRule(self, *args, **kwargs):
+        from schooltool.calendar.recurrent import DailyRecurrenceRule
+        return DailyRecurrenceRule(*args, **kwargs)
+
+    def test(self):
+        from schooltool.calendar.interfaces import IDailyRecurrenceRule
+        rule = self.createRule()
+        verifyObject(IDailyRecurrenceRule, rule)
+
+    def test_apply(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule()
+        ev = SimpleCalendarEvent(datetime(2004, 10, 13, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        # The event happened after the range -- empty result
+        result = list(rule.apply(ev, enddate=date(2003, 10, 1)))
+        self.assertEqual(result, [])
+
+        # Simplest case
+        result = list(rule.apply(ev, enddate=date(2004, 10, 20)))
+        self.assertEqual(result, [date(2004, 10, d) for d in range(13, 21)])
+
+        # With an end date
+        rule = self.createRule(until=date(2004, 10, 20))
+        result = list(rule.apply(ev))
+        self.assertEqual(result, [date(2004, 10, d) for d in range(13, 21)])
+
+        # With an end date as datetime, see issue318
+        rule = self.createRule(until=datetime(2004, 10, 20))
+        result = list(rule.apply(ev))
+        self.assertEqual(result, [date(2004, 10, d) for d in range(13, 21)])
+
+        # With a count
+        rule = self.createRule(count=8)
+        result = list(rule.apply(ev))
+        self.assertEqual(result, [date(2004, 10, d) for d in range(13, 21)])
+
+        # With an interval
+        rule = self.createRule(interval=2)
+        result = list(rule.apply(ev, enddate=date(2004, 10, 20)))
+        self.assertEqual(result, [date(2004, 10, d) for d in range(13, 21, 2)])
+
+        # With exceptions
+        rule = self.createRule(exceptions=[date(2004, 10, d)
+                                           for d in range(16, 21)])
+        result = list(rule.apply(ev, enddate=date(2004, 10, 20)))
+        self.assertEqual(result, [date(2004, 10, d) for d in range(13, 16)])
+
+        # With exceptions and count -- exceptions are excluded after
+        # counting
+        rule = self.createRule(exceptions=[date(2004, 10, d)
+                                           for d in range(16, 21)],
+                               count=6)
+        result = list(rule.apply(ev, enddate=date(2004, 10, 20)))
+        self.assertEqual(result, [date(2004, 10, 13), date(2004, 10, 14),
+                                  date(2004, 10, 15)])
+
+        # Far in future
+        tick = time.clock()
+        rule = self.createRule(interval=3)
+        result = list(rule.apply(ev, startdate=date(3000, 01, 01),
+                                 enddate=date(3000, 01, 20)))
+        self.assertEquals(int(time.clock() - tick), 0)
+        self.assertEqual(result,
+                         [date(3000, 1, 3), date(3000, 1, 6),
+                          date(3000, 1, 9), date(3000, 1, 12),
+                          date(3000, 1, 15), date(3000, 1, 18)])
+
+    def test_scroll(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule()
+        ev = SimpleCalendarEvent(datetime(2004, 10, 13, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        # if the start date is before the event,
+        # return the original event date.
+        self.assertEqual(rule._scroll(ev, date(2004, 1, 1)),
+                         (0, date(2004, 10, 13)))
+
+        # if the start date coincides with the event, date
+        self.assertEqual(rule._scroll(ev, date(2004, 10, 13)),
+                         (0, date(2004, 10, 13)))
+
+        # if the start date is later than the event date
+        self.assertEqual(rule._scroll(ev, date(2004, 10, 23)),
+                         (10, date(2004, 10, 23)))
+
+        rule = self.createRule(interval=3)
+
+        # if the start date is before the event,
+        # return the original event date.
+        self.assertEqual(rule._scroll(ev, date(2004, 1, 1)),
+                         (0, date(2004, 10, 13)))
+
+        # if the start date coincides with the event, date
+        self.assertEqual(rule._scroll(ev, date(2004, 10, 13)),
+                         (0, date(2004, 10, 13)))
+
+        # if the start date is later than the event date
+        self.assertEqual(rule._scroll(ev, date(2004, 10, 23)),
+                         (3, date(2004, 10, 22)))
+
+        self.assertEqual(rule._scroll(ev, date(2004, 10, 22)),
+                         (3, date(2004, 10, 22)))
+
+        self.assertEqual(rule._scroll(ev, date(2004, 10, 21)),
+                         (2, date(2004, 10, 19)))
+
+
+class TestYearlyRecurrenceRule(unittest.TestCase, RecurrenceRuleTestBase):
+
+    def createRule(self, *args, **kwargs):
+        from schooltool.calendar.recurrent import YearlyRecurrenceRule
+        return YearlyRecurrenceRule(*args, **kwargs)
+
+    def test(self):
+        from schooltool.calendar.interfaces import IYearlyRecurrenceRule
+        rule = self.createRule()
+        verifyObject(IYearlyRecurrenceRule, rule)
+
+    def test_apply(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule()
+        ev = SimpleCalendarEvent(datetime(1978, 5, 17, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        # The event happened after the range -- empty result
+        result = list(rule.apply(ev, enddate=date(1970, 1, 1)))
+        self.assertEqual(result, [])
+
+        # Simplest case
+        result = list(rule.apply(ev, enddate=date(2004, 10, 20)))
+        self.assertEqual(result, [date(y, 5, 17) for y in range(1978, 2005)])
+
+        # With an end date
+        rule = self.createRule(until=date(2004, 10, 20))
+        result = list(rule.apply(ev))
+        self.assertEqual(result, [date(y, 5, 17) for y in range(1978, 2005)])
+
+        # With a count
+        rule = self.createRule(count=8)
+        result = list(rule.apply(ev))
+        self.assertEqual(result, [date(y, 5, 17) for y in range(1978, 1986)])
+
+        # With an interval
+        rule = self.createRule(interval=4)
+        result = list(rule.apply(ev, enddate=date(2004, 10, 20)))
+        self.assertEqual(result,
+                         [date(y, 5, 17)
+                          for y in [1978, 1982, 1986, 1990, 1994, 1998, 2002]])
+
+        # With exceptions
+        rule = self.createRule(exceptions=[date(1980, 5, 17)])
+        result = list(rule.apply(ev, enddate=date(2004, 10, 20)))
+        self.assertEqual(result,
+                         [date(y, 5, 17)
+                          for y in [1978, 1979] + range(1981, 2005)])
+
+        # With exceptions and count -- the total nr. of events is less
+        # that count.
+        rule = self.createRule(exceptions=[date(1980, 5, 17)], count=4)
+        result = list(rule.apply(ev, enddate=date(2004, 10, 20)))
+        self.assertEqual(result,
+                         [date(1978, 5, 17), date(1979, 5, 17),
+                          date(1981, 5, 17)])
+
+        # Event somewhere in the future
+        rule = self.createRule(interval=2)
+        result = list(rule.apply(ev, date(2000, 1, 1), date(2006, 1, 1)))
+        self.assertEqual(result, [date(2000, 5, 17), date(2002, 5, 17),
+                                  date(2004, 5, 17)])
+
+        # Frebruary 29
+        ev = SimpleCalendarEvent(datetime(1996, 2, 29, 12, 0),
+                           timedelta(minutes=10),
+                           "once in 4 years", unique_id='uid')
+        rule = self.createRule()
+        result = list(rule.apply(ev, date(1995, 1, 1), date(2006, 1, 1)))
+        self.assertEqual(result, [date(1996, 2, 29), date(2000, 2, 29),
+                                  date(2004, 2, 29)])
+
+    def test_scroll(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule()
+        ev = SimpleCalendarEvent(datetime(1978, 5, 17, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+        self.assertEqual(rule._scroll(ev, date(1900, 3, 1)),
+                         (0, date(1978, 5, 17)))
+        self.assertEqual(rule._scroll(ev, date(2000, 3, 1)),
+                         (22, date(2000, 5, 17)))
+
+    def test_scroll_feb29(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule()
+        ev = SimpleCalendarEvent(datetime(1996, 2, 29, 12, 0),
+                           timedelta(minutes=10),
+                           "once in 4 years", unique_id='uid')
+        self.assertEqual(rule._scroll(ev, date(1900, 3, 1)),
+                         (0, date(1996, 2, 29)))
+        self.assertEqual(rule._scroll(ev, date(1999, 3, 1)),
+                         (0, date(1996, 2, 29)))
+        self.assertEqual(rule._scroll(ev, date(2000, 3, 1)),
+                         (4, date(2000, 2, 29)))
+        self.assertEqual(rule._scroll(ev, date(2004, 3, 1)),
+                         (8, date(2004, 2, 29)))
+
+
+class TestWeeklyRecurrenceRule(unittest.TestCase, RecurrenceRuleTestBase):
+
+    def createRule(self, *args, **kwargs):
+        from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+        return WeeklyRecurrenceRule(*args, **kwargs)
+
+    def test(self):
+        from schooltool.calendar.interfaces import IWeeklyRecurrenceRule
+        rule = self.createRule()
+        verifyObject(IWeeklyRecurrenceRule, rule)
+
+    def test_weeekday_validation(self):
+        self.assertRaises(ValueError, self.createRule, weekdays=(1, 7))
+        self.assertRaises(ValueError, self.createRule, weekdays=(1, "TH"))
+
+    def test_replace_weekly(self):
+        rule = self.createRule(weekdays=(1, 3))
+        assert rule == rule.replace()
+        assert rule != rule.replace(weekdays=(1,))
+
+    def test_scroll(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule()
+        ev = SimpleCalendarEvent(datetime(1978, 5, 17, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        self.assertEqual(rule._scroll(ev, date(1978, 5, 25)),
+                         (1, date(1978, 5, 24)))
+        self.assertEqual(rule._scroll(ev, date(1978, 6, 2)),
+                         (1, date(1978, 5, 24)))
+
+        # tricky case!
+        # --  Tu We
+        # -- -- --
+        # Mo Tu We
+        # -- -- --
+        # Mo Tu We
+        # ...
+
+        rule = self.createRule(weekdays=(0, 3,), interval=2)
+
+        # We don't care that we get the closest event.  What we care
+        # about is that the sequence of events is correct:
+        goodresults = [(0, date(1978, 5, 17)),
+                       (1, date(1978, 5, 18)),
+                       (2, date(1978, 5, 29)),
+                       (3, date(1978, 5, 31)),
+                       (4, date(1978, 6, 1)),
+                       (5, date(1978, 6, 5)),
+                       (6, date(1978, 6, 7)),
+                       (7, date(1978, 6, 8))]
+
+        for delta in range(-10, 40):
+            d = date(1978, 5, 17) + date.resolution * delta
+            self.assert_(rule._scroll(ev, d) in goodresults, d)
+
+        # Still, it does not always return the zeroth result:
+        self.assertEqual(rule._scroll(ev, date(1978, 6, 29)),
+                         (6, date(1978, 6, 14)))
+
+    def test_apply(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule()
+        ev = SimpleCalendarEvent(datetime(1978, 5, 17, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        # The event happened after the range -- empty result
+        result = list(rule.apply(ev, enddate=date(1970, 1, 1)))
+        self.assertEqual(result, [])
+
+        # Simplest case
+        result = list(rule.apply(ev, enddate=date(1978, 7, 17))) # Wednesday
+        expected = [date(1978, 5, 17) + timedelta(w * 7) for w in range(9)]
+        self.assertEqual(result, expected)
+
+        # With an end date
+        rule = self.createRule(until=date(1978, 7, 12))
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With an end date as datetime
+        rule = self.createRule(until=datetime(1978, 7, 12))
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With a count
+        rule = self.createRule(count=9)
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With an interval
+        rule = self.createRule(interval=2, weekdays=(3,))
+        result = list(rule.apply(ev, enddate=date(1978, 7, 12)))
+        expected = [date(1978, 5, 17), date(1978, 5, 18),
+                    date(1978, 5, 31), date(1978, 6, 1),
+                    date(1978, 6, 14), date(1978, 6, 15),
+                    date(1978, 6, 28), date(1978, 6, 29),
+                    date(1978, 7, 12)]
+        self.assertEqual(result, expected)
+
+        # With exceptions
+        rule = self.createRule(interval=2, weekdays=(3,),
+                               exceptions=[date(1978, 6, 29)])
+        result = list(rule.apply(ev, enddate=date(1978, 7, 12)))
+        expected = [date(1978, 5, 17), date(1978, 5, 18),
+                    date(1978, 5, 31), date(1978, 6, 1),
+                    date(1978, 6, 14), date(1978, 6, 15),
+                    date(1978, 6, 28), date(1978, 7, 12)]
+        self.assertEqual(result, expected)
+
+        # With a start date
+        rule = self.createRule(interval=2, weekdays=(3,), count=9)
+        result = list(rule.apply(ev, startdate=date(1978, 6, 15)))
+        expected = [date(1978, 6, 15),
+                    date(1978, 6, 28), date(1978, 6, 29),
+                    date(1978, 7, 12)]
+
+        self.assertEqual(result, expected)
+
+    def test_iCalRepresentation_weekly(self):
+        rule = self.createRule(weekdays=(0, 3, 6))
+        dtstart = datetime(2005, 01, 01, 12, 0) # saturday
+        self.assertEquals(rule.iCalRepresentation(dtstart),
+                          ['RRULE:FREQ=WEEKLY;BYDAY=MO,TH,SA,SU;INTERVAL=1'])
+        self.assertEquals(rule.iCalRepresentation(None),
+                          ['RRULE:FREQ=WEEKLY;INTERVAL=1'])
+
+
+class TestMonthlyRecurrenceRule(unittest.TestCase, RecurrenceRuleTestBase):
+
+    def createRule(self, *args, **kwargs):
+        from schooltool.calendar.recurrent import MonthlyRecurrenceRule
+        return MonthlyRecurrenceRule(*args, **kwargs)
+
+    def test(self):
+        from schooltool.calendar.interfaces import IMonthlyRecurrenceRule
+        rule = self.createRule()
+        verifyObject(IMonthlyRecurrenceRule, rule)
+
+    def test_monthly_validation(self):
+        self.assertRaises(ValueError, self.createRule, monthly="whenever")
+        self.assertRaises(ValueError, self.createRule, monthly=date.today())
+        self.assertRaises(ValueError, self.createRule, monthly=None)
+        self.createRule(monthly="lastweekday")
+        self.createRule(monthly="monthday")
+        self.createRule(monthly="weekday")
+
+    # XXX what's with the trailing underscore?
+    #     there's another test in this class, called test_replace
+    def test_replace_(self):
+        rule = self.createRule(monthly="lastweekday")
+        assert rule == rule.replace()
+        assert rule != rule.replace(monthly="monthday")
+
+    def test_apply_monthday(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule(monthly="monthday")
+        ev = SimpleCalendarEvent(datetime(1978, 5, 17, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        # The event happened after the range -- empty result
+        result = list(rule.apply(ev, enddate=date(1970, 1, 1)))
+        self.assertEqual(result, [])
+
+        # Simplest case
+        result = list(rule.apply(ev, enddate=date(1978, 8, 17)))
+        expected = [date(1978, m, 17) for m in range(5,9)]
+        self.assertEqual(result, expected)
+
+        # Over the end of the year
+        result = list(rule.apply(ev, enddate=date(1979, 2, 17)))
+        expected = ([date(1978, m, 17) for m in range(5, 13)] +
+                    [date(1979, m, 17) for m in range(1, 3)])
+        self.assertEqual(result, expected)
+
+        # With an end date
+        rule = self.createRule(monthly="monthday", until=date(1979, 2, 17))
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With a count
+        rule = self.createRule(count=10)
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With an interval
+        rule = self.createRule(monthly="monthday", interval=2)
+        result = list(rule.apply(ev, enddate=date(1979, 2, 17)))
+        expected = [date(1978, 5, 17), date(1978, 7, 17),date(1978, 9, 17),
+                    date(1978, 11, 17), date(1979, 1, 17)]
+        self.assertEqual(result, expected)
+
+        # With exceptions
+        rule = self.createRule(monthly="monthday", interval=2,
+                               exceptions=[date(1978, 7, 17)])
+        result = list(rule.apply(ev, enddate=date(1978, 9, 17)))
+        expected = [date(1978, 5, 17), date(1978, 9, 17)]
+        self.assertEqual(result, expected)
+
+        # With a start date
+        rule = self.createRule(monthly="monthday", interval=2,
+                               exceptions=[date(1978, 7, 17)])
+        result = list(rule.apply(ev,startdate=date(2000, 1, 1),
+                                 enddate=date(2000, 6, 17)))
+        expected = [date(2000, 1, 17), date(2000, 3, 17), date(2000, 5, 17)]
+        self.assertEqual(result, expected)
+
+    def test_apply_endofmonth(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule(monthly="monthday")
+        ev = SimpleCalendarEvent(datetime(2001, 1, 31, 0, 0),
+                           timedelta(minutes=10),
+                           "End of month", unique_id="uid")
+
+        # The event happened after the range -- empty result
+        result = list(rule.apply(ev, enddate=date(2001, 12, 31)))
+        self.assertEqual(len(result), 7)
+
+        rule = self.createRule(monthly="monthday", count=7)
+        result = list(rule.apply(ev, enddate=date(2001, 12, 31)))
+        self.assertEqual(len(result), 7)
+        self.assertEqual(result[-1], date(2001, 12, 31))
+
+        rule = self.createRule(monthly="monthday", interval=2)
+        result = list(rule.apply(ev, enddate=date(2002, 1, 31)))
+        self.assertEqual(result, [date(2001, 1, 31),
+                                  date(2001, 3, 31),
+                                  date(2001, 5, 31),
+                                  date(2001, 7, 31),
+                                  date(2002, 1, 31),])
+
+        result = list(rule.apply(ev, startdate=date(2001, 4, 1),
+                                 enddate=date(2002, 1, 31)))
+        self.assertEqual(result, [date(2001, 5, 31),
+                                  date(2001, 7, 31),
+                                  date(2002, 1, 31),])
+
+    def test_apply_weekday_edge_case(self):
+        # A test for Issue381 (monthly repeat causes bad date)
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule(monthly="weekday")
+        # 1st Tuesday and 7th day of the week
+        ev = SimpleCalendarEvent(datetime(2006, 2, 7, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        result = list(rule.apply(ev, enddate=date(2006, 5, 10)))
+        expected = [date(2006, 2, 7), date(2006, 3, 7),
+                    date(2006, 4, 4), date(2006, 5, 2)]
+        self.assertEqual(result, expected)
+
+
+    def test_apply_weekday(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule(monthly="weekday")
+        ev = SimpleCalendarEvent(datetime(1978, 5, 17, 12, 0),  # 3rd Wednesday
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        # The event happened after the range -- empty result
+        result = list(rule.apply(ev, enddate=date(1970, 1, 1)))
+        self.assertEqual(result, [])
+
+        # Simplest case
+        result = list(rule.apply(ev, enddate=date(1978, 8, 17)))
+        expected = [date(1978, 5, 17), date(1978, 6, 21),
+                    date(1978, 7, 19), date(1978, 8, 16)]
+        self.assertEqual(result, expected)
+
+        # With a start date
+        result = list(rule.apply(ev, startdate=date(1978, 8, 1),
+                                 enddate=date(1979, 2, 21)))
+
+        expected = [date(1978, 8, 16), date(1978, 9, 20),
+                    date(1978, 10, 18), date(1978, 11, 15),
+                    date(1978, 12, 20), date(1979, 1, 17), date(1979, 2, 21)]
+
+        # With a start date later than recurrence on that month
+        result = list(rule.apply(ev, startdate=date(1978, 8, 17),
+                                 enddate=date(1979, 2, 21)))
+
+        expected = [date(1978, 9, 20), date(1978, 10, 18), date(1978, 11, 15),
+                    date(1978, 12, 20), date(1979, 1, 17), date(1979, 2, 21)]
+
+        self.assertEqual(result, expected)
+        # Over the end of the year
+        result = list(rule.apply(ev, enddate=date(1979, 2, 21)))
+        expected = [date(1978, 5, 17), date(1978, 6, 21),
+                    date(1978, 7, 19), date(1978, 8, 16),
+                    date(1978, 9, 20), date(1978, 10, 18),
+                    date(1978, 11, 15), date(1978, 12, 20),
+                    date(1979, 1, 17), date(1979, 2, 21)]
+        self.assertEqual(result, expected)
+
+        # With an end date
+        rule = self.createRule(monthly="weekday", until=date(1979, 2, 21))
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With a count
+        rule = self.createRule(monthly="weekday", count=10)
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With an interval
+        rule = self.createRule(monthly="weekday", interval=2)
+        result = list(rule.apply(ev, enddate=date(1979, 2, 21)))
+        expected = [date(1978, 5, 17), date(1978, 7, 19),
+                    date(1978, 9, 20), date(1978, 11, 15),
+                    date(1979, 1, 17)]
+        self.assertEqual(result, expected)
+
+        # With exceptions
+        rule = self.createRule(monthly="weekday", interval=2,
+                               exceptions=[date(1978, 7, 19)])
+        result = list(rule.apply(ev, enddate=date(1978, 9, 30)))
+        expected = [date(1978, 5, 17), date(1978, 9, 20)]
+        self.assertEqual(result, expected)
+
+    def test_apply_lastweekday(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule(monthly="lastweekday")
+        ev = SimpleCalendarEvent(datetime(1978, 5, 17, 12, 0),  # 3rd last Wednesday
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        # The event happened after the range -- empty result
+        result = list(rule.apply(ev, enddate=date(1970, 1, 1)))
+        self.assertEqual(result, [])
+
+        # Simplest case
+        result = list(rule.apply(ev, enddate=date(1978, 8, 17)))
+        expected = [date(1978, 5, 17), date(1978, 6, 14),
+                    date(1978, 7, 12), date(1978, 8, 16)]
+        self.assertEqual(result, expected)
+
+        # With a start date
+        result = list(rule.apply(ev, startdate=date(1978, 8, 1),
+                                 enddate=date(1979, 2, 21)))
+        expected = [date(1978, 8, 16),
+                    date(1978, 9, 13), date(1978, 10, 11),
+                    date(1978, 11, 15), date(1978, 12, 13),
+                    date(1979, 1, 17), date(1979, 2, 14)]
+        self.assertEqual(result, expected)
+
+        # With a start date later than the recurrence
+        result = list(rule.apply(ev, startdate=date(1978, 8, 17),
+                                 enddate=date(1979, 2, 21)))
+        expected = [date(1978, 9, 13), date(1978, 10, 11),
+                    date(1978, 11, 15), date(1978, 12, 13),
+                    date(1979, 1, 17), date(1979, 2, 14)]
+        self.assertEqual(result, expected)
+
+        # Over the end of the year
+        result = list(rule.apply(ev, enddate=date(1979, 2, 21)))
+        expected = [date(1978, 5, 17), date(1978, 6, 14),
+                    date(1978, 7, 12), date(1978, 8, 16),
+                    date(1978, 9, 13), date(1978, 10, 11),
+                    date(1978, 11, 15), date(1978, 12, 13),
+                    date(1979, 1, 17), date(1979, 2, 14)]
+        self.assertEqual(result, expected)
+
+        # With an end date
+        rule = self.createRule(monthly="lastweekday", until=date(1979, 2, 21))
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With a count
+        rule = self.createRule(monthly="lastweekday", count=10)
+        result = list(rule.apply(ev))
+        self.assertEqual(result, expected)
+
+        # With an interval
+        rule = self.createRule(monthly="lastweekday", interval=2)
+        result = list(rule.apply(ev, enddate=date(1979, 2, 21)))
+        expected = [date(1978, 5, 17), date(1978, 7, 12),
+                    date(1978, 9, 13), date(1978, 11, 15),
+                    date(1979, 1, 17)]
+        self.assertEqual(result, expected)
+
+        # With exceptions
+        rule = self.createRule(monthly="lastweekday", interval=2,
+                               exceptions=[date(1978, 7, 12)])
+        result = list(rule.apply(ev, enddate=date(1978, 9, 30)))
+        expected = [date(1978, 5, 17), date(1978, 9, 13)]
+        self.assertEqual(result, expected)
+
+    def test_scroll(self):
+        from schooltool.calendar.simple import SimpleCalendarEvent
+        rule = self.createRule(interval=3)
+        ev = SimpleCalendarEvent(datetime(2004, 10, 13, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+
+        # start before event
+        self.assertEqual(rule._scroll(ev, date(2004, 1, 1)),
+                         (0, date(2004, 10, 13)))
+
+        # start on event date
+        self.assertEqual(rule._scroll(ev, date(2004, 10, 13)),
+                         (0, date(2004, 10, 13)))
+
+        # start after date
+        self.assertEqual(rule._scroll(ev, date(2005, 3, 14)),
+                         (1, date(2005, 1, 13)))
+
+        # If we ask for an illegal dates, we get less events
+        rule = self.createRule()
+        ev = SimpleCalendarEvent(datetime(2004, 1, 30, 12, 0),
+                           timedelta(minutes=10),
+                           "reality check", unique_id='uid')
+        self.assertEqual(rule._scroll(ev, date(2004, 1, 29)),
+                         (0, date(2004, 1, 30)))
+        self.assertEqual(rule._scroll(ev, date(2004, 2, 28)),
+                         (0, date(2004, 1, 30)))
+        # sequence nr 1 is taken by illegal date 2004-02-30
+        self.assertEqual(rule._scroll(ev, date(2004, 3, 1)),
+                         (2, date(2004, 3, 30)))
+
+    def test_iCalRepresentation(self):
+        # This method deliberately overrides the test in the base class.
+
+        # monthday
+        rule = self.createRule(monthly="monthday")
+        self.assertEquals(rule.iCalRepresentation(date(2004, 10, 26)),
+                          ['RRULE:FREQ=MONTHLY;BYMONTHDAY=26;INTERVAL=1'])
+
+        # weekday
+        rule = self.createRule(monthly="weekday")
+        self.assertEquals(rule.iCalRepresentation(date(2004, 10, 26)),
+                          ['RRULE:FREQ=MONTHLY;BYDAY=4TU;INTERVAL=1'])
+
+        # lastweekday
+        rule = self.createRule(monthly="lastweekday")
+        self.assertEquals(rule.iCalRepresentation(date(2004, 10, 26)),
+                          ['RRULE:FREQ=MONTHLY;BYDAY=-1TU;INTERVAL=1'])
+
+        # some standard stuff
+        rule = self.createRule(interval=3, count=7,
+                               exceptions=[date(2004, 10, 2*d)
+                                           for d in range(3, 6)])
+        self.assertEquals(rule.iCalRepresentation(date(2004, 10, 26)),
+                      ['RRULE:FREQ=MONTHLY;COUNT=7;BYMONTHDAY=26;INTERVAL=3',
+                       'EXDATE;VALUE=DATE:20041006,20041008,20041010'])
+
+
+class TestWeekSpan(unittest.TestCase):
+
+    def test_weekspan(self):
+        from schooltool.calendar.recurrent import weekspan
+
+        # The days are in the same week
+        self.assertEqual(weekspan(date(2004, 10, 11), date(2004, 10, 17)), 0)
+        #                              Monday, w42         Sunday, w42
+
+        # The days are in the adjacent weeks
+        self.assertEqual(weekspan(date(2004, 10, 17), date(2004, 10, 18)), 1)
+        #                              Sunday, w42         Monday, w43
+
+        # The days span the end of year
+        self.assertEqual(weekspan(date(2004, 12, 30), date(2005, 01, 07)), 1)
+        #                              Thursday, w53       Friday, w1
+
+        # The days span the end of year, two weeks
+        self.assertEqual(weekspan(date(2004, 12, 30), date(2005, 01, 14)), 2)
+        #                              Thursday, w53       Friday, w2
+
+
+class TestMonthIndex(unittest.TestCase):
+
+    def test_monthindex(self):
+        from schooltool.calendar.recurrent import monthindex
+        # First Friday of October 2004
+        self.assertEqual(monthindex(2004, 10, 1, 4), date(2004, 10, 1))
+        self.assertEqual(monthindex(2004, 10, 1, 3), date(2004, 10, 7))
+        self.assertEqual(monthindex(2004, 10, 1, 3), date(2004, 10, 7))
+
+        # Users must check whether the month is correct themselves.
+        self.assertEqual(monthindex(2004, 10, 5, 3), date(2004, 11, 4))
+
+        self.assertEqual(monthindex(2004, 10, 4, 3), date(2004, 10, 28))
+        self.assertEqual(monthindex(2004, 10, -1, 3), date(2004, 10, 28))
+
+        self.assertEqual(monthindex(2004, 11, -1, 1), date(2004, 11, 30))
+        self.assertEqual(monthindex(2004, 11, -1, 2), date(2004, 11, 24))
+
+        self.assertEqual(monthindex(2004, 12, -1, 3), date(2004, 12, 30))
+        self.assertEqual(monthindex(2004, 12, -1, 4), date(2004, 12, 31))
+        self.assertEqual(monthindex(2004, 12, -1, 3), date(2004, 12, 30))
+        self.assertEqual(monthindex(2004, 12, -2, 3), date(2004, 12, 23))
+
+
+def doctest_InfinitePastEventsBug():
+    """Regression test for http://issues.schooltool.org/issue461
+
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+        >>> ev = SimpleCalendarEvent(datetime(2006, 1, 18, tzinfo=pytz.utc),
+        ...                          timedelta(hours=1), 'Sample event',
+        ...                          recurrence=WeeklyRecurrenceRule())
+        >>> for e in ev.expand(datetime(2006, 1, 1, tzinfo=pytz.utc),
+        ...                    datetime(2006, 2, 1, tzinfo=pytz.utc)):
+        ...     print e.dtstart
+        2006-01-18 00:00:00+00:00
+        2006-01-25 00:00:00+00:00
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite())
+    suite.addTest(unittest.makeSuite(TestDailyRecurrenceRule))
+    suite.addTest(unittest.makeSuite(TestYearlyRecurrenceRule))
+    suite.addTest(unittest.makeSuite(TestWeeklyRecurrenceRule))
+    suite.addTest(unittest.makeSuite(TestMonthlyRecurrenceRule))
+    suite.addTest(unittest.makeSuite(TestWeekSpan))
+    suite.addTest(unittest.makeSuite(TestMonthIndex))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_recurrent.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_schooltool.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_schooltool.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_schooltool.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,362 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.calendar
+
+$Id: test_schooltool.py 5031 2005-09-20 17:25:52Z ignas $
+"""
+
+import unittest
+from zope.testing import doctest
+
+
+def doctest_interfaces():
+    """Look for syntax errors in interfaces.py
+
+        >>> import schooltool.calendar.interfaces
+
+    """
+
+
+def doctest_CalendarMixin_expand():
+    """Tests for CalendarMixin.expand.
+
+    Let's define a calendar that uses CalendarMixin and contains a fixed
+    set of events
+
+        >>> from datetime import datetime, timedelta
+        >>> from schooltool.calendar.mixins import CalendarMixin
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+        >>> Event = SimpleCalendarEvent # shorter
+
+        >>> from pytz import utc
+
+        >>> class MyCalendar(CalendarMixin):
+        ...     def __iter__(self):
+        ...         return iter([Event(datetime(2004, 12, 14, 12, 30,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=1), 'a'),
+        ...                      Event(datetime(2004, 12, 15, 16, 30,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=1), 'c'),
+        ...                      Event(datetime(2004, 12, 15, 14, 30,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=1), 'b'),
+        ...                      Event(datetime(2004, 12, 16, 17, 30,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=1), 'd'),
+        ...                      Event(datetime(2005,  2,  3,  4,  5,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=4), 'simple'),
+        ...                      Event(datetime(2005,  2,  4,  4,  5,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=4), 'recurring',
+        ...                            recurrence=DailyRecurrenceRule()),
+        ...                      Event(datetime(2005, 6, 16, 23, 30,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=1), 'e'),
+        ...                      Event(datetime(2005, 6, 17, 5, 30,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=1), 'f'),
+        ...                      Event(datetime(2005, 6, 18, 1, 0,
+        ...                                     tzinfo=utc),
+        ...                            timedelta(hours=1), 'g'),
+        ...                     ])
+
+        >>> cal = MyCalendar()
+
+    We will define a convenience function for showing all events returned
+    by expand:
+
+        >>> def show(first, last):
+        ...     events = list(cal.expand(first, last))
+        ...     events.sort()
+        ...     print '[%s]' % ', '.join([e.title for e in events])
+
+        >>> def show_long(first, last):
+        ...     events = list(cal.expand(first, last))
+        ...     events.sort()
+        ...     for e in events:
+        ...         print e.dtstart.strftime('%Y-%m-%d'), e.title
+
+    Events that fall inside the interval
+
+        >>> show(datetime(2004, 12, 1, tzinfo=utc),
+        ...      datetime(2004, 12, 31, tzinfo=utc))
+        [a, b, c, d]
+
+        >>> show(datetime(2004, 12, 15, tzinfo=utc),
+        ...      datetime(2004, 12, 16, tzinfo=utc))
+        [b, c]
+
+    Events that fall partially in the interval
+
+        >>> show(datetime(2004, 12, 15, 17, 0, tzinfo=utc),
+        ...      datetime(2004, 12, 16, 18, 0, tzinfo=utc))
+        [c, d]
+
+    Corner cases: if event.dtstart + event.duration == first, or
+    event.dtstart == last, the event is not included.
+
+        >>> show(datetime(2004, 12, 15, 15, 30, tzinfo=utc),
+        ...      datetime(2004, 12, 15, 16, 30, tzinfo=utc))
+        []
+
+    Recurring events:
+
+        >>> show_long(datetime(2005, 2, 2, tzinfo=utc),
+        ...           datetime(2005, 2, 5, tzinfo=utc))
+        2005-02-03 simple
+        2005-02-04 recurring
+
+        >>> show_long(datetime(2005, 2, 2, tzinfo=utc),
+        ...           datetime(2005, 2, 6, tzinfo=utc))
+        2005-02-03 simple
+        2005-02-04 recurring
+        2005-02-05 recurring
+
+        >>> show_long(datetime(2005, 2, 10, tzinfo=utc),
+        ...           datetime(2005, 2, 13, tzinfo=utc))
+        2005-02-10 recurring
+        2005-02-11 recurring
+        2005-02-12 recurring
+
+    Recurring events are replaced by proxy objects
+
+        >>> from schooltool.calendar.interfaces import IExpandedCalendarEvent
+        >>> events = list(cal.expand(datetime(2005, 2, 2, tzinfo=utc),
+        ...                          datetime(2005, 2, 6, tzinfo=utc)))
+        >>> events.sort()
+        >>> [IExpandedCalendarEvent.providedBy(e) for e in events]
+        [False, True, True]
+        >>> events[1].original is events[2].original
+        True
+
+    When we expand with a different timezone, we see the events that occur on
+    that date in the given timezone.
+
+        >>> from pytz import timezone
+        >>> eastern = timezone('US/Eastern')
+        >>> show(datetime(2005, 6, 17, tzinfo=eastern),
+        ...      datetime(2005, 6, 18, tzinfo=eastern))
+        [recurring, f, g, recurring]
+
+        >>> vilnius = timezone('Europe/Vilnius')
+        >>> show(datetime(2005, 6, 17, tzinfo=vilnius),
+        ...      datetime(2005, 6, 18, tzinfo=vilnius))
+        [e, recurring, f]
+
+    You can even mix timezones:
+
+        >>> show(datetime(2005, 6, 17, tzinfo=utc),
+        ...      datetime(2005, 6, 18, tzinfo=vilnius))
+        [e, recurring, f]
+
+        >>> show(datetime(2005, 6, 17, tzinfo=vilnius),
+        ...      datetime(2005, 6, 18, tzinfo=utc))
+        [e, recurring, f]
+
+    """
+
+
+def doctest_CalendarEventMixin_hasOccurrences():
+    """Tests for CalendarEventMixin.hasOccurrences.
+
+    We will use SimpleCalendarEvent which is a trivial subclass of
+    CalendarEventMixin
+
+        >>> from datetime import date, datetime, timedelta
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+
+    A simple event always has occurrences.
+
+        >>> e1 = SimpleCalendarEvent(datetime(2004, 11, 25, 12, 0),
+        ...                          timedelta(minutes=10), 'whatever')
+        >>> e1.hasOccurrences()
+        True
+
+    A forever-repeating event always has occurrences.
+
+        >>> e2 = SimpleCalendarEvent(datetime(2004, 11, 25, 12, 0),
+        ...                          timedelta(minutes=10), 'whatever',
+        ...                          recurrence=DailyRecurrenceRule())
+        >>> e2.hasOccurrences()
+        True
+
+    Here's an event without occurrences:
+
+        >>> e3 = SimpleCalendarEvent(datetime(2004, 11, 25, 12, 0),
+        ...                          timedelta(minutes=10), 'whatever',
+        ...                          recurrence=DailyRecurrenceRule(
+        ...                              count=3,
+        ...                              exceptions=[date(2004, 11, 25),
+        ...                                          date(2004, 11, 26),
+        ...                                          date(2004, 11, 27)]))
+        >>> e3.hasOccurrences()
+        False
+
+    However remove one exception, and it becomes an occurrence:
+
+        >>> e4 = SimpleCalendarEvent(datetime(2004, 11, 25, 12, 0),
+        ...                          timedelta(minutes=10), 'whatever',
+        ...                          recurrence=DailyRecurrenceRule(
+        ...                              count=3,
+        ...                              exceptions=[date(2004, 11, 25),
+        ...                                          date(2004, 11, 27)]))
+        >>> e4.hasOccurrences()
+        True
+
+    """
+
+
+def doctest_CalendarEventMixin_replace():
+    """Make sure CalendarEventMixin.replace does not forget any attributes.
+
+        >>> from schooltool.calendar.interfaces import ICalendarEvent
+        >>> from zope.schema import getFieldNames
+        >>> all_attrs = getFieldNames(ICalendarEvent)
+
+    We will use SimpleCalendarEvent which is a trivial subclass of
+    CalendarEventMixin
+
+        >>> from datetime import datetime, timedelta
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> e1 = SimpleCalendarEvent(datetime(2004, 12, 15, 18, 57),
+        ...                          timedelta(minutes=15),
+        ...                          'Work on schooltool.calendar.simple')
+
+        # XXX Need a better test for this.  event.dtstart should always be a
+        # datetime object not a string
+        #>>> for attr in all_attrs:
+        #...     e2 = e1.replace(**{attr: 'new value'})
+        #...     assert getattr(e2, attr) == 'new value', attr
+        #...     assert e2 != e1, attr
+        #...     assert e2.replace(**{attr: getattr(e1, attr)}) == e1, attr
+
+    """
+
+
+def doctest_CalendarEventMixin_expand():
+    """Test expanding of recurring events
+
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+
+    For non-recurring events, expand yields the event if it is in the
+    range passed as arguments:
+
+        >>> from pytz import utc
+        >>> from datetime import datetime, timedelta
+        >>> e1 = SimpleCalendarEvent(datetime(2004, 12, 15, 18, 57, tzinfo=utc),
+        ...                          timedelta(minutes=15),
+        ...                          'Work on schoolbell.calendar.simple')
+        >>> expanded = list(e1.expand(
+        ...     datetime(2004, 12, 15, 0, 0, tzinfo=utc),
+        ...     datetime(2004, 12, 16, 0, 0, tzinfo=utc)))
+        >>> expanded
+        [<schooltool.calendar.simple.SimpleCalendarEvent object at ...>]
+        >>> expanded[0] is e1
+        True
+
+    If the event is outside the datetime range passed, the method
+    yields nothing.
+
+        >>> list(e1.expand(datetime(2004, 12, 16, 0, 0, tzinfo=utc),
+        ...                datetime(2004, 12, 17, 0, 0, tzinfo=utc)))
+        []
+
+    See doctest_CalendarMixin_expand doctest for an elaborate
+    demonstration of the expanding functionality.
+    """
+
+
+def doctest_CalendarEventMixin_expand_at_midnight():
+    """Regression tests for CalendarEventMixin.expand.
+
+    Bug: an event that occurs at midnight and is 0 minutes long gets lost.
+
+        >>> from pytz import utc
+        >>> from datetime import datetime, timedelta
+        >>> from schooltool.calendar.simple import SimpleCalendarEvent
+        >>> from schooltool.calendar.recurrent import DailyRecurrenceRule
+        >>> e1 = SimpleCalendarEvent(datetime(2005, 3, 2, 0, 0, tzinfo=utc),
+        ...                          timedelta(0), "Corner case")
+        >>> e2 = SimpleCalendarEvent(datetime(2005, 3, 4, 0, 0, tzinfo=utc),
+        ...                          timedelta(0), "Recurring case",
+        ...                          recurrence=DailyRecurrenceRule())
+
+        >>> def show(first, last):
+        ...     for event in e1, e2:
+        ...         print [e.title for e in event.expand(first, last)]
+
+        >>> show(datetime(2005, 3, 1, tzinfo=utc),
+        ...      datetime(2005, 3, 2, tzinfo=utc))
+        []
+        []
+
+        >>> show(datetime(2005, 3, 2, tzinfo=utc),
+        ...      datetime(2005, 3, 3, tzinfo=utc))
+        ['Corner case']
+        []
+
+        >>> show(datetime(2005, 3, 3, tzinfo=utc),
+        ...      datetime(2005, 3, 4, tzinfo=utc))
+        []
+        []
+
+        >>> show(datetime(2005, 3, 4, tzinfo=utc),
+        ...      datetime(2005, 3, 5, tzinfo=utc))
+        []
+        ['Recurring case']
+
+    """
+
+
+def doctest_weeknum_bounds():
+    """Unit test for schooltool.calendar.utils.weeknum_bounds.
+
+    Check that weeknum_bounds is the reverse of datetime.isocalendar().
+
+        >>> from datetime import date
+        >>> from schooltool.calendar.utils import weeknum_bounds
+        >>> d = date(2000, 1, 1)
+        >>> while d < date(2010, 1, 1):
+        ...     year, weeknum, weekday = d.isocalendar()
+        ...     l, h = weeknum_bounds(year, weeknum)
+        ...     assert l <= d <= h
+        ...     d += d.resolution
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(optionflags=doctest.ELLIPSIS))
+    suite.addTest(doctest.DocFileSuite('../README.txt'))
+    suite.addTest(doctest.DocTestSuite('schooltool.calendar.mixins'))
+    suite.addTest(doctest.DocTestSuite('schooltool.calendar.simple'))
+    suite.addTest(doctest.DocTestSuite('schooltool.calendar.recurrent'))
+    suite.addTest(doctest.DocTestSuite('schooltool.calendar.utils'))
+    suite.addTest(doctest.DocTestSuite('schooltool.calendar.browser',
+                        optionflags=doctest.ELLIPSIS | doctest.REPORT_UDIFF))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/tests/test_schooltool.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/timezones.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/timezones.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/timezones.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,144 @@
+Time zones used in SchoolTool
+-----------------------------
+
+In schooltool, there are three significant time zones: the school
+timezone (the application preference), the user's preferred one, and
+UTC.  Practically, the user's preferred timezone will differ from the
+server timezone only in special cases, but we need to handle this
+difference anyway.
+
+The user's preferred timezone should only be used when accepting
+datetime input from the user, and when determining the day boundaries
+on the calendar views.
+
+A rule of thumb is that all the datetimes in the system should use the
+application timezone.  Business processes such as timetabling,
+attendance and so on use the application timezone.  The school day
+boundaries are determined in this timezone.
+
+As a historical legacy, SchoolTool internally stores most times in
+UTC, and some parts of SchoolTool might still require that the
+timezone is used in calendar events' dtstart attributes.
+
+The application timezone can be acquired thus::
+
+    >>> import pytz
+    >>> from schooltool.app.interfaces import ISchoolToolApplication
+    >>> from schooltool.app.interfaces import IApplicationPreferences
+    >>> app = ISchoolToolApplication(None)
+    >>> apptimezone = pytz.timezone(IApplicationPreferences(app).timezone)
+
+In order to get the user preferred timezone, you need the browser
+request::
+
+    >>> from schooltool.app.browser import ViewPreferences
+    >>> usertz = ViewPreferences(request).timezone
+
+
+Converting timezones
+--------------------
+
+There are two kinds of timezone conversion: you might have a naïve
+datetime and want to apply a certain timezone for it, of you might
+want to express a timezone-aware datetime in another timezone.
+
+For the latter, use ``astimezone``:
+
+    >>> tz_aware_dt.astimezone(other_tz)
+
+For the former, that is making the datetime timezone-aware, always use
+timezone.localize::
+
+    >>> tz_aware_dt = timezone.localize(naive_dt)
+
+**Never use** ``datetime.replace(tzinfo=timezone)`` as it will get you
+incorrect results most of the time.  For example::
+
+    ### DON'T DO THIS! This is wrong. ###
+    >>> import pytz
+    >>> import datetime
+    >>> vilnius = pytz.timezone('Europe/Vilnius')
+    >>> datetime.datetime(2006, 1, 1, 0, 0, tzinfo=vilnius)
+    datetime.datetime(2006, 1, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Vilnius' WMT+1:24:00 STD>)
+
+This gets the timezone that was used in Vilnius in 1900!  Even if the
+timezone is unchanged since the start of the ZoneInfo database, we
+loose all hope of getting the daylight savings right.  If we use the
+``localize`` method we get the correct result::
+
+    >>> vilnius.localize(datetime.datetime(2006, 1, 1, 0, 0))
+    datetime.datetime(2006, 1, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Vilnius' EET+2:00:00 STD>)
+
+Let's look at the UTC expressions of both times to see the difference clearly::
+
+    >>> good = vilnius.localize(datetime.datetime(2006, 1, 1, 0, 0))
+    >>> wrong = datetime.datetime(2006, 1, 1, 0, 0, tzinfo=vno)
+    >>> good.astimezone(pytz.utc)
+    datetime.datetime(2005, 12, 31, 22, 0, tzinfo=<UTC>)
+    >>> wrong.astimezone(pytz.utc)
+    datetime.datetime(2005, 12, 31, 22, 36, tzinfo=<UTC>)
+
+When using the ``datetime.replace`` for replacing other datetime
+components, you should convert the result to the desired timezone, as
+your manipulation might have shifted the datetime into a different
+timezones because the daylight savings have changed.
+
+On the day when the daylight savings time switches, timezone.localize
+might raise if you pass the "missing hour".  In this example, the time
+is moved from 2:59AM to 4:00AM, so 3:00AM does not exist::
+
+    >>> vilnius.localize(datetime.datetime(2006, 3, 26, 3, 1))
+    Traceback (most recent call last):
+      ...
+    IndexError: list index out of range
+
+
+What is Today?
+--------------
+
+This question arises when displaying timetable and calendar events on
+the calendar of the user.  When the timezones of the application and
+user preference differ, actually two schooldays should be filtered for
+display.
+
+**Never use datetime.date.today()**.  You'll get a date in the system
+timezone, that might be terribly wrong if the application timezone and
+the user's preferred timezone differ from that.
+
+If you need a date for today to be displayed for the user do this::
+
+    >>> from datetime import datetime
+    >>> from pytz import utc, timezone
+    >>> def today(self, tz):
+    ...     current_time = utc.localize(datetime.utcnow())
+    ...     return current_time.astimezone(tz).date()
+
+Here's an example of how the correct date usage can be tested.  These
+two timezones are on the different sides of the International Date
+Line, so the dates in these timezones are always different::
+
+    >>> from schooltool.app.browser.cal import CalendarViewBase
+    >>> view = CalendarViewBase(None, TestRequest())
+
+    >>> current_time = utc.localize(datetime.utcnow())
+
+    >>> tz = timezone('Etc/GMT+12')
+    >>> today_date = current_time.astimezone(tz).date()
+    >>> view.timezone = tz
+    >>> view.today() == today_date
+    True
+
+    >>> tz = timezone('Etc/GMT-12')
+    >>> today_date = current_time.astimezone(tz).date()
+    >>> view.timezone = tz
+    >>> view.today() == today_date
+    True
+
+If you want to store a date of an event - store::
+
+    >>> utc.localize(datetime.datetime.utcnow())
+
+and display only the date part to the user, using::
+
+    >>> dt.astimezone(user_tz).date()
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/timezones.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/utils.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/utils.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/utils.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,455 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Utility functions for SchoolBell calendaring.
+
+These include various date manipulation routines.
+
+$Id: utils.py 5921 2006-04-14 16:44:39Z alga $
+"""
+
+import re
+import calendar
+from datetime import date, datetime, timedelta, time
+
+from pytz import timezone, utc
+from zope.testing.cleanup import addCleanUp
+
+
+def prev_month(date):
+    """Calculate the first day of the previous month for a given date.
+
+        >>> prev_month(date(2004, 8, 1))
+        datetime.date(2004, 7, 1)
+        >>> prev_month(date(2004, 8, 31))
+        datetime.date(2004, 7, 1)
+        >>> prev_month(date(2004, 12, 15))
+        datetime.date(2004, 11, 1)
+        >>> prev_month(date(2005, 1, 28))
+        datetime.date(2004, 12, 1)
+
+    """
+    return (date.replace(day=1) - timedelta(1)).replace(day=1)
+
+
+def next_month(date):
+    """Calculate the first day of the next month for a given date.
+
+        >>> next_month(date(2004, 8, 1))
+        datetime.date(2004, 9, 1)
+        >>> next_month(date(2004, 8, 31))
+        datetime.date(2004, 9, 1)
+        >>> next_month(date(2004, 12, 15))
+        datetime.date(2005, 1, 1)
+        >>> next_month(date(2004, 2, 28))
+        datetime.date(2004, 3, 1)
+        >>> next_month(date(2004, 2, 29))
+        datetime.date(2004, 3, 1)
+        >>> next_month(date(2005, 2, 28))
+        datetime.date(2005, 3, 1)
+
+    """
+    return (date.replace(day=28) + timedelta(7)).replace(day=1)
+
+
+def week_start(date, first_day_of_week=0):
+    """Calculate the first day of the week for a given date.
+
+    Assuming that week starts on Mondays:
+
+        >>> week_start(date(2004, 8, 19))
+        datetime.date(2004, 8, 16)
+        >>> week_start(date(2004, 8, 15))
+        datetime.date(2004, 8, 9)
+        >>> week_start(date(2004, 8, 14))
+        datetime.date(2004, 8, 9)
+        >>> week_start(date(2004, 8, 21))
+        datetime.date(2004, 8, 16)
+        >>> week_start(date(2004, 8, 22))
+        datetime.date(2004, 8, 16)
+        >>> week_start(date(2004, 8, 23))
+        datetime.date(2004, 8, 23)
+
+    Assuming that week starts on Sundays:
+
+        >>> import calendar
+        >>> week_start(date(2004, 8, 19), calendar.SUNDAY)
+        datetime.date(2004, 8, 15)
+        >>> week_start(date(2004, 8, 15), calendar.SUNDAY)
+        datetime.date(2004, 8, 15)
+        >>> week_start(date(2004, 8, 14), calendar.SUNDAY)
+        datetime.date(2004, 8, 8)
+        >>> week_start(date(2004, 8, 21), calendar.SUNDAY)
+        datetime.date(2004, 8, 15)
+        >>> week_start(date(2004, 8, 22), calendar.SUNDAY)
+        datetime.date(2004, 8, 22)
+        >>> week_start(date(2004, 8, 23), calendar.SUNDAY)
+        datetime.date(2004, 8, 22)
+
+    """
+    assert 0 <= first_day_of_week < 7
+    delta = date.weekday() - first_day_of_week
+    if delta < 0:
+        delta += 7
+    return date - timedelta(delta)
+
+
+def weeknum_bounds(year, weeknum):
+    """Calculate the inclusive date bounds for a (year, weeknum) tuple.
+
+    Week numbers are as defined in ISO 8601 and returned by
+    datetime.date.isocalendar().
+
+        >>> weeknum_bounds(2003, 52)
+        (datetime.date(2003, 12, 22), datetime.date(2003, 12, 28))
+        >>> weeknum_bounds(2004, 1)
+        (datetime.date(2003, 12, 29), datetime.date(2004, 1, 4))
+        >>> weeknum_bounds(2004, 2)
+        (datetime.date(2004, 1, 5), datetime.date(2004, 1, 11))
+
+    """
+    # The first week of a year is at least 4 days long, so January 4th
+    # is in the first week.
+    firstweek = week_start(date(year, 1, 4), calendar.MONDAY)
+    # move forward to the right week number
+    weekstart = firstweek + timedelta(weeks=weeknum-1)
+    weekend = weekstart + timedelta(days=6)
+    return (weekstart, weekend)
+
+
+def check_weeknum(year, weeknum):
+    """Check to see whether a (year, weeknum) tuple refers to a real
+    ISO week number.
+
+        >>> check_weeknum(2004, 1)
+        True
+        >>> check_weeknum(2004, 53)
+        True
+        >>> check_weeknum(2004, 0)
+        False
+        >>> check_weeknum(2004, 54)
+        False
+        >>> check_weeknum(2003, 52)
+        True
+        >>> check_weeknum(2003, 53)
+        False
+
+    """
+    weekstart, weekend = weeknum_bounds(year, weeknum)
+    isoyear, isoweek, isoday = weekstart.isocalendar()
+    return (year, weeknum) == (isoyear, isoweek)
+
+
+def parse_date(value):
+    """Parse a ISO-8601 YYYY-MM-DD date value.
+
+    Examples:
+
+        >>> parse_date('2003-09-01')
+        datetime.date(2003, 9, 1)
+        >>> parse_date('20030901')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid date: '20030901'
+        >>> parse_date('2003-IX-01')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid date: '2003-IX-01'
+        >>> parse_date('2003-09-31')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid date: '2003-09-31'
+        >>> parse_date('2003-09-30-15-42')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid date: '2003-09-30-15-42'
+
+    """
+    try:
+        y, m, d = map(int, value.split('-'))
+        return date(y, m, d)
+    except ValueError:
+        raise ValueError("Invalid date: %r" % value)
+
+
+def parse_datetime(s):
+    """Parse a ISO 8601 date/time value.
+
+    Only a small subset of ISO 8601 is accepted:
+
+      YYYY-MM-DD HH:MM:SS
+      YYYY-MM-DD HH:MM:SS.ssssss
+      YYYY-MM-DDTHH:MM:SS
+      YYYY-MM-DDTHH:MM:SS.ssssss
+
+    Returns a datetime.datetime object without a time zone.
+
+    Examples:
+
+        >>> parse_datetime('2003-04-05 11:22:33.456789')
+        datetime.datetime(2003, 4, 5, 11, 22, 33, 456789)
+
+        >>> parse_datetime('2003-04-05 11:22:33.456')
+        datetime.datetime(2003, 4, 5, 11, 22, 33, 456000)
+
+        >>> parse_datetime('2003-04-05 11:22:33.45678999')
+        datetime.datetime(2003, 4, 5, 11, 22, 33, 456789)
+
+        >>> parse_datetime('01/02/03')
+        Traceback (most recent call last):
+          ...
+        ValueError: Bad datetime: 01/02/03
+
+    """
+    m = re.match(r"(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+)([.](\d+))?$", s)
+    if not m:
+        raise ValueError("Bad datetime: %s" % s)
+    ssssss = m.groups()[7]
+    if ssssss:
+        ssssss = int((ssssss + "00000")[:6])
+    else:
+        ssssss = 0
+    y, m, d, hh, mm, ss = map(int, m.groups()[:6])
+    return datetime(y, m, d, hh, mm, ss, ssssss)
+
+
+def parse_datetimetz(s):
+    """Parse a ISO 8601 date/time value in UTC.
+
+    Only a small subset of ISO 8601 is accepted:
+
+      YYYY-MM-DD HH:MM:SS
+      YYYY-MM-DD HH:MM:SS.ssssss
+      YYYY-MM-DDTHH:MM:SS
+      YYYY-MM-DDTHH:MM:SS.ssssss
+
+    optionally followed by the letter Z to indicate UTC time.
+
+    Returns a datetime.datetime object with tzinfo=UTC.
+
+    Examples:
+
+        >>> dt1 = parse_datetimetz('2003-04-05 11:22:33.456789Z')
+        >>> dt1.date()
+        datetime.date(2003, 4, 5)
+        >>> dt1.time()
+        datetime.time(11, 22, 33, 456789)
+        >>> dt1.tzname()
+        'UTC'
+
+        >>> dt2 = parse_datetimetz('2003-04-05 11:22:33.456')
+        >>> dt2.date()
+        datetime.date(2003, 4, 5)
+        >>> dt2.time()
+        datetime.time(11, 22, 33, 456000)
+
+        >>> dt3 = parse_datetimetz('2003-04-05 11:22:33.45678999')
+        >>> dt3.date()
+        datetime.date(2003, 4, 5)
+        >>> dt3.time()
+        datetime.time(11, 22, 33, 456789)
+        >>> dt3.tzname()
+        'UTC'
+
+        >>> dt4 = parse_datetimetz('2003-04-05 11:22:33+00:00')
+        >>> dt4.date()
+        datetime.date(2003, 4, 5)
+
+        >>> dt5 = parse_datetimetz('2003-04-05 11:22:33.45678999-09:00')
+        >>> dt5.time()
+        datetime.time(11, 22, 33, 456789)
+
+        >>> dt6 = parse_datetimetz('01/02/03')
+        Traceback (most recent call last):
+          ...
+        ValueError: Bad datetime: 01/02/03
+
+    """
+    m = re.match(r"(\d+)-(\d+)-(\d+)[ T]"
+                 r"(\d+):(\d+):(\d+)([.](\d+))?([-+](\d+):(\d+))?Z?$", s)
+    if not m:
+        raise ValueError("Bad datetime: %s" % s)
+    ssssss = m.groups()[7]
+    if ssssss:
+        ssssss = int((ssssss + "00000")[:6])
+    else:
+        ssssss = 0
+    y, m, d, hh, mm, ss = map(int, m.groups()[:6])
+    return datetime(y, m, d, hh, mm, ss, ssssss, tzinfo=utc)
+
+
+def parse_time(s):
+    """Parse a ISO 8601 time value.
+
+    Only a small subset of ISO 8601 is accepted:
+
+      HH:MM
+      HH:MM:SS
+
+    Returns a datetime.time object without a time zone.
+
+    Examples:
+
+        >>> parse_time('11:22:33')
+        datetime.time(11, 22, 33)
+
+        >>> parse_time('11:22')
+        datetime.time(11, 22)
+
+        >>> parse_time('11:66')
+        Traceback (most recent call last):
+          ...
+        ValueError: minute must be in 0..59
+
+    """
+    parts = s.split(":")
+    hh, mm = map(int, parts[:2])
+    ss = 0
+    if len(parts) > 2:
+        ss = int(parts[2])
+    return time(hh, mm, ss)
+
+
+def parse_timetz(s, tz=utc):
+    """Timezone aware time parser.
+
+    If no timezone preference is given, default to UTC.
+
+        >>> t1 = parse_timetz('11:22:33')
+        >>> t1.hour
+        11
+        >>> t1.minute
+        22
+        >>> t1.second
+        33
+        >>> t1.tzname()
+        'UTC'
+
+        >>> t2 = parse_timetz('11:22')
+        >>> t2.hour
+        11
+        >>> t2.minute
+        22
+        >>> t2.second
+        0
+        >>> t2.tzname()
+        'UTC'
+
+        >>> eastern = timezone('US/Eastern')
+        >>> teastern = parse_timetz('11:22', tz=eastern)
+        >>> teastern.tzname()
+        'EST'
+
+        >>> parse_timetz('11:66')
+        Traceback (most recent call last):
+          ...
+        ValueError: minute must be in 0..59
+
+
+    """
+    parts = s.split(":")
+    hh, mm = map(int, parts[:2])
+    ss = 0
+    if len(parts) > 2:
+        ss = int(parts[2])
+    return time(hh, mm, ss, tzinfo=tz)
+
+
+# A hook for unit tests and functional tests:  overrides the "now"
+# utcnow() will return its return value if it is not None
+_utcnow_hook = None
+
+
+def utcnow():
+    """Return the datetime of now with a UTC timezone.
+
+        >>> tick = utc.localize(datetime.utcnow())
+        >>> tack = utcnow()
+        >>> tock = utc.localize(datetime.utcnow())
+        >>> tick <= tack <= tock
+        True
+
+        >>> tack.tzinfo
+        <UTC>
+
+    Is hookable for tests by setting the utcnow_hook module global:
+
+        >>> from schooltool.calendar import utils
+        >>> utils._utcnow_hook = lambda: datetime(1970, 1, 1, 1, 1, tzinfo=utc)
+        >>> utcnow()
+        datetime.datetime(1970, 1, 1, 1, 1, tzinfo=<UTC>)
+
+    Clean up:
+
+        >>> utils._utcnow_hook = None
+    """
+    global _utcnow_hook
+    if _utcnow_hook is not None:
+        return _utcnow_hook()
+    else:
+        return utc.localize(datetime.utcnow())
+
+
+def stub_utcnow(value):
+    """Provide a fake value that utcnow will return.
+
+    The fake value can be a datetime:
+
+        >>> stub_utcnow(datetime(1970, 1, 1, 0, 0, tzinfo=utc))
+        >>> utcnow()
+        datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)
+        >>> utcnow()
+        datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)
+
+    Alternatively, it can be a callable:
+
+        >>> def faketime():
+        ...    yield datetime(1970, 1, 1, 0, 0, tzinfo=utc)
+        ...    yield datetime(1970, 1, 1, 0, 1, tzinfo=utc)
+        ...    yield datetime(1970, 1, 1, 0, 2, tzinfo=utc)
+
+        >>> stub_utcnow(faketime().next)
+        >>> utcnow()
+        datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)
+        >>> utcnow()
+        datetime.datetime(1970, 1, 1, 0, 1, tzinfo=<UTC>)
+        >>> utcnow()
+        datetime.datetime(1970, 1, 1, 0, 2, tzinfo=<UTC>)
+
+    When we set the stubbed value to None, utcnow starts returning real time:
+
+        >>> stub_utcnow(None)
+
+        >>> tick = utc.localize(datetime.utcnow())
+        >>> tack = utcnow()
+        >>> tock = utc.localize(datetime.utcnow())
+        >>> tick <= tack <= tock
+        True
+
+    """
+    global _utcnow_hook
+    if value is None:
+        _utcnow_hook = None
+    elif callable(value):
+        _utcnow_hook = value
+    else:
+        _utcnow_hook = lambda: value
+
+
+addCleanUp(stub_utcnow, (None, ))


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/utils.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/vcal_dict.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/vcal_dict.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/vcal_dict.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5113 @@
+#
+# This file was generated by generate_vcal_dict.py, DO NOT EDIT!
+# Instructions on updating this file can be found in generate_vcal_dict.py.
+#
+
+timezone_map = {
+'Africa/Algiers' : ('/schooltool.org/Olson_20060310_1/Africa/Algiers', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Algiers
+X-LIC-LOCATION:Africa/Algiers
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Luanda' : ('/schooltool.org/Olson_20060310_1/Africa/Luanda', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Luanda
+X-LIC-LOCATION:Africa/Luanda
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Porto-Novo' : ('/schooltool.org/Olson_20060310_1/Africa/Porto-Novo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Porto-Novo
+X-LIC-LOCATION:Africa/Porto-Novo
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Gaborone' : ('/schooltool.org/Olson_20060310_1/Africa/Gaborone', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Gaborone
+X-LIC-LOCATION:Africa/Gaborone
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Ouagadougou' : ('/schooltool.org/Olson_20060310_1/Africa/Ouagadougou', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Ouagadougou
+X-LIC-LOCATION:Africa/Ouagadougou
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Bujumbura' : ('/schooltool.org/Olson_20060310_1/Africa/Bujumbura', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Bujumbura
+X-LIC-LOCATION:Africa/Bujumbura
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Douala' : ('/schooltool.org/Olson_20060310_1/Africa/Douala', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Douala
+X-LIC-LOCATION:Africa/Douala
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Bangui' : ('/schooltool.org/Olson_20060310_1/Africa/Bangui', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Bangui
+X-LIC-LOCATION:Africa/Bangui
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Ndjamena' : ('/schooltool.org/Olson_20060310_1/Africa/Ndjamena', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Ndjamena
+X-LIC-LOCATION:Africa/Ndjamena
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Kinshasa' : ('/schooltool.org/Olson_20060310_1/Africa/Kinshasa', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Kinshasa
+X-LIC-LOCATION:Africa/Kinshasa
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Lubumbashi' : ('/schooltool.org/Olson_20060310_1/Africa/Lubumbashi', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Lubumbashi
+X-LIC-LOCATION:Africa/Lubumbashi
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Brazzaville' : ('/schooltool.org/Olson_20060310_1/Africa/Brazzaville', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Brazzaville
+X-LIC-LOCATION:Africa/Brazzaville
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Abidjan' : ('/schooltool.org/Olson_20060310_1/Africa/Abidjan', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Abidjan
+X-LIC-LOCATION:Africa/Abidjan
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Djibouti' : ('/schooltool.org/Olson_20060310_1/Africa/Djibouti', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Djibouti
+X-LIC-LOCATION:Africa/Djibouti
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Cairo' : ('/schooltool.org/Olson_20060310_1/Africa/Cairo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Cairo
+X-LIC-LOCATION:Africa/Cairo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700424T000000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1FR
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19700925T000000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1FR
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Malabo' : ('/schooltool.org/Olson_20060310_1/Africa/Malabo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Malabo
+X-LIC-LOCATION:Africa/Malabo
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Asmera' : ('/schooltool.org/Olson_20060310_1/Africa/Asmera', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Asmera
+X-LIC-LOCATION:Africa/Asmera
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Addis_Ababa' : ('/schooltool.org/Olson_20060310_1/Africa/Addis_Ababa', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Addis_Ababa
+X-LIC-LOCATION:Africa/Addis_Ababa
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Libreville' : ('/schooltool.org/Olson_20060310_1/Africa/Libreville', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Libreville
+X-LIC-LOCATION:Africa/Libreville
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Banjul' : ('/schooltool.org/Olson_20060310_1/Africa/Banjul', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Banjul
+X-LIC-LOCATION:Africa/Banjul
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Accra' : ('/schooltool.org/Olson_20060310_1/Africa/Accra', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Accra
+X-LIC-LOCATION:Africa/Accra
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Conakry' : ('/schooltool.org/Olson_20060310_1/Africa/Conakry', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Conakry
+X-LIC-LOCATION:Africa/Conakry
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Bissau' : ('/schooltool.org/Olson_20060310_1/Africa/Bissau', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Bissau
+X-LIC-LOCATION:Africa/Bissau
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Nairobi' : ('/schooltool.org/Olson_20060310_1/Africa/Nairobi', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Nairobi
+X-LIC-LOCATION:Africa/Nairobi
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Maseru' : ('/schooltool.org/Olson_20060310_1/Africa/Maseru', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Maseru
+X-LIC-LOCATION:Africa/Maseru
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Monrovia' : ('/schooltool.org/Olson_20060310_1/Africa/Monrovia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Monrovia
+X-LIC-LOCATION:Africa/Monrovia
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Tripoli' : ('/schooltool.org/Olson_20060310_1/Africa/Tripoli', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Tripoli
+X-LIC-LOCATION:Africa/Tripoli
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Blantyre' : ('/schooltool.org/Olson_20060310_1/Africa/Blantyre', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Blantyre
+X-LIC-LOCATION:Africa/Blantyre
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Bamako' : ('/schooltool.org/Olson_20060310_1/Africa/Bamako', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Bamako
+X-LIC-LOCATION:Africa/Bamako
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Nouakchott' : ('/schooltool.org/Olson_20060310_1/Africa/Nouakchott', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Nouakchott
+X-LIC-LOCATION:Africa/Nouakchott
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Casablanca' : ('/schooltool.org/Olson_20060310_1/Africa/Casablanca', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Casablanca
+X-LIC-LOCATION:Africa/Casablanca
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/El_Aaiun' : ('/schooltool.org/Olson_20060310_1/Africa/El_Aaiun', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/El_Aaiun
+X-LIC-LOCATION:Africa/El_Aaiun
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Maputo' : ('/schooltool.org/Olson_20060310_1/Africa/Maputo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Maputo
+X-LIC-LOCATION:Africa/Maputo
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Windhoek' : ('/schooltool.org/Olson_20060310_1/Africa/Windhoek', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Windhoek
+X-LIC-LOCATION:Africa/Windhoek
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:WAST
+DTSTART:19700906T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Niamey' : ('/schooltool.org/Olson_20060310_1/Africa/Niamey', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Niamey
+X-LIC-LOCATION:Africa/Niamey
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Lagos' : ('/schooltool.org/Olson_20060310_1/Africa/Lagos', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Lagos
+X-LIC-LOCATION:Africa/Lagos
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:WAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Kigali' : ('/schooltool.org/Olson_20060310_1/Africa/Kigali', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Kigali
+X-LIC-LOCATION:Africa/Kigali
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Sao_Tome' : ('/schooltool.org/Olson_20060310_1/Africa/Sao_Tome', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Sao_Tome
+X-LIC-LOCATION:Africa/Sao_Tome
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Dakar' : ('/schooltool.org/Olson_20060310_1/Africa/Dakar', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Dakar
+X-LIC-LOCATION:Africa/Dakar
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Freetown' : ('/schooltool.org/Olson_20060310_1/Africa/Freetown', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Freetown
+X-LIC-LOCATION:Africa/Freetown
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Mogadishu' : ('/schooltool.org/Olson_20060310_1/Africa/Mogadishu', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Mogadishu
+X-LIC-LOCATION:Africa/Mogadishu
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Johannesburg' : ('/schooltool.org/Olson_20060310_1/Africa/Johannesburg', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Johannesburg
+X-LIC-LOCATION:Africa/Johannesburg
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Khartoum' : ('/schooltool.org/Olson_20060310_1/Africa/Khartoum', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Khartoum
+X-LIC-LOCATION:Africa/Khartoum
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Mbabane' : ('/schooltool.org/Olson_20060310_1/Africa/Mbabane', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Mbabane
+X-LIC-LOCATION:Africa/Mbabane
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:SAST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Dar_es_Salaam' : ('/schooltool.org/Olson_20060310_1/Africa/Dar_es_Salaam', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Dar_es_Salaam
+X-LIC-LOCATION:Africa/Dar_es_Salaam
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Lome' : ('/schooltool.org/Olson_20060310_1/Africa/Lome', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Lome
+X-LIC-LOCATION:Africa/Lome
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Tunis' : ('/schooltool.org/Olson_20060310_1/Africa/Tunis', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Tunis
+X-LIC-LOCATION:Africa/Tunis
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Kampala' : ('/schooltool.org/Olson_20060310_1/Africa/Kampala', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Kampala
+X-LIC-LOCATION:Africa/Kampala
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Lusaka' : ('/schooltool.org/Olson_20060310_1/Africa/Lusaka', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Lusaka
+X-LIC-LOCATION:Africa/Lusaka
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Harare' : ('/schooltool.org/Olson_20060310_1/Africa/Harare', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Harare
+X-LIC-LOCATION:Africa/Harare
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:CAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Africa/Ceuta' : ('/schooltool.org/Olson_20060310_1/Africa/Ceuta', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Africa/Ceuta
+X-LIC-LOCATION:Africa/Ceuta
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/Cape_Verde' : ('/schooltool.org/Olson_20060310_1/Atlantic/Cape_Verde', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Cape_Verde
+X-LIC-LOCATION:Atlantic/Cape_Verde
+BEGIN:STANDARD
+TZOFFSETFROM:-0100
+TZOFFSETTO:-0100
+TZNAME:CVT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/St_Helena' : ('/schooltool.org/Olson_20060310_1/Atlantic/St_Helena', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/St_Helena
+X-LIC-LOCATION:Atlantic/St_Helena
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/Faeroe' : ('/schooltool.org/Olson_20060310_1/Atlantic/Faeroe', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Faeroe
+X-LIC-LOCATION:Atlantic/Faeroe
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19700329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/Reykjavik' : ('/schooltool.org/Olson_20060310_1/Atlantic/Reykjavik', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Reykjavik
+X-LIC-LOCATION:Atlantic/Reykjavik
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/Jan_Mayen' : ('/schooltool.org/Olson_20060310_1/Atlantic/Jan_Mayen', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Jan_Mayen
+X-LIC-LOCATION:Atlantic/Jan_Mayen
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/Azores' : ('/schooltool.org/Olson_20060310_1/Atlantic/Azores', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Azores
+X-LIC-LOCATION:Atlantic/Azores
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:AZOST
+DTSTART:19700329T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:AZOT
+DTSTART:19701025T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/Madeira' : ('/schooltool.org/Olson_20060310_1/Atlantic/Madeira', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Madeira
+X-LIC-LOCATION:Atlantic/Madeira
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19700329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/Canary' : ('/schooltool.org/Olson_20060310_1/Atlantic/Canary', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Canary
+X-LIC-LOCATION:Atlantic/Canary
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19700329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Atlantic/Bermuda' : ('/schooltool.org/Olson_20060310_1/Atlantic/Bermuda', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Bermuda
+X-LIC-LOCATION:Atlantic/Bermuda
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Atlantic/Stanley' : ('/schooltool.org/Olson_20060310_1/Atlantic/Stanley', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/Stanley
+X-LIC-LOCATION:Atlantic/Stanley
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:FKT
+DTSTART:19700419T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:FKST
+DTSTART:19700906T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Atlantic/South_Georgia' : ('/schooltool.org/Olson_20060310_1/Atlantic/South_Georgia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Atlantic/South_Georgia
+X-LIC-LOCATION:Atlantic/South_Georgia
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0200
+TZNAME:GST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Comoro' : ('/schooltool.org/Olson_20060310_1/Indian/Comoro', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Comoro
+X-LIC-LOCATION:Indian/Comoro
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Antananarivo' : ('/schooltool.org/Olson_20060310_1/Indian/Antananarivo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Antananarivo
+X-LIC-LOCATION:Indian/Antananarivo
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Mauritius' : ('/schooltool.org/Olson_20060310_1/Indian/Mauritius', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Mauritius
+X-LIC-LOCATION:Indian/Mauritius
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:MUT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Mayotte' : ('/schooltool.org/Olson_20060310_1/Indian/Mayotte', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Mayotte
+X-LIC-LOCATION:Indian/Mayotte
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:EAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Reunion' : ('/schooltool.org/Olson_20060310_1/Indian/Reunion', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Reunion
+X-LIC-LOCATION:Indian/Reunion
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:RET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Mahe' : ('/schooltool.org/Olson_20060310_1/Indian/Mahe', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Mahe
+X-LIC-LOCATION:Indian/Mahe
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:SCT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Kerguelen' : ('/schooltool.org/Olson_20060310_1/Indian/Kerguelen', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Kerguelen
+X-LIC-LOCATION:Indian/Kerguelen
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:TFT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Chagos' : ('/schooltool.org/Olson_20060310_1/Indian/Chagos', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Chagos
+X-LIC-LOCATION:Indian/Chagos
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:IOT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Maldives' : ('/schooltool.org/Olson_20060310_1/Indian/Maldives', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Maldives
+X-LIC-LOCATION:Indian/Maldives
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:MVT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Christmas' : ('/schooltool.org/Olson_20060310_1/Indian/Christmas', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Christmas
+X-LIC-LOCATION:Indian/Christmas
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:CXT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Indian/Cocos' : ('/schooltool.org/Olson_20060310_1/Indian/Cocos', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Indian/Cocos
+X-LIC-LOCATION:Indian/Cocos
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0630
+TZNAME:CCT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/Casey' : ('/schooltool.org/Olson_20060310_1/Antarctica/Casey', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/Casey
+X-LIC-LOCATION:Antarctica/Casey
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:WST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/Davis' : ('/schooltool.org/Olson_20060310_1/Antarctica/Davis', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/Davis
+X-LIC-LOCATION:Antarctica/Davis
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:DAVT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/Mawson' : ('/schooltool.org/Olson_20060310_1/Antarctica/Mawson', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/Mawson
+X-LIC-LOCATION:Antarctica/Mawson
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:MAWT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/DumontDUrville' : ('/schooltool.org/Olson_20060310_1/Antarctica/DumontDUrville', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/DumontDUrville
+X-LIC-LOCATION:Antarctica/DumontDUrville
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:DDUT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/Syowa' : ('/schooltool.org/Olson_20060310_1/Antarctica/Syowa', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/Syowa
+X-LIC-LOCATION:Antarctica/Syowa
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:SYOT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/Vostok' : ('/schooltool.org/Olson_20060310_1/Antarctica/Vostok', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/Vostok
+X-LIC-LOCATION:Antarctica/Vostok
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:VOST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/Rothera' : ('/schooltool.org/Olson_20060310_1/Antarctica/Rothera', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/Rothera
+X-LIC-LOCATION:Antarctica/Rothera
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ROTT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/Palmer' : ('/schooltool.org/Olson_20060310_1/Antarctica/Palmer', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/Palmer
+X-LIC-LOCATION:Antarctica/Palmer
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:CLST
+DTSTART:19701011T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:CLT
+DTSTART:19700315T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Antarctica/McMurdo' : ('/schooltool.org/Olson_20060310_1/Antarctica/McMurdo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/McMurdo
+X-LIC-LOCATION:Antarctica/McMurdo
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19700315T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:19701004T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Antarctica/South_Pole' : ('/schooltool.org/Olson_20060310_1/Antarctica/South_Pole', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Antarctica/South_Pole
+X-LIC-LOCATION:Antarctica/South_Pole
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19700315T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:19701004T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Asia/Kabul' : ('/schooltool.org/Olson_20060310_1/Asia/Kabul', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Kabul
+X-LIC-LOCATION:Asia/Kabul
+BEGIN:STANDARD
+TZOFFSETFROM:+0430
+TZOFFSETTO:+0430
+TZNAME:AFT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Yerevan' : ('/schooltool.org/Olson_20060310_1/Asia/Yerevan', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Yerevan
+X-LIC-LOCATION:Asia/Yerevan
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:AMST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:AMT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Baku' : ('/schooltool.org/Olson_20060310_1/Asia/Baku', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Baku
+X-LIC-LOCATION:Asia/Baku
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:AZST
+DTSTART:19700329T040000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:AZT
+DTSTART:19701025T050000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Bahrain' : ('/schooltool.org/Olson_20060310_1/Asia/Bahrain', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Bahrain
+X-LIC-LOCATION:Asia/Bahrain
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Dhaka' : ('/schooltool.org/Olson_20060310_1/Asia/Dhaka', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Dhaka
+X-LIC-LOCATION:Asia/Dhaka
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:BDT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Thimphu' : ('/schooltool.org/Olson_20060310_1/Asia/Thimphu', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Thimphu
+X-LIC-LOCATION:Asia/Thimphu
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:BTT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Brunei' : ('/schooltool.org/Olson_20060310_1/Asia/Brunei', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Brunei
+X-LIC-LOCATION:Asia/Brunei
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:BNT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Rangoon' : ('/schooltool.org/Olson_20060310_1/Asia/Rangoon', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Rangoon
+X-LIC-LOCATION:Asia/Rangoon
+BEGIN:STANDARD
+TZOFFSETFROM:+0630
+TZOFFSETTO:+0630
+TZNAME:MMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Phnom_Penh' : ('/schooltool.org/Olson_20060310_1/Asia/Phnom_Penh', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Phnom_Penh
+X-LIC-LOCATION:Asia/Phnom_Penh
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Harbin' : ('/schooltool.org/Olson_20060310_1/Asia/Harbin', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Harbin
+X-LIC-LOCATION:Asia/Harbin
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Shanghai' : ('/schooltool.org/Olson_20060310_1/Asia/Shanghai', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Shanghai
+X-LIC-LOCATION:Asia/Shanghai
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Chongqing' : ('/schooltool.org/Olson_20060310_1/Asia/Chongqing', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Chongqing
+X-LIC-LOCATION:Asia/Chongqing
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Urumqi' : ('/schooltool.org/Olson_20060310_1/Asia/Urumqi', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Urumqi
+X-LIC-LOCATION:Asia/Urumqi
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Kashgar' : ('/schooltool.org/Olson_20060310_1/Asia/Kashgar', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Kashgar
+X-LIC-LOCATION:Asia/Kashgar
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Hong_Kong' : ('/schooltool.org/Olson_20060310_1/Asia/Hong_Kong', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Hong_Kong
+X-LIC-LOCATION:Asia/Hong_Kong
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:HKT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Taipei' : ('/schooltool.org/Olson_20060310_1/Asia/Taipei', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Taipei
+X-LIC-LOCATION:Asia/Taipei
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Macau' : ('/schooltool.org/Olson_20060310_1/Asia/Macau', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Macau
+X-LIC-LOCATION:Asia/Macau
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Nicosia' : ('/schooltool.org/Olson_20060310_1/Asia/Nicosia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Nicosia
+X-LIC-LOCATION:Asia/Nicosia
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Asia/Tbilisi' : ('/schooltool.org/Olson_20060310_1/Asia/Tbilisi', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Tbilisi
+X-LIC-LOCATION:Asia/Tbilisi
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:GET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Dili' : ('/schooltool.org/Olson_20060310_1/Asia/Dili', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Dili
+X-LIC-LOCATION:Asia/Dili
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:TLT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Calcutta' : ('/schooltool.org/Olson_20060310_1/Asia/Calcutta', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Calcutta
+X-LIC-LOCATION:Asia/Calcutta
+BEGIN:STANDARD
+TZOFFSETFROM:+0530
+TZOFFSETTO:+0530
+TZNAME:IST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Jakarta' : ('/schooltool.org/Olson_20060310_1/Asia/Jakarta', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Jakarta
+X-LIC-LOCATION:Asia/Jakarta
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:WIT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Pontianak' : ('/schooltool.org/Olson_20060310_1/Asia/Pontianak', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Pontianak
+X-LIC-LOCATION:Asia/Pontianak
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:WIT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Makassar' : ('/schooltool.org/Olson_20060310_1/Asia/Makassar', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Makassar
+X-LIC-LOCATION:Asia/Makassar
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:CIT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Jayapura' : ('/schooltool.org/Olson_20060310_1/Asia/Jayapura', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Jayapura
+X-LIC-LOCATION:Asia/Jayapura
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:EIT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Tehran' : ('/schooltool.org/Olson_20060310_1/Asia/Tehran', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Tehran
+X-LIC-LOCATION:Asia/Tehran
+BEGIN:STANDARD
+TZOFFSETFROM:+0330
+TZOFFSETTO:+0330
+TZNAME:IRST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Baghdad' : ('/schooltool.org/Olson_20060310_1/Asia/Baghdad', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Baghdad
+X-LIC-LOCATION:Asia/Baghdad
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:ADT
+DTSTART:19700401T030000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19701001T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Jerusalem' : ('/schooltool.org/Olson_20060310_1/Asia/Jerusalem', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Jerusalem
+X-LIC-LOCATION:Asia/Jerusalem
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0200
+TZNAME:IST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Tokyo' : ('/schooltool.org/Olson_20060310_1/Asia/Tokyo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Tokyo
+X-LIC-LOCATION:Asia/Tokyo
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:JST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Amman' : ('/schooltool.org/Olson_20060310_1/Asia/Amman', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Amman
+X-LIC-LOCATION:Asia/Amman
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700326T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1TH
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19700925T010000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1FR
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Almaty' : ('/schooltool.org/Olson_20060310_1/Asia/Almaty', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Almaty
+X-LIC-LOCATION:Asia/Almaty
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:ALMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Qyzylorda' : ('/schooltool.org/Olson_20060310_1/Asia/Qyzylorda', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Qyzylorda
+X-LIC-LOCATION:Asia/Qyzylorda
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:QYZT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Aqtobe' : ('/schooltool.org/Olson_20060310_1/Asia/Aqtobe', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Aqtobe
+X-LIC-LOCATION:Asia/Aqtobe
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:AQTT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Aqtau' : ('/schooltool.org/Olson_20060310_1/Asia/Aqtau', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Aqtau
+X-LIC-LOCATION:Asia/Aqtau
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:AQTT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Oral' : ('/schooltool.org/Olson_20060310_1/Asia/Oral', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Oral
+X-LIC-LOCATION:Asia/Oral
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:ORAT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Bishkek' : ('/schooltool.org/Olson_20060310_1/Asia/Bishkek', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Bishkek
+X-LIC-LOCATION:Asia/Bishkek
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:KGT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Seoul' : ('/schooltool.org/Olson_20060310_1/Asia/Seoul', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Seoul
+X-LIC-LOCATION:Asia/Seoul
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:KST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Pyongyang' : ('/schooltool.org/Olson_20060310_1/Asia/Pyongyang', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Pyongyang
+X-LIC-LOCATION:Asia/Pyongyang
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:KST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Kuwait' : ('/schooltool.org/Olson_20060310_1/Asia/Kuwait', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Kuwait
+X-LIC-LOCATION:Asia/Kuwait
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Vientiane' : ('/schooltool.org/Olson_20060310_1/Asia/Vientiane', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Vientiane
+X-LIC-LOCATION:Asia/Vientiane
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Beirut' : ('/schooltool.org/Olson_20060310_1/Asia/Beirut', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Beirut
+X-LIC-LOCATION:Asia/Beirut
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Kuala_Lumpur' : ('/schooltool.org/Olson_20060310_1/Asia/Kuala_Lumpur', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Kuala_Lumpur
+X-LIC-LOCATION:Asia/Kuala_Lumpur
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:MYT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Kuching' : ('/schooltool.org/Olson_20060310_1/Asia/Kuching', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Kuching
+X-LIC-LOCATION:Asia/Kuching
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:MYT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Hovd' : ('/schooltool.org/Olson_20060310_1/Asia/Hovd', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Hovd
+X-LIC-LOCATION:Asia/Hovd
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:HOVT
+DTSTART:19700926T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SA
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:HOVST
+DTSTART:19700328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Asia/Ulaanbaatar' : ('/schooltool.org/Olson_20060310_1/Asia/Ulaanbaatar', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Ulaanbaatar
+X-LIC-LOCATION:Asia/Ulaanbaatar
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:ULAT
+DTSTART:19700926T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SA
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:ULAST
+DTSTART:19700328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Asia/Choibalsan' : ('/schooltool.org/Olson_20060310_1/Asia/Choibalsan', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Choibalsan
+X-LIC-LOCATION:Asia/Choibalsan
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:CHOT
+DTSTART:19700926T020000
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SA
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:CHOST
+DTSTART:19700328T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Asia/Katmandu' : ('/schooltool.org/Olson_20060310_1/Asia/Katmandu', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Katmandu
+X-LIC-LOCATION:Asia/Katmandu
+BEGIN:STANDARD
+TZOFFSETFROM:+0545
+TZOFFSETTO:+0545
+TZNAME:NPT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Muscat' : ('/schooltool.org/Olson_20060310_1/Asia/Muscat', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Muscat
+X-LIC-LOCATION:Asia/Muscat
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:GST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Karachi' : ('/schooltool.org/Olson_20060310_1/Asia/Karachi', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Karachi
+X-LIC-LOCATION:Asia/Karachi
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:PKT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Gaza' : ('/schooltool.org/Olson_20060310_1/Asia/Gaza', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Gaza
+X-LIC-LOCATION:Asia/Gaza
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700417T000000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3FR
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701004T020000
+RRULE:FREQ=YEARLY
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Manila' : ('/schooltool.org/Olson_20060310_1/Asia/Manila', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Manila
+X-LIC-LOCATION:Asia/Manila
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:PHT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Qatar' : ('/schooltool.org/Olson_20060310_1/Asia/Qatar', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Qatar
+X-LIC-LOCATION:Asia/Qatar
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Riyadh' : ('/schooltool.org/Olson_20060310_1/Asia/Riyadh', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Riyadh
+X-LIC-LOCATION:Asia/Riyadh
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Singapore' : ('/schooltool.org/Olson_20060310_1/Asia/Singapore', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Singapore
+X-LIC-LOCATION:Asia/Singapore
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:SGT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Colombo' : ('/schooltool.org/Olson_20060310_1/Asia/Colombo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Colombo
+X-LIC-LOCATION:Asia/Colombo
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0600
+TZNAME:LKT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Damascus' : ('/schooltool.org/Olson_20060310_1/Asia/Damascus', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Damascus
+X-LIC-LOCATION:Asia/Damascus
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701001T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700401T000000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Asia/Dushanbe' : ('/schooltool.org/Olson_20060310_1/Asia/Dushanbe', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Dushanbe
+X-LIC-LOCATION:Asia/Dushanbe
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:TJT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Bangkok' : ('/schooltool.org/Olson_20060310_1/Asia/Bangkok', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Bangkok
+X-LIC-LOCATION:Asia/Bangkok
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Ashgabat' : ('/schooltool.org/Olson_20060310_1/Asia/Ashgabat', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Ashgabat
+X-LIC-LOCATION:Asia/Ashgabat
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:TMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Dubai' : ('/schooltool.org/Olson_20060310_1/Asia/Dubai', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Dubai
+X-LIC-LOCATION:Asia/Dubai
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0400
+TZNAME:GST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Samarkand' : ('/schooltool.org/Olson_20060310_1/Asia/Samarkand', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Samarkand
+X-LIC-LOCATION:Asia/Samarkand
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:UZT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Tashkent' : ('/schooltool.org/Olson_20060310_1/Asia/Tashkent', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Tashkent
+X-LIC-LOCATION:Asia/Tashkent
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0500
+TZNAME:UZT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Saigon' : ('/schooltool.org/Olson_20060310_1/Asia/Saigon', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Saigon
+X-LIC-LOCATION:Asia/Saigon
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0700
+TZNAME:ICT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Aden' : ('/schooltool.org/Olson_20060310_1/Asia/Aden', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Aden
+X-LIC-LOCATION:Asia/Aden
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0300
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Yekaterinburg' : ('/schooltool.org/Olson_20060310_1/Asia/Yekaterinburg', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Yekaterinburg
+X-LIC-LOCATION:Asia/Yekaterinburg
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0600
+TZNAME:YEKST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0500
+TZNAME:YEKT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Omsk' : ('/schooltool.org/Olson_20060310_1/Asia/Omsk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Omsk
+X-LIC-LOCATION:Asia/Omsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:OMSST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:OMST
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Novosibirsk' : ('/schooltool.org/Olson_20060310_1/Asia/Novosibirsk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Novosibirsk
+X-LIC-LOCATION:Asia/Novosibirsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0600
+TZOFFSETTO:+0700
+TZNAME:NOVST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0600
+TZNAME:NOVT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Krasnoyarsk' : ('/schooltool.org/Olson_20060310_1/Asia/Krasnoyarsk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Krasnoyarsk
+X-LIC-LOCATION:Asia/Krasnoyarsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0700
+TZOFFSETTO:+0800
+TZNAME:KRAST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0700
+TZNAME:KRAT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Irkutsk' : ('/schooltool.org/Olson_20060310_1/Asia/Irkutsk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Irkutsk
+X-LIC-LOCATION:Asia/Irkutsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0900
+TZNAME:IRKST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0800
+TZNAME:IRKT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Yakutsk' : ('/schooltool.org/Olson_20060310_1/Asia/Yakutsk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Yakutsk
+X-LIC-LOCATION:Asia/Yakutsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+TZOFFSETTO:+1000
+TZNAME:YAKST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+0900
+TZNAME:YAKT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Vladivostok' : ('/schooltool.org/Olson_20060310_1/Asia/Vladivostok', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Vladivostok
+X-LIC-LOCATION:Asia/Vladivostok
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:VLAST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:VLAT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Sakhalin' : ('/schooltool.org/Olson_20060310_1/Asia/Sakhalin', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Sakhalin
+X-LIC-LOCATION:Asia/Sakhalin
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1000
+TZNAME:SAKT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:SAKST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Asia/Magadan' : ('/schooltool.org/Olson_20060310_1/Asia/Magadan', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Magadan
+X-LIC-LOCATION:Asia/Magadan
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1200
+TZNAME:MAGST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1100
+TZNAME:MAGT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Kamchatka' : ('/schooltool.org/Olson_20060310_1/Asia/Kamchatka', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Kamchatka
+X-LIC-LOCATION:Asia/Kamchatka
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:PETST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:PETT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Anadyr' : ('/schooltool.org/Olson_20060310_1/Asia/Anadyr', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Anadyr
+X-LIC-LOCATION:Asia/Anadyr
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:ANAST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:ANAT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Asia/Istanbul' : ('/schooltool.org/Olson_20060310_1/Asia/Istanbul', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Asia/Istanbul
+X-LIC-LOCATION:Asia/Istanbul
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Nicosia' : ('/schooltool.org/Olson_20060310_1/Europe/Nicosia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Nicosia
+X-LIC-LOCATION:Europe/Nicosia
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Europe/London' : ('/schooltool.org/Olson_20060310_1/Europe/London', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/London
+X-LIC-LOCATION:Europe/London
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:BST
+DTSTART:19700329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Dublin' : ('/schooltool.org/Olson_20060310_1/Europe/Dublin', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Dublin
+X-LIC-LOCATION:Europe/Dublin
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:IST
+DTSTART:19700329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Tirane' : ('/schooltool.org/Olson_20060310_1/Europe/Tirane', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Tirane
+X-LIC-LOCATION:Europe/Tirane
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Andorra' : ('/schooltool.org/Olson_20060310_1/Europe/Andorra', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Andorra
+X-LIC-LOCATION:Europe/Andorra
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Vienna' : ('/schooltool.org/Olson_20060310_1/Europe/Vienna', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Vienna
+X-LIC-LOCATION:Europe/Vienna
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Minsk' : ('/schooltool.org/Olson_20060310_1/Europe/Minsk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Minsk
+X-LIC-LOCATION:Europe/Minsk
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Brussels' : ('/schooltool.org/Olson_20060310_1/Europe/Brussels', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Brussels
+X-LIC-LOCATION:Europe/Brussels
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Sofia' : ('/schooltool.org/Olson_20060310_1/Europe/Sofia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Sofia
+X-LIC-LOCATION:Europe/Sofia
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Prague' : ('/schooltool.org/Olson_20060310_1/Europe/Prague', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Prague
+X-LIC-LOCATION:Europe/Prague
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Bratislava' : ('/schooltool.org/Olson_20060310_1/Europe/Bratislava', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Bratislava
+X-LIC-LOCATION:Europe/Bratislava
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Copenhagen' : ('/schooltool.org/Olson_20060310_1/Europe/Copenhagen', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Copenhagen
+X-LIC-LOCATION:Europe/Copenhagen
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Tallinn' : ('/schooltool.org/Olson_20060310_1/Europe/Tallinn', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Tallinn
+X-LIC-LOCATION:Europe/Tallinn
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Helsinki' : ('/schooltool.org/Olson_20060310_1/Europe/Helsinki', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Helsinki
+X-LIC-LOCATION:Europe/Helsinki
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Mariehamn' : ('/schooltool.org/Olson_20060310_1/Europe/Mariehamn', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Mariehamn
+X-LIC-LOCATION:Europe/Mariehamn
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Paris' : ('/schooltool.org/Olson_20060310_1/Europe/Paris', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Paris
+X-LIC-LOCATION:Europe/Paris
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Berlin' : ('/schooltool.org/Olson_20060310_1/Europe/Berlin', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Berlin
+X-LIC-LOCATION:Europe/Berlin
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Gibraltar' : ('/schooltool.org/Olson_20060310_1/Europe/Gibraltar', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Gibraltar
+X-LIC-LOCATION:Europe/Gibraltar
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Athens' : ('/schooltool.org/Olson_20060310_1/Europe/Athens', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Athens
+X-LIC-LOCATION:Europe/Athens
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Budapest' : ('/schooltool.org/Olson_20060310_1/Europe/Budapest', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Budapest
+X-LIC-LOCATION:Europe/Budapest
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Rome' : ('/schooltool.org/Olson_20060310_1/Europe/Rome', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Rome
+X-LIC-LOCATION:Europe/Rome
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/San_Marino' : ('/schooltool.org/Olson_20060310_1/Europe/San_Marino', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/San_Marino
+X-LIC-LOCATION:Europe/San_Marino
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Vatican' : ('/schooltool.org/Olson_20060310_1/Europe/Vatican', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Vatican
+X-LIC-LOCATION:Europe/Vatican
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Riga' : ('/schooltool.org/Olson_20060310_1/Europe/Riga', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Riga
+X-LIC-LOCATION:Europe/Riga
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Vaduz' : ('/schooltool.org/Olson_20060310_1/Europe/Vaduz', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Vaduz
+X-LIC-LOCATION:Europe/Vaduz
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Vilnius' : ('/schooltool.org/Olson_20060310_1/Europe/Vilnius', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Vilnius
+X-LIC-LOCATION:Europe/Vilnius
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Luxembourg' : ('/schooltool.org/Olson_20060310_1/Europe/Luxembourg', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Luxembourg
+X-LIC-LOCATION:Europe/Luxembourg
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Malta' : ('/schooltool.org/Olson_20060310_1/Europe/Malta', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Malta
+X-LIC-LOCATION:Europe/Malta
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Chisinau' : ('/schooltool.org/Olson_20060310_1/Europe/Chisinau', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Chisinau
+X-LIC-LOCATION:Europe/Chisinau
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Monaco' : ('/schooltool.org/Olson_20060310_1/Europe/Monaco', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Monaco
+X-LIC-LOCATION:Europe/Monaco
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Amsterdam' : ('/schooltool.org/Olson_20060310_1/Europe/Amsterdam', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Amsterdam
+X-LIC-LOCATION:Europe/Amsterdam
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Oslo' : ('/schooltool.org/Olson_20060310_1/Europe/Oslo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Oslo
+X-LIC-LOCATION:Europe/Oslo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Warsaw' : ('/schooltool.org/Olson_20060310_1/Europe/Warsaw', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Warsaw
+X-LIC-LOCATION:Europe/Warsaw
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Lisbon' : ('/schooltool.org/Olson_20060310_1/Europe/Lisbon', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Lisbon
+X-LIC-LOCATION:Europe/Lisbon
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0000
+TZNAME:WET
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0100
+TZNAME:WEST
+DTSTART:19700329T010000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Europe/Bucharest' : ('/schooltool.org/Olson_20060310_1/Europe/Bucharest', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Bucharest
+X-LIC-LOCATION:Europe/Bucharest
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Kaliningrad' : ('/schooltool.org/Olson_20060310_1/Europe/Kaliningrad', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Kaliningrad
+X-LIC-LOCATION:Europe/Kaliningrad
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Moscow' : ('/schooltool.org/Olson_20060310_1/Europe/Moscow', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Moscow
+X-LIC-LOCATION:Europe/Moscow
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0400
+TZNAME:MSD
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0300
+TZNAME:MSK
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Samara' : ('/schooltool.org/Olson_20060310_1/Europe/Samara', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Samara
+X-LIC-LOCATION:Europe/Samara
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0400
+TZOFFSETTO:+0500
+TZNAME:SAMST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0500
+TZOFFSETTO:+0400
+TZNAME:SAMT
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Belgrade' : ('/schooltool.org/Olson_20060310_1/Europe/Belgrade', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Belgrade
+X-LIC-LOCATION:Europe/Belgrade
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Zagreb' : ('/schooltool.org/Olson_20060310_1/Europe/Zagreb', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Zagreb
+X-LIC-LOCATION:Europe/Zagreb
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Skopje' : ('/schooltool.org/Olson_20060310_1/Europe/Skopje', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Skopje
+X-LIC-LOCATION:Europe/Skopje
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Sarajevo' : ('/schooltool.org/Olson_20060310_1/Europe/Sarajevo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Sarajevo
+X-LIC-LOCATION:Europe/Sarajevo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Ljubljana' : ('/schooltool.org/Olson_20060310_1/Europe/Ljubljana', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Ljubljana
+X-LIC-LOCATION:Europe/Ljubljana
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Madrid' : ('/schooltool.org/Olson_20060310_1/Europe/Madrid', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Madrid
+X-LIC-LOCATION:Europe/Madrid
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Stockholm' : ('/schooltool.org/Olson_20060310_1/Europe/Stockholm', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Stockholm
+X-LIC-LOCATION:Europe/Stockholm
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Zurich' : ('/schooltool.org/Olson_20060310_1/Europe/Zurich', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Zurich
+X-LIC-LOCATION:Europe/Zurich
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Istanbul' : ('/schooltool.org/Olson_20060310_1/Europe/Istanbul', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Istanbul
+X-LIC-LOCATION:Europe/Istanbul
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Kiev' : ('/schooltool.org/Olson_20060310_1/Europe/Kiev', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Kiev
+X-LIC-LOCATION:Europe/Kiev
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Uzhgorod' : ('/schooltool.org/Olson_20060310_1/Europe/Uzhgorod', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Uzhgorod
+X-LIC-LOCATION:Europe/Uzhgorod
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Zaporozhye' : ('/schooltool.org/Olson_20060310_1/Europe/Zaporozhye', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Zaporozhye
+X-LIC-LOCATION:Europe/Zaporozhye
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Europe/Simferopol' : ('/schooltool.org/Olson_20060310_1/Europe/Simferopol', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Europe/Simferopol
+X-LIC-LOCATION:Europe/Simferopol
+BEGIN:STANDARD
+TZOFFSETFROM:+0300
+TZOFFSETTO:+0200
+TZNAME:EET
+DTSTART:19701025T040000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+TZNAME:EEST
+DTSTART:19700329T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Australia/Darwin' : ('/schooltool.org/Olson_20060310_1/Australia/Darwin', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Darwin
+X-LIC-LOCATION:Australia/Darwin
+BEGIN:STANDARD
+TZOFFSETFROM:+0930
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Perth' : ('/schooltool.org/Olson_20060310_1/Australia/Perth', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Perth
+X-LIC-LOCATION:Australia/Perth
+BEGIN:STANDARD
+TZOFFSETFROM:+0800
+TZOFFSETTO:+0800
+TZNAME:WST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Brisbane' : ('/schooltool.org/Olson_20060310_1/Australia/Brisbane', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Brisbane
+X-LIC-LOCATION:Australia/Brisbane
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Lindeman' : ('/schooltool.org/Olson_20060310_1/Australia/Lindeman', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Lindeman
+X-LIC-LOCATION:Australia/Lindeman
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Adelaide' : ('/schooltool.org/Olson_20060310_1/Australia/Adelaide', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Adelaide
+X-LIC-LOCATION:Australia/Adelaide
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0930
+TZOFFSETTO:+1030
+TZNAME:CST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0930
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Hobart' : ('/schooltool.org/Olson_20060310_1/Australia/Hobart', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Hobart
+X-LIC-LOCATION:Australia/Hobart
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19701004T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Currie' : ('/schooltool.org/Olson_20060310_1/Australia/Currie', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Currie
+X-LIC-LOCATION:Australia/Currie
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19701004T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Melbourne' : ('/schooltool.org/Olson_20060310_1/Australia/Melbourne', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Melbourne
+X-LIC-LOCATION:Australia/Melbourne
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Sydney' : ('/schooltool.org/Olson_20060310_1/Australia/Sydney', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Sydney
+X-LIC-LOCATION:Australia/Sydney
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1100
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:EST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Broken_Hill' : ('/schooltool.org/Olson_20060310_1/Australia/Broken_Hill', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Broken_Hill
+X-LIC-LOCATION:Australia/Broken_Hill
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0930
+TZOFFSETTO:+1030
+TZNAME:CST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0930
+TZOFFSETTO:+0930
+TZNAME:CST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Australia/Lord_Howe' : ('/schooltool.org/Olson_20060310_1/Australia/Lord_Howe', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Australia/Lord_Howe
+X-LIC-LOCATION:Australia/Lord_Howe
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1030
+TZOFFSETTO:+1100
+TZNAME:LHST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1030
+TZOFFSETTO:+1030
+TZNAME:LHST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Rarotonga' : ('/schooltool.org/Olson_20060310_1/Pacific/Rarotonga', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Rarotonga
+X-LIC-LOCATION:Pacific/Rarotonga
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:CKT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Fiji' : ('/schooltool.org/Olson_20060310_1/Pacific/Fiji', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Fiji
+X-LIC-LOCATION:Pacific/Fiji
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:FJT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Gambier' : ('/schooltool.org/Olson_20060310_1/Pacific/Gambier', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Gambier
+X-LIC-LOCATION:Pacific/Gambier
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0900
+TZNAME:GAMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Marquesas' : ('/schooltool.org/Olson_20060310_1/Pacific/Marquesas', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Marquesas
+X-LIC-LOCATION:Pacific/Marquesas
+BEGIN:STANDARD
+TZOFFSETFROM:-0930
+TZOFFSETTO:-0930
+TZNAME:MART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Tahiti' : ('/schooltool.org/Olson_20060310_1/Pacific/Tahiti', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Tahiti
+X-LIC-LOCATION:Pacific/Tahiti
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:TAHT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Guam' : ('/schooltool.org/Olson_20060310_1/Pacific/Guam', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Guam
+X-LIC-LOCATION:Pacific/Guam
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:ChST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Tarawa' : ('/schooltool.org/Olson_20060310_1/Pacific/Tarawa', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Tarawa
+X-LIC-LOCATION:Pacific/Tarawa
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:GILT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Enderbury' : ('/schooltool.org/Olson_20060310_1/Pacific/Enderbury', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Enderbury
+X-LIC-LOCATION:Pacific/Enderbury
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1300
+TZNAME:PHOT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Kiritimati' : ('/schooltool.org/Olson_20060310_1/Pacific/Kiritimati', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Kiritimati
+X-LIC-LOCATION:Pacific/Kiritimati
+BEGIN:STANDARD
+TZOFFSETFROM:+1400
+TZOFFSETTO:+1400
+TZNAME:LINT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Saipan' : ('/schooltool.org/Olson_20060310_1/Pacific/Saipan', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Saipan
+X-LIC-LOCATION:Pacific/Saipan
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:ChST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Majuro' : ('/schooltool.org/Olson_20060310_1/Pacific/Majuro', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Majuro
+X-LIC-LOCATION:Pacific/Majuro
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:MHT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Kwajalein' : ('/schooltool.org/Olson_20060310_1/Pacific/Kwajalein', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Kwajalein
+X-LIC-LOCATION:Pacific/Kwajalein
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:MHT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Truk' : ('/schooltool.org/Olson_20060310_1/Pacific/Truk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Truk
+X-LIC-LOCATION:Pacific/Truk
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:TRUT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Ponape' : ('/schooltool.org/Olson_20060310_1/Pacific/Ponape', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Ponape
+X-LIC-LOCATION:Pacific/Ponape
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:PONT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Kosrae' : ('/schooltool.org/Olson_20060310_1/Pacific/Kosrae', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Kosrae
+X-LIC-LOCATION:Pacific/Kosrae
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:KOST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Nauru' : ('/schooltool.org/Olson_20060310_1/Pacific/Nauru', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Nauru
+X-LIC-LOCATION:Pacific/Nauru
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:NRT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Noumea' : ('/schooltool.org/Olson_20060310_1/Pacific/Noumea', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Noumea
+X-LIC-LOCATION:Pacific/Noumea
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:NCT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Auckland' : ('/schooltool.org/Olson_20060310_1/Pacific/Auckland', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Auckland
+X-LIC-LOCATION:Pacific/Auckland
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+TZNAME:NZST
+DTSTART:19700315T030000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1300
+TZNAME:NZDT
+DTSTART:19701004T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Pacific/Chatham' : ('/schooltool.org/Olson_20060310_1/Pacific/Chatham', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Chatham
+X-LIC-LOCATION:Pacific/Chatham
+BEGIN:STANDARD
+TZOFFSETFROM:+1345
+TZOFFSETTO:+1245
+TZNAME:CHAST
+DTSTART:19700315T034500
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+1245
+TZOFFSETTO:+1345
+TZNAME:CHADT
+DTSTART:19701004T024500
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'Pacific/Niue' : ('/schooltool.org/Olson_20060310_1/Pacific/Niue', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Niue
+X-LIC-LOCATION:Pacific/Niue
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:NUT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Norfolk' : ('/schooltool.org/Olson_20060310_1/Pacific/Norfolk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Norfolk
+X-LIC-LOCATION:Pacific/Norfolk
+BEGIN:STANDARD
+TZOFFSETFROM:+1130
+TZOFFSETTO:+1130
+TZNAME:NFT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Palau' : ('/schooltool.org/Olson_20060310_1/Pacific/Palau', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Palau
+X-LIC-LOCATION:Pacific/Palau
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:PWT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Port_Moresby' : ('/schooltool.org/Olson_20060310_1/Pacific/Port_Moresby', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Port_Moresby
+X-LIC-LOCATION:Pacific/Port_Moresby
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+TZOFFSETTO:+1000
+TZNAME:PGT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Pitcairn' : ('/schooltool.org/Olson_20060310_1/Pacific/Pitcairn', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Pitcairn
+X-LIC-LOCATION:Pacific/Pitcairn
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Pago_Pago' : ('/schooltool.org/Olson_20060310_1/Pacific/Pago_Pago', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Pago_Pago
+X-LIC-LOCATION:Pacific/Pago_Pago
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:SST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Apia' : ('/schooltool.org/Olson_20060310_1/Pacific/Apia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Apia
+X-LIC-LOCATION:Pacific/Apia
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:WST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Guadalcanal' : ('/schooltool.org/Olson_20060310_1/Pacific/Guadalcanal', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Guadalcanal
+X-LIC-LOCATION:Pacific/Guadalcanal
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:SBT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Fakaofo' : ('/schooltool.org/Olson_20060310_1/Pacific/Fakaofo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Fakaofo
+X-LIC-LOCATION:Pacific/Fakaofo
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:TKT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Tongatapu' : ('/schooltool.org/Olson_20060310_1/Pacific/Tongatapu', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Tongatapu
+X-LIC-LOCATION:Pacific/Tongatapu
+BEGIN:STANDARD
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1300
+TZNAME:TOT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Funafuti' : ('/schooltool.org/Olson_20060310_1/Pacific/Funafuti', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Funafuti
+X-LIC-LOCATION:Pacific/Funafuti
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:TVT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Johnston' : ('/schooltool.org/Olson_20060310_1/Pacific/Johnston', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Johnston
+X-LIC-LOCATION:Pacific/Johnston
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:HST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Midway' : ('/schooltool.org/Olson_20060310_1/Pacific/Midway', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Midway
+X-LIC-LOCATION:Pacific/Midway
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:SST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Wake' : ('/schooltool.org/Olson_20060310_1/Pacific/Wake', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Wake
+X-LIC-LOCATION:Pacific/Wake
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:WAKT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Efate' : ('/schooltool.org/Olson_20060310_1/Pacific/Efate', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Efate
+X-LIC-LOCATION:Pacific/Efate
+BEGIN:STANDARD
+TZOFFSETFROM:+1100
+TZOFFSETTO:+1100
+TZNAME:VUT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Wallis' : ('/schooltool.org/Olson_20060310_1/Pacific/Wallis', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Wallis
+X-LIC-LOCATION:Pacific/Wallis
+BEGIN:STANDARD
+TZOFFSETFROM:+1200
+TZOFFSETTO:+1200
+TZNAME:WFT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Honolulu' : ('/schooltool.org/Olson_20060310_1/Pacific/Honolulu', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Honolulu
+X-LIC-LOCATION:Pacific/Honolulu
+BEGIN:STANDARD
+TZOFFSETFROM:-1000
+TZOFFSETTO:-1000
+TZNAME:HST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Easter' : ('/schooltool.org/Olson_20060310_1/Pacific/Easter', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Easter
+X-LIC-LOCATION:Pacific/Easter
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:EASST
+DTSTART:19701010T220000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SA
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:EAST
+DTSTART:19700314T220000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SA
+END:STANDARD
+END:VTIMEZONE'''),
+'Pacific/Galapagos' : ('/schooltool.org/Olson_20060310_1/Pacific/Galapagos', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Pacific/Galapagos
+X-LIC-LOCATION:Pacific/Galapagos
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:GALT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Danmarkshavn' : ('/schooltool.org/Olson_20060310_1/America/Danmarkshavn', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Danmarkshavn
+X-LIC-LOCATION:America/Danmarkshavn
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:+0000
+TZNAME:GMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Scoresbysund' : ('/schooltool.org/Olson_20060310_1/America/Scoresbysund', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Scoresbysund
+X-LIC-LOCATION:America/Scoresbysund
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0100
+TZOFFSETTO:+0000
+TZNAME:EGST
+DTSTART:19700329T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0000
+TZOFFSETTO:-0100
+TZNAME:EGT
+DTSTART:19701025T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Godthab' : ('/schooltool.org/Olson_20060310_1/America/Godthab', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Godthab
+X-LIC-LOCATION:America/Godthab
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:WGST
+DTSTART:19700328T220000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:WGT
+DTSTART:19701024T230000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Thule' : ('/schooltool.org/Olson_20060310_1/America/Thule', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Thule
+X-LIC-LOCATION:America/Thule
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/New_York' : ('/schooltool.org/Olson_20060310_1/America/New_York', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/New_York
+X-LIC-LOCATION:America/New_York
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Chicago' : ('/schooltool.org/Olson_20060310_1/America/Chicago', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Chicago
+X-LIC-LOCATION:America/Chicago
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Denver' : ('/schooltool.org/Olson_20060310_1/America/Denver', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Denver
+X-LIC-LOCATION:America/Denver
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Shiprock' : ('/schooltool.org/Olson_20060310_1/America/Shiprock', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Shiprock
+X-LIC-LOCATION:America/Shiprock
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Los_Angeles' : ('/schooltool.org/Olson_20060310_1/America/Los_Angeles', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Los_Angeles
+X-LIC-LOCATION:America/Los_Angeles
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Juneau' : ('/schooltool.org/Olson_20060310_1/America/Juneau', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Juneau
+X-LIC-LOCATION:America/Juneau
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Yakutat' : ('/schooltool.org/Olson_20060310_1/America/Yakutat', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Yakutat
+X-LIC-LOCATION:America/Yakutat
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Anchorage' : ('/schooltool.org/Olson_20060310_1/America/Anchorage', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Anchorage
+X-LIC-LOCATION:America/Anchorage
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Nome' : ('/schooltool.org/Olson_20060310_1/America/Nome', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Nome
+X-LIC-LOCATION:America/Nome
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0900
+TZOFFSETTO:-0800
+TZNAME:AKDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0900
+TZNAME:AKST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Adak' : ('/schooltool.org/Olson_20060310_1/America/Adak', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Adak
+X-LIC-LOCATION:America/Adak
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-1000
+TZOFFSETTO:-0900
+TZNAME:HADT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0900
+TZOFFSETTO:-1000
+TZNAME:HAST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Phoenix' : ('/schooltool.org/Olson_20060310_1/America/Phoenix', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Phoenix
+X-LIC-LOCATION:America/Phoenix
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Boise' : ('/schooltool.org/Olson_20060310_1/America/Boise', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Boise
+X-LIC-LOCATION:America/Boise
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Detroit' : ('/schooltool.org/Olson_20060310_1/America/Detroit', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Detroit
+X-LIC-LOCATION:America/Detroit
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Menominee' : ('/schooltool.org/Olson_20060310_1/America/Menominee', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Menominee
+X-LIC-LOCATION:America/Menominee
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/St_Johns' : ('/schooltool.org/Olson_20060310_1/America/St_Johns', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/St_Johns
+X-LIC-LOCATION:America/St_Johns
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0330
+TZOFFSETTO:-0230
+TZNAME:NDT
+DTSTART:19700405T000100
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0230
+TZOFFSETTO:-0330
+TZNAME:NST
+DTSTART:19701025T000100
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Goose_Bay' : ('/schooltool.org/Olson_20060310_1/America/Goose_Bay', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Goose_Bay
+X-LIC-LOCATION:America/Goose_Bay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19700405T000100
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19701025T000100
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Halifax' : ('/schooltool.org/Olson_20060310_1/America/Halifax', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Halifax
+X-LIC-LOCATION:America/Halifax
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Glace_Bay' : ('/schooltool.org/Olson_20060310_1/America/Glace_Bay', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Glace_Bay
+X-LIC-LOCATION:America/Glace_Bay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:ADT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Montreal' : ('/schooltool.org/Olson_20060310_1/America/Montreal', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Montreal
+X-LIC-LOCATION:America/Montreal
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Toronto' : ('/schooltool.org/Olson_20060310_1/America/Toronto', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Toronto
+X-LIC-LOCATION:America/Toronto
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Thunder_Bay' : ('/schooltool.org/Olson_20060310_1/America/Thunder_Bay', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Thunder_Bay
+X-LIC-LOCATION:America/Thunder_Bay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Nipigon' : ('/schooltool.org/Olson_20060310_1/America/Nipigon', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Nipigon
+X-LIC-LOCATION:America/Nipigon
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Rainy_River' : ('/schooltool.org/Olson_20060310_1/America/Rainy_River', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Rainy_River
+X-LIC-LOCATION:America/Rainy_River
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Winnipeg' : ('/schooltool.org/Olson_20060310_1/America/Winnipeg', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Winnipeg
+X-LIC-LOCATION:America/Winnipeg
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701101T030000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Regina' : ('/schooltool.org/Olson_20060310_1/America/Regina', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Regina
+X-LIC-LOCATION:America/Regina
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Swift_Current' : ('/schooltool.org/Olson_20060310_1/America/Swift_Current', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Swift_Current
+X-LIC-LOCATION:America/Swift_Current
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Edmonton' : ('/schooltool.org/Olson_20060310_1/America/Edmonton', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Edmonton
+X-LIC-LOCATION:America/Edmonton
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Vancouver' : ('/schooltool.org/Olson_20060310_1/America/Vancouver', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Vancouver
+X-LIC-LOCATION:America/Vancouver
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Dawson_Creek' : ('/schooltool.org/Olson_20060310_1/America/Dawson_Creek', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Dawson_Creek
+X-LIC-LOCATION:America/Dawson_Creek
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Pangnirtung' : ('/schooltool.org/Olson_20060310_1/America/Pangnirtung', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Pangnirtung
+X-LIC-LOCATION:America/Pangnirtung
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Iqaluit' : ('/schooltool.org/Olson_20060310_1/America/Iqaluit', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Iqaluit
+X-LIC-LOCATION:America/Iqaluit
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Coral_Harbour' : ('/schooltool.org/Olson_20060310_1/America/Coral_Harbour', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Coral_Harbour
+X-LIC-LOCATION:America/Coral_Harbour
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Rankin_Inlet' : ('/schooltool.org/Olson_20060310_1/America/Rankin_Inlet', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Rankin_Inlet
+X-LIC-LOCATION:America/Rankin_Inlet
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Cambridge_Bay' : ('/schooltool.org/Olson_20060310_1/America/Cambridge_Bay', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Cambridge_Bay
+X-LIC-LOCATION:America/Cambridge_Bay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Yellowknife' : ('/schooltool.org/Olson_20060310_1/America/Yellowknife', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Yellowknife
+X-LIC-LOCATION:America/Yellowknife
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Inuvik' : ('/schooltool.org/Olson_20060310_1/America/Inuvik', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Inuvik
+X-LIC-LOCATION:America/Inuvik
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Whitehorse' : ('/schooltool.org/Olson_20060310_1/America/Whitehorse', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Whitehorse
+X-LIC-LOCATION:America/Whitehorse
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Dawson' : ('/schooltool.org/Olson_20060310_1/America/Dawson', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Dawson
+X-LIC-LOCATION:America/Dawson
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Cancun' : ('/schooltool.org/Olson_20060310_1/America/Cancun', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Cancun
+X-LIC-LOCATION:America/Cancun
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Merida' : ('/schooltool.org/Olson_20060310_1/America/Merida', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Merida
+X-LIC-LOCATION:America/Merida
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Monterrey' : ('/schooltool.org/Olson_20060310_1/America/Monterrey', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Monterrey
+X-LIC-LOCATION:America/Monterrey
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Mexico_City' : ('/schooltool.org/Olson_20060310_1/America/Mexico_City', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Mexico_City
+X-LIC-LOCATION:America/Mexico_City
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Chihuahua' : ('/schooltool.org/Olson_20060310_1/America/Chihuahua', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Chihuahua
+X-LIC-LOCATION:America/Chihuahua
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Hermosillo' : ('/schooltool.org/Olson_20060310_1/America/Hermosillo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Hermosillo
+X-LIC-LOCATION:America/Hermosillo
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Mazatlan' : ('/schooltool.org/Olson_20060310_1/America/Mazatlan', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Mazatlan
+X-LIC-LOCATION:America/Mazatlan
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0600
+TZNAME:MDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0700
+TZNAME:MST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Tijuana' : ('/schooltool.org/Olson_20060310_1/America/Tijuana', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Tijuana
+X-LIC-LOCATION:America/Tijuana
+BEGIN:STANDARD
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+TZNAME:PST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+TZNAME:PDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Anguilla' : ('/schooltool.org/Olson_20060310_1/America/Anguilla', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Anguilla
+X-LIC-LOCATION:America/Anguilla
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Antigua' : ('/schooltool.org/Olson_20060310_1/America/Antigua', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Antigua
+X-LIC-LOCATION:America/Antigua
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Nassau' : ('/schooltool.org/Olson_20060310_1/America/Nassau', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Nassau
+X-LIC-LOCATION:America/Nassau
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Barbados' : ('/schooltool.org/Olson_20060310_1/America/Barbados', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Barbados
+X-LIC-LOCATION:America/Barbados
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Belize' : ('/schooltool.org/Olson_20060310_1/America/Belize', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Belize
+X-LIC-LOCATION:America/Belize
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Cayman' : ('/schooltool.org/Olson_20060310_1/America/Cayman', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Cayman
+X-LIC-LOCATION:America/Cayman
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Costa_Rica' : ('/schooltool.org/Olson_20060310_1/America/Costa_Rica', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Costa_Rica
+X-LIC-LOCATION:America/Costa_Rica
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Havana' : ('/schooltool.org/Olson_20060310_1/America/Havana', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Havana
+X-LIC-LOCATION:America/Havana
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:CST
+DTSTART:19701025T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:CDT
+DTSTART:19700405T000000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Dominica' : ('/schooltool.org/Olson_20060310_1/America/Dominica', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Dominica
+X-LIC-LOCATION:America/Dominica
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Santo_Domingo' : ('/schooltool.org/Olson_20060310_1/America/Santo_Domingo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Santo_Domingo
+X-LIC-LOCATION:America/Santo_Domingo
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/El_Salvador' : ('/schooltool.org/Olson_20060310_1/America/El_Salvador', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/El_Salvador
+X-LIC-LOCATION:America/El_Salvador
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Grenada' : ('/schooltool.org/Olson_20060310_1/America/Grenada', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Grenada
+X-LIC-LOCATION:America/Grenada
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Guadeloupe' : ('/schooltool.org/Olson_20060310_1/America/Guadeloupe', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Guadeloupe
+X-LIC-LOCATION:America/Guadeloupe
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Guatemala' : ('/schooltool.org/Olson_20060310_1/America/Guatemala', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Guatemala
+X-LIC-LOCATION:America/Guatemala
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Port-au-Prince' : ('/schooltool.org/Olson_20060310_1/America/Port-au-Prince', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Port-au-Prince
+X-LIC-LOCATION:America/Port-au-Prince
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Tegucigalpa' : ('/schooltool.org/Olson_20060310_1/America/Tegucigalpa', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Tegucigalpa
+X-LIC-LOCATION:America/Tegucigalpa
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Jamaica' : ('/schooltool.org/Olson_20060310_1/America/Jamaica', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Jamaica
+X-LIC-LOCATION:America/Jamaica
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Martinique' : ('/schooltool.org/Olson_20060310_1/America/Martinique', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Martinique
+X-LIC-LOCATION:America/Martinique
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Montserrat' : ('/schooltool.org/Olson_20060310_1/America/Montserrat', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Montserrat
+X-LIC-LOCATION:America/Montserrat
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Managua' : ('/schooltool.org/Olson_20060310_1/America/Managua', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Managua
+X-LIC-LOCATION:America/Managua
+BEGIN:STANDARD
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Panama' : ('/schooltool.org/Olson_20060310_1/America/Panama', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Panama
+X-LIC-LOCATION:America/Panama
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Puerto_Rico' : ('/schooltool.org/Olson_20060310_1/America/Puerto_Rico', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Puerto_Rico
+X-LIC-LOCATION:America/Puerto_Rico
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/St_Kitts' : ('/schooltool.org/Olson_20060310_1/America/St_Kitts', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/St_Kitts
+X-LIC-LOCATION:America/St_Kitts
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/St_Lucia' : ('/schooltool.org/Olson_20060310_1/America/St_Lucia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/St_Lucia
+X-LIC-LOCATION:America/St_Lucia
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Miquelon' : ('/schooltool.org/Olson_20060310_1/America/Miquelon', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Miquelon
+X-LIC-LOCATION:America/Miquelon
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:PMDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:PMST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/St_Vincent' : ('/schooltool.org/Olson_20060310_1/America/St_Vincent', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/St_Vincent
+X-LIC-LOCATION:America/St_Vincent
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Grand_Turk' : ('/schooltool.org/Olson_20060310_1/America/Grand_Turk', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Grand_Turk
+X-LIC-LOCATION:America/Grand_Turk
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T000000
+RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Tortola' : ('/schooltool.org/Olson_20060310_1/America/Tortola', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Tortola
+X-LIC-LOCATION:America/Tortola
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/St_Thomas' : ('/schooltool.org/Olson_20060310_1/America/St_Thomas', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/St_Thomas
+X-LIC-LOCATION:America/St_Thomas
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Aruba' : ('/schooltool.org/Olson_20060310_1/America/Aruba', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Aruba
+X-LIC-LOCATION:America/Aruba
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/La_Paz' : ('/schooltool.org/Olson_20060310_1/America/La_Paz', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/La_Paz
+X-LIC-LOCATION:America/La_Paz
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:BOT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Noronha' : ('/schooltool.org/Olson_20060310_1/America/Noronha', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Noronha
+X-LIC-LOCATION:America/Noronha
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0200
+TZNAME:FNT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Belem' : ('/schooltool.org/Olson_20060310_1/America/Belem', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Belem
+X-LIC-LOCATION:America/Belem
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Fortaleza' : ('/schooltool.org/Olson_20060310_1/America/Fortaleza', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Fortaleza
+X-LIC-LOCATION:America/Fortaleza
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Recife' : ('/schooltool.org/Olson_20060310_1/America/Recife', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Recife
+X-LIC-LOCATION:America/Recife
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Araguaina' : ('/schooltool.org/Olson_20060310_1/America/Araguaina', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Araguaina
+X-LIC-LOCATION:America/Araguaina
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Maceio' : ('/schooltool.org/Olson_20060310_1/America/Maceio', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Maceio
+X-LIC-LOCATION:America/Maceio
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Bahia' : ('/schooltool.org/Olson_20060310_1/America/Bahia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Bahia
+X-LIC-LOCATION:America/Bahia
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Sao_Paulo' : ('/schooltool.org/Olson_20060310_1/America/Sao_Paulo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Sao_Paulo
+X-LIC-LOCATION:America/Sao_Paulo
+BEGIN:STANDARD
+TZOFFSETFROM:-0200
+TZOFFSETTO:-0300
+TZNAME:BRT
+DTSTART:19700215T000000
+RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0200
+TZNAME:BRST
+DTSTART:19701018T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=3SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Campo_Grande' : ('/schooltool.org/Olson_20060310_1/America/Campo_Grande', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Campo_Grande
+X-LIC-LOCATION:America/Campo_Grande
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19700215T000000
+RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:19701018T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=3SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Cuiaba' : ('/schooltool.org/Olson_20060310_1/America/Cuiaba', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Cuiaba
+X-LIC-LOCATION:America/Cuiaba
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19700215T000000
+RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=3SU
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:AMST
+DTSTART:19701018T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=3SU
+END:DAYLIGHT
+END:VTIMEZONE'''),
+'America/Porto_Velho' : ('/schooltool.org/Olson_20060310_1/America/Porto_Velho', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Porto_Velho
+X-LIC-LOCATION:America/Porto_Velho
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Boa_Vista' : ('/schooltool.org/Olson_20060310_1/America/Boa_Vista', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Boa_Vista
+X-LIC-LOCATION:America/Boa_Vista
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Manaus' : ('/schooltool.org/Olson_20060310_1/America/Manaus', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Manaus
+X-LIC-LOCATION:America/Manaus
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AMT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Eirunepe' : ('/schooltool.org/Olson_20060310_1/America/Eirunepe', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Eirunepe
+X-LIC-LOCATION:America/Eirunepe
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:ACT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Rio_Branco' : ('/schooltool.org/Olson_20060310_1/America/Rio_Branco', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Rio_Branco
+X-LIC-LOCATION:America/Rio_Branco
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:ACT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Santiago' : ('/schooltool.org/Olson_20060310_1/America/Santiago', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Santiago
+X-LIC-LOCATION:America/Santiago
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:CLST
+DTSTART:19701011T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:CLT
+DTSTART:19700315T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Bogota' : ('/schooltool.org/Olson_20060310_1/America/Bogota', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Bogota
+X-LIC-LOCATION:America/Bogota
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:COT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Curacao' : ('/schooltool.org/Olson_20060310_1/America/Curacao', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Curacao
+X-LIC-LOCATION:America/Curacao
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Guayaquil' : ('/schooltool.org/Olson_20060310_1/America/Guayaquil', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Guayaquil
+X-LIC-LOCATION:America/Guayaquil
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:ECT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Cayenne' : ('/schooltool.org/Olson_20060310_1/America/Cayenne', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Cayenne
+X-LIC-LOCATION:America/Cayenne
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:GFT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Guyana' : ('/schooltool.org/Olson_20060310_1/America/Guyana', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Guyana
+X-LIC-LOCATION:America/Guyana
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:GYT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Asuncion' : ('/schooltool.org/Olson_20060310_1/America/Asuncion', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Asuncion
+X-LIC-LOCATION:America/Asuncion
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0300
+TZNAME:PYST
+DTSTART:19701018T000000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=3SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0400
+TZNAME:PYT
+DTSTART:19700308T000000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Lima' : ('/schooltool.org/Olson_20060310_1/America/Lima', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Lima
+X-LIC-LOCATION:America/Lima
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0500
+TZNAME:PET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Paramaribo' : ('/schooltool.org/Olson_20060310_1/America/Paramaribo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Paramaribo
+X-LIC-LOCATION:America/Paramaribo
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:SRT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Port_of_Spain' : ('/schooltool.org/Olson_20060310_1/America/Port_of_Spain', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Port_of_Spain
+X-LIC-LOCATION:America/Port_of_Spain
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:AST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Montevideo' : ('/schooltool.org/Olson_20060310_1/America/Montevideo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Montevideo
+X-LIC-LOCATION:America/Montevideo
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:UYT
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Caracas' : ('/schooltool.org/Olson_20060310_1/America/Caracas', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Caracas
+X-LIC-LOCATION:America/Caracas
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0400
+TZNAME:VET
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/North_Dakota/Center' : ('/schooltool.org/Olson_20060310_1/America/North_Dakota/Center', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/North_Dakota/Center
+X-LIC-LOCATION:America/North_Dakota/Center
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Indiana/Indianapolis' : ('/schooltool.org/Olson_20060310_1/America/Indiana/Indianapolis', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Indiana/Indianapolis
+X-LIC-LOCATION:America/Indiana/Indianapolis
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Indiana/Marengo' : ('/schooltool.org/Olson_20060310_1/America/Indiana/Marengo', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Indiana/Marengo
+X-LIC-LOCATION:America/Indiana/Marengo
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Indiana/Knox' : ('/schooltool.org/Olson_20060310_1/America/Indiana/Knox', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Indiana/Knox
+X-LIC-LOCATION:America/Indiana/Knox
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+TZOFFSETTO:-0500
+TZNAME:CDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0600
+TZNAME:CST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Indiana/Vevay' : ('/schooltool.org/Olson_20060310_1/America/Indiana/Vevay', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Indiana/Vevay
+X-LIC-LOCATION:America/Indiana/Vevay
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Kentucky/Louisville' : ('/schooltool.org/Olson_20060310_1/America/Kentucky/Louisville', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Kentucky/Louisville
+X-LIC-LOCATION:America/Kentucky/Louisville
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Kentucky/Monticello' : ('/schooltool.org/Olson_20060310_1/America/Kentucky/Monticello', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Kentucky/Monticello
+X-LIC-LOCATION:America/Kentucky/Monticello
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700308T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701101T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/Buenos_Aires' : ('/schooltool.org/Olson_20060310_1/America/Argentina/Buenos_Aires', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/Buenos_Aires
+X-LIC-LOCATION:America/Argentina/Buenos_Aires
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/Cordoba' : ('/schooltool.org/Olson_20060310_1/America/Argentina/Cordoba', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/Cordoba
+X-LIC-LOCATION:America/Argentina/Cordoba
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/Tucuman' : ('/schooltool.org/Olson_20060310_1/America/Argentina/Tucuman', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/Tucuman
+X-LIC-LOCATION:America/Argentina/Tucuman
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/La_Rioja' : ('/schooltool.org/Olson_20060310_1/America/Argentina/La_Rioja', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/La_Rioja
+X-LIC-LOCATION:America/Argentina/La_Rioja
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/San_Juan' : ('/schooltool.org/Olson_20060310_1/America/Argentina/San_Juan', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/San_Juan
+X-LIC-LOCATION:America/Argentina/San_Juan
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/Jujuy' : ('/schooltool.org/Olson_20060310_1/America/Argentina/Jujuy', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/Jujuy
+X-LIC-LOCATION:America/Argentina/Jujuy
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/Catamarca' : ('/schooltool.org/Olson_20060310_1/America/Argentina/Catamarca', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/Catamarca
+X-LIC-LOCATION:America/Argentina/Catamarca
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/Mendoza' : ('/schooltool.org/Olson_20060310_1/America/Argentina/Mendoza', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/Mendoza
+X-LIC-LOCATION:America/Argentina/Mendoza
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/Rio_Gallegos' : ('/schooltool.org/Olson_20060310_1/America/Argentina/Rio_Gallegos', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/Rio_Gallegos
+X-LIC-LOCATION:America/Argentina/Rio_Gallegos
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'America/Argentina/Ushuaia' : ('/schooltool.org/Olson_20060310_1/America/Argentina/Ushuaia', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/America/Argentina/Ushuaia
+X-LIC-LOCATION:America/Argentina/Ushuaia
+BEGIN:STANDARD
+TZOFFSETFROM:-0300
+TZOFFSETTO:-0300
+TZNAME:ART
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE'''),
+'Arctic/Longyearbyen' : ('/schooltool.org/Olson_20060310_1/Arctic/Longyearbyen', '''BEGIN:VTIMEZONE
+TZID:/schooltool.org/Olson_20060310_1/Arctic/Longyearbyen
+X-LIC-LOCATION:Arctic/Longyearbyen
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE'''),
+}


Property changes on: schooltool/branches/upstream/current/src/schooltool/calendar/vcal_dict.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/calendar/vzic.patch
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/calendar/vzic.patch	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/calendar/vzic.patch	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+===================================================================
+--- Makefile                    	(Original)
++++ Makefile	                        (Updated)
+@@ -23,7 +23,7 @@
+ # gets expanded to today's date. There is also a vzic-merge.pl which can be
+ # used to merge changes into a master set of VTIMEZONEs. If a VTIMEZONE has
+ # changed, it bumps the version number on the end of this prefix. */
+-TZID_PREFIX = /myorganization.org/%D_1/
++TZID_PREFIX = /schooltool.org/Olson_%D_1/
+ 
+ # This is what libical-evolution uses.
+ #TZID_PREFIX = /softwarestudio.org/Olson_%D_1/
+--- vzic-dump.c                         	(Original)
++++ vzic-dump.c	                                (Updated)
+@@ -358,11 +358,7 @@
+        them a bit easier. But they don't have entries in the zone.tab file,
+        so we use the entry from the timezone linked from. */
+     zone_name_in_hash = zone_name;
+-    if (!strcmp (zone_name, "America/Indiana/Indianapolis"))
+-      zone_name_in_hash = "America/Indianapolis";
+-    else if (!strcmp (zone_name, "America/Kentucky/Louisville"))
+-      zone_name_in_hash = "America/Louisville";
+-    else if (!strcmp (zone_name, "Asia/Istanbul"))
++     if (!strcmp (zone_name, "Asia/Istanbul"))
+       zone_name_in_hash = "Europe/Istanbul";
+     else if (!strcmp (zone_name, "Europe/Nicosia"))
+       zone_name_in_hash = "Asia/Nicosia";
+--- vzic-output.c                       	(Original)
++++ vzic-output.c                               (Updated)
+@@ -1934,7 +1934,7 @@
+ 		 month + 1);
+       } else {
+ 	printf ("ERROR: %s: Couldn't output RRULE (day=%i) compatable with Outlook\n", CurrentZoneName, day_number);
+-	exit (1);
++	sprintf (buffer, "RRULE:FREQ=YEARLY");
+       }
+     } else {
+ 	sprintf (buffer, "RRULE:FREQ=YEARLY");
+@@ -2120,7 +2120,12 @@
+ 		 month + 1, WeekDays[day_weekday]);
+       } else {
+ 	printf ("ERROR: %s: Couldn't modify RRULE to be compatable with Outlook (day >= %i, month = %i)\n", CurrentZoneName, day_number, month + 1);
+-	exit (1);
++        sprintf (buffer,
++  	       "RRULE:FREQ=YEARLY;BYMONTH=%i;BYMONTHDAY=%i,%i,%i,%i,%i,%i,%i;BYDAY=%s",
++  	       month + 1,
++  	       day_number, day_number + 1, day_number + 2, day_number + 3,
++  	       day_number + 4, day_number + 5, day_number + 6,
++  	       WeekDays[day_weekday]);
+       }
+ 
+     } else {

Added: schooltool/branches/upstream/current/src/schooltool/client.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/client.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/client.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,531 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Schooltool command line client.
+
+$Id: client.py 5230 2005-10-12 19:32:32Z mg $
+"""
+
+import sys
+import getopt
+import socket
+import httplib
+import base64
+from cmd import Cmd
+from StringIO import StringIO
+from xml.sax import make_parser, SAXParseException
+from xml.sax.handler import ContentHandler, feature_namespaces
+
+from schooltool.common import to_unicode, StreamWrapper
+
+__metaclass__ = type
+
+
+class Client(Cmd):
+
+    intro = """\
+SchoolTool client $Id: client.py 5230 2005-10-12 19:32:32Z mg $
+This is free software, covered by the GNU General Public License, and you are
+welcome to change it and/or distribute copies of it under certain conditions.
+"""
+
+    prompt = "SchoolTool> "
+    extra_prompt = "%(what)s> "
+
+    doc_header = "Available commands:"
+    ruler = ""
+
+    server = 'localhost'
+    port = 7001
+    user = None
+    password = ""
+    ssl = False
+    accept = 'text/xml'
+    links = True
+    headers = False
+
+    # Hooks for unit tests.
+    connectionFactory = httplib.HTTPConnection
+    secureConnectionFactory = httplib.HTTPSConnection
+
+    file_hook = file
+    input_hook = raw_input
+
+    def __init__(self, *args, **kw):
+        Cmd.__init__(self, *args, **kw)
+        self._setupPrompt()
+        self.last_data = None
+        self.resources = []
+
+    def _setupPrompt(self):
+        """Sets up the prompt suitable to operating environment.
+
+        Noninteractive sessions (self.stdin is not a tty) get no prompt.
+        Interactive sessions get a coloured prompt if the terminal supports
+        it, or just a simple prompt otherwise.
+        """
+        if not self.stdin.isatty():
+            self.prompt = ""
+            self.extra_prompt = ""
+            self.intro = ""
+        else:
+            try:
+                import curses
+                curses.error
+            except (ImportError, AttributeError):
+                pass
+            else:
+                try:
+                    curses.setupterm()
+                    bold = curses.tigetstr('bold')
+                    normal = curses.tigetstr('sgr0')
+                    if bold:
+                        self.prompt = ("\001%s\002SchoolTool>\001%s\002 "
+                                       % (bold, normal))
+                        self.extra_prompt = ("\001%s\002%%(what)s>\001%s\002 "
+                                             % (bold, normal))
+                except curses.error:
+                    pass
+        # Do this after curses.setupterm()
+        self.stdout = StreamWrapper(self.stdout)
+
+    def emit(self, *args):
+        """Output the arguments.  A hook for tests"""
+        print >> self.stdout, ' '.join(args)
+
+    def postcmd(self, stop, line):
+        """Hook method executed just after a command dispatch is finished."""
+        if not stop:
+            self.emit("")   # make sure there's an empty line between commands
+        return stop
+
+    def emptyline(self):
+        """Called when an empty line is entered in response to the prompt."""
+        pass
+
+    def default(self, line):
+        """This is called when a nonexistent command is invoked."""
+        if line == "EOF":
+            if self.stdin.isatty():
+                self.emit("quit")
+            return self.do_quit(line)
+        else:
+            self.emit("I beg your pardon?")
+
+    def help_help(self):
+        self.emit("This help.")
+
+    def do_quit(self, line):
+        """Exit the client."""
+        return True
+
+    def do_server(self, line):
+        """Set the server to talk to.
+
+        server [server [port [ssl]]]
+        """
+        args = line.split()
+        if args:
+            if len(args) > 3:
+                self.emit("Extra arguments provided")
+                return
+            ssl = False
+            if len(args) > 2:
+                if args[2].upper() == 'SSL':
+                    ssl = True
+                elif args[2].upper() == 'PLAIN':
+                    pass # ssl is already False
+                else:
+                    self.emit("'ssl' or 'plain' expected, got '%s'" % args[2])
+                    return
+            if len(args) > 1:
+                try:
+                    port = int(args[1])
+                except ValueError:
+                    self.emit("Invalid port number")
+                    return
+            else:
+                port = 80
+            self.server = args[0]
+            self.port = port
+            self.ssl = ssl
+            self.do_get("/")
+        else:
+            self.emit(self.server)
+
+    def do_accept(self, line):
+        """Set the accepted content type.
+
+        accept [type]
+        """
+        if line.strip():
+            line = ' '.join(line.split())
+            self.accept = line
+        self.emit(self.accept)
+
+    def do_user(self, line):
+        """Set the user and password to be used with the server.
+
+        user [username [password]]
+
+        Missing password means empty password, missing username means
+        no authentication.
+        """
+        args = line.split(None, 1)
+        if len(args) == 0:
+            self.user = None
+            self.password = ""
+        elif len(args) == 1:
+            self.user = args[0]
+            self.password = ""
+        elif len(args) == 2:
+            self.user = args[0]
+            self.password = args[1]
+        user = self.user
+        if user == None:
+            user = 'Anonymous'
+        self.emit("User %s" % user)
+
+    def _request(self, method, resource, headers=(), body=None,
+                 ignore_data=False):
+        """Perform an HTTP request.
+
+        Displays the response (if it is text/*), stores it for later
+        perusal (see do_save), parses xlinks if the response is text/xml
+        and link parsing is enabled.
+        """
+        # TODO: this big function could use some refactoring
+        self.last_data = None
+        self.resources = []
+        try:
+            if self.ssl:
+                factory = self.secureConnectionFactory
+            else:
+                factory = self.connectionFactory
+            conn = factory(self.server, self.port)
+            self.lastconn = conn # Test hook
+            hdrdict = {}
+            if self.user is not None:
+                data = "%s:%s" % (self.user, self.password)
+                basic = "Basic %s" % base64.encodestring(data).strip()
+                hdrdict['Authorization'] = basic
+            for k, v in headers:
+                hdrdict[k] = v
+            conn.request(method, resource, body, hdrdict)
+            response = conn.getresponse()
+            self.emit("%s %s" % (response.status, response.reason))
+            if ignore_data:
+                data = response.read()
+                conn.close()
+                return
+            ctype = response.getheader('Content-Type',
+                                       'application/octet-stream')
+            if self.headers:
+                for hdr, value in response.getheaders():
+                    self.emit("%s: %s" % (hdr, value))
+                self.emit()
+            else:
+                self.emit("Content-Type: %s" % ctype)
+            self.last_data = data = response.read()
+            conn.close()
+            if not ctype.startswith('text/'):
+                self.emit("Resource is not text, use save <filename>"
+                          " to save it")
+                return
+            self.emit(to_unicode(data))
+            if self.links and ctype.startswith('text/xml'):
+                try:
+                    parser = make_parser()
+                    handler = XLinkHandler()
+                    parser.setContentHandler(handler)
+                    parser.setFeature(feature_namespaces, 1)
+                    parser.parse(StringIO(data))
+                    first = True
+                    for nr, link in enumerate(handler.links):
+                        if 'title' in link:
+                            title = link['title']
+                        else:
+                            title = ""
+
+                        if 'href' in link:
+                            href = link['href']
+                        else:
+                            href = "no href"
+                        try:
+                            self.resources.append(http_join(resource, href))
+                            if first:
+                                self.emit("=" * 50)
+                                first = False
+                            self.emit("%-3d %s (%s)" % (nr + 1, title, href))
+                        except (IndexError, ValueError):
+                            pass
+                except SAXParseException, e:
+                    self.emit("=" * 50)
+                    self.emit("Could not extract links: %s" % e)
+        except socket.error:
+            self.emit('Error: could not connect to %s:%s'
+                      % (self.server, self.port))
+
+    def do_get(self, line):
+        """Get and display a resource from the server.
+
+        get <resource>
+        """
+        args = line.split()
+        if len(args) < 1:
+            self.emit("Resource not provided")
+            return
+        if len(args) > 1:
+            self.emit("Extra arguments provided")
+            return
+        resource = args[0]
+        self._request('GET', resource, [('Accept', self.accept)])
+
+    def _do_put_or_post(self, what, line):
+        """Common implementation of do_put and do_post."""
+        assert what in ('PUT', 'POST')
+        args = line.split()
+        if len(args) < 1:
+            self.emit("Resource not provided")
+            return
+        if len(args) > 2:
+            self.emit("Extra arguments provided")
+            return
+        resource = args[0]
+        content_type = 'text/plain'
+        if len(args) > 1:
+            content_type = args[1]
+        if self.stdin.isatty():
+            self.emit("End data with a line containing just a single period.")
+        data = []
+        prompt = self.extra_prompt % {'what': what}
+        while True:
+            try:
+                row = self.input_hook(prompt)
+            except EOFError:
+                self.emit('Unexpected EOF -- %s aborted' % what)
+                return
+            if row.startswith('.'):
+                if row == '.':
+                    break
+                elif row == '.' * len(row):
+                    row = row[:-1]
+            data.append(row)
+        data.append('')
+        data = '\n'.join(data)
+        self._request(what, resource,
+                      [('Content-Type', content_type),
+                       ('Content-Length', len(data))],
+                      data)
+
+    def do_put(self, line):
+        """Put a resource on the server.
+
+        put <resource> [<content-type>]
+
+        Content-type defaults to text/plain.  The new representation of the
+        resource should be terminated with a line containing just a single
+        period.  If the data contains a line consisting of just periods,
+        prepend it with an additional one that will be stripped automatically.
+        """
+        self._do_put_or_post('PUT', line)
+
+    def do_post(self, line):
+        """Post a resource to the server.
+
+        post <resource> [<content-type>]
+
+        Content-type defaults to text/plain.  The representation of the new
+        resource should be terminated with a line containing just a single
+        period.  If the data contains a line consisting of just periods,
+        prepend it with an additional one that will be stripped automatically.
+        """
+        self._do_put_or_post('POST', line)
+
+    def do_delete(self, line):
+        """Delete a resource from the server.
+
+        delete <resource>
+        """
+        args = line.split()
+        if len(args) < 1:
+            self.emit("Resource not provided")
+            return
+        if len(args) > 1:
+            self.emit("Extra arguments provided")
+            return
+        resource = args[0]
+        self._request('DELETE', resource)
+
+    def do_save(self, line):
+        """Save the last downloaded resource to a file.
+
+        save <filename>
+        """
+        if not line:
+            self.emit("No filename")
+            return
+        filename = line
+        if not self.last_data:
+            self.emit("Perform a get first")
+            return
+        try:
+            f = self.file_hook(filename, 'wb')
+            f.write(self.last_data)
+            f.close()
+        except EnvironmentError, e:
+            self.emit(str(e))
+        else:
+            self.emit("Saved %s: %d bytes" % (filename, len(self.last_data)))
+
+    def do_links(self, line):
+        """Toggle the display of xlinks found in the response.
+
+        links [on|off]
+        """
+        if not line:
+            self.emit(self.links and "on" or "off")
+        elif line.lower() == "on":
+            self.links = True
+        elif line.lower() == "off":
+            self.links = False
+        else:
+            self.emit("'on' or 'off' expected, got '%s'" % line)
+
+    def do_headers(self, line):
+        """Toggle the display of HTTP response headers.
+
+        headers [on|off]
+        """
+        if not line:
+            self.emit(self.headers and "on" or "off")
+        elif line.lower() == "on":
+            self.headers = True
+        elif line.lower() == "off":
+            self.headers = False
+        else:
+            self.emit("'on' or 'off' expected, got '%s'" % line)
+
+    def do_follow(self, line):
+        """Follow the link from the last document.
+
+        follow <nr>
+        """
+        try:
+            link = self.resources[int(line.split()[0])-1]
+            self.do_get(link)
+        except (IndexError, ValueError):
+            self.emit("Wrong link number")
+
+    def do_save_snapshot(self, line):
+        """Save a snapshot of database state.
+
+        Only available in functional tests.
+
+        save_snapshot snapshot1
+        """
+        name = line.strip()
+        if not line:
+            self.emit("Please specify a name.")
+        self._request('GET', '/', [('X-Testing-Save-Snapshot', name)],
+                      ignore_data=True)
+
+    def do_load_snapshot(self, line):
+        """Load a snapshot of database state.
+
+        Only available in functional tests.
+
+        load_snapshot snapshot1
+        """
+        name = line.strip()
+        if not line:
+            self.emit("Please specify a name.")
+            return
+        self._request('GET', '/', [('X-Testing-Load-Snapshot', name)],
+                      ignore_data=True)
+
+
+class XLinkHandler(ContentHandler):
+
+    def __init__(self):
+        self.links = []
+
+    def startElementNS(self, name, qname, attrs):
+        link = {}
+        for namespace, attr in attrs.getNames():
+            if namespace == u"http://www.w3.org/1999/xlink":
+                link[attr] = attrs.get((namespace, attr))
+        if link:
+            self.links.append(link)
+
+
+def http_join(path, rel):
+    """os.path.join for HTTP paths.
+
+    The first argument should be an abs. path, the second argument
+    is a relative path.  Directory names must end with a '/'.
+    """
+
+    if rel.startswith('/'):
+        return rel
+
+    chunks = path.split('/')
+    if chunks[0]:
+        raise ValueError, "The path should be absolute"
+    chunks = chunks[1:-1]
+
+    for chunk in rel.split('/'):
+        if chunk == '..':
+            del chunks[-1]
+        elif chunk == ".":
+            pass
+        elif chunk == '':
+            raise ValueError, "Empty path elements are not allowed"
+        else:
+            chunks.append(chunk)
+    chunks.insert(0, '')
+    return '/'.join(chunks)
+
+
+def main():
+    c = Client()
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], 'h:p:s', ['host=', 'port=',
+                                                           'ssl'])
+    except getopt.error, e:
+        print >> sys.stderr, "%s: %s" % (sys.argv[0], e)
+        sys.exit(1)
+
+    for k, v in opts:
+        if k in ('-h', '--host'):
+            c.server = v
+        if k in ('-p', '--port'):
+            try:
+                c.port = int(v)
+            except ValueError, e:
+                print >> sys.stderr, "%s: invalid port: %s" % (sys.argv[0], v)
+                sys.exit(1)
+        elif k in ('-s', '--ssl'):
+            c.ssl = True
+
+    c.cmdloop()
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/src/schooltool/client.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/BasicComponent.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/BasicComponent.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/BasicComponent.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,250 @@
+=============================================
+Development of the ``Commendation`` Component
+=============================================
+
+The goal of this of the first section is to bootstrap a third-party add-on
+package for SchoolTool and implement a simple initial component.
+
+Creating the Package
+--------------------
+
+The SchoolTool developers recommend that you put any SchoolTool add-on code
+into a package. Furthermore, in order to avoid namespace collisions, you
+should also create a top level package that simply represents you. This could
+be either your common login name or the company you are working for. For
+example, if you work for Tufts University, a good top-level package would be
+``tufts``. Since this documentation is part of the SchoolTool project, I am
+going to use the ``schooltool`` package as my top-level package. Unlike Java,
+the Python community does not use reverse network names, like
+``edu.tufts.dev`` to describe a top-level package name.
+
+A package is simply a directory with a file name ``__init__.py`` in it. So you
+could do the following to create the package::
+
+  $ mkdir tufts
+  $ echo "# Make a package" >> tufts/__init__.py
+
+Clearly, the above instructions are for Un*x/Linux systems. You need to adjust
+the commands as needed for other Operating Systems, such as Windows, either
+using the equivalent command line instructions or the graphical tools to
+create folders and text documents.
+
+Now that you have a top-level package, you create the project package inside
+of it using the same process as above. Naturally, I chose the name
+``commendation`` for the package name. Note that the SchoolTool community
+always uses singular names for package names.
+
+::
+
+  $ cd tufts
+  $ mkdir commendation
+  $ echo "# Make a package" >> commendation/__init__.py
+
+What we are now left with is an empty package that can be imported in Python
+using
+
+  >>> from schooltool import commendation
+
+or
+
+  >>> import schooltool.commendation
+
+(Of course, I am using ``schooltool`` as the top-level package and not
+``tufts`` as described above, because for the purposes of this example this
+implementation actually lives in ``schooltool``.)
+
+
+Development of the ``ICommendation`` Interface
+----------------------------------------------
+
+SchoolTool, using Zope 3 as its development platform, makes heavy use of
+component-based development. The central concept of this development pattern is
+the use of interfaces. Interfaces are like a contract, a promise by an object
+to provide a specified set of methods and attributes. While it is possible to
+not use interfaces and still play nice with SchoolTool, you will probably never
+see objects that do not use interfaces to describe their functionality.
+
+Furthermore, if we take some more time now to create interfaces that contain a
+lot of meta-data, then we can later profit from it. But we have to be patient
+for now. So, in Tom's E-mail he specified the fields he would like to have the
+fields ``title``, ``description``, ``scope``, ``date``, ``grantor``. All
+public interfaces are, by coding convention, placed into a file called
+``interfaces.py``.
+
+Have a look at the ``ICommendation`` interface inside the ``interfaces.py``
+file for the complete interface. Since Python does not support interfaces
+directly in the language, the class statement is used to declare interfaces as
+well, except that an interface must always inherit from
+``zope.interface.Interface`` [#iface]_ somewhere in its inheritance tree. To
+specify fields, we use the ``zope.schema`` package [#schema]_.
+
+The interfaces also serve as API documentation, containing a lot of
+information describing the behavior of the interface's methods and fields. As
+a consequence, we can avoid large, descriptive documentation strings in the
+implementation.
+
+Let me make a couple more comments on the fields in the interface. First of
+all, you can see that all fields are required:
+
+  >>> import zope.schema
+  >>> from schooltool.commendation import interfaces
+  >>> for name, field in zope.schema.getFieldsInOrder(interfaces.ICommendation):
+  ...     print name, field.required
+  title True
+  description True
+  scope True
+  date True
+  grantor True
+
+``Choice`` fields are also special, since they need to define the available
+choices. In this case, we chose the simple method of specifying values
+sequence. However this list is immediately converted to a vocabulary
+
+  >>> [term.value for term in interfaces.ICommendation['scope'].vocabulary]
+  [u'group', u'school-wide', u'community', u'state', u'national', u'global']
+
+Vocabularies are a way to provide dynamic choice lists. In most applications,
+the choices for a given data field change as the application data evolves. For
+example, you might want a field that let's you choose a student. In this case
+you would write a vocabulary that provides a term for each student.
+
+Finally, since it is very important for SchoolTool to be internationalized
+(being able to be translated), we need to tell the system which strings are
+human-readable and must therefore be translatable. Translatable strings are
+known as "messages". We use message factories to create messages. As you can
+see in the interfaces file, message factories are instantiated using an
+argument. This argument is the translation domain [#msgid]_. The message id
+factory *must* be known as ``_``, since the SchoolTool message extraction
+tools look for this name in order to extract the name.
+
+.. [#iface] Read the ``README.txt`` in ``zope.interface`` for a general
+   introduction to interfaces. The other text files in the package are also
+   very useful for more advanced applications of interfaces.
+
+.. [#schema] For more details see the documentation files in ``zope.schema``,
+   especially ``README.txt``.
+
+.. [#msgid] For an introduction to message ids see ``messages.txt`` in
+   ``zope.i18nmessageid``.
+
+
+Implementation of the ``Commendation`` Component
+------------------------------------------------
+
+Now that the interface has been designed, we can write an implementation for
+it. My imlpementation can be found in the ``Commendation`` class of the
+``commendation.py`` file.
+
+Since all fields are required, they must be set during initialization. The
+date and grantor are not passed to the constructor, since they are
+determined. The date is simply extracted from the computer's internal clock
+and the grantor is the user that creates the instance and can be read from the
+system's interaction.
+
+  >>> from zope.security import management, testing
+  >>> management.endInteraction()
+  >>> management.newInteraction(
+  ...     testing.Participation(testing.Principal(u'manager')))
+
+Let's now create a commendation instance:
+
+  >>> from schooltool.commendation import commendation
+  >>> goodjob = commendation.Commendation(
+  ...     u'Good Job!',
+  ...     u'You have done a good job with the latest assignment.',
+  ...     u'school-wide')
+
+  >>> goodjob
+  <Commendation u'Good Job!' by u'manager'>
+
+Another feature of the constructor is that if no interaction and thus grantor
+principal is found, the term ``<unknown>`` is inserted.
+
+  >>> management.endInteraction()
+  >>> commendation.Commendation(
+  ...     u'Well done!', u'Job well done.', u'school-wide')
+  <Commendation u'Well done!' by u'<unknown>'>
+
+Finally you will notice, is the unusual implementation of the fields, which
+are not implemented as simple attributes, but using a special property, called
+the ``FieldProperty``. The field property uses a field to verify the property
+value before setting it. This allows us to enforce the schema fields on the
+Python level. I'll note that the SchoolTool code does not usually implement
+fields this way, though it is very useful and should be used.
+
+For example, the title and description must be unicode strings:
+
+  >>> goodjob.title = 'Well done!'
+  Traceback (most recent call last):
+  ...
+  WrongType: ('Well done!', <type 'unicode'>)
+
+  >>> goodjob.description = 'Job well done!'
+  Traceback (most recent call last):
+  ...
+  WrongType: ('Job well done!', <type 'unicode'>)
+
+Further, since the grantor and date are marked as read-only, you cannot assign
+new values to them:
+
+  >>> goodjob.grantor = u'me'
+  Traceback (most recent call last):
+  ...
+  ValueError: ('grantor', 'field is readonly')
+
+  >>> import datetime
+  >>> goodjob.date = datetime.date.today()
+  Traceback (most recent call last):
+  ...
+  ValueError: ('date', 'field is readonly')
+
+Finally, the choice field of the scope restricts the entries to the ones
+listed in the interface:
+
+  >>> goodjob.scope = u'universe'
+  Traceback (most recent call last):
+  ...
+  ConstraintNotSatisfied: universe
+
+And that's it. Note that the commendation object has no methods, other than
+overriding some builtins. This is very common for content objects, since
+Python is an attribute-centric object-oriented language. Most often adapters
+will implement methods that use and/or manipulate the content component's
+data.
+
+
+Testing the Implementation
+--------------------------
+
+Testing your code is one of the most important tasks of development in
+SchoolTool and the Zope 3 community at large. There are several ways to write
+tests, but we prefer writing documentation-based tests inside text files like
+this one. In fact this file itself is a doctest and all that we have to do is
+to hook it into the test runner system.
+
+Zope 3's test runner will look for modules and packages called ``tests``. If
+``tests`` is a package, it looks inside the directory to find modules having
+the prefix ``test``. Since we only have some relatively simple tests here, we
+only create a module called ``tests``. See the file ``tests.py`` for its
+contents.
+
+As you will see in the file, registering this file as a doctest is a simple
+matter of creating a ``DocFileSuite`` instance that points to this text
+file. Some setup and teardown functions are specified to ensure that the
+component architecture is up and running before the tests are executed. To run
+the tests from your SchoolTool root directory use the following command line::
+
+  $ python test.py -vpu1 -s src/schooltool/commendation/
+
+The output of the test run should look something like this::
+
+  Imported 1 module in 0.254s
+
+     1/1 (100.0%): schooltool/commendation/BasicComponent.txt
+  ----------------------------------------------------------------------
+  Ran 1 test in 0.213s
+
+  OK
+
+It means that the test suite successfully completed. Once this is the case, we
+can proceed with the next set of features.


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/BasicComponent.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/PythonIntegration.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/PythonIntegration.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/PythonIntegration.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,212 @@
+===================================================
+Python-Integration of Commendations into SchoolTool
+===================================================
+
+Now that we have developed the basic commendation component, we have to hook
+up the commendations to the other SchoolTool objects. In his requirement
+E-mail, Tom wrote specifically:
+
+  The overall idea is to allow teachers, clerks and administrators to
+  enter a commendation for a person or group (including sections).
+
+The task of this section will be to attach any amount of commendations to
+persons, groups and sections.
+
+
+The ``Commendations`` container
+-------------------------------
+
+Since we have to be able to associate multiple commendations with a particular
+SchoolTool component, it is necessary to implement a commendations
+container. This is a common pattern in SchoolTool; in other words nearly every
+content component comes with a special container. The first step is to create
+a container interface that only allows commendations to be added; see
+``interfaces.py``.
+
+We also need to tell the ``Commendation`` class that it can only be contained
+by components implementing ``ICommendations``, which is done using the
+interface ``ICommendationContained``. Thus we now ensure that not only the
+container can only contain commendations, but also that the commendations can
+only be added to the commendations container. I will demonstrate the
+constraints, once we have implemented our two new interfaces [#constraints]_.
+
+The ``ICommendationContained`` interface extends ``IContained``, which ensures
+that the component has a parent and name, allowing instances
+of the component to be located and their paths (including URLs) to be
+computed. This interface is simply added to the list of interfaces implemented
+by the``Commendation`` class. Also, as you can see in the code, there exists a
+nice base class called ``Contained`` that implements the ``IContained``
+interface. Now it should not be possible anymore to add commendations to
+arbitrary containers, such as a regular folder:
+
+  >>> from schooltool.commendation import commendation
+  >>> goodjob = commendation.Commendation(
+  ...     u'Good Job!',
+  ...     u'You have done a good job with the latest assignment.',
+  ...     u'school-wide')
+
+  >>> from zope.app.folder import folder
+  >>> from zope.app.container import constraints
+  >>> constraints.checkObject(folder.Folder(), u'goodjob', goodjob)
+  Traceback (most recent call last):
+  ...
+  InvalidContainerType: (<zope.app.folder.folder.Folder ...>,
+                         (<InterfaceClass ...ICommendations>,))
+
+The ``ICommendations`` interface also needs an implementation, since the
+``IContainer`` interface specifies many methods. Luckily there is a great base
+class called ``BTreeContainer`` that we can use, so that our implementation of
+the interface becomes trivial as you can see in ``commendation.py``. This base
+class implements the full ``IContainer`` interface using the ZODB's ``BTree``
+package, which is particularly efficient for large amounts of items. Once a an
+instance of the container is created,
+
+  >>> myCommendations = commendation.Commendations()
+
+you can add commendations
+
+  >>> constraints.checkObject(myCommendations, u'goodjob', goodjob)
+
+but not arbitrary objects:
+
+  >>> constraints.checkObject(myCommendations, u'welldone', object())
+  Traceback (most recent call last):
+  ...
+  InvalidItemType:
+      (<Commendations for None>, <object ...>,
+       (<InterfaceClass schooltool.commendation.interfaces.ICommendation>,))
+
+Again, this is a very common development pattern in SchoolTool for any content
+component. In the next section I will show you how to connect the
+commendations to other components.
+
+.. [#constraints] For the implementation of constraints, which contains
+   several docstring-based doctests, see ``zope.app.container.constraints``.
+
+
+Associating Commendations with SchoolTool Components
+----------------------------------------------------
+
+To connect our commendations to another component, we are using a feature of
+Zope 3 called annotations. Annotations are data connected with a particular
+object. In other words, annotations allow us to associate any data structure
+with a particular object. The data structure itself is known as one
+annotation, and an adapter (``IAnnotations``) is used to manage all
+annotations of an object.
+
+Annotations were developed to help components integrate into a system, such as
+SchoolTool. For example, the core component "Person" only knows about a title
+(full name), username, password, and the photo. But in order to be fully
+functional in SchoolTool, we also need to know demographic information,
+maintanance information (Dublin Core), and even store workflows of the
+person. All this data is implemented using annotations, which are inturn
+accessed by various adapters. Thus, annotations are essential to the
+SchoolTool application and a crucial part of the framework.
+
+Based on Tom's requirement E-mail, we do not just want to allow all components
+to have commendations; instead, only persons, groups and sections should be
+able to have commendations. This is a common problem in SchoolTool and has an
+equally common solution. We are going to use a marker interface called
+``IHaveCommentations`` that will be implemented by all components that can
+have commendations.
+
+So let's say we are given a person component:
+
+  >>> import zope.interface
+  >>> from zope import annotation
+  >>> class Person(object):
+  ...     zope.interface.implements(annotation.interfaces.IAttributeAnnotatable)
+  ...     def __init__(self, id):
+  ...         self.id = id
+  ...
+  ...     def __repr__(self):
+  ...         return 'Person(%r)' %self.id
+
+Now we want to state that this particular class can have commendations. So we
+use the interface pacakge to attach the ``IHaveCommendations`` interface as
+one that is *implemented* by the ``Person`` class.
+
+  >>> import zope.interface
+  >>> from schooltool.commendation import interfaces
+  >>> zope.interface.classImplements(Person, interfaces.IHaveCommendations)
+
+You might wonder, why did he not use the ``implements()`` function inside
+the class directly to specify the interface? The reason is so that you would
+ask yourself this question. I put it there to demonstrate how it will really
+work. The classes, like ``Person``, we want to attach the commendation to,
+already exists and it would be very bad if we would alter the class just to
+assert this interface, since it would create a dependency. The better way to
+do it is using the ``classImplements()`` function, that allows us to assert
+implemented interfaces after the class is created.
+
+Also note that the component must be annotatable, that is, they must implement
+the ``IAttributeAnnotatable`` interface. In this particular case, the person
+is attribute annotatable, which means that the annotations are stored in a
+special attribute of the ``Person`` class instance, which is the most common
+way for storing annotations. All SchoolTool content components implement
+``IAttributeAnnotatable``.
+
+Now that we have a class that can have commendations, we have to write an
+adapter from ``IHaveCommendations`` to ``ICommendations`` that uses the
+annotations. In short, an adapter adapts an object providing a particular
+interface (here ``IHaveCommendations``) to another interface (here
+``ICommendations``). The argument to the adapter is the component that is
+adapted, in our example a ``Person`` class instance [#adapter]_. It does not
+matter whether the adapter is a class or a function, as long as the adapter is
+callable and takes one argument, everything is fine. While it is very common
+to implement adapters using classes, for annotation-based adapters like this
+one, SchoolTool usually uses a function. The function is called
+``getCommendations()`` and is located in ``commmendation.py``. It's only
+responsibility is to get the annotation from the object and return it. If it
+does not exist, it creates the commendations annotation and returns it.
+
+So before we add an annotation to a person, the attribute dictionary looks
+pretty empty:
+
+  >>> person = Person('stephan')
+  >>> person.__dict__
+  {'id': 'stephan'}
+
+Next we register our new adapter function with the component architecture:
+
+  >>> import zope.component
+  >>> from schooltool.commendation import commendation
+  >>> zope.component.provideAdapter(
+  ...     commendation.getCommendations,
+  ...     (interfaces.IHaveCommendations,), interfaces.ICommendations)
+
+Now we can ask the person for its commendations:
+
+  >>> commendations = interfaces.ICommendations(person)
+  >>> commendations
+  <Commendations for Person('stephan')>
+
+Also, note that the adapter has added the annotations attribute to the person
+now:
+
+  >>> sorted(person.__dict__.keys())
+  ['__annotations__', 'id']
+
+We can now create and add commendations to the person:
+
+  >>> commendations['goodjob'] = commendation.Commendation(
+  ...     u'Good Job!',
+  ...     u'You have done a good job with the latest assignment.',
+  ...     u'school-wide')
+
+Even if we look up the adapter again, the commendations will be available:
+
+  >>> sorted(interfaces.ICommendations(person).keys())
+  [u'goodjob']
+
+And that's it. We are now able to define commendations for any external object
+and store them inside annotations. As in the last section, this file itself
+serves as the test for the new code again. I have added just another doc-test
+file suite to the test setup in ``tests.py``.
+
+.. [#adapter] For a good introduction to adapters see the ``human.txt`` in
+   ``zope.interface``. If you feel brave and want to get a good logic training,
+   you can also read ``adapter.txt`` in the same package for a complete
+   description of adapters. Adapters are also discussed in detail in the
+   ``socketexample.txt`` and ``README.txt`` files of the ``zope.component``
+   package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/PythonIntegration.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,120 @@
+========================================
+The Commendation Package (Documentation)
+========================================
+
+The prime purpose of this package is to document the implementation of an
+additional content component in SchoolTool. To motivate the documentation, Tom
+Hoffman, the SchoolTool project manager, will act as the customer for this
+extension, and the protagonist of the writing is the developer fulfilling the
+customer's specifications.
+
+Here is the original E-mail that contains Tom's specifications:
+
+  I think for our sample product documentation, the opposite of our
+  discipline referral system might be simple enough, that is, a
+  commendation system (since no workflow is necessary).
+
+  The overall idea is to allow teachers, clerks and administrators to
+  enter a commendation for a person or group (including sections).
+
+  Commendations are, by definition, public.
+
+  Commendations have the following fields:
+
+  * Scope: [group, school-wide, community, state, national, global]
+  * Grantor
+  * Title
+  * Description
+  * Date
+
+  Users with the proper role should have an "Add commendation" action
+  when they're viewing a person or group.
+
+  If a user or group has a commendation, a "View commendations" action
+  should be visible.
+
+  For the school, a "View commendations" action should present a
+  batched/searchable list of all commendations in reverse chronological
+  order.
+
+Thus, this documentation package will implement a simple commendation
+system. To make the documentation more readible, it is split into four
+sections as outlined below.
+
+
+Outline
+-------
+
+1. Development of the ``Commendation`` Component
+
+   [``BasicComponent.txt``]
+
+   (a) Creating the Package
+   (b) Development of the ``ICommendation`` Interface
+   (c) Implementation of the ``Commendation`` Component
+   (d) Testing the Implementation
+
+2. Python-Integration of Commendations into SchoolTool
+
+   [``PythonIntegration.txt``]
+
+   (a) The ``Commendations`` container
+   (b) Asoociating Commendations with SchoolTool Components
+
+3. System-Integration of Commentations into SchoolTool
+
+   [``SystemIntegration.txt``]
+
+   (a) ZCML Registration of new Components
+   (b) Create an Add and Commendations View
+   (c) Testing Browser UI Code
+
+4. Viewing the Commendations
+
+   [``Viewing.txt``]
+
+   (a) Caching Commendations
+   (b) Searching Commendations
+   (c) School-wide Commendations Overview
+
+
+Using this Tutorial
+-------------------
+
+You may find the structure of this tutorial to be unusual.  Most of the
+developer documentation in the SchoolTool and Zope 3 source code is in the
+form of Python "doctests," and one purpose of this package is to give you
+an introduction to reading and using documentation in this style.
+
+The main narrative documentation is contained in text files, which are
+formatted using a simple, unobtrusive markup language called `ReStructured
+Text`__.  You can read the raw text files without much trouble, or they can
+also easily be more prettily rendered as HTML, PDF or another format.
+
+__ http://docutils.sourceforge.net/rst.html
+
+Included in the narrative text, you will also see examples in the form of
+simulated Python interpreter sessions.  If we wanted to demonstrate
+addition, we could say:
+
+  >>> 2+3
+  5
+
+In addition to being a demonstration which the reader can follow along and
+experiment with in their own Python interpreter, these snippets also function
+as real tests of the behavior of the tested components.  That is, when you run
+the SchoolTool testrunner on this package, the testrunner will input ``2+3``
+into its own virtual Python interpreter, and if the result it gets back is
+not equal to the one listed, i.e., '5', then this will count as a failed test.
+This will help us ensure that this documentation always works with the current
+version of SchoolTool.  It is also an easy way for developers to write
+tests.
+
+To get the most out of this tutorial, you will need to refer back and forth
+between these narrative files and the source code itself.  You also should
+have an instance of SchoolTool running with this package installed.  Further
+documentation and references are available via your SchoolTool server, if you
+switch it into 'devmode.'  In your ``schooltool.conf`` file include a line
+which says "devmode on."  This will add a drop-down menu in the upper right
+hand corner of the page which gives you access to further SchoolTool and
+Zope 3 docs.


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/SystemIntegration.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/SystemIntegration.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/SystemIntegration.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,331 @@
+===================================================
+System-Integration of Commentations into SchoolTool
+===================================================
+
+Now that we have integrated the commendations on the Python level, we need to
+complete this integration in the system. The goal of this section will be to
+make the commendations viewable and addable in the Web UI.
+
+While it is perfectly possible to *configure* SchoolTool components using Python
+directly, it is never done. Instead, there is a special configuration language
+called the Zope Configuration Markup Language, or ZCML. The intention here is
+that the configuration can be easily overridden and changed.  This chapter will
+introduce you to some of the responsibilities and features of ZCML.
+
+By convention, all configuration is placed into a file called
+``configure.zcml``. If your package contains sub-packages, there is a
+``<include package="..." />`` directive that allows you to link in other
+configuration files. You can see that our package also has such a file. Since
+ZCML is a XML dialect, configuration directives are grouped into XML
+namespaces. Short names for the used namespaces inside a configuration file
+are commonly declared in the wrapping ``<configure>`` element as can be seen
+in ``configure.zcml``.
+
+Once the configuration file is created, you need a way to tell the system:
+"Hey, here is a new ZCML file." This is handled by placing a forwarding
+configuration file -- usually called ``<package>-configure.zcml`` -- into a
+special directory; in this case ``SCHOOLTOOL/etc/schooltool-skel``. To
+automate the task, create a ``SETUP.cfg`` file as demonstrated in the
+package. When you type ``make`` or ``python setup.py build``, the forwarding
+configuration file is automatically placed into the aforementioned directory.
+
+
+ZCML Registration of new Components
+-----------------------------------
+
+The primary objective of ZCML is to register components. In the previous
+chapter, we registered our component, the ``IHaveCommendations`` adapter,
+using Python directly. For the final system integration, we register the
+adapter using the ``<adapter>`` directive. Most of its attributes should be
+obvious. The ``trusted`` argument causes the adapted object (in other words
+the context of the adapter) to not be proxied, but the result from calling the
+adapter (in this case the ``Commendations`` instance) will be proxied. This is
+necessary, since there are no security declarations for the annotation
+attribute of the component.
+
+Next we declare the security assignments for the ``Commendation`` and
+``Commendations`` class. Since commendations are public, we allow them to be
+accessible publically. On the other hand, commendations should never be
+editable, so we simple make the commendation API writable only for the
+``schooltool.create`` permission. Note that those settings are true for both
+classes. The ``<content>`` directive is commonly used to make such
+declarations. The ``<allow>`` sub-directives makes the specified attributes
+public for access. If an interface is specified, all fields and methods will
+be made public. The ``<require>`` directive is very similar to the previous
+one, except that it allows one to specify the permission under which the
+attributes are accessible. As you can see, we are using the ``set_schema``
+attribute here, since we want to say that all fields in the given schema are
+only writable with the specified permission.
+
+Finally, we have to tell the system which objects will be able to have
+commendations. This is done by simply asserting the implementation of the
+``IHaveCommendations`` interface on the desired classes. As specified in Tom's
+requirement E-mail, all persons, groups and sections should be able to get
+commendations. Thus, you can see the three ``<class>`` directives with an
+``<implements>`` directive doing exactely that. If you review the previous
+chapter, you will see that we did the same there in Python.
+
+
+Create an Add and Commendations View
+------------------------------------
+
+Now that we have integrated the commendations with the system, we need to
+develop some views. All of the browser-related code will be placed in a newly
+created module called ``browser.py``. The first screen will be the addform,
+which is implemented in the view class called ``CommendationAddView``. Since
+commendations are tucked away in annotations, we cannot use the standard Zope
+3 form machinery for the task without some modifications. In fact, we only
+need to change the methods that convert the input data to the object and
+handle the forwarding to the next screen. Additionally we have to set a couple
+of attributes manually, which usually would be set by the
+``<browser:addform>`` directive.
+
+*Note*: By convention browser-related code is placed in a module called
+ ``browser``. If there is a lot of browser code, a package of the same name is
+ commonly created. This package does not only contain the Python code, but
+ also all other resources, such as icons, templates, etc.
+
+As you can see, the ``CommendationAddView`` class inherits from the
+``AddForm`` class, the standard class for add forms. By specifying the schema
+``ICommendations`` we tell the forms about the fields whose data must be
+collected. This selection can be refined using the ``fieldNames`` attribute,
+which specifies the fields and their order to be displayed. Since we do not
+want the form to ask for the creation date and the author, we only ask for the
+title, description and scope.
+
+Let's now have a look at the methods that are overridden. As you can see in
+the first line of the ``commendation_add.pt`` template -- the page template
+used for the add form -- the ``update()`` method is the first view class
+method that is called. The reson we are overriding it in this case is to
+support the additional "Cancel" button.
+
+  >>> from zope.interface import directlyProvides
+  >>> from zope.traversing.interfaces import IContainmentRoot
+  >>> from schooltool.app import app
+  >>> from zope.event import notify
+  >>> from schooltool.app.interfaces import ApplicationInitializationEvent
+  >>> st = app.SchoolToolApplication()
+  >>> notify(ApplicationInitializationEvent(st))
+  >>> directlyProvides(st, IContainmentRoot)
+
+  >>> from schooltool.person import person
+  >>> st['persons']['sue'] = person.Person('sue', 'Sue')
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest(form={'CANCEL': True})
+
+  >>> from schooltool.commendation import browser
+  >>> from schooltool.commendation.interfaces import ICommendations
+  >>> commendations = ICommendations(st['persons']['sue'])
+  >>> addform = browser.CommendationAddView(commendations, request)
+
+  >>> addform.update()
+  'http://127.0.0.1/persons/sue'
+
+If instead of the "Cancel" button, the "Add" button is clicked, then the
+standard ``update()`` method is used. If all values were correctly input, the
+``create()`` method is called, which must return the created object:
+
+  >>> comm = addform.create(u'good job', u'very good job.', u'group')
+  >>> comm
+  <Commendation u'good job' by u'<unknown>'>
+
+After the commendation is created it is added using the ``add()`` method:
+
+  >>> addform.add(comm)
+  <Commendation u'good job' by u'<unknown>'>
+
+  >>> from schooltool.commendation import interfaces
+  >>> dict(interfaces.ICommendations(st['persons']['sue']).items())
+  {u'Commendation': <Commendation u'good job' by u'<unknown>'>}
+
+As you can see the commendation be returned again. Once the real work is done,
+``nextURL()`` is called to determine the URL to which the page should be
+forwarded.
+
+  >>> addform.nextURL()
+  'http://127.0.0.1/persons/sue'
+
+While, as mentioned before, it is custom to use the ``<browser:addform>``
+directive to create add forms, our special circumstances require us to use the
+more generic ``<browser:page>`` directive. The page directive fulfills several
+tasks. It creates the view from the view class and a given template, sets up
+security, and registers the page with a menu. In our case, only individuals
+having the ``schooltool.create`` permission can add commendations and the
+``schooltool_actions`` menu will provide a link for the add form, if the
+current user has been granted that permission.
+
+Now that we can add new commendations, we also need a way to view
+them. Instead of just writing one large view to render all the commendations
+of a a person, group or section, we first write a small view that will create
+an HTML snippet that represents one commendation. The view class,
+``CommendationDetails``, has only one responsibility: provide UI-friendly
+versions of the commendations data. That means that the grantor should not be
+an incomprehensible principal id, but the name of the person and the date
+should be formatted to the correct locale information of the user. Both of
+those requirements are fulfilled in the referenced class.
+
+  >>> details = browser.CommendationDetails()
+  >>> details.context = comm
+  >>> details.request = request
+
+  >>> details.title
+  u'good job'
+  >>> details.description
+  u'very good job.'
+  >>> details.grantor
+  u'<unknown>'
+  >>> details.date
+  u'...'
+
+Combined with the details template, ``commendation.pt``, the view is now
+registered using the ``<browser:page>`` directive, even though the view does
+not produce a full oage in itself. Also note that Tom specified that
+commendations are by definition public, so that the details view has the
+permission ``zope.Public``.
+
+The final step is to write a view for ``ICommendations`` that uses the
+commendation details view for each commendation. Since commendations are
+hidden in an annotation, the commendations view is registered for
+``IHaveCommendation``, but in the constructor the view looks up the
+commendations and stores them in an attribute. This is done in the
+``CommendationsView`` class.
+
+  >>> commendations = ICommendations(st['persons']['sue'])
+  >>> overview = browser.CommendationsView(commendations, request)
+  >>> list(overview.commendations)
+  [<Commendation u'good job' by u'<unknown>'>]
+
+Combined with a very short template, here ``commendations.pt``, the overview
+is registered as a page again.
+
+
+Testing Browser UI Code
+-----------------------
+
+Browser code can be tested in two ways. One is through unit tests, as we did
+in the previous sections as well as this one. All of the above interactive
+Python commands are unit tests with the difference that they are run with the
+full SchoolTool system setup.
+
+The second way of testing is through functional tests. Functional tests check
+the correctness on a higher level. Unit tests are programming tests, while
+functional tests are user tests. Ideally, they should be executed in a
+browser. And that's exactely what we will do. Zope 3 comes with a component
+known as the "test browser", which is a class that represents a little
+programmable browser. So here is a typical test:
+
+We get setup by accessing the site and logging in as the manager:
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> manager = Browser()
+  >>> manager.open('http://localhost/')
+
+  >>> manager.getLink('Log In').click()
+  >>> manager.getControl('Username').value = 'manager'
+  >>> manager.getControl('Password').value = 'schooltool'
+  >>> manager.getControl('Log in').click()
+
+
+Now that we are locked in, we have to create
+
+- a student,
+
+  >>> from schooltool.app.browser.ftests.setup import addPerson
+  >>> addPerson('Tom Hoffman', 'tha1', 'myohmy')
+
+- a course,
+
+  >>> manager.open('http://localhost/')
+  >>> manager.getLink('Courses').click()
+  >>> manager.getLink('New Course').click()
+  >>> manager.getControl('Title').value = 'Math 101'
+  >>> manager.getControl('Description').value = 'Basic Math'
+  >>> manager.getControl('Identifier').value = 'math101'
+  >>> manager.getControl('Add').click()
+
+- and a section.
+
+  >>> manager.getLink('Math 101').click()
+  >>> manager.getLink('New Section').click()
+  >>> manager.getControl('Code').value = 'Sec-A'
+  >>> manager.getControl('Description').value = 'Section A'
+  >>> manager.getControl('Identifier').value = 'math101-A'
+  >>> manager.getControl('Add').click()
+
+Now we should be able to add commendations to
+
+- persons,
+
+  >>> manager.getLink('Persons').click()
+  >>> manager.getLink('Tom Hoffman').click()
+  >>> manager.getLink('Add Commendation').click()
+  >>> manager.getControl('Title').value = 'Good Job!'
+  >>> manager.getControl('Description').value = 'You did a very good job.'
+  >>> manager.getControl('Add').click()
+
+  >>> manager.getLink('View Commendations').click()
+
+  >>> print analyze.queryHTML('//div[@class="commendation"]',
+  ...                         manager.contents)[0]
+  <div class="commendation">
+    <h3>Good Job!</h3>
+    <div style="font-size: 60%">
+      by <span class="grantor">SchoolTool Manager</span>
+      on <span class="date">...</span>
+    </div>
+    <div class="description">You did a very good job.</div>
+  </div>
+
+- groups,
+
+  >>> manager.getLink('Groups').click()
+  >>> manager.getLink('Students').click()
+  >>> manager.getLink('Add Commendation')
+  <Link text='Add Commendation' url='...groups/students/commendations/@@addCommendation.html'>
+  >>> manager.getLink('View Commendations')
+  <Link text='View Commendations' url='...groups/students/commendations'>
+
+- and sections.
+
+  >>> manager.getLink('Sections').click()
+  >>> manager.getLink('Sec-A').click()
+  >>> manager.getLink('Add Commendation')
+  <Link text='Add Commendation' url='...tions/math101-A/commendations/@@addCommendation.html'>
+  >>> manager.getLink('View Commendations')
+  <Link text='View Commendations' url='...tions/math101-A/commendations'>
+
+Also, not just everybody can add new commendations. For example Tom Hoffman,
+one of the students, cannot add new commendations:
+
+  >>> tom = Browser()
+  >>> tom.open('http://localhost/')
+
+  >>> tom.getLink('Log In').click()
+  >>> tom.getControl('Username').value = 'tha1'
+  >>> tom.getControl('Password').value = 'myohmy'
+  >>> tom.getControl('Log in').click()
+
+  >>> tom.handleErrors = False
+  >>> tom.open('http://localhost/persons/manager/commendations/@@addCommendation.html')
+  Traceback (most recent call last):
+  ...
+  Unauthorized: ...
+
+  >>> tom.open('http://localhost/groups/students/commendations/@@addCommendation.html')
+  Traceback (most recent call last):
+  ...
+  Unauthorized: ...
+
+  >>> tom.open('http://localhost/sections/math101-A/commendations/@@addCommendation.html')
+  Traceback (most recent call last):
+  ...
+  Unauthorized: ...
+
+On the other hand, since the commendations are public, he can view them:
+
+  >>> tom.open('http://localhost/persons/manager/commendations')
+  >>> tom.open('http://localhost/groups/students/commendations')
+  >>> tom.open('http://localhost/sections/math101-A/commendations')
+
+And that's all.


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/SystemIntegration.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/Viewing.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/Viewing.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/Viewing.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,237 @@
+=========================
+Viewing the Commendations
+=========================
+
+The final part of Tom's specification E-mail states the following:
+
+  For the school, a "View commendations" action should present a
+  batched/searchable list of all commendations in reverse chronological
+  order.
+
+This means that our SchoolTool application should provide a view to look at
+and search all the existing commendation in a school. This poses several
+problems in our design. Currently, commendations are attached via annotations
+on all objects that provide ``IHaveCommendations``. Since we cannot know which
+objects will ever provide this interface, we cannot do simple object crawling.
+
+However, there is a simple object notification system that will send out an
+event whenever an object is created. We can write a subscriber to that event
+and thus catch all newly created commendations. Since it is not possible to
+edit or delete commendations in our simple system, we do not have to listen
+for other events.
+
+Once we have the event and the new commendation we have two choices. The best
+way would be to create an integer id utility (which created unique ids for any
+object and provides a map from the id to the object) and create a catalog with
+the correct fields for the commendation. However, I think this would be
+overkill, and the much simpler way would be to store references of the
+commendations in a list and do a simple linear search by hand.
+
+
+Caching Commendations
+---------------------
+
+As mentioned above, we can use an event subscriber to get access to all newly
+created commendations. An event subscriber is a callable Python object that
+expects as many arguments as there are event discriminators. Originally, the
+creation code (in the addform) sends a single ``ObjectCreatedEvent`` instance
+that contains the created object. A special subscriber is notified and resends
+the event sending out the pair ``(object, event)``. This is the notification
+we want to listen to; thus our event subscriber has two arguments.
+
+Usually event subscribers are simple functions, as it is in this case. It is
+called ``cacheCommendations(commendation, event)`` and is located in
+``commendation.py``. All the function does is to add the new commendation to a
+list that is stored as an annotation on the SchoolToolApplication.
+
+Here is how it works:
+
+  >>> from schooltool.app import app
+  >>> from zope.app.component import site
+  >>> st = app.SchoolToolApplication()
+  >>> st.setSiteManager(site.LocalSiteManager(st))
+
+  >>> from zope.app.component import hooks
+  >>> hooks.setSite(st)
+
+  >>> from schooltool.commendation import commendation
+  >>> comm = commendation.Commendation(u'good job', u'very good job!', u'group')
+  >>> event = object()
+  >>> commendation.cacheCommendation(comm, event)
+
+  >>> st.__annotations__['schooltool.commendation.Cache'][0] == comm
+  True
+
+Note that in the object database the commendation is only stored once and not
+for every time it is referenced.
+
+
+Searching Commendations
+-----------------------
+
+Now that we have a cache of all commendations in the system, we need to write
+a search across the commendations. I decided to provide two search
+criteria. The first is a simple sub-string match that tries to match test from
+the title and the description. The second is the scope, where you specify the
+smallest scope you want to see. For example, if you specify "global" then only
+commendations that can be seen globally are shown. If you specify
+"school-wide", then all global, national and schoole-wide commendations are
+displayed.
+
+Since the search code is not very involved, I simply implemented the
+functionality inside a view method. The probably clear way would have been to
+write an adapter or utility in this case. The code can be found in the
+``CommendationsOverview`` class of the ``browser.py`` module. Here a couple of
+search examples; we are reusing the SchoolTool application object produced
+above:
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+  >>> from schooltool.commendation import browser
+  >>> overview = browser.CommendationsOverview(st, request)
+
+  >>> comm = commendation.Commendation(u'well done', u'', u'national')
+  >>> st.__annotations__['schooltool.commendation.Cache'].append(comm)
+
+By default all commendations are shown:
+
+  >>> overview.commendations()
+  [<Commendation u'good job' by u'<unknown>'>,
+   <Commendation u'well done' by u'<unknown>'>]
+
+Then we can filter by text:
+
+  >>> overview.request = TestRequest(form={'search_text': 'good'})
+  >>> overview.commendations()
+  [<Commendation u'good job' by u'<unknown>'>]
+
+Or by scope:
+
+  >>> overview.request = TestRequest(form={'search_scope': 'school-wide'})
+  >>> overview.commendations()
+  [<Commendation u'well done' by u'<unknown>'>]
+
+Of course you can also specify both search criteria:
+
+  >>> overview.request = TestRequest(
+  ...     form={'search_text': 'good', 'search_scope': 'school-wide'})
+  >>> overview.commendations()
+  []
+
+
+School-wide Commendations Overview
+----------------------------------
+
+Now that we have all the functionality written, all that is left to do is to
+write the template, ``commendation_overview.pt``, and register the
+page. Unfortunately, we cannot simply place the a menu item into the
+``schooltool_actions`` menu, because there is no view of the
+SchoolToolApplication. Even the ``[top]`` link in the breadcrumbs forwards you
+to the calendar. Thus the best place to put the link is in the Navigation
+menu. However, the entries in the navigation menu are not simple menu items,
+but viewlets. A special viewlet base class has been written for those entries,
+so that we simply copy the code and replace some of the entries. The result
+can be seen in ``configure.zcml``.
+
+Now that all components have been setup, we can test our overview screen via
+a browser:
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> manager = Browser()
+  >>> manager.open('http://localhost/')
+
+  >>> manager.getLink('Log In').click()
+  >>> manager.getControl('Username').value = 'manager'
+  >>> manager.getControl('Password').value = 'schooltool'
+  >>> manager.getControl('Log in').click()
+
+The first step is to create a person ...
+
+  >>> from schooltool.app.browser.ftests.setup import addPerson
+  >>> addPerson('Tom Hoffman', 'tha1', 'myohmy')
+
+to whom we attach a bunch of commendations:
+
+  >>> manager.open('http://localhost/persons')
+  >>> manager.getLink('Tom Hoffman').click()
+
+  >>> manager.getLink('Add Commendation').click()
+  >>> manager.getControl('Title').value = 'Good Job!'
+  >>> manager.getControl('Description').value = 'You did a very good job.'
+  >>> manager.getControl('Scope').value = ['global']
+  >>> manager.getControl('Add').click()
+
+  >>> manager.getLink('Add Commendation').click()
+  >>> manager.getControl('Title').value = 'Well Done!'
+  >>> manager.getControl('Description').value = 'A job well done.'
+  >>> manager.getControl('Scope').value = ['school-wide']
+  >>> manager.getControl('Add').click()
+
+Now we can go to the list of all commendations of the school and we should see
+both:
+
+  >>> manager.getLink('All Commendations').click()
+
+  >>> print analyze.queryHTML('//div[@class="commendation"]',
+  ...                         manager.contents)[0]
+  <div class="commendation">
+    <h3>Good Job!</h3>
+    <div style="font-size: 60%">
+      by <span class="grantor">SchoolTool Manager</span>
+      on <span class="date">...</span>
+    </div>
+    <div class="description">You did a very good job.</div>
+  </div>
+
+  >>> print analyze.queryHTML('//div[@class="commendation"]',
+  ...                         manager.contents)[1]
+  <div class="commendation">
+    <h3>Well Done!</h3>
+    <div style="font-size: 60%">
+      by <span class="grantor">SchoolTool Manager</span>
+      on <span class="date">...</span>
+    </div>
+    <div class="description">A job well done.</div>
+  </div>
+
+Now we filter by the term "well":
+
+  >>> manager.getControl('Text').value = u'well'
+  >>> manager.getControl('Filter').click()
+
+  >>> print analyze.queryHTML('//div[@class="commendation"]',
+  ...                         manager.contents)[0]
+  <div class="commendation">
+    <h3>Well Done!</h3>
+    <div style="font-size: 60%">
+      by <span class="grantor">SchoolTool Manager</span>
+      on <span class="date">...</span>
+    </div>
+    <div class="description">A job well done.</div>
+  </div>
+
+When we ask for all commendations on a national level, then we should only get
+the "Good job!" commendation:
+
+  >>> manager.getControl('Text').value = u''
+  >>> manager.getControl('Scope').value = ['national']
+  >>> manager.getControl('Filter').click()
+
+  >>> print analyze.queryHTML('//div[@class="commendation"]',
+  ...                         manager.contents)[0]
+  <div class="commendation">
+    <h3>Good Job!</h3>
+    <div style="font-size: 60%">
+      by <span class="grantor">SchoolTool Manager</span>
+      on <span class="date">...</span>
+    </div>
+    <div class="description">You did a very good job.</div>
+  </div>
+
+  >>> len(analyze.queryHTML('//div[@class="commendation"]', manager.contents))
+  1
+
+And that's all. You now have developed a fully integrated commendation system
+for SchoolTool. I intentionally left out some goodies, so that you have some
+room to play with the code yourself.


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/Viewing.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,179 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Commendation Browser Views
+
+$Id: browser.py 6230 2006-06-12 15:56:57Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+from zope import annotation
+from zope.app import container
+from zope.app import security
+from zope.app import zapi
+from zope.app.form.browser.add import AddView
+from zope.publisher import browser
+
+# Import the 'commendation' message id factory
+from schooltool.commendation import interfaces, commendation
+from schooltool.commendation.interfaces import _
+from schooltool.app import app
+
+# This is a simple view class that provides the information of a commendation
+# in a user-readable format.
+class CommendationDetails(object):
+    """Commendation View Support"""
+
+    # Decorators (the statement starting with '@') are a new feature in Python
+    # 2.4. `property` is a function that creates a property from a set of
+    # given functions. In this case the `title` method is used as the getter
+    # function for the `title` property.
+    @property
+    def title(self):
+        """Return the title of the commendation."""
+        return self.context.title
+
+    @property
+    def description(self):
+        """Return the description of the commendation."""
+        return self.context.description
+
+    @property
+    def grantor(self):
+        # Here we try to look up the title for a principal, whose id we saved.
+        # The first step is to look up the closest authentication utility.
+        auth = zapi.getUtility(security.interfaces.IAuthentication)
+
+        # We then try to find the principal. When, during initialization of
+        # the commendation, no principal was found, we stored the string
+        # '<unknown>', which clearly is not a valid id and the lookup will
+        # fail. The same is true for deleted users. In those cases we simply
+        # return '<unknwon>' as the title of the grantor.
+        try:
+            principal = auth.getPrincipal(self.context.grantor)
+        except security.interfaces.PrincipalLookupError:
+            return _('<unknown>')
+        return principal.title
+
+    @property
+    def date(self):
+        # Date/times are stored as date, time or datetime objects. Thus, when
+        # we want to display them, we need to convert them to a string. Since
+        # SchoolTool is an international tool that is used in many regions of
+        # the world, we need to ensure that we create the correct date/time
+        # representation of the region of the user making the request.
+        #
+        # Zope 3 provides the utilities to do just that. Zope 3 determines the
+        # locale of the user from the HTTP header information and stores the
+        # locale object in the request. One of the locale's features is the
+        # formatting of date/times and numbers. The code below formats only
+        # the date in the locale's short format. Every locale has several
+        # formats defined: short, medium, long, full.
+        formatter = self.request.locale.dates.getFormatter('date', 'short')
+        return formatter.format(self.context.date)
+
+
+class CommendationAddView(AddView):
+    """A view for adding a commendation."""
+
+    __used_for__ = interfaces.IHaveCommendations
+
+    # Form error message for the page template
+    error = None
+
+    # Override some fields of AddView
+    schema = interfaces.ICommendation
+    _factory = commendation.Commendation
+    _arguments = ['title', 'description', 'scope']
+    _keyword_arguments = []
+    _set_before_add = []
+    _set_after_add = []
+
+    fieldNames = ['title', 'description', 'scope']
+
+    def create(self, title, description, scope):
+        """Create a commmendation from the collected information."""
+        comm = self._factory(title, description, scope)
+        return comm
+
+    def add(self, comm):
+        """Add ``comm`` to the object."""
+        # It is often not necessary/desirable to ask the user for the name of
+        # the component, since it is immaterial to the interaction of the user
+        # with the application. For those scenarios Zope 3 provides a
+        # component that will choose the name for you. It is simply an adapter
+        # from the container to ``INameChooser`` and is used as shown below.
+        chooser = container.interfaces.INameChooser(self.context)
+        self.context[chooser.chooseName('', comm)] = comm
+        return comm
+
+    def update(self):
+        """Process the form data and actions."""
+        # We extend the ``update()`` method by supporting a cancel
+        # action, which willbring us back to the context's parent's
+        # default view.
+        if 'CANCEL' in self.request:
+            return self.request.response.redirect(self.nextURL())
+        return super(CommendationAddView, self).update()
+
+    def nextURL(self):
+        """See zope.app.container.interfaces.IAdding"""
+        return zapi.absoluteURL(self.context.__parent__, self.request)
+
+
+class CommendationsView(browser.BrowserView):
+    """Commendations View
+
+    A view that shows all commendations of an ``IHaveCommendations`` object.
+    """
+
+    def __init__(self, context, request):
+        super(CommendationsView, self).__init__(context, request)
+        self.commendations = self.context.values()
+
+
+class CommendationsOverview(browser.BrowserView):
+    """SchoolTool Application Commendations Overview"""
+
+    # Give each scope entry a value, so that we can easily compate them. The
+    # higher the number, the more available/open/larger the scope.
+    scopeDict = {'group': 0, 'school-wide': 1, 'community': 2,
+                 'state': 3, 'national': 4, 'global': 5}
+
+    def commendations(self):
+        """Get all the available commendations after the filters were
+        applied."""
+        # Retrieve the filter options from the request.
+        search_text = self.request.get('search_text', '')
+        search_scope = self.scopeDict[
+            self.request.get('search_scope', 'group')]
+
+        # Get the SchoolTool application instance and access its annotations.
+        stapp = app.getSchoolToolApplication()
+        annotations = annotation.interfaces.IAnnotations(stapp)
+        # A list comprehension that iterates through all the commendations and
+        # applies the filter one-by-one.
+        result = [
+            c
+            for c in annotations.get(commendation.CommendationsCacheKey, [])
+            if ((search_text in c.title or search_text in c.description) and
+                search_scope <= self.scopeDict[c.scope]) ]
+
+        # Make sure that the commendations are sorted in reverse chronological
+        # order.
+        result.sort(lambda x, y: cmp(y.date, x.date))
+        return result


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/commendation-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/commendation-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/commendation-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.commendation" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/commendation-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/commendation.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/commendation.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/commendation.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,12 @@
+<div class="commendation"
+     i18n:domain="commendation">
+  <h3 tal:content="view/title">Good Job!</h3>
+  <div style="font-size: 60%" i18n:translate="">
+    by <span class="grantor" tal:content="view/grantor" i18n:name="grantor" />
+    on <span class="date" tal:content="view/date" i18n:name="date" />
+  </div>
+  <div class="description"
+       tal:content="structure view/description">
+    You did a great job.
+  </div>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/commendation.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/commendation.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/commendation.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/commendation.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,123 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Commendation Implementation
+
+$Id: commendation.py 6596 2007-01-24 15:42:42Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+import datetime
+import persistent
+import zope.interface
+import zope.security
+from zope.schema import fieldproperty
+from zope import annotation
+from zope.app.container import btree, contained
+
+from schooltool.app import app
+from schooltool.commendation import interfaces
+from schooltool.traverser.traverser import AdapterTraverserPlugin
+from schooltool.commendation.interfaces import ICommendations
+from schooltool.commendation.interfaces import _
+
+# Annotations are identified using annotation keys that must be truly
+# unique. Thus it is a good idea to make the Python path of the pacakge the
+# prefix of the annotation key. Below are the two keys we need.
+CommendationsKey = 'schooltool.commendation.Commendations'
+CommendationsCacheKey = 'schooltool.commendation.Cache'
+
+class Commendation(persistent.Persistent, contained.Contained):
+    """A simple commendation implementation."""
+
+    zope.interface.implements(interfaces.ICommendation,
+                              interfaces.ICommendationContained)
+
+    # We are using ``FieldProperty`` properties to implement the data
+    # fields. ``FieldProperty`` isntances ensure that no invalid values are
+    # assigned to the attribute.
+    title = fieldproperty.FieldProperty(interfaces.ICommendation['title'])
+
+    description = fieldproperty.FieldProperty(
+        interfaces.ICommendation['description'])
+
+    scope = fieldproperty.FieldProperty(interfaces.ICommendation['scope'])
+
+    date = fieldproperty.FieldProperty(interfaces.ICommendation['date'])
+
+    grantor = fieldproperty.FieldProperty(interfaces.ICommendation['grantor'])
+
+    def __init__(self, title, description, scope):
+        self.date = datetime.date.today()
+        # Extract the current principal's id. If no interaction is found, then
+        # we also do not have a user. Thus we simply store a special string
+        # stating that the user was not found.
+        interaction = zope.security.management.queryInteraction()
+        if interaction and interaction.participations:
+            self.grantor = interaction.participations[0].principal.id
+        else:
+            self.grantor = _('<unknown>')
+        self.title = title
+        self.description = description
+        self.scope = scope
+
+    def __repr__(self):
+        # Providing an alternative implementation of the object's
+        # representation is commonly helpful, especially for doctests.
+        return '<%s %r by %r>' %(self.__class__.__name__,
+                                 self.title, self.grantor)
+
+
+class Commendations(btree.BTreeContainer):
+    '''A simple implementation of ``ICommendations``.'''
+    zope.interface.implements(interfaces.ICommendations)
+
+    title = _("commendations")
+
+    def __repr__(self):
+        return '<%s for %r>' %(self.__class__.__name__, self.__parent__)
+
+
+def getCommendations(context):
+    """Adapt an ``IHaveCommendations`` object to ``ICommendations``."""
+    annotations = annotation.interfaces.IAnnotations(context)
+    try:
+        return annotations[CommendationsKey]
+    except KeyError:
+        # If the key was not found, then we have never added it, so do that
+        # now. Make sure that the annotation has a valid parent, so that we
+        # can create URLs and do local component lookups.
+        annotations[CommendationsKey] = Commendations()
+        annotations[CommendationsKey].__parent__ = context
+        annotations[CommendationsKey].__name__ = 'commendations'
+        return annotations[CommendationsKey]
+
+
+def cacheCommendation(commendation, event):
+    """Cache a newly created commendation."""
+    # Whereever we are, get the SchoolTool application and access its
+    # annotations. Then add the commendation to the list of all cached
+    # commendations.
+    stapp = app.getSchoolToolApplication()
+    annotations = annotation.interfaces.IAnnotations(stapp)
+    if CommendationsCacheKey not in annotations:
+        annotations[CommendationsCacheKey] = persistent.list.PersistentList()
+    annotations[CommendationsCacheKey].append(commendation)
+
+
+CommendationsTraverserPlugin = AdapterTraverserPlugin(
+    'commendations', ICommendations)


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/commendation.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/commendation_add.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/commendation_add.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/commendation_add.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Add Commendation</title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+
+<metal:block metal:fill-slot="body">
+
+  <form class="standalone" method="post" enctype="multipart/form-data"
+        tal:attributes="action request/URL">
+    <h3 i18n:translate="">Commendation</h3>
+
+    <div class="error" tal:condition="view/error" tal:content="view/error" />
+
+    <fieldset>
+      <div class="row" tal:define="widget nocall:view/title_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/description_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/scope_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+    </fieldset>
+
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Add"
+             title="Shortcut: Alt-A" accesskey="A"
+             i18n:attributes="value add-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/commendation_add.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/commendations.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/commendations.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/commendations.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<metal:block use-macro="view/@@standard_macros/page" i18n:domain="commendation">
+
+  <metal:block fill-slot="content-header">
+    <h1 i18n:translate="">Commendations</h1>
+  </metal:block>
+
+  <metal:block metal:fill-slot="body">
+
+    <div style="border: 1px #999 solid; padding: 3px; margin-bottom: 1em"
+        tal:repeat="commendation view/commendations"
+        tal:content="structure commendation/@@details" />
+
+  </metal:block>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/commendations.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/commendations_overview.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/commendations_overview.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/commendations_overview.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,40 @@
+<metal:block use-macro="view/@@standard_macros/page" i18n:domain="commendation">
+
+  <metal:block fill-slot="content-header">
+    <h1 i18n:translate="">Commendations Overview</h1>
+  </metal:block>
+
+  <metal:block metal:fill-slot="body">
+
+    <form method="post" enctype="multipart/form-data"
+          tal:attributes="action request/URL">
+
+      <label for="search_text">Text</label>
+      <input type="text" id="search_text" name="search_text" value=""
+             tal:attributes="value request/search_text|nothing" />
+
+      <label for="search_scope">Scope</label>
+      <select id="search_scope" name="search_scope" size="1">
+        <tal:loop repeat="scope view/scopeDict">
+          <option tal:content="scope"
+                  tal:attributes="value scope"
+                  tal:condition="python:scope != request.get('search_scope')" />
+          <option selected=""
+                  tal:content="scope"
+                  tal:attributes="value scope"
+                  tal:condition="python:scope == request.get('search_scope')" />
+        </tal:loop>
+      </select>
+
+      <input type="submit" class="button-ok" name="FILTER" value="Filter"
+             i18n:attributes="value filter-button" />
+
+    </form>
+
+    <div style="border: 1px #999 solid; padding: 3px; margin-bottom: 1em"
+        tal:repeat="commendation view/commendations"
+        tal:content="structure commendation/@@details" />
+
+  </metal:block>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/commendations_overview.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,141 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:security="http://schooltool.org/securitypolicy"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    i18n_domain="schooltool.commendation">
+
+  <!-- Declare commendation-capable components -->
+
+  <class class="schooltool.person.person.Person">
+    <implements interface=".interfaces.IHaveCommendations" />
+  </class>
+
+  <class class="schooltool.group.group.Group">
+    <implements interface=".interfaces.IHaveCommendations" />
+  </class>
+
+  <class class="schooltool.course.section.Section">
+    <implements interface=".interfaces.IHaveCommendations" />
+  </class>
+
+  <!-- Security -->
+
+  <class class=".commendation.Commendations">
+    <allow interface="zope.app.container.interfaces.IReadContainer" />
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer" />
+  </class>
+
+  <class class=".commendation.Commendation">
+    <allow interface=".interfaces.ICommendation" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.ICommendation" />
+  </class>
+
+  <security:allow
+      interface="schooltool.commendation.interfaces.ICommendations"
+      crowds="administration"
+      permission="schooltool.view" />
+
+  <security:allow
+      interface="schooltool.commendation.interfaces.ICommendations"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <!-- Commendation Adapter -->
+
+  <adapter
+      for=".interfaces.IHaveCommendations"
+      provides=".interfaces.ICommendations"
+      factory=".commendation.getCommendations"
+      trusted="true"
+      />
+
+  <!-- Commendation Event Subscribers -->
+
+  <subscriber
+      for=".interfaces.ICommendation
+           zope.lifecycleevent.interfaces.IObjectCreatedEvent"
+      handler=".commendation.cacheCommendation"
+      />
+
+  <!-- Browser UI -->
+
+  <subscriber
+      for=".interfaces.IHaveCommendations
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".commendation.CommendationsTraverserPlugin"
+      permission="zope.Public"
+      />
+
+  <browser:page
+      name="details"
+      for=".interfaces.ICommendation"
+      class=".browser.CommendationDetails"
+      template="commendation.pt"
+      permission="zope.Public"
+      />
+
+  <browser:page
+      name="index.html"
+      for=".interfaces.ICommendations"
+      class=".browser.CommendationsView"
+      template="commendations.pt"
+      permission="zope.Public"
+      menu="schooltool_actions"
+      title="View Commendations"
+      />
+
+  <browser:menuItem
+      for=".interfaces.IHaveCommendations"
+      menu="schooltool_actions"
+      title="View Commendations"
+      action="commendations"
+      permission="zope.View"
+      />
+
+  <browser:page
+      name="addCommendation.html"
+      for=".interfaces.ICommendations"
+      template="commendation_add.pt"
+      class=".browser.CommendationAddView"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Add Commendation"
+      />
+
+  <browser:menuItem
+      for=".interfaces.IHaveCommendations"
+      menu="schooltool_actions"
+      title="Add Commendation"
+      action="commendations/@@addCommendation.html"
+      permission="schooltool.edit"
+      />
+
+  <browser:page
+      name="commendations.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      class=".browser.CommendationsOverview"
+      template="commendations_overview.pt"
+      permission="zope.Public"
+      />
+
+  <configure package="schooltool.skin">
+
+    <browser:navigationViewlet
+      name="commendations"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.NavigationViewlet"
+      permission="schooltool.edit"
+      link="@@commendations.html"
+      title="All Commendations"
+      order="100"
+      />
+
+  </configure>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.commendation" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.commendation
+
+$Id: ftests.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+import unittest
+import os
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+commendation_functional_layer = ZCMLLayer(filename,
+                                          __name__,
+                                          'commendation_functional_layer')
+
+def test_suite():
+    return collect_ftests(filenames=['SystemIntegration.txt', 'Viewing.txt'],
+                          layer=commendation_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,93 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Commandation Interfaces
+
+$Id: interfaces.py 6589 2007-01-24 13:34:18Z ignas $
+"""
+# Setting this attribute on the module declares that all doc strings in this
+# module are written in restructured text, the default Python documentation
+# format.
+__docformat__ = 'reStructuredText'
+
+import zope.interface
+import zope.schema
+import zope.i18nmessageid
+from zope.app import container
+
+# Since Zope 3 is an application server and does not know the users locale
+# until a request is issued, we can only mark all strings that are supposed to
+# be translated when displayed. Additionally, a translatable string must be
+# assigned to a domain, so we know where it belongs to adn it allows us to
+# disambiguate translations.
+# In order for the string extraction tools to find the translatable strings,
+# they have to be wrapped by ``_()``, namely a callable called ``_``
+# (underscore).
+_ = zope.i18nmessageid.MessageFactory("schooltool.commendation")
+
+
+class ICommendation(zope.interface.Interface):
+    """A commendation (usually for a person or a group)."""
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        description=_("Title of the commendation."),
+        required=True)
+
+    description = zope.schema.Text(
+        title=_("Description"),
+        description=_("A detailed description of the commendation."),
+        required=True)
+
+    scope = zope.schema.Choice(
+        title=_("Scope"),
+        description=_("The scope of the commendation."),
+        values=[_('group'), _('school-wide'), _('community'),
+                _('state'), _('national'), _('global')],
+        required=True)
+
+    date = zope.schema.Date(
+        title=_("Date"),
+        description=_("The date the commendation was issued."),
+        readonly=True,
+        required=True)
+
+    grantor = zope.schema.TextLine(
+        title=_("Grantor"),
+        description=_("The grantor of the commendation."),
+        readonly=True,
+        required=True)
+
+
+# The ``IContainer`` interface specifes many methods that are related to
+# component management. It basically implements the Python mapping
+# API. However, its methods have to do a little bit more work, so that it
+# integrates nicely into the Zope 3 framework.
+class ICommendations(zope.app.container.interfaces.IContainer):
+    '''An object containing several commendations.'''
+    container.constraints.contains(ICommendation)
+
+# ``IContained`` says that this object can be contained by another. Basically,
+# it requires an object to provide a ``__parent__`` and ``__name__`` attribute.
+class ICommendationContained(container.interfaces.IContained):
+    '''A commendation that can only be contained by ``ICommendations``.'''
+    container.constraints.containers(ICommendations)
+
+
+class IHaveCommendations(zope.interface.Interface):
+    '''Objects having commendations associated with them.'''


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/commendation/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/commendation/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/commendation/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,49 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Commendation-related Tests
+
+$Id: tests.py 5669 2006-01-20 19:58:16Z mg $
+"""
+__docformat__='restructuredtext'
+
+import unittest
+
+from zope.testing import doctest
+from zope.app.testing import setup
+
+def setUp(test):
+    setup.placefulSetUp()
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+def test_suite():
+    optionflags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
+    return unittest.TestSuite((
+        doctest.DocFileSuite('BasicComponent.txt',
+                             setUp=setUp, tearDown=tearDown,
+                             optionflags=optionflags),
+        doctest.DocFileSuite('PythonIntegration.txt',
+                             setUp=setUp, tearDown=tearDown,
+                             optionflags=optionflags),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/commendation/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/common.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/common.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/common.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,531 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Things common to the SchoolTool server and clients.
+"""
+
+import re
+import locale
+import datetime
+import urllib
+
+from zope.schema import Date
+from zope.interface import Interface, implements
+
+__metaclass__ = type
+
+
+def parse_date(value):
+    """Parse a ISO-8601 YYYY-MM-DD date value.
+
+    Examples:
+
+        >>> parse_date('2003-09-01')
+        datetime.date(2003, 9, 1)
+        >>> parse_date('20030901')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid date: '20030901'
+        >>> parse_date('2003-IX-01')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid date: '2003-IX-01'
+        >>> parse_date('2003-09-31')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid date: '2003-09-31'
+        >>> parse_date('2003-09-30-15-42')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid date: '2003-09-30-15-42'
+
+    """
+    try:
+        y, m, d = map(int, value.split('-'))
+        return datetime.date(y, m, d)
+    except ValueError:
+        raise ValueError("Invalid date: %r" % value)
+
+
+def parse_time(value):
+    """Parse a ISO 8601 HH:MM time value.
+
+    Examples:
+
+        >>> parse_time('01:25')
+        datetime.time(1, 25)
+        >>> parse_time('9:15')
+        datetime.time(9, 15)
+        >>> parse_time('12:1')
+        datetime.time(12, 1)
+        >>> parse_time('00:00')
+        datetime.time(0, 0)
+        >>> parse_time('23:59')
+        datetime.time(23, 59)
+        >>> parse_time('24:00')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid time: '24:00'
+        >>> parse_time('06:30PM')
+        Traceback (most recent call last):
+          ...
+        ValueError: Invalid time: '06:30PM'
+
+    """
+    try:
+        h, m = map(int, value.split(':'))
+        return datetime.time(h, m)
+    except ValueError:
+        raise ValueError("Invalid time: %r" % value)
+
+
+def parse_datetime(s):
+    """Parse a ISO 8601 date/time value.
+
+    Only a small subset of ISO 8601 is accepted:
+
+      YYYY-MM-DD HH:MM:SS
+      YYYY-MM-DD HH:MM:SS.ssssss
+      YYYY-MM-DDTHH:MM:SS
+      YYYY-MM-DDTHH:MM:SS.ssssss
+
+    Returns a datetime.datetime object without a time zone.
+
+    Examples:
+
+        >>> parse_datetime('2003-04-05 11:22:33.456789')
+        datetime.datetime(2003, 4, 5, 11, 22, 33, 456789)
+
+        >>> parse_datetime('2003-04-05 11:22:33.456')
+        datetime.datetime(2003, 4, 5, 11, 22, 33, 456000)
+
+        >>> parse_datetime('2003-04-05 11:22:33.45678999')
+        datetime.datetime(2003, 4, 5, 11, 22, 33, 456789)
+
+        >>> parse_datetime('01/02/03')
+        Traceback (most recent call last):
+          ...
+        ValueError: Bad datetime: 01/02/03
+
+    """
+    m = re.match(r"(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+)([.](\d+))?$", s)
+    if not m:
+        raise ValueError("Bad datetime: %s" % s)
+    ssssss = m.groups()[7]
+    if ssssss:
+        ssssss = int((ssssss + "00000")[:6])
+    else:
+        ssssss = 0
+    y, m, d, hh, mm, ss = map(int, m.groups()[:6])
+    return datetime.datetime(y, m, d, hh, mm, ss, ssssss)
+
+
+def dedent(text):
+    r"""Remove leading indentation from triple-quoted strings.
+
+    Example:
+
+        >>> dedent('''
+        ...     some text
+        ...     is here
+        ...        with maybe some indents
+        ...     ''')
+        ...
+        'some text\nis here\n   with maybe some indents\n'
+
+    Corner cases (mixing tabs and spaces, lines that are indented less than
+    the first line) are not handled yet.
+    """
+    lines = text.splitlines()
+    first, limit = 0, len(lines)
+    while first < limit and not lines[first]:
+        first += 1
+    if first >= limit:
+        return ''
+    firstline = lines[first]
+    indent, limit = 0, len(firstline)
+    while indent < limit and firstline[indent] in (' ', '\t'):
+        indent += 1
+    return '\n'.join([line[indent:] for line in lines[first:]])
+
+
+def to_unicode(s):
+    r"""Convert a UTF-8 string to Unicode.
+
+    Example:
+
+        >>> to_unicode('\xc4\x84\xc5\xbeuol\xc5\xb3')
+        u'\u0104\u017euol\u0173'
+
+    For convenience, to_unicode accepts None as the argument value.  This makes
+    it easier to use it with libxml2 functions such as nsProp, which return
+    None for missing attribute values.
+
+        >>> to_unicode(None) is None
+        True
+
+    """
+    if s is None:
+        return None
+    else:
+        return unicode(s, 'UTF-8')
+
+
+locale_charset = locale.getpreferredencoding()
+
+
+def to_locale(us):
+    r"""Convert a Unicode string to the current locale encoding.
+
+    Example:
+
+        >>> from schooltool import common
+        >>> old_locale_charset = common.locale_charset
+
+        >>> common.locale_charset = 'UTF-8'
+        >>> to_locale(u'\u263B')
+        '\xe2\x98\xbb'
+
+        >>> common.locale_charset = 'ASCII'
+        >>> to_locale(u'Unrepresentable: \u263B')
+        'Unrepresentable: ?'
+
+        >>> locale_charset = old_locale_charset
+
+    """
+    return us.encode(locale_charset, 'replace')
+
+
+def from_locale(s):
+    r"""Convert an 8-bit string in locale encoding to Unicode.
+
+    Example:
+
+        >>> from schooltool import common
+        >>> old_locale_charset = common.locale_charset
+
+        >>> from_locale('xyzzy')
+        u'xyzzy'
+
+        >>> common.locale_charset = 'UTF-8'
+        >>> from_locale('\xe2\x98\xbb')
+        u'\u263b'
+
+        >>> locale_charset = old_locale_charset
+
+    """
+    return unicode(s, locale_charset)
+
+
+class StreamWrapper:
+    r"""Unicode-friendly wrapper for writable file-like objects.
+
+    Here the terms 'encoding' and 'charset' are used interchangeably.
+
+    The main use case for StreamWrapper is wrapping sys.stdout and sys.stderr
+    so that you can forget worrying about charsets of your data.
+
+        >>> from StringIO import StringIO
+        >>> from schooltool import common
+        >>> old_locale_charset = common.locale_charset
+        >>> common.locale_charset = 'UTF-8'
+
+        >>> sw = StreamWrapper(StringIO())
+        >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7"
+        >>> sw.stm.getvalue()
+        'Hello, world! \xc2\xb7\xe2\x98\xbb\xc2\xb7\n'
+
+    By default printing Unicode strings to stdout/stderr will raise Unicode
+    errors if the stream encoding does not include some characters you are
+    printing.  StreamWrapper will replace unconvertable characters to question
+    marks, therefore you should only use it for informative messages where such
+    loss of information is acceptable.
+
+        >>> common.locale_charset = 'US-ASCII'
+        >>> sw = StreamWrapper(StringIO())
+        >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7"
+        >>> sw.stm.getvalue()
+        'Hello, world! ???\n'
+
+    StreamWrapper converts all unicode strings that are written to it to the
+    encoding defined in the wrapped stream's 'encoding' attribute, or, if that
+    is None, to the locale encoding.  Typically the stream's encoding attribute
+    is set when the stream is connected to a console device, and None when the
+    stream is connected to a file.  On Unix systems the console encoding
+    matches the locale charset, but on Win32 systems they differ.
+
+        >>> s = StringIO()
+        >>> s.encoding = 'ISO-8859-1'
+        >>> sw = StreamWrapper(s)
+        >>> print >> sw, u"Hello, world! \u00b7\u263b\u00b7"
+        >>> sw.stm.getvalue()
+        'Hello, world! \xb7?\xb7\n'
+
+    You can print other kinds of objects:
+
+        >>> sw = StreamWrapper(StringIO())
+        >>> print >> sw, 1, 2,
+        >>> print >> sw, 3
+        >>> sw.stm.getvalue()
+        '1 2 3\n'
+
+    but not 8-bit strings:
+
+        >>> sw = StreamWrapper(StringIO())
+        >>> print >> sw, "\xff"
+        Traceback (most recent call last):
+          ...
+        UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
+
+    In addition to 'write', StreamWrapper provides 'flush' and 'writelines'
+
+        >>> sw = StreamWrapper(StringIO())
+        >>> sw.write('xyzzy\n')
+        >>> sw.flush()
+        >>> sw.writelines(['a', 'b', 'c', 'd'])
+        >>> sw.stm.getvalue()
+        'xyzzy\nabcd'
+
+    Clean up:
+
+        >>> common.locale_charset = old_locale_charset
+
+    """
+
+    def __init__(self, stm):
+        self.stm = stm
+        self.encoding = getattr(stm, 'encoding', None)
+        if self.encoding is None:
+            self.encoding = locale_charset
+
+    def write(self, obj):
+        self.stm.write(obj.encode(self.encoding, 'replace'))
+
+    def flush(self):
+        self.stm.flush()
+
+    def writelines(self, seq):
+        for obj in seq:
+            self.write(obj)
+
+
+class UnicodeAwareException(Exception):
+    r"""Unicode-friendly exception.
+
+    Sadly, the standard Python exceptions deal badly with Unicode strings:
+
+        >>> e = ValueError(u"\u2639")
+        >>> unicode(e)
+        Traceback (most recent call last):
+            ...
+        UnicodeEncodeError: 'ascii' codec can't encode character u'\u2639' in position 0: ordinal not in range(128)
+
+    UnicodeAwareException fixes this problem, so please subclass it for custom
+    SchoolTool exceptions that might be shown to the user and therefore need
+    to be internationalized.
+
+        >>> e1 = UnicodeAwareException(u"\u2639")
+        >>> unicode(e1)
+        u'\u2639'
+
+        >>> e2 = UnicodeAwareException(u"\u2639", e1)
+        >>> unicode(e2)
+        u'\u2639 \u2639'
+
+    See also
+    http://sf.net/tracker/?func=detail&aid=1012952&group_id=5470&atid=355470
+    """
+
+    def __unicode__(self):
+        return u" ".join(map(unicode, self.args))
+
+
+def looks_like_a_uri(uri):
+    r"""Check if the argument looks like a URI string.
+
+    Refer to http://www.ietf.org/rfc/rfc2396.txt for details.
+    We're only approximating to the spec.
+
+    Some examples of valid URI strings:
+
+        >>> looks_like_a_uri('http://foo/bar?baz#quux')
+        True
+        >>> looks_like_a_uri('HTTP://foo/bar?baz#quux')
+        True
+        >>> looks_like_a_uri('mailto:root')
+        True
+
+    These strings are all invalid URIs:
+
+        >>> looks_like_a_uri('2HTTP://foo/bar?baz#quux')
+        False
+        >>> looks_like_a_uri('\nHTTP://foo/bar?baz#quux')
+        False
+        >>> looks_like_a_uri('mailto:postmaster ')
+        False
+        >>> looks_like_a_uri('mailto:postmaster text')
+        False
+        >>> looks_like_a_uri('nocolon')
+        False
+        >>> looks_like_a_uri(None)
+        False
+
+    """
+    uri_re = re.compile(r"^[A-Za-z][A-Za-z0-9+-.]*:\S\S*$")
+    return bool(uri and uri_re.match(uri) is not None)
+
+
+def unquote_uri(uri):
+    r"""Unquote a URI.
+
+       >>> unquote_uri('/terms/%C5%BEiema')
+       u'/terms/\u017eiema'
+
+       >>> unquote_uri(u'/terms/%C5%BEiema')
+       u'/terms/\u017eiema'
+
+    """
+    return urllib.unquote(str(uri)).decode('UTF-8')
+
+
+def collect(fn):
+    """Convert a generator to a function that returns a list of items.
+
+        >>> @collect
+        ... def something(x, y, z):
+        ...     yield x
+        ...     yield y + z
+
+        >>> something(1, 2, 3)
+        [1, 5]
+
+    """
+    def collector(*args, **kw):
+        return list(fn(*args, **kw))
+    collector.__name__ = fn.__name__
+    collector.__doc__ = fn.__doc__
+    return collector
+
+
+class IDateRange(Interface):
+    """A range of dates (inclusive).
+
+    If r is an IDateRange, then the following invariant holds:
+    r.first <= r.last
+
+    Note that empty date ranges cannot be represented.
+    """
+
+    first = Date(
+        title=u"The first day of the period of time covered.")
+
+    last = Date(
+        title=u"The last day of the period covered.")
+
+    def __iter__():
+        """Iterate over all dates in the range from the first to the last."""
+
+    def __contains__(date):
+        """Return True if the date is within the range, otherwise False.
+
+        Raises a TypeError if date is not a datetime.date.
+        """
+
+    def __len__():
+        """Return the number of dates covered by the range."""
+
+
+class DateRange(object):
+    """A date range implementation using the standard datetime module.
+
+    Date ranges are low-level components that represent a date
+    span. They are mainly used to implement the date handling in
+    terms:
+
+      >>> january = DateRange(datetime.date(2003, 1, 1), datetime.date(2003, 1, 31))
+      >>> IDateRange.providedBy(january)
+      True
+
+    You can use date ranges to check whether a certain date is within
+    the range:
+
+      >>> datetime.date(2002, 12, 31) in january
+      False
+      >>> datetime.date(2003, 2, 1) in january
+      False
+      >>> datetime.date(2003, 1, 1) in january
+      True
+      >>> datetime.date(2003, 1, 12) in january
+      True
+      >>> datetime.date(2003, 1, 31) in january
+      True
+
+    You can ask the date range for the amount of dates it includes.
+
+      >>> days = list(january)
+      >>> len(days)
+      31
+      >>> len(january)
+      31
+
+    As you can see, the boundary dates are inclusive. You can also
+    iterate through all the dates in the date range.
+
+      >>> days = DateRange(
+      ...     datetime.date(2003, 1, 1), datetime.date(2003, 1, 2))
+      >>> list(days)
+      [datetime.date(2003, 1, 1), datetime.date(2003, 1, 2)]
+
+      >>> days = DateRange(
+      ...     datetime.date(2003, 1, 1), datetime.date(2003, 1, 1))
+      >>> list(days)
+      [datetime.date(2003, 1, 1)]
+
+    If the beginning of the of the date range is later than the end, a
+    value error is raised:
+
+      >>> DateRange(datetime.date(2003, 1, 2),
+      ...           datetime.date(2003, 1, 1)) # doctest: +NORMALIZE_WHITESPACE
+      Traceback (most recent call last):
+      ...
+      ValueError: Last date datetime.date(2003, 1, 1) less than
+                  first date datetime.date(2003, 1, 2)
+
+    """
+    implements(IDateRange)
+
+    def __init__(self, first, last):
+        self.first = first
+        self.last = last
+        if last < first:
+            raise ValueError("Last date %r less than first date %r" %
+                             (last, first))
+
+    def __iter__(self):
+        date = self.first
+        while date <= self.last:
+            yield date
+            date += datetime.date.resolution
+
+    def __len__(self):
+        return (self.last - self.first).days + 1
+
+    def __contains__(self, date):
+        return self.first <= date <= self.last
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/common.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,117 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="schooltool">
+
+  <include package="zope.app.zcmlfiles" />
+  <include package="zope.app.authentication" file="password.zcml" />
+  <include package="zope.app.wfmc" file="meta.zcml" />
+  <include package="zope.viewlet" file="meta.zcml" />
+  <include package="zope.mimetype" file="meta.zcml"/>
+  <include package="zc.resourcelibrary" file="meta.zcml"/>
+  <include package="schooltool.securitypolicy" file="meta.zcml" />
+  <include package="schooltool.skin" file="meta.zcml" />
+
+  <include package="zope.app.session" />
+  <include package="zope.app.server" />
+  <include package="zope.app.http" />
+  <include package="zope.contentprovider" />
+  <include package="zope.viewlet" />
+  <include package="zope.formlib" />
+  <include package="zope.app.keyreference" />
+  <include package="zope.app.intid" />
+  <include package="zope.app.catalog" />
+  <include package="zope.app.file" />
+  <include package="zope.mimetype" />
+  <include package="zope.file" />
+  <include package="zope.html" />
+  <include package="z3c.javascript.mochikit" />
+
+  <!-- set up an adapter from zope.i18n locale to a zope.ucol collator -->
+
+  <adapter
+      for="zope.i18n.interfaces.locales.ILocale"
+      provides="zope.i18n.interfaces.locales.ICollator "
+      factory="zope.ucol.localeadapter.LocaleCollator"
+      />
+
+  <!-- pull in some configuration needed by schooltool. -->
+  <include package="zc.resourcelibrary" file="configure.zcml" />
+  <include package="zc.table" file="configure.zcml" />
+  <include package="zc.catalog" file="configure.zcml" />
+  <include package="hurry.query" file="configure.zcml" />
+  <include package="zc.datetimewidget" file="configure.zcml" />
+  <includeOverrides package="zc.datetimewidget" file="overrides.zcml" />
+
+  <!-- set up zope3 security -->
+  <unauthenticatedPrincipal id="zope.anybody" title="Unauthenticated User" />
+  <unauthenticatedGroup id="zope.Anybody" title="Unauthenticated Users" />
+  <authenticatedGroup id="zope.Authenticated" title="Authenticated Users" />
+  <everybodyGroup id="zope.Everybody" title="All Users" />
+
+  <!-- set up custom security policy -->
+  <include package="schooltool.securitypolicy"/>
+
+  <!-- Load optionstorage -->
+
+  <include package="optionstorage" file="meta.zcml" />
+  <include package="optionstorage" />
+
+  <!-- Load key references -->
+
+  <include package="zope.app.keyreference" />
+
+  <!-- Support Online Help -->
+
+  <include package="zope.app.renderer" file="meta.zcml" />
+  <include package="zope.app.renderer" />
+  <include package="zope.app.onlinehelp" file="meta.zcml" />
+  <include package="zope.app.onlinehelp" />
+
+  <!-- Load devmode-specific Zope and SchoolTool packages -->
+
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+    <include package="zope.app.apidoc" file="meta.zcml" />
+    <include package="zope.app.preference" file="meta.zcml" />
+    <include package="zope.app.renderer" file="meta.zcml" />
+    <include package="zope.app.apidoc" />
+    <include package="zope.app.preference" />
+    <include package="zope.app.renderer" />
+    <include package="zope.app.tree" />
+    <include package=".sampledata" />
+    <include package=".setupdata" />
+  </configure>
+
+  <!-- Translations -->
+
+  <i18n:registerTranslations directory="locales" />
+
+  <!-- Permissions -->
+
+  <permission id="schooltool.view" title="View" />
+  <permission id="schooltool.edit" title="Edit Info" />
+  <permission id="schooltool.add" title="Add Info" />
+  <permission id="schooltool.editCalendarOverlays" title="Edit Calendar Overlays" />
+
+  <!-- Utilities -->
+
+  <utility
+      name="schooltool"
+      provides="zope.app.generations.interfaces.ISchemaManager"
+      component=".generations.schemaManager"
+      />
+
+  <!-- *Core* sub-packages -->
+
+  <include package=".skin" />
+  <include package=".relationship" />
+  <include package=".app" />
+  <include package=".person" />
+  <include package=".demographics" />
+  <include package=".group" />
+  <include package=".resource" />
+  <include package=".securitypolicy.browser" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,38 @@
+# Make a package.
+
+def registerTestSetup():
+    from zope.interface import classImplements
+    from schooltool.testing import registry
+
+    def addCourseAndSectionContainer(app):
+        from schooltool.course import course, section
+        app['courses'] = course.CourseContainer()
+        app['sections'] = section.SectionContainer()
+    registry.register('ApplicationContainers', addCourseAndSectionContainer)
+
+    def haveCalendar():
+        from schooltool.course import section
+        from schooltool.app.interfaces import IHaveCalendar
+        if not IHaveCalendar.implementedBy(section.Section):
+            classImplements(section.Section, IHaveCalendar)
+    registry.register('CalendarComponents', haveCalendar)
+
+    def ownTimetables():
+        from schooltool.course import section
+        from schooltool.timetable.interfaces import IOwnTimetables
+        if not IOwnTimetables.implementedBy(section.Section):
+            classImplements(section.Section, IOwnTimetables)
+
+    registry.register('TimetablesComponents', ownTimetables)
+
+    def bookResources():
+        from schooltool.course import section
+        from schooltool.timetable.interfaces import IBookResources
+        if not IBookResources.implementedBy(section.Section):
+            classImplements(section.Section, IBookResources)
+
+    registry.register('TimetablesComponents', bookResources)
+
+registerTestSetup()
+del registerTestSetup
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/booking.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/booking.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/booking.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,40 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Resource booking for sections.
+
+$Id: booking.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+
+from schooltool.relationship.uri import URIObject
+from schooltool.relationship.relationship import RelationshipSchema
+
+
+URISectionBooking = URIObject('http://schooltool.org/ns/sectionbooking',
+                              'Section booking',
+                              'The section booking relationship.')
+URISection = URIObject('http://schooltool.org/ns/sectionbooking/section',
+                       'Section', 'A role of a section.')
+URIResource = URIObject('http://schooltool.org/ns/sectionbooking/resource',
+                        'Resource', 'The role of a booked resource.')
+
+
+SectionBooking = RelationshipSchema(URISectionBooking,
+                                    section=URISection,
+                                    resource=URIResource)


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/booking.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,189 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope">
+
+  <configure
+      package="schooltool.skin"
+      i18n_domain="schooltool">
+
+    <addform
+        label="Add a Course"
+        name="addSchoolToolCourse.html"
+        schema="schooltool.course.interfaces.ICourse"
+        fields="title description"
+        set_before_add="title"
+        content_factory="schooltool.course.course.Course"
+        permission="schooltool.edit"
+        template="templates/simple_add.pt"
+        class="schooltool.course.browser.course.CourseAddView">
+        <widget field="description" height="5" />
+    </addform>
+
+    <navigationViewlet
+      name="courses"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.TopLevelContainerNavigationViewlet"
+      permission="schooltool.view"
+      link="courses"
+      title="Courses"
+      order="40"
+      />
+
+    <navigationViewlet
+      name="sections"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.TopLevelContainerNavigationViewlet"
+      permission="schooltool.view"
+      link="sections"
+      title="Sections"
+      order="50"
+      />
+
+  </configure>
+
+  <viewlet
+      name="coursesinfo"
+      for="*"
+      manager="schooltool.person.browser.person.IPersonInfoManager"
+      template="templates/coursesviewlet.pt"
+      class="schooltool.course.browser.course.CoursesViewlet"
+      permission="zope.View"
+      order="10"
+      />
+
+  <page
+      name="index.html"
+      for="..interfaces.ICourse"
+      class=".course.CourseView"
+      template="templates/course.pt"
+      permission="zope.View"
+      menu="zmi_views"
+      title="View"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <page
+      name="index.html"
+      for="..interfaces.ICourseContainer"
+      class=".course.CourseContainerView"
+      template="templates/course_container.pt"
+      permission="zope.View"
+      menu="zmi_views"
+      title="View"
+      />
+
+  <containerViews
+      for="..interfaces.ICourseContainer"
+      contents="schooltool.view"
+      add="schooltool.edit"
+      />
+
+  <page
+      name="course-csvimport.html"
+      for="..interfaces.ICourseContainer"
+      class=".csvimport.CourseCSVImportView"
+      template="templates/course-csvimport.pt"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Import Courses"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="New Course"
+      for="..interfaces.ICourseContainer"
+      action="+/addSchoolToolCourse.html"
+      />
+
+  <page
+      name="index.html"
+      for="..interfaces.ISectionContainer"
+      class=".section.SectionContainerView"
+      template="templates/section_container.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="View"
+      />
+
+  <page
+      name="index.html"
+      for="..interfaces.ISection"
+      class=".section.SectionView"
+      template="templates/section.pt"
+      permission="zope.View"
+      menu="zmi_views"
+      title="View"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <containerViews
+      for="..interfaces.ISectionContainer"
+      contents="schooltool.view"
+      add="schooltool.edit"
+      />
+
+  <addform
+      label="Add a Section"
+      name="addSchoolToolSection.html"
+      schema="..interfaces.ISection"
+      fields="title description"
+      set_before_add="title"
+      template="templates/section_add.pt"
+      content_factory="..section.Section"
+      permission="schooltool.edit"
+      class=".section.SectionAddView">
+    <widget field="description" height="5" />
+  </addform>
+
+  <editform
+      label="Edit Section Information"
+      name="edit.html"
+      schema="..interfaces.ISection"
+      for="..interfaces.ISection"
+      fields="title description"
+      template="templates/section_edit.pt"
+      permission="schooltool.edit"
+      class=".section.SectionEditView"
+      menu="schooltool_actions"
+      title="Edit Info">
+    <widget field="description" height="5" />
+  </editform>
+
+  <page
+      name="instructors.html"
+      for="..interfaces.ISection"
+      class=".section.SectionInstructorView"
+      template="templates/edit_relationships.pt"
+      permission="schooltool.edit"
+      />
+
+  <page
+      name="resources.html"
+      for="..interfaces.ISection"
+      class=".section.SectionResourceView"
+      template="templates/edit_relationships.pt"
+      permission="schooltool.edit"
+      />
+
+  <page
+      name="learners.html"
+      for="..interfaces.ISection"
+      class=".section.SectionLearnerView"
+      template="templates/edit_relationships.pt"
+      permission="schooltool.edit"
+      />
+
+  <page
+      name="learner-groups.html"
+      for="..interfaces.ISection"
+      class=".section.SectionLearnerGroupView"
+      template="templates/edit_relationships.pt"
+      permission="schooltool.edit"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/course.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/course.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/course.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,105 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+course browser views.
+
+$Id: course.py 6585 2007-01-19 17:48:36Z ignas $
+"""
+from zope.app import zapi
+from zope.app.form.browser.add import AddView
+from zope.publisher.browser import BrowserView
+from schooltool.skin.containers import ContainerView
+
+from schooltool import SchoolToolMessage as _
+from schooltool.course.interfaces import ICourse, ICourseContainer, ISection
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.relationships import URIInstruction, URISection
+from schooltool.relationship import getRelatedObjects
+
+class CourseContainerView(ContainerView):
+    """A Course Container view."""
+
+    __used_for__ = ICourseContainer
+
+    index_title = _("Course index")
+
+
+class CourseView(BrowserView):
+    """A view for courses."""
+
+    __used_for__ = ICourse
+
+
+class CourseAddView(AddView):
+    """A view for adding Courses."""
+
+    def nextURL(self):
+        return zapi.absoluteURL(self.context.context, self.request)
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(self.nextURL())
+        else:
+            return AddView.update(self)
+
+class CoursesViewlet(BrowserView):
+    """A viewlet showing the courses a person is in."""
+
+    def isTeacher(self):
+        """Find out if the person is an instructor for any sections."""
+        if len(getRelatedObjects(self.context, URISection,
+                                 rel_type=URIInstruction)) > 0:
+            return True
+        else:
+            return False
+
+    def isLearner(self):
+        """Find out if the person is a member of any sections."""
+        for obj in self.context.groups:
+            if ISection.providedBy(obj):
+                return True
+
+        return False
+
+    def instructorOf(self):
+        """Get the sections the person instructs."""
+        return getRelatedObjects(self.context, URISection,
+                                 rel_type=URIInstruction)
+
+    def memberOf(self):
+        """Seperate out generic groups from sections."""
+
+        return [group for group in self.context.groups if not
+                ISection.providedBy(group)]
+
+    def learnerOf(self):
+        """Get the sections the person is a member of."""
+        results = []
+        sections = getSchoolToolApplication()['sections'].values()
+        for section in sections:
+            if self.context in section.members:
+                results.append({'section': section, 'group': None})
+            # XXX isTransitiveMember works in the test fixture but not in the
+            # application, working around it for the time being.
+            for group in self.memberOf():
+                if group in section.members:
+                    results.append({'section': section,
+                                    'group': group})
+
+        return results


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/course.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/csvimport.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/csvimport.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/csvimport.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,60 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+csv importing.
+
+$Id: csvimport.py 6047 2006-05-11 18:31:03Z mg $
+"""
+from schooltool.app.browser.csvimport import BaseCSVImporter, BaseCSVImportView
+from schooltool.course.course import Course
+
+from schooltool import SchoolToolMessage as _
+
+
+class CourseCSVImporter(BaseCSVImporter):
+    """Course CSV Importer"""
+
+    factory = Course
+
+    def createAndAdd(self, data, dry_run=True):
+        """Create objects and add them to the container."""
+
+        if len(data) < 1:
+            self.errors.fields.append(_('Insufficient data provided.'))
+            return
+
+        if not data[0]:
+            self.errors.fields.append(_('Titles may not be empty'))
+            return
+
+        if len(data) > 1:
+            description = data[1]
+        else:
+            description = ''
+
+        obj = self.factory(title=data[0], description=description)
+        name = self.chooser.chooseName('', obj)
+        if not dry_run:
+            self.container[name] = obj
+
+
+class CourseCSVImportView(BaseCSVImportView):
+    """View for Course CSV importer."""
+
+    importer_class = CourseCSVImporter


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/csvimport.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/section.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/section.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/section.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,342 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+course browser views.
+
+$Id: section.py 6860 2007-04-13 23:37:39Z ignas $
+"""
+from zope.security.proxy import removeSecurityProxy
+from zope.app import zapi
+from zope.app.component.hooks import getSite
+from zope.app.form.browser.add import AddView
+from zope.app.form.interfaces import WidgetsError
+from zope.app.form.utility import getWidgetsData
+from zope.publisher.browser import BrowserView
+from zope.component import getMultiAdapter
+
+from zc.table import table
+
+from schooltool.person.interfaces import IPerson
+from schooltool.group.interfaces import IGroup
+from schooltool.timetable.interfaces import ITimetables
+from schooltool.skin.containers import ContainerView
+from schooltool.app.browser.app import BaseEditView
+
+from schooltool import SchoolToolMessage as _
+from schooltool.common import collect
+from schooltool.course.interfaces import ISection, ISectionContainer
+from schooltool.relationship.relationship import getRelatedObjects
+from schooltool.app.membership import URIGroup
+from schooltool.app.relationships import URISection
+from schooltool.course import booking
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.app.browser.app import RelationshipViewBase
+from schooltool.timetable.browser import TimetableConflictMixin
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.table.interfaces import ITableFormatter
+
+
+def same(a, b):
+    """Check if two possibly proxied objects are one and the same."""
+    return removeSecurityProxy(a) is removeSecurityProxy(b)
+
+
+class SectionContainerView(ContainerView):
+    """A Course Container view."""
+
+    __used_for__ = ISectionContainer
+
+    index_title = _("Section index")
+
+    # XXX: very hacky, but necessary for now. :-(
+    def getTimetables(self, obj):
+        return ITimetables(obj).timetables
+
+
+class SectionView(BrowserView):
+    """A view for courses providing a list of sections."""
+
+    __used_for__ = ISection
+
+    def renderPersonTable(self):
+        persons = ISchoolToolApplication(None)['persons']
+        formatter = getMultiAdapter((persons, self.request), ITableFormatter)
+        formatter.setUp(table_formatter=table.StandaloneFullFormatter,
+                        items=self.getPersons())
+        return formatter.render()
+
+    def getPersons(self):
+        return map(removeSecurityProxy,
+                   filter(IPerson.providedBy, self.context.members))
+
+    def getGroups(self):
+        return filter(IGroup.providedBy, self.context.members)
+
+
+class SectionAddView(AddView):
+    """A view for adding Sections."""
+
+    error = None
+    course = None
+
+    def validCourse(self):
+        return self.course is not None
+
+    def getCourseFromId(self, cid):
+        app = getSite()
+        try:
+            return app['courses'][cid]
+        except KeyError:
+            self.error = _("No such course.")
+
+    def __init__(self, context, request):
+        super(AddView, self).__init__(context, request)
+        self.update_status = None
+        self.errors = None
+
+        try:
+            course_id = request['field.course_id']
+        except KeyError:
+            self.error = _("Need a course ID.")
+            return
+
+        self.course = self.getCourseFromId(course_id)
+        if self.course is not None:
+            self.label = _("Add a Section to ${course}",
+                           mapping={'course': self.course.title})
+
+    def update(self):
+        if self.update_status is not None:
+            # We've been called before. Just return the previous result.
+            return self.update_status
+
+        if "UPDATE_SUBMIT" in self.request:
+            self.update_status = ''
+            try:
+                data = getWidgetsData(self, self.schema, names=self.fieldNames)
+                section = removeSecurityProxy(self.createAndAdd(data))
+                self.course.sections.add(section)
+            except WidgetsError, errors:
+                self.errors = errors
+                self.update_status = _("An error occurred.")
+                return self.update_status
+
+            self.request.response.redirect(self.nextURL())
+
+        if 'CANCEL' in self.request:
+            url = zapi.absoluteURL(self.course, self.request)
+            self.request.response.redirect(url)
+
+        return self.update_status
+
+    def nextURL(self):
+        return zapi.absoluteURL(self.course, self.request)
+
+
+class SectionEditView(BaseEditView):
+    """View for editing Sections."""
+
+    __used_for__ = ISection
+
+
+class ConflictDisplayMixin(TimetableConflictMixin):
+    """A mixin for use in views that display event conflicts."""
+
+    def __init__(self, context):
+        self.context = context
+
+    def getConflictingSections(self, item):
+        """Return a sequence of sections that conflict with item.
+
+        update(), which sets self.busy_periods, should be called before
+        invoking this method.
+        """
+        result = []
+        for section in self.getSections(item):
+            if same(section, self.context):
+                continue
+            for (day_id, period_id), sections in self.busy_periods:
+                if section in sections:
+                    result.append({'day_id': day_id,
+                                   'period_id': period_id,
+                                   'section': section})
+        result.sort(key=lambda x: (x['day_id'], x['period_id'],
+                                   x['section'].label))
+        return result
+
+    def getSections(self, items):
+        raise NotImplementedError("Subclasses should override this method.")
+
+    @collect
+    def _findConflicts(self, timetable_events, calendar_events):
+        """Returns calendar events that intersect with section timetable events.
+
+        This method expects timetable_events list to be ordered by dtstart.
+        """
+        calendar_events = sorted(calendar_events, reverse=True)
+        def before(a, b):
+            return (a.dtstart + a.duration) <= b.dtstart
+
+        for ttevent in timetable_events:
+            while calendar_events:
+                if before(ttevent, calendar_events[-1]):
+                    break
+                elif before(calendar_events[-1], ttevent):
+                    calendar_events.pop()
+                else:
+                    # conflict!
+                    yield calendar_events.pop()
+
+    def _groupConflicts(self, conflicts):
+        """Generate a list of unique events out of a list of expanded events."""
+        uniques = {}
+        for event in conflicts:
+            uniques.setdefault(event.unique_id, event)
+        return uniques.values()
+
+    def getConflictingEvents(self, item):
+        """Return a list of conflicting events.
+
+        Conflicting events are events that occur in the item calendar
+        at some time that is booked/taken by section timetable event.
+        """
+        calendar = ISchoolToolCalendar(item)
+        ctt = ICompositeTimetables(self.context)
+
+        timetable_events = sorted(ctt.makeTimetableCalendar())
+
+        if not timetable_events:
+            return []
+
+        first = timetable_events[0]
+        last = timetable_events[-1]
+        calendar_events = calendar.expand(first.dtstart,
+                                          last.dtstart + last.duration)
+
+        conflicts = self._findConflicts(timetable_events, calendar_events)
+
+        return self._groupConflicts(conflicts)
+
+    def update(self):
+        """Set self.busy_periods."""
+        ttschema = self.getSchema()
+        if ttschema:
+            term = self.getTerm()
+            section_map = self.sectionMap(term, ttschema)
+            self.busy_periods = [(key, sections)
+                                 for key, sections in section_map.items()
+                                 if self.context in sections]
+        else:
+            self.busy_periods = []
+
+
+class RelationshipEditConfView(RelationshipViewBase, ConflictDisplayMixin):
+    """A relationship editing view that displays conflicts."""
+
+    def update(self):
+        RelationshipViewBase.update(self)
+        ConflictDisplayMixin.update(self)
+
+
+class SectionInstructorView(RelationshipEditConfView, ConflictDisplayMixin):
+    """View for adding instructors to a Section."""
+
+    __used_for__ = ISection
+
+    title = _("Instructors")
+    current_title = _("Current Instructors")
+    available_title = _("Available Instructors")
+
+    def getSections(self, item):
+        return [section for section in getRelatedObjects(item, URISection)
+                if ISection.providedBy(section)]
+
+    def getCollection(self):
+        return self.context.instructors
+
+    def getAvailableItemsContainer(self):
+        return ISchoolToolApplication(None)['persons']
+
+
+class SectionLearnerView(RelationshipEditConfView):
+    """View for adding learners to a Section.  """
+
+    __used_for__ = ISection
+
+    title = _("Students")
+    current_title = _("Current Students")
+    available_title = _("Available Students")
+
+    def getSections(self, item):
+        return [section for section in getRelatedObjects(item, URIGroup)
+                if ISection.providedBy(section)]
+
+    def getCollection(self):
+        return self.context.members
+
+    def getSelectedItems(self):
+        """Return a list of selected members."""
+        return filter(IPerson.providedBy, self.getCollection())
+
+    def getAvailableItemsContainer(self):
+        return ISchoolToolApplication(None)['persons']
+
+
+class SectionLearnerGroupView(RelationshipEditConfView):
+    """View for adding learners to a Section."""
+
+    __used_for__ = ISection
+
+    title = _("Groups")
+    current_title = _("Current Groups")
+    available_title = _("Available Groups")
+
+    def getSections(self, item):
+        return [section for section in getRelatedObjects(item, URIGroup)
+                if ISection.providedBy(section)]
+
+    def getCollection(self):
+        return self.context.members
+
+    def getSelectedItems(self):
+        """Return a list of selected members."""
+        return filter(IGroup.providedBy, self.getCollection())
+
+    def getAvailableItemsContainer(self):
+        return ISchoolToolApplication(None)['groups']
+
+
+class SectionResourceView(RelationshipEditConfView):
+    """View for adding learners to a Section."""
+
+    __used_for__ = ISection
+
+    title = _("Resources")
+    current_title = _("Current Resources")
+    available_title = _("Available Resources")
+
+    def getSections(self, item):
+        return getRelatedObjects(item, booking.URISection)
+
+    def getCollection(self):
+        return self.context.resources
+
+    def getAvailableItemsContainer(self):
+        return ISchoolToolApplication(None)['resources']


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/section.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course-csvimport.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course-csvimport.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course-csvimport.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+<tal:defs define="update view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <head>
+    <title metal:fill-slot="title" i18n:translate="">
+      Upload schooltool courses as CSV
+    </title>
+  </head>
+  <body>
+
+    <metal:block metal:fill-slot="body">
+
+      <div class="info" tal:condition="view/success">
+        <p tal:repeat="msg view/success" tal:content="msg" />
+      </div>
+      <div class="error" tal:condition="view/errors"
+        tal:repeat="err view/errors" tal:content="err" />
+
+      <form method="POST" enctype="multipart/form-data" class="standalone"
+        tal:attributes="action request/URL">
+
+        <h3 i18n:translate="">
+          Import Courses
+        </h3>
+        <p i18n:translate="">
+          CSV data <strong>must</strong> include a course
+          title and <strong>may</strong> include an optional
+          course description.  Any extra information will be discarded.
+        </p>
+        <p i18n:translate="">Example:</p>
+
+<pre i18n:translate="">
+Ancient History, Pre-history through 1000 A.D.
+US History
+World History, 1000 A.D. through the 20th century, text after a second comma
+</pre>
+        <p i18n:translate="">
+          The above example will create 3 courses titled 'Ancient History',
+          'US History' and 'World History'.  The first and last course will
+          have the descriptions 'Pre-history through 1000 A.D.' and '1000 A.D.
+          through the 20th century' respectively.  The Second course will have
+          no description, and the extra "text after a second comma" text on
+          the third course will be ignored.
+        </p>
+
+        <fieldset>
+          <legend i18n:translate="">Upload CSV File</legend>
+          <div class="row">
+            <label for="csvfile" i18n:translate="">CSV File</label>
+            <input id="csvfile" type="file" name="csvfile"/>
+          </div>
+
+          <div class="row">
+            <tal:block i18n:translate="">Charset:</tal:block>
+            <select name="charset">
+              <option value="UTF-8" i18n:translate="">Unicode (UTF-8)</option>
+              <option value="ISO-8859-1" i18n:translate="">Western (ISO-8859-1)</option>
+              <option value="ISO-8859-15" i18n:translate="">Western (ISO-8859-15)</option>
+              <option value="Windows-1252" i18n:translate="">Western (Windows-1252)</option>
+              <option value="other" i18n:translate="">Other (please specify)</option>
+            </select>
+          </div>
+          <div class="row" i18n:translate="">
+            Other charset: <input name="other_charset" type="text" i18n:name="other_charset" />
+          </div>
+        </fieldset>
+        <fieldset>
+          <legend i18n:translate="">Input CSV Data</legend>
+          <label for="csvtext" i18n:translate="">CSV Data</label>
+          <textarea name="csvtext" id="csvtext" cols="50" rows="10"></textarea>
+        </fieldset>
+        <div class="controls">
+          <input name="UPDATE_SUBMIT" class="button-ok" type="submit"
+                 value="Submit" i18n:attributes="value submit-button" />
+        </div>
+      </form>
+    </metal:block>
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course-csvimport.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="context/title" />
+</head>
+<body>
+<h1 metal:fill-slot="content-header"><span tal:replace="context/title" /></h1>
+
+<metal:block metal:fill-slot="body">
+
+  <tal:block replace="structure context/@@notes|nothing"/>
+
+  <div id="course-view">
+    <p class="description" tal:content="context/description"/>
+
+    <div class="sections">
+
+      <div tal:define="sections context/sections">
+        <h3 i18n:translate="">Sections</h3>
+        <div class="section-list">
+          <tal:loop repeat="section sections/sortby:label">
+          <tal:if condition="section/can_access:label">
+
+            <tal:comment condition="nothing">
+               XXX This should be moved into a macro
+            </tal:comment>
+
+            <div class="section"
+                 tal:define="instructors section/instructors|nothing;
+                             learners section/learners|nothing;
+                             calendar section/calendar|nothing">
+
+              <tal:loop repeat="instructor instructors">
+                <tal:if condition="instructor/can_access:photo">
+                <tal:if condition="instructor/photo">
+                  <div class="instructor">
+                    <img src="photo" class="person-photo" alt="photo"
+                         i18n:attributes="alt"
+                         tal:attributes="src string:${instructor/@@absolute_url}/photo" />
+                  <br />
+                  <a href="" tal:content="instructor/title"
+                     tal:attributes="href instructor/@@absolute_url" />
+                  </div>
+                </tal:if>
+                </tal:if>
+              </tal:loop>
+
+                <a tal:attributes="href section/@@absolute_url">
+                  <span tal:replace="section/label" i18n:translate=""/>
+                  (<span tal:replace="section/title" i18n:translate=""/>)
+                </a>
+              <p>
+                  <span tal:replace="section/size" />
+                  <span i18n:translate="">students</span>
+              </p>
+
+              <p tal:content="section/description" />
+
+            </div>
+
+          </tal:if>
+          </tal:loop>
+
+        </div>
+      </div>
+    </div>
+    <div class="controls">
+      <a class="button-ok" href="" title="New Section"
+        tal:attributes="href string:${context/schooltool:app/@@absolute_url}/sections/+/addSchoolToolSection.html?field.course_id=${context/__name__}">
+        New Section
+      </a>
+    </div>
+
+
+  </div>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course_container.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course_container.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course_container.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,81 @@
+<tal:define define="dummy view/update"/>
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title"
+         tal:content="view/index_title" i18n:translate="">Contents</title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/index_title" i18n:translate="">Contents</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="batch view/batch;
+                         canModify view/canModify">
+
+  <p tal:condition="not:batch" i18n:translate="">There are none.</p>
+  <tal:if tal:condition="batch">
+    <tal:block replace="structure view/batch/render" />
+    <div metal:use-macro="view/@@view_macros/batch-search"/>
+    <div class="count">
+      <span i18n:translate="">Showing</span>
+      <span tal:content="batch/length"/>
+      <span i18n:translate="">of</span>
+      <span tal:content="batch/full_size"/>
+      <span i18n:translate="">items</span>
+    </div>
+    <form method="post"
+          tal:condition="canModify"
+          tal:attributes="action string:${context/@@absolute_url}/delete.html">
+      <div tal:repeat="course batch" class="course">
+        <input type="checkbox" tal:attributes="name string:delete.${course/zope:name}" />
+        <a tal:content="course/title"
+           tal:attributes="href course/@@absolute_url">Some Object</a>
+        <ul tal:condition="course/sections|nothing" class="section-list">
+          <tal:for repeat="section course/sections">
+          <li tal:condition="section/can_access:label">
+            <a i18n:translate=""
+               tal:content="section/label"
+               tal:attributes="href section/@@absolute_url;
+                               title section/title">
+              Some Object
+            </a>
+            <span class="hint">
+              (<span tal:replace="section/size"/>
+              <span i18n:translate="">Students</span>)
+            </span>
+          </li>
+          </tal:for>
+        </ul>
+      </div>
+      <div class="controls">
+        <input type="submit" class="button-cancel" value="Delete"
+               i18n:attributes="value delete-button;" />
+      </div>
+    </form>
+    <ul tal:condition="not:canModify" class="container-content">
+      <li tal:repeat="course batch" class="course">
+        <a tal:content="course/title"
+           tal:attributes="href course/@@absolute_url">Some Object</a>
+        <ul tal:condition="course/sections|nothing" class="section-list">
+          <tal:for repeat="section course/sections">
+          <li tal:condition="section/can_access:label">
+            <a i18n:translate=""
+               tal:condition="section/can_access:label"
+               tal:content="section/label"
+               tal:attributes="href section/@@absolute_url"
+               >Some Object</a>
+            <span class="hint">
+              (<span tal:replace="section/size"/>
+              <span i18n:translate="">Students</span>)
+            </span>
+          </li>
+          </tal:for>
+        </ul>
+      </li>
+    </ul>
+  </tal:if>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/course_container.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/coursesviewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/coursesviewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/coursesviewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,39 @@
+<div class="info-block" tal:define="sections view/instructorOf"
+     tal:condition="view/isTeacher"
+     i18n:domain="schooltool">
+  <h5 i18n:translate="">Sections Taught</h5>
+  <ul tal:condition="sections">
+    <tal:loop repeat="group sections">
+      <li>
+        <a title=""
+          tal:attributes="href group/@@absolute_url;
+          title group/description|group/title"
+          tal:content="group/label" i18n:translate=""></a>
+      </li>
+    </tal:loop>
+  </ul>
+</div>
+
+<div class="info-block" tal:define="sections view/learnerOf"
+                        tal:condition="view/isLearner">
+  <h5 i18n:translate="">Courses</h5>
+    <ul tal:condition="sections">
+      <tal:loop repeat="group sections">
+        <li>
+          <a title=""
+             tal:attributes="href group/section/@@absolute_url;
+                             title group/section/description|group/section/title"
+             tal:content="group/section/label"
+             i18n:translate=""></a>
+          <span class="hint" tal:condition="group/group">
+            <span i18n:translate="">
+              via group
+            </span>
+            <a href=""
+               tal:attributes="href group/group/@@absolute_url"
+               tal:content="group/group/title" />
+          </span>
+        </li>
+      </tal:loop>
+    </ul>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/coursesviewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/edit_relationships.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/edit_relationships.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/edit_relationships.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,100 @@
+<tal:defs define="update view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="context/title" />
+</head>
+<body>
+<metal:block metal:fill-slot="body"
+             tal:define="batch view/batch">
+
+<form method="post" tal:attributes="action request/URL" class="standalone">
+<h3 i18n:translate="" tal:content="view/title" />
+<fieldset tal:define="items view/getSelectedItems">
+  <tal:if condition="items">
+    <legend i18n:translate="" tal:content="view/current_title" />
+    <div tal:repeat="item items/sortby:title">
+      <label>
+        <input tal:attributes="name string:remove_item.${item/__name__}"
+          type="checkbox" />
+        <span tal:replace="item/title" />
+      </label>
+      <div tal:repeat="conflict python:view.getConflictingSections(item)"
+           i18n:translate="">
+        Conflict:
+        <a tal:content="conflict/section/label"
+           tal:attributes="href conflict/section/@@absolute_url" />
+        (<span tal:replace="conflict/day_id" i18n:name="day_id" />,
+         <span tal:replace="conflict/period_id" i18n:name="period_id" />)
+      </div>
+      <div tal:repeat="conflict python:view.getConflictingEvents(item)"
+           i18n:translate="">
+        Conflict:
+        <a tal:content="conflict/title"
+           tal:attributes="href conflict/@@absolute_url" />
+      </div>
+    </div>
+    <div class="controls">
+      <input type="submit" class="button-ok" name="REMOVE_ITEMS"
+        value="Remove"
+        title="Shortcut: Alt-R" accesskey="R"
+        i18n:attributes="value; accesskey" />
+    </div>
+  </tal:if>
+  <p tal:condition="not:items" i18n:translate="">
+    There are none.
+  </p>
+</fieldset>
+</form>
+<form method="post" tal:attributes="action request/URL" class="standalone">
+<fieldset>
+  <legend i18n:translate="" tal:content="view/available_title" />
+  <div class="item_list">
+    <tal:block replace="structure view/batch/render" />
+    <input type="text" name="SEARCH"
+      tal:attributes="value request/SEARCH|nothing"/>
+    <input type="submit" name="SEARCH_BUTTON" value="Find Now"
+      i18n:attributes="value"/>
+    <input type="submit" name="CLEAR_SEARCH" value="Clear"
+      i18n:attributes="value"/>
+    <div tal:repeat="item batch" tal:condition="batch">
+      <label>
+        <input tal:attributes="name string:add_item.${item/__name__}"
+               type="checkbox" />
+        <span tal:replace="item/title" />
+      </label>
+      <div tal:repeat="conflict python:view.getConflictingSections(item)"
+           i18n:translate="">
+        Conflict:
+        <a tal:content="conflict/section/label"
+           tal:attributes="href conflict/section/@@absolute_url" />
+        (<span tal:replace="conflict/day_id" i18n:name="day_id" />,
+         <span tal:replace="conflict/period_id" i18n:name="period_id" />)
+      </div>
+      <div tal:repeat="conflict python:view.getConflictingEvents(item)"
+           i18n:translate="">
+        Conflict:
+        <a tal:content="conflict/title"
+           tal:attributes="href conflict/@@absolute_url" />
+      </div>
+    </div>
+    <div class="controls">
+      <input type="submit" class="button-ok" name="ADD_ITEMS"
+        value="Add" tal:condition="batch"
+        title="Shortcut: Alt-A" accesskey="A"
+        i18n:attributes="value; accesskey" />
+    </div>
+    <p tal:condition="not:batch" i18n:translate="">
+      There are none to add.
+    </p>
+  </div>
+</fieldset>
+
+<div class="controls">
+  <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+         i18n:attributes="value cancel-button" />
+</div>
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/edit_relationships.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,104 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="context/title" />
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">
+    Section of
+    <tal:loop tal:repeat="course context/courses" i18n:name="course">
+      <a href=""
+         tal:attributes="href course/@@absolute_url"
+         tal:content="course/title"/>
+    </tal:loop>
+    -- <span tal:replace="context/title" />
+  </h1>
+
+<metal:block metal:fill-slot="body">
+
+  <tal:block replace="structure context/@@notes|nothing"/>
+
+  <div id="section-view">
+
+    <a class="modify" href=""
+       title="Change the name or description of this section."
+       tal:attributes="href string:${context/@@absolute_url}/edit.html"
+       i18n:attributes="title"
+       i18n:translate="">
+       edit info
+    </a>
+
+    <p class="description" tal:content="context/description"/>
+
+    <div class="info-block" tal:define="resources context/resources">
+      <h3 i18n:translate="">Resources</h3>
+      <ul>
+        <li tal:repeat="obj resources/sorted_filter_accessible:title">
+          <a tal:attributes="href obj/@@absolute_url"
+             tal:content="obj/title" />
+        </li>
+      </ul>
+      <a class="modify" href=""
+         title="Change the resources for this section."
+         tal:attributes="href string:${context/@@absolute_url}/resources.html"
+         i18n:attributes="title"
+         i18n:translate="">
+         book resources
+      </a>
+    </div>
+
+    <div class="info-block" tal:define="instructors context/instructors">
+      <h3 i18n:translate="">Instructors</h3>
+      <ul>
+        <li tal:repeat="obj instructors/sorted_filter_accessible:title">
+          <a tal:attributes="href obj/@@absolute_url"
+             tal:content="obj/title" />
+        </li>
+      </ul>
+      <a class="modify" href=""
+         title="Change the instructors for this section."
+         tal:attributes="href string:${context/@@absolute_url}/instructors.html"
+         i18n:attributes="title"
+         i18n:translate="">
+         edit instructors
+      </a>
+    </div>
+
+    <div class="info-block"
+         tal:define="groups view/getGroups;
+                     persons view/getPersons">
+      <h3 i18n:translate="">Students</h3>
+      <ul>
+        <li class="group" tal:repeat="group groups/sorted_filter_accessible:title">
+          <a tal:attributes="href group/@@absolute_url"
+             tal:content="group/title" />
+          <ul tal:condition="group/members">
+            <li class="individual" tal:repeat="person group/members">
+              <a tal:attributes="href person/@@absolute_url"
+                 tal:content="person/title" />
+            </li>
+          </ul>
+        </li>
+
+        <tal:block tal:replace="structure view/renderPersonTable" />
+
+      </ul>
+      <a class="modify" href=""
+         title="Change the students in this section individually"
+         tal:attributes="href string:${context/@@absolute_url}/learners.html"
+         i18n:attributes="title"
+         i18n:translate="">
+         edit individuals
+      </a>
+      <a class="modify" href=""
+         title="Change the students in this section by groups"
+         tal:attributes="href string:${context/@@absolute_url}/learner-groups.html"
+         i18n:attributes="title"
+         i18n:translate="">
+         edit groups
+      </a>
+    </div>
+
+  </div>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_add.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_add.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_add.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,84 @@
+<html metal:use-macro="context/@@standard_macros/page"
+      i18n:domain="schooltool">
+<body>
+<div metal:fill-slot="body">
+
+<div metal:define-macro="addform">
+
+  <form tal:attributes="action request/URL"
+        method="post" enctype="multipart/form-data" class="standalone">
+
+    <fieldset metal:define-macro="formbody">
+
+      <h3 tal:condition="view/label"
+          tal:content="view/label" i18n:translate=""
+          metal:define-slot="heading"
+          >Edit something</h3>
+
+      <p tal:define="error view/error|nothing"
+         tal:condition="error"
+         tal:content="error" />
+
+      <p tal:define="status view/update"
+         tal:condition="status"
+         tal:content="status" />
+
+      <p tal:condition="view/errors" i18n:translate="">
+        There are <strong tal:content="python:len(view.errors)"
+                          i18n:name="num_errors">6</strong> input errors.
+      </p>
+
+      <div metal:define-slot="extra_info" tal:replace="nothing">
+      </div>
+
+      <div class="row" metal:define-slot="extra_top" tal:replace="nothing">
+        <div class="label">Extra top</div>
+        <div class="label"><input type="text" style="width:100%" /></div>
+      </div>
+
+      <div metal:use-macro="context/@@form_macros/widget_rows" />
+
+      <div class="separator"></div>
+
+      <div class="row" metal:define-slot="extra_bottom" tal:replace="nothing">
+        <div class="label">Extra bottom</div>
+        <div class="field"><input type="text" style="width:100%" /></div>
+      </div>
+
+      <div class="row">
+        <div class="label">
+          <label for="add_name" i18n:translate="">Identifier
+            (optional)
+          </label>
+        </div>
+        <div class="field">
+          <input id="add_name" type="text" name="add_input_name"
+                 tal:attributes="value context/contentName" />
+        </div>
+        <input id="field.course_id" name="field.course_id" type="hidden"
+               value=""
+               tal:attributes="value request/field.course_id|nothing" />
+    </fieldset>
+    <div class="controls">
+      <tal:if condition="view/validCourse">
+        <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Add"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value add-button; accesskey" />
+      </tal:if>
+      <tal:if condition="not:view/validCourse">
+        <input class="disabled button-ok" disabled="disabled"
+               type="submit" name="UPDATE_SUBMIT" value="Add"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value add-button; accesskey" />
+      </tal:if>
+
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+
+  </form>
+</div>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_add.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_container.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_container.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_container.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,90 @@
+<tal:define define="dummy view/update"/>
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title"
+         tal:content="view/index_title" i18n:translate="">
+    Contents
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/index_title" i18n:translate="">Contents</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="batch view/batch">
+
+  <tal:block replace="structure batch/render" />
+  <div metal:use-macro="view/@@view_macros/batch-search"/>
+  <p tal:condition="not:batch" i18n:translate="">There are none.</p>
+  <form method="post" tal:condition="batch"
+        tal:attributes="action string:${context/@@absolute_url}/delete.html">
+    <table class="container">
+      <tr class="header">
+        <th i18n:translate="">
+        </th>
+        <th i18n:translate="">
+          Courses
+        </th>
+        <th i18n:translate="">
+          Section
+        </th>
+        <th i18n:translate="">
+          Instructors
+        </th>
+        <th i18n:translate="">
+          Schedule
+        </th>
+        <th i18n:translate="">
+          Current Size
+        </th>
+      </tr>
+      <tr tal:repeat="obj batch">
+        <td>
+          <input type="checkbox"
+                 tal:attributes="name string:delete.${obj/zope:name}" />
+        </td>
+        <td>
+          <a tal:repeat="course obj/courses"
+             tal:attributes="href course/@@absolute_url"
+             tal:content="course/title">
+              Some Object
+          </a>
+        </td>
+        <td>
+          <a tal:attributes="href obj/@@absolute_url"
+             tal:content="obj/title">
+              Some Object
+          </a>
+        </td>
+        <td>
+          <tal:loop repeat="instructor obj/instructors">
+            <span tal:condition="not:repeat/instructor/start">, </span>
+            <a href="" tal:attributes="href instructor/@@absolute_url"
+               tal:content="instructor/title" />
+          </tal:loop>
+        </td>
+        <td>
+          <tal:loop repeat="tt python: view.getTimetables(obj)">
+            <span tal:condition="not:repeat/tt/start">, </span>
+            <a href="" tal:attributes="href string:${obj/@@absolute_url}/timetables/$tt"
+               tal:content="tt/title" />
+          </tal:loop>
+        </td>
+        <td>
+          <span class="hint">
+            (<span tal:replace="obj/size"/>
+            <span i18n:translate="">Students</span>)
+          </span>
+        </td>
+      </tr>
+    </table>
+    <div class="controls">
+      <input type="submit" class="button-cancel" value="Delete"
+             i18n:attributes="value delete-button;" />
+    </div>
+  </form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_container.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_edit.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_edit.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_edit.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,68 @@
+<tal:tag condition="view/update"/>
+<html metal:use-macro="context/@@standard_macros/view"
+      i18n:domain="schooltool">
+<body>
+<div metal:fill-slot="body">
+
+<div metal:define-macro="body">
+
+  <form tal:attributes="action request/URL" method="post"
+        enctype="multipart/form-data" class="standalone">
+
+    <div metal:define-macro="formbody">
+
+      <h3 tal:condition="view/label"
+          tal:content="view/label" i18n:translate=""
+          metal:define-slot="heading"
+          >Edit something</h3>
+
+      <p tal:define="status view/update"
+         tal:condition="status" tal:content="status" i18n:translate="" />
+
+      <p tal:condition="view/errors" i18n:translate="">
+        There are <strong tal:content="python:len(view.errors)"
+                          i18n:name="num_errors">6</strong> input errors.
+      </p>
+
+      <div metal:define-slot="extra_info" tal:replace="nothing">
+      </div>
+
+      <fieldset>
+        <div class="row"
+             metal:define-slot="extra_top" tal:replace="nothing">
+          <div class="label">Extra top</div>
+          <div class="field"><input type="text" style="width:100%" /></div>
+        </div>
+
+        <div metal:use-macro="context/@@form_macros/widget_rows" />
+
+        <div class="separator"></div>
+
+        <div class="row"
+             metal:define-slot="extra_bottom" tal:replace="nothing">
+          <div class="label">Extra bottom</div>
+          <div class="field"><input type="text" style="width:100%" /></div>
+        </div>
+        <div class="separator"></div>
+      </fieldset>
+    </div>
+
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Apply"
+             title="Shortcut: Alt-A" accesskey="A"
+             i18n:attributes="value submit-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+    <div class="row" metal:define-slot="extra_buttons" tal:replace="nothing">
+    </div>
+
+    <div class="separator"></div>
+
+  </form>
+
+</div>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/templates/section_edit.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/browser/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/browser/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/browser/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1009 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for course and section views.
+
+$Id: tests.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import unittest
+
+from zope.i18n import translate
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app.container.browser.adding import Adding
+from zope.traversing.interfaces import IContainmentRoot
+from zope.app.testing import ztapi
+from zope.component import adapts
+from zope.interface import implements
+from zope.component import provideAdapter
+
+from schooltool.app.browser.testing import setUp, tearDown
+from schooltool.testing import setup
+
+class AddingStub(Adding):
+    pass
+
+def doctest_CourseContainerView():
+    r"""View for the courses container.
+
+        >>> from schooltool.course.browser.course import CourseContainerView
+        >>> from schooltool.course.course import CourseContainer
+        >>> cc = CourseContainer()
+        >>> request = TestRequest()
+        >>> view = CourseContainerView(cc, request)
+
+    """
+
+
+def doctest_CourseView():
+    r"""View for courses.
+
+    Lets create a simple view for a course:
+
+        >>> from schooltool.course.browser.course import CourseView
+        >>> from schooltool.course.course import Course
+        >>> course = Course(title="Algebra 1")
+        >>> request = TestRequest()
+        >>> view = CourseView(course, request)
+
+    """
+
+
+def doctest_CourseAddView():
+    r"""
+
+        >>> from schooltool.course.browser.course import CourseAddView
+        >>> from schooltool.course.course import Course
+        >>> from schooltool.course.interfaces import ICourse
+
+        >>> class CourseAddViewForTesting(CourseAddView):
+        ...     schema = ICourse
+        ...     fieldNames = ('title', 'description')
+        ...     _factory = Course
+
+
+        >>> app = setup.setUpSchoolToolSite()
+        >>> container = app['courses']
+        >>> request = TestRequest()
+        >>> context = AddingStub(container, request)
+        >>> context = container
+
+        >>> view = CourseAddViewForTesting(context, request)
+        >>> view.update()
+
+        >>> request = TestRequest()
+        >>> request.form = {'field.title' : 'math'}
+        >>> context = AddingStub(context, request)
+        >>> view = CourseAddViewForTesting(context, request)
+        >>> view.update()
+
+    """
+
+
+def doctest_CourseCSVImporter():
+    r"""Tests for CourseCSVImporter.
+
+    Create a course container and an importer
+
+        >>> from schooltool.course.browser.csvimport import CourseCSVImporter
+        >>> from schooltool.course.course import CourseContainer
+        >>> container = CourseContainer()
+        >>> importer = CourseCSVImporter(container, None)
+
+    Import some sample data
+
+        >>> csvdata='''Course 1, Course 1 Description
+        ... Course2
+        ... Course3, Course 3 Description, Some extra data'''
+        >>> importer.importFromCSV(csvdata)
+        True
+
+    Check that the courses exist
+
+        >>> [course for course in container]
+        [u'course-1', u'course2', u'course3']
+
+    Check that descriptions were imported properly
+
+        >>> [course.description for course in container.values()]
+        ['Course 1 Description', '', 'Course 3 Description']
+
+    """
+
+
+def doctest_CourseCSVImportView():
+    r"""
+    We'll create a course csv import view
+
+        >>> from schooltool.course.browser.csvimport import CourseCSVImportView
+        >>> from schooltool.course.course import CourseContainer
+        >>> from zope.publisher.browser import TestRequest
+        >>> container = CourseContainer()
+        >>> request = TestRequest()
+
+    Now we'll try a text import.  Note that the description is not required
+
+        >>> request.form = {'csvtext' : "A Course, The best Course\nAnother Course",
+        ...                 'charset' : 'UTF-8',
+        ...                 'UPDATE_SUBMIT': 1}
+        >>> view = CourseCSVImportView(container, request)
+        >>> view.update()
+        >>> [course for course in container]
+        [u'a-course', u'another-course']
+
+    If no data is provided, we naturally get an error
+
+        >>> request.form = {'charset' : 'UTF-8', 'UPDATE_SUBMIT': 1}
+        >>> view.update()
+        >>> view.errors
+        [u'No data provided']
+
+    We also get an error if a line starts with a comma (no title)
+
+        >>> request.form = {'csvtext' : ", No title provided here",
+        ...                 'charset' : 'UTF-8',
+        ...                 'UPDATE_SUBMIT': 1}
+        >>> view = CourseCSVImportView(container, request)
+        >>> view.update()
+        >>> view.errors
+        [u'Failed to import CSV text', u'Titles may not be empty']
+
+    """
+
+
+def doctest_SectionContainerView():
+    r"""View for the sections container.
+
+        >>> from schooltool.course.browser.section import SectionContainerView
+        >>> from schooltool.course.section import SectionContainer
+        >>> sc = SectionContainer()
+        >>> request = TestRequest()
+        >>> view = SectionContainerView(sc, request)
+
+    """
+
+
+def doctest_SectionView():
+    r"""View for sections
+
+    Lets create a simple view for a section:
+
+        >>> from schooltool.course.browser.section import SectionView
+        >>> from schooltool.course.section import Section
+        >>> section = Section()
+        >>> request = TestRequest()
+        >>> view = SectionView(section, request)
+        >>> view.getPersons()
+        []
+        >>> view.getGroups()
+        []
+
+    Let's create some students and a group:
+
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person
+        >>> person1 = Person(title='Person1')
+        >>> person2 = Person(title='Person2')
+        >>> person3 = Person(title='Person3')
+        >>> person4 = Person(title='Person4')
+        >>> form = Group('Form1')
+        >>> form.members.add(person3)
+        >>> form.members.add(person4)
+
+    Let's add the individuals and the group to the section:
+
+        >>> section.members.add(person1)
+        >>> section.members.add(person2)
+        >>> section.members.add(form)
+        >>> view = SectionView(section, request)
+        >>> [p.title for p in view.getPersons()]
+        ['Person1', 'Person2']
+        >>> [g.title for g in view.getGroups()]
+        ['Form1']
+
+    TODO in the future we should probably prevent users being direct memebers
+    of a section if they're transitive members.
+
+    """
+
+
+def doctest_SectionAddView():
+    r"""Tests for adding sections.
+
+        >>> from schooltool.course.browser.section import SectionAddView
+        >>> from schooltool.course.course import Course
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.course.interfaces import ISection
+
+    We need some setup to make traversal work in a unit test.
+
+        >>> setUp()
+
+        >>> class FakeURL:
+        ...     def __init__(self, context, request): pass
+        ...     def __call__(self): return "http://localhost/frogpond/groups"
+        ...
+        >>> from schooltool.group.interfaces import IGroupContainer
+        >>> from zope.traversing.browser.interfaces import IAbsoluteURL
+        >>> ztapi.browserViewProviding(IGroupContainer, FakeURL, \
+        ...                            providing=IAbsoluteURL)
+
+    we need to stub out the widgets
+
+        >>> from zope.app.form.interfaces import IInputWidget
+        >>> from zope.app.form.browser.objectwidget import ObjectWidget
+        >>> from zope.schema.interfaces import IObject
+        >>> ztapi.browserViewProviding(IObject, ObjectWidget, IInputWidget)
+
+    fake the ZCML
+
+        >>> class SectionAddViewForTesting(SectionAddView):
+        ...     schema = ISection
+        ...     fieldNames = ('title', 'description')
+        ...     _factory = Section
+        ...     _arguments = []
+        ...     _keyword_arguments = []
+        ...     _set_before_add = 'title',
+        ...     _set_after_add = []
+
+    create a SchoolTool instance:
+
+        >>> from schooltool.app.app import SchoolToolApplication
+        >>> app = setup.setUpSchoolToolSite()
+        >>> directlyProvides(app, IContainmentRoot)
+        >>> sections = app['sections']
+        >>> courses = app['courses']
+        >>> course = Course(title="Algebra I")
+        >>> courses['algebraI'] = course
+
+    On to the actual work...
+
+    Sections are special types of groups meant to represent one meeting time
+    of a course.  If they don't have a course, they can't be created "stand
+    alone".
+
+    First a request without a course reference sets the view error.
+
+        >>> request = TestRequest()
+        >>> context = AddingStub(sections, request)
+        >>> view = SectionAddViewForTesting(context, request)
+        >>> view.error
+        u'Need a course ID.'
+
+    validCourse is used to disable the update input button:
+
+        >>> view.validCourse()
+        False
+        >>> view.update()
+
+    A request with course_id doesn't
+
+        >>> request = TestRequest()
+        >>> request.form = {'field.course_id' : 'algebraI'}
+        >>> context = AddingStub(sections, request)
+        >>> view = SectionAddViewForTesting(context, request)
+        >>> view.error is None
+        True
+        >>> view.validCourse()
+        True
+        >>> view.update()
+
+    if there's a course_id in the request that doesn't match any known courses
+    the error is different.
+
+        >>> request = TestRequest()
+        >>> request.form = {'field.course_id' : 'math'}
+        >>> context = AddingStub(sections, request)
+        >>> view = SectionAddViewForTesting(context, request)
+        >>> view.error
+        u'No such course.'
+        >>> view.validCourse()
+        False
+        >>> view.update()
+
+    Currently our course has no sections
+
+        >>> for section in course.sections:
+        ...     print section
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': True,
+        ...                 'field.title' : 'MAT1',
+        ...                 'field.course_id' : 'algebraI'}
+        >>> context = AddingStub(sections, request)
+        >>> view = SectionAddViewForTesting(context, request)
+        >>> view.update()
+        ''
+
+        >>> translate(view.label)
+        u'Add a Section to Algebra I'
+
+    Our section is now a member of the Course, we use a generic title for
+    sections
+
+        >>> for section in course.sections:
+        ...     print section.title
+        MAT1
+
+        >>> tearDown()
+
+    """
+
+
+def doctest_SectionEditView():
+    r"""Test for SectionEditView
+
+    Let's create a view for editing a section:
+
+        >>> from schooltool.course.browser.section import SectionEditView
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.course.interfaces import ISection
+
+    We need some setup:
+
+        >>> from schooltool.app.app import SchoolToolApplication
+        >>> app = setup.setUpSchoolToolSite()
+        >>> from schooltool.resource.resource import Location
+        >>> app['resources']['room1'] = room1 = Location("Room 1")
+
+        >>> section = Section()
+        >>> directlyProvides(section, IContainmentRoot)
+        >>> request = TestRequest()
+
+        >>> class TestSectionEditView(SectionEditView):
+        ...     schema = ISection
+        ...     fieldNames = ('title', 'description')
+        ...     _factory = Section
+
+        >>> view = TestSectionEditView(section, request)
+
+    We should not get redirected if we did not click on apply button:
+
+        >>> request = TestRequest()
+        >>> view = TestSectionEditView(section, request)
+        >>> view.update()
+        ''
+        >>> request.response.getStatus()
+        599
+
+    After changing name of the section you should get redirected to the
+    container:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u'new_title'}
+        >>> view = TestSectionEditView(section, request)
+        >>> view.update()
+        u'Updated on ${date_time}'
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+        >>> section.title
+        u'new_title'
+
+    Even if the title has not changed you should get redirected to the section
+    list:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u'new_title'}
+        >>> view = TestSectionEditView(section, request)
+        >>> view.update()
+        ''
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+        >>> section.title
+        u'new_title'
+
+    We should not get redirected if there were errors:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u''}
+        >>> view = TestSectionEditView(section, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> request.response.getStatus()
+        599
+
+        >>> section.title
+        u'new_title'
+
+    We can cancel an action if we want to:
+
+        >>> request = TestRequest()
+        >>> request.form = {'CANCEL': 'Cancel'}
+        >>> view = TestSectionEditView(section, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    """
+
+
+def doctest_ConflictDisplayMixin():
+    r"""Tests for ConflictDisplayMixin.
+
+        >>> app = setup.setUpSchoolToolSite()
+
+        >>> class ItemStub(object):
+        ...     def __init__(self, name):
+        ...         self.__name__ = name
+        ...         self.title = name.title()
+        >>> class RelationshipPropertyStub(object):
+        ...     items = [ItemStub('john'),
+        ...              ItemStub('pete')]
+        ...     def __iter__(self):
+        ...         return iter(self.items)
+        ...     def add(self, item):
+        ...         print "Adding: %s" % item.title
+        ...     def remove(self, item):
+        ...         print "Removing: %s" % item.title
+
+    Inheriting views must implement getCollection() and
+    getAvailableItems():
+
+        >>> from schooltool.course.browser.section import ConflictDisplayMixin
+        >>> class SchemaStub(ItemStub):
+        ...     def items(self):
+        ...         return []
+        >>> class RelationshipView(ConflictDisplayMixin):
+        ...     def getCollection(self):
+        ...         return RelationshipPropertyStub()
+        ...     def getAvailableItems(self):
+        ...         return [ItemStub('ann'), ItemStub('frog')]
+        ...     def getTerm(self): return ItemStub('does not matter')
+        ...     def getSchema(self): return SchemaStub('does not matter')
+
+    Let's add Ann to the list:
+
+        >>> request = TestRequest()
+        >>> request.form = {'add_item.ann': 'on',
+        ...                 'ADD_ITEMS': 'Apply'}
+        >>> view = RelationshipView(None, request)
+        >>> view.update()
+        Adding: Ann
+
+    Someone might want to cancel a change.
+
+        >>> request = TestRequest()
+        >>> request.form = {'add_item.ann': 'on', 'CANCEL': 'Cancel'}
+        >>> view = RelationshipView(None, request)
+        >>> view.update()
+
+    No one was added, but we got redirected:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    We can remove items too:
+
+        >>> request.form = {'remove_item.john': 'on',
+        ...                 'remove_item.pete': 'on',
+        ...                 'REMOVE_ITEMS': 'Remove'}
+        >>> view = RelationshipView(None, request)
+        >>> view.update()
+        Removing: John
+        Removing: Pete
+
+    We also use a batch for available items in this view
+
+        >>> [i.title for i in view.batch]
+        ['Ann', 'Frog']
+
+    Which is searchable
+
+        >>> request.form = {'SEARCH': 'ann'}
+        >>> view = RelationshipView(None, request)
+        >>> view.update()
+        >>> [i.title for i in view.batch]
+        ['Ann']
+
+    The search can be cleared, ignoring any search value passed:
+
+        >>> request.form = {'SEARCH': 'ann', 'CLEAR_SEARCH': 'on'}
+        >>> view = RelationshipView(None, request)
+        >>> view.update()
+        >>> [i.title for i in view.batch]
+        ['Ann', 'Frog']
+
+    """
+
+
+def doctest_ConflictDisplayMixin_no_timetables():
+    r"""Tests for ConflictDisplayMixin.
+
+    ConflictDisplayMixin should work even if there are no timetables
+    defined.
+
+        >>> from schooltool.course.browser.section import ConflictDisplayMixin
+        >>> app = setup.setUpSchoolToolSite()
+        >>> view = ConflictDisplayMixin(app)
+        >>> view.getSchema = lambda: None
+        >>> view.getAvailableItems = lambda: []
+
+        >>> view.update()
+
+    """
+
+
+def doctest_ConflictDisplayMixin_getConflictingSections():
+    r"""Tests for ConflictDisplayMixin.getConflictingSections
+
+        >>> class SectionStub(object):
+        ...     def __init__(self, label):
+        ...         self.label = label
+        ...     def __repr__(self):
+        ...         return 'Section ' + self.label
+
+        >>> context = SectionStub('x')
+        >>> section1 = SectionStub('1')
+        >>> section2 = SectionStub('2')
+
+        >>> def getSectionsStub(item):
+        ...     print "Called getSections on", item
+        ...     return [context, section2]
+
+        >>> from schooltool.course.browser.section import ConflictDisplayMixin
+        >>> view = ConflictDisplayMixin(context)
+        >>> view.getSections = getSectionsStub
+        >>> view.busy_periods = [(('d1', 'a'), [section1]),
+        ...                      (('d2', 'b'), [section1, context]),
+        ...                      (('d4', 'd'), [section2]),
+        ...                      (('d3', 'c'), [section2])]
+
+        >>> for d in view.getConflictingSections('iTeM'):
+        ...     print sorted(d.items())
+        Called getSections on iTeM
+        [('day_id', 'd3'), ('period_id', 'c'), ('section', Section 2)]
+        [('day_id', 'd4'), ('period_id', 'd'), ('section', Section 2)]
+
+    Note that the results are sorted by (day_id, period, section.label).
+
+    """
+
+
+def doctest_ConflictDisplayMixin():
+    """Tests for ConflictDisplayMixin._findConflists
+
+        >>> from schooltool.course.browser.section import ConflictDisplayMixin
+        >>> view = ConflictDisplayMixin(None)
+        >>> view._findConflicts([], [])
+        []
+
+        >>> class EventStub(object):
+        ...     def __init__(self, start, duration, name):
+        ...         self.dtstart = start
+        ...         self.duration = duration
+        ...         self.name = name
+        ...     def __cmp__(self, other):
+        ...         return cmp(self.dtstart, other.dtstart)
+        ...     def __repr__(self):
+        ...         return self.name
+
+        >>> def e(s):
+        ...     events = []
+        ...     cur = None
+        ...     for time, char in enumerate(s):
+        ...         if cur and char == cur.name:
+        ...             cur.duration += 1
+        ...         elif char != '-':
+        ...             cur = EventStub(time, 1, char)
+        ...             events.append(cur)
+        ...     return events
+
+        >>> tte = e('---aaaaa----bbbbb----ccccc----ddddddd--')
+        >>> cal = e('---------xxx-----yy-----zzzz----q-w----')
+        >>> view._findConflicts(tte, cal)
+        [z, q, w]
+
+        >>> tte = e('--abcd-----eee------')
+        >>> cal = e('-xxxxxx--yyy-----zz-')
+        >>> view._findConflicts(tte, cal)
+        [x, y]
+
+    """
+
+
+def doctest_ConflictDisplayMixin_groupConflicts():
+    """Tests for ConflictDisplayMixin._groupConflicts
+
+    Given an empty list the function should return an empty list:
+
+        >>> from schooltool.course.browser.section import ConflictDisplayMixin
+        >>> view = ConflictDisplayMixin(None)
+        >>> view._groupConflicts([])
+        []
+
+    Events are considered unique if their unique_id's are different:
+
+        >>> class EventStub(object):
+        ...     def __init__(self, id):
+        ...         self.unique_id = id
+
+        >>> events = [EventStub(id) for id in "abcda"]
+
+        >>> sorted(e.unique_id for e in view._groupConflicts(events))
+        ['a', 'b', 'c', 'd']
+
+    """
+
+def doctest_ConflictDisplayMixin_getConflictingEvents():
+    """Tests for ConflictDisplayMixin.getConflictingEvents
+
+        >>> from schooltool.timetable.interfaces import ICompositeTimetables
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> class TimetabledStub(object):
+        ...     def __init__(self, events):
+        ...         self.events = events
+        >>> class CompositeTimetablesStub(object):
+        ...     adapts(TimetabledStub)
+        ...     implements(ICompositeTimetables)
+        ...     def __init__(self, section):
+        ...         self.section = section
+        ...     def makeTimetableCalendar(self):
+        ...         return self.section.events
+        >>> provideAdapter(CompositeTimetablesStub)
+
+        >>> class CalendarStub(object):
+        ...     adapts(TimetabledStub)
+        ...     implements(ISchoolToolCalendar)
+        ...     def __init__(self, item):
+        ...         self.item = item
+        ...     def expand(self, start, end):
+        ...         print "Expanding from %s to %s" % (start, end)
+        ...         return self.item.events
+        >>> provideAdapter(CalendarStub)
+
+    First let's try it out with a section without events in its
+    timetable:
+
+        >>> from schooltool.course.browser.section import ConflictDisplayMixin
+        >>> view = ConflictDisplayMixin(TimetabledStub([]))
+        >>> view.getConflictingEvents(TimetabledStub([]))
+        []
+
+        >>> class EventStub(object):
+        ...     def __init__(self, start):
+        ...         self.dtstart = start
+        ...         self.duration = 3
+        ...     def __cmp__(self, other):
+        ...         return cmp(self.dtstart, other.dtstart)
+        ...     def __repr__(self):
+        ...         return "e%s" % self.dtstart
+
+    Any events in the item calendar are ignored and an empty list is
+    returned:
+
+        >>> events = [EventStub(start) for start in [30, 10, 20]]
+        >>> view.getConflictingEvents(TimetabledStub(events))
+        []
+
+    If there are no events in the item calendar, an empty list is
+    returned:
+
+        >>> view = ConflictDisplayMixin(TimetabledStub(events))
+        >>> view.getConflictingEvents(TimetabledStub([]))
+        Expanding from 10 to 33
+        []
+
+    The calendar was expanded from the dtstart of the first event till
+    the dtend of the last one. This works with only one event too:
+
+        >>> view = ConflictDisplayMixin(TimetabledStub(events[-1:]))
+        >>> view.getConflictingEvents(TimetabledStub([]))
+        Expanding from 20 to 23
+        []
+
+    If there are events in both calendars all unique conflicting
+    events are returned:
+
+        >>> more_events = [EventStub(start) for start in [25, 15]]
+        >>> view._findConflicts = lambda tte, cae: "conflicts between %s and %s" % (tte, cae)
+        >>> view._groupConflicts = lambda conflicts: "Grouped %s" % conflicts
+
+        >>> print view.getConflictingEvents(TimetabledStub(more_events))
+        Expanding from 20 to 23
+        Grouped conflicts between [e20] and [e25, e15]
+
+    """
+
+
+def doctest_SectionInstructorView():
+    """Tests for SectionInstructorView.
+
+    First we need to set up some persons:
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.person.person import Person
+        >>> school = setup.setUpSchoolToolSite()
+        >>> provideAdapter(lambda context: school, (None,), ISchoolToolApplication)
+        >>> persons = school['persons']
+        >>> directlyProvides(school, IContainmentRoot)
+        >>> persons['smith'] = Person('smith', 'John Smith')
+        >>> persons['jones'] = Person('jones', 'Sally Jones')
+        >>> persons['stevens'] = Person('stevens', 'Bob Stevens')
+
+    getCollection plainly returns instructors attribute of a section:
+
+        >>> from schooltool.course.browser.section import SectionInstructorView
+        >>> class SectionStub(object):
+        ...     instructors = [persons['smith']]
+        >>> view = SectionInstructorView(SectionStub(), None)
+        >>> [item.title for item in view.getCollection()]
+        ['John Smith']
+
+    All persons that are not in the current instructor list are
+    considered available:
+
+        >>> [item.title for item in view.getAvailableItems()]
+        ['Sally Jones', 'Bob Stevens']
+
+        >>> view.context.instructors = []
+
+        >>> [item.title for item in view.getAvailableItems()]
+        ['Sally Jones', 'John Smith', 'Bob Stevens']
+
+    """
+
+
+def doctest_SectionLearnerView():
+    """Tests for SectionLearnerView.
+
+    First we need to set up some persons:
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.person.person import Person
+        >>> school = setup.setUpSchoolToolSite()
+        >>> provideAdapter(lambda context: school, (None,), ISchoolToolApplication)
+        >>> persons = school['persons']
+        >>> directlyProvides(school, IContainmentRoot)
+        >>> smith = persons['smith'] = Person('smith', 'John Smith')
+        >>> jones = persons['jones'] = Person('jones', 'Sally Jones')
+        >>> stevens = persons['stevens'] = Person('stevens', 'Bob Stevens')
+
+    getCollection plainly returns members attribute of a section:
+
+        >>> from schooltool.course.browser.section import SectionLearnerView
+        >>> class SectionStub(object):
+        ...     members = [smith]
+        >>> view = SectionLearnerView(SectionStub(), None)
+        >>> [item.title for item in view.getCollection()]
+        ['John Smith']
+
+    All persons that are not in the selected learner list are
+    considered available:
+
+        >>> [item.title for item in view.getAvailableItems()]
+        ['Sally Jones', 'Bob Stevens']
+
+        >>> view.context.members = []
+
+        >>> [item.title for item in view.getAvailableItems()]
+        ['Sally Jones', 'John Smith', 'Bob Stevens']
+
+    Any non-person members should be skipped when displaying selected
+    items:
+
+        >>> from schooltool.group.group import Group
+        >>> frogs = Group('frogs')
+        >>> view.context.members = [smith, frogs]
+        >>> [item.title for item in view.getSelectedItems()]
+        ['John Smith']
+
+    """
+
+
+def doctest_SectionLearnerGroupView():
+    """Tests for SectionLearnerGroupView.
+
+    First we need to set up some groups:
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.group.group import Group
+        >>> school = setup.setUpSchoolToolSite()
+        >>> provideAdapter(lambda context: school, (None,), ISchoolToolApplication)
+        >>> groups = school['groups']
+        >>> directlyProvides(school, IContainmentRoot)
+        >>> frogs = groups['frogs'] = Group('frogs', 'Bunch of frogs')
+        >>> lilies = groups['lilies'] = Group('lilies', 'Lillie pond')
+        >>> bugs = groups['bugs'] = Group('bugs', "Lot's o Bugs")
+
+    getCollection plainly returns members attribute of a section:
+
+        >>> from schooltool.course.browser.section import SectionLearnerGroupView
+        >>> class SectionStub(object):
+        ...     members = [frogs]
+        >>> view = SectionLearnerGroupView(SectionStub(), None)
+        >>> [item.title for item in view.getCollection()]
+        ['frogs']
+
+    All groups that are not in the selected learner list are
+    considered available:
+
+        >>> [item.title for item in view.getAvailableItems()]
+        ['bugs', 'lilies']
+
+        >>> view.context.members = []
+
+        >>> [item.title for item in view.getAvailableItems()]
+        ['bugs', 'frogs', 'lilies']
+
+    Any non-person members should be skipped when displaying selected
+    items:
+
+        >>> from schooltool.person.person import Person
+        >>> smith = Person('smith', 'John Smith')
+        >>> view.context.members = [smith, frogs]
+        >>> [item.title for item in view.getSelectedItems()]
+        ['frogs']
+
+    """
+
+
+def doctest_SectionResourceView():
+    """Tests for SectionResourceView.
+
+    First we need to set up some persons:
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.resource.resource import Resource
+        >>> school = setup.setUpSchoolToolSite()
+        >>> provideAdapter(lambda context: school, (None,), ISchoolToolApplication)
+        >>> resources = school['resources']
+        >>> directlyProvides(school, IContainmentRoot)
+        >>> rock = resources['rock'] = Resource('rock')
+        >>> stone = resources['stone'] = Resource('stone')
+        >>> boulder = resources['boulder'] = Resource('boulder')
+
+    getCollection plainly returns resources attribute of a section:
+
+        >>> from schooltool.course.browser.section import SectionResourceView
+        >>> class SectionStub(object):
+        ...     resources = [rock]
+        >>> view = SectionResourceView(SectionStub(), None)
+        >>> [item.title for item in view.getCollection()]
+        ['rock']
+
+    All resources that are not currently booked are considered
+    available:
+
+        >>> [item.title for item in view.getAvailableItems()]
+        ['boulder', 'stone']
+
+        >>> view.context.resources = []
+
+        >>> [item.title for item in view.getAvailableItems()]
+        ['boulder', 'rock', 'stone']
+
+    """
+
+
+def doctest_CoursesViewlet():
+    r"""Test for CoursesViewlet
+
+    Let's create a viewlet for a person's courses:
+
+        >>> from schooltool.course.browser.course import CoursesViewlet
+        >>> from schooltool.person.person import Person
+
+        >>> school = setup.setUpSchoolToolSite()
+        >>> persons = school['persons']
+        >>> sections = school['sections']
+
+        >>> persons['teacher'] = teacher = Person("Teacher")
+        >>> teacher_view = CoursesViewlet(teacher, TestRequest())
+
+    Not a teacher yet:
+
+        >>> teacher_view.isTeacher()
+        False
+
+    We'll need something to teach:
+
+        >>> from schooltool.course.section import Section
+        >>> sections['section'] = section = Section(title="History")
+        >>> sections['section2'] = section2 = Section(title="Algebra")
+        >>> section.instructors.add(teacher)
+
+    Now we're teaching:
+
+        >>> teacher_view.isTeacher()
+        True
+        >>> teacher_view.isLearner()
+        False
+
+    We'll teach 2 courses this semester, and we'll need an easy way to get a
+    list of all the courses we're teaching.
+
+        >>> section2.instructors.add(teacher)
+        >>> teacher_view = CoursesViewlet(teacher, TestRequest())
+        >>> [section.title for section in teacher_view.instructorOf()]
+        ['History', 'Algebra']
+
+    Let's create a student
+
+        >>> persons['student'] = student = Person("Student")
+        >>> student_view = CoursesViewlet(student, TestRequest())
+
+        >>> student_view.isTeacher()
+        False
+        >>> student_view.isLearner()
+        False
+
+    Membership in a Section implies being a learner:
+
+        >>> section.members.add(student)
+        >>> student_view.isTeacher()
+        False
+        >>> student_view.isLearner()
+        True
+
+        >>> sections['section3'] = section3 = Section(title="English")
+        >>> sections['section4'] = section4 = Section(title="Gym")
+
+    Our student is taking several classes
+
+        >>> section3.members.add(student)
+        >>> student_view = CoursesViewlet(student, TestRequest())
+
+        >>> [section['section'].title for section in student_view.learnerOf()]
+        ['Algebra', 'English']
+
+    Students can also participate in sections as part of a group, say all 10th
+    grade students must take gym:
+
+        >>> from schooltool.group.group import Group
+        >>> tenth_grade = Group(title="Tenth Grade")
+        >>> tenth_grade.members.add(student)
+        >>> section4.members.add(tenth_grade)
+
+        >>> student_view = CoursesViewlet(student, TestRequest())
+        >>> [section['section'].title for section in student_view.learnerOf()]
+        ['Algebra', 'English', 'Gym']
+
+    One thing that might confuse is that learnerOf may be similar to but not
+    the same as view.context.groups
+
+        >>> [group.title for group in student_view.context.groups]
+        ['Algebra', 'English', 'Tenth Grade']
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=doctest.ELLIPSIS|
+                                                   doctest.REPORT_NDIFF))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/browser/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,149 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <include file="security.zcml" />
+
+  <!-- Course Content Components -->
+
+  <interface
+      interface=".interfaces.ICourseContainer"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".course.CourseContainer">
+    <allow interface="zope.app.container.interfaces.ISimpleReadContainer" />
+    <require permission="schooltool.view"
+             attributes="keys values items __iter__ __len__" />
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer" />
+  </class>
+
+  <interface
+      interface=".interfaces.ICourse"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".course.Course">
+    <require permission="schooltool.view"
+             attributes="title description sections leaders __cmp__" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.ICourse" />
+  </class>
+
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".course.addCourseContainerToApplication"
+      />
+
+  <adapter
+      for=".interfaces.ICourseContainer"
+      factory="schooltool.app.app.SimpleNameChooser"
+      provides="zope.app.container.interfaces.INameChooser" />
+
+
+  <!-- Section Content Components -->
+
+  <interface
+      interface=".interfaces.ISectionContainer"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".section.SectionContainer">
+    <allow interface="zope.app.container.interfaces.ISimpleReadContainer" />
+    <require permission="schooltool.view"
+             attributes="keys values items __iter__ __len__" />
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer" />
+  </class>
+
+  <interface
+      interface=".interfaces.ISection"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".section.Section">
+    <implements interface="schooltool.timetable.interfaces.IOwnTimetables" />
+    <implements interface="schooltool.timetable.interfaces.IBookResources" />
+    <implements interface="schooltool.app.interfaces.IHaveCalendar" />
+
+    <require permission="schooltool.view"
+             interface=".interfaces.ISection" />
+    <require permission="schooltool.view"
+             interface="schooltool.timetable.interfaces.IBookResources" />
+    <require permission="schooltool.view"
+             attributes="__cmp__" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.ISection" />
+  </class>
+
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".section.addSectionContainerToApplication"
+      />
+
+  <adapter
+      for=".interfaces.ISectionContainer"
+      factory="schooltool.app.app.SimpleNameChooser"
+      provides="zope.app.container.interfaces.INameChooser" />
+
+  <!-- sample data -->
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+
+    <utility
+        factory=".sampledata.SampleCourses"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="courses"
+        />
+
+    <utility
+        factory=".sampledata.SampleSections"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="sections"
+        />
+
+    <utility
+        factory=".sampledata.SampleTimetables"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="section_timetables"
+        />
+
+    <utility
+        factory=".sampledata.SampleSectionAssignments"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="section_events"
+        />
+
+  </configure>
+
+  <!-- Relationships -->
+
+  <utility
+      provides="schooltool.relationship.interfaces.IRelationshipSchema"
+      component=".booking.SectionBooking"
+      name="http://schooltool.org/ns/sectionbooking" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".booking.URISectionBooking"
+      name="http://schooltool.org/ns/sectionbooking/sectionbooking" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".booking.URIResource"
+      name="http://schooltool.org/ns/sectionbooking/resource" />
+
+  <utility
+      provides="schooltool.relationship.uri.IURIObject"
+      component=".booking.URISection"
+      name="http://schooltool.org/ns/sectionbooking/section" />
+
+  <!-- Views -->
+  <include package=".browser" />
+  <include package=".rest" />
+
+  <!-- Help files -->
+  <include package=".help" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/course-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/course-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/course-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.course" />
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/course-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/course.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/course.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/course.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,57 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Course implementation
+
+$Id: course.py 6183 2006-06-07 18:40:03Z ignas $
+"""
+from persistent import Persistent
+import zope.interface
+
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.container import btree, contained
+
+from schooltool.relationship import RelationshipProperty
+from schooltool.app import relationships
+from schooltool.app.app import Asset
+from schooltool.course import interfaces
+
+class CourseContainer(btree.BTreeContainer):
+    """Container of Courses."""
+
+    zope.interface.implements(interfaces.ICourseContainer,
+                              IAttributeAnnotatable)
+
+
+class Course(Persistent, contained.Contained, Asset):
+
+    zope.interface.implements(interfaces.ICourseContained,
+                              IAttributeAnnotatable)
+
+    sections = RelationshipProperty(relationships.URICourseSections,
+                                    relationships.URICourse,
+                                    relationships.URISectionOfCourse)
+
+    def __init__(self, title=None, description=None):
+        self.title = title
+        self.description = description
+
+
+def addCourseContainerToApplication(event):
+    event.object['courses'] = CourseContainer()


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/course.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/help/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/help/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/help/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/help/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/help/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,17 @@
+<configure
+  xmlns:zcml="http://namespaces.zope.org/zcml"
+  xmlns:browser="http://namespaces.zope.org/browser"
+  xmlns:help="http://namespaces.zope.org/help"
+  zcml:condition="have context-help"
+  i18n_domain="schooltool">
+
+  <help:register
+      id="coursecontainer_index"
+      title="Course Container - Contents"
+      doc_path="course_container.pt"
+      for="schooltool.course.interfaces.ICourseContainer"
+      view="index.html"
+      class="zope.app.onlinehelp.onlinehelptopic.ZPTOnlineHelpTopic"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/help/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/help/course_container.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/help/course_container.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/help/course_container.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      metal:use-macro="view/@@schooltool_macros/onlinehelp/page">
+      <head>
+      <title metal:fill-slot="title"
+                   i18n:translate="">Z3 CSS: Styles</title>
+</head>
+<body metal:fill-slot="body" tal:omit-tag="">
+
+<p>Use this page to organize courses listed in the system.</p>
+
+<p>To look for for a course, use the search box to the left of the <b>Find
+Now</b> button to look through the entire list of courses for the search
+criterion.</p>
+
+<p>To show a list of the different sections of a course, click on the name
+of the course.</p>
+
+<p>The <b>Clear</b> button empties the search box of current entries.</p>
+
+<p>To show the lists of students in a particular class, click on the
+<em>teacher -- course</em> link. The number of students is also listed next
+to the teacher and the course.</p>
+
+<p>Separate <q>batches</q> of the Course list can be accessed through the
+<b>Next 10</b> (and <b>Previous</b>) and links in the blue bar.</p>
+
+<p>A <b>Show All</b> button is also there to show all of the courses on a
+single page.</p>
+
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/help/course_container.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,103 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Course and Section related interfaces
+
+$Id: interfaces.py 6217 2006-06-08 20:32:39Z pcardune $
+"""
+import zope.interface
+import zope.schema
+from zope.app import container
+
+from schooltool.group.interfaces import IBaseGroup as IGroup
+from schooltool import SchoolToolMessage as _
+
+
+class ICourse(zope.interface.Interface):
+    """Courses are similar to groups, membership is restricted to Sections."""
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        description=_("Title of the course."))
+
+    description = zope.schema.Text(
+        title=_("Description"),
+        required=False,
+        description=_("Description of the course."))
+
+    sections = zope.interface.Attribute(
+        """The Sections that implement this course material,
+           see schooltool.relationship.interfaces.IRelationshipProperty.""")
+
+
+class ICourseContainer(container.interfaces.IContainer):
+    """Container of Courses."""
+
+    container.constraints.contains(ICourse)
+
+
+class ICourseContained(ICourse, container.interfaces.IContained):
+    """Courses contained in an ICourseContainer."""
+
+    container.constraints.containers(ICourseContainer)
+
+
+class ISection(IGroup):
+    """Sections are groups of users in a particular meeting of a Course."""
+
+    label = zope.schema.TextLine(
+        title=_("Label"),
+        required=False,
+        description=_(
+            """An identifier for a section, made up of instructor
+            names, courses, and meeting time."""))
+
+    title = zope.schema.TextLine(
+        title=_("Code"),
+        required=True,
+        description=_("ID code for the section."))
+
+    description = zope.schema.Text(
+        title=_("Description"),
+        required=False,
+        description=_("Description of the section."))
+
+    instructors = zope.interface.Attribute(
+        """A list of Person objects in the role of instructor""")
+
+    members = zope.interface.Attribute(
+        """Students listed in the role of member""")
+
+    courses = zope.interface.Attribute(
+        """A list of courses this section is a member of.""")
+
+    size = zope.interface.Attribute(
+        """The number of member students in the section.""")
+
+
+class ISectionContainer(container.interfaces.IContainer):
+    """A container for Sections."""
+
+    container.constraints.contains(ISection)
+
+
+class ISectionContained(ISection, container.interfaces.IContained):
+    """Sections in a SectionContainer."""
+
+    container.constraints.containers(ISectionContainer)


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,116 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <!-- Course RESTive registrations -->
+
+  <view
+      for="..interfaces.ICourseContainer"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ICourseContainer"
+      name="POST"
+      factory=".course.CourseContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.ICourseContainer"
+      provides="zope.filerepresentation.interfaces.IFileFactory"
+      factory=".course.CourseFileFactory"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ICourseContainer"
+      name="GET"
+      factory=".course.CourseContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ICourse"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ICourse"
+      name="GET"
+      factory=".course.CourseView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.ICourse"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".course.CourseFile"
+      permission="zope.Public"
+      />
+
+  <!-- Section RESTive registrations -->
+
+  <view
+      for="..interfaces.ISectionContainer"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ISectionContainer"
+      name="POST"
+      factory=".section.SectionContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ISectionContainer"
+      name="GET"
+      factory=".section.SectionContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.ISectionContainer"
+      provides="zope.filerepresentation.interfaces.IFileFactory"
+      factory=".section.SectionFileFactory"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ISection"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ISection"
+      name="GET"
+      factory=".section.SectionView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.ISection"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".section.SectionFile"
+      permission="zope.Public"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/rest/course.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/rest/course.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/rest/course.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<course xmlns:xlink="http://www.w3.org/1999/xlink"
+            xmlns:tal="http://xml.zope.org/namespaces/tal"
+            xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+            i18n:domain="schooltool">
+  <title tal:content="context/title" />
+  <description tal:content="context/description" />
+  <relationships xlink:type="simple" xlink:title="Relationships"
+                 i18n:attributes="xlink:title Relationships"
+                 tal:attributes="xlink:href string:${context/@@absolute_url}/relationships" />
+  <acl xlink:type="simple" xlink:title="ACL"
+      i18n:attributes="xlink:title ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/acl" />
+</course>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/rest/course.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/rest/course.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/rest/course.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/rest/course.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,88 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for Courses
+
+$Id: course.py 6047 2006-05-11 18:31:03Z mg $
+"""
+from zope.component import adapts
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.app import ApplicationObjectFile
+from schooltool.app.rest.app import ApplicationObjectFileFactory
+from schooltool.app.rest.app import GenericContainerView
+
+from schooltool.course.course import Course
+from schooltool.course.interfaces import ICourseContainer, ICourse
+
+
+class CourseFileFactory(ApplicationObjectFileFactory):
+    """Adapter that adapts CourseContainer to FileFactory."""
+
+    adapts(ICourseContainer)
+
+    schema = '''<?xml version="1.0" encoding="UTF-8"?>
+        <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                 ns="http://schooltool.org/ns/model/0.1"
+                 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+          <start>
+            <element name="object">
+              <attribute name="title">
+                <text/>
+              </attribute>
+              <optional>
+                <attribute name="description">
+                  <text/>
+                </attribute>
+              </optional>
+            </element>
+          </start>
+        </grammar>
+        '''
+
+    factory = Course
+
+    def parseDoc(self, doc):
+        kwargs = {}
+        node = doc.query('/m:object')[0]
+        kwargs['title'] = node['title']
+        kwargs['description'] = node.get('description')
+        return kwargs
+
+
+class CourseContainerView(GenericContainerView):
+    """RESTive view of a course container."""
+
+
+class CourseFile(ApplicationObjectFile):
+    """Adapter that adapts ICourse to IWriteFile"""
+
+    adapts(ICourse)
+
+    def modify(self, title=None, description=None):
+        """Modifies underlying schema."""
+        self.context.title = title
+        self.context.description = description
+
+
+class CourseView(View):
+    """RESTive view for courses."""
+
+    template = Template("course.pt",
+                        content_type="text/xml; charset=UTF-8")
+    factory = CourseFile


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/rest/course.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/rest/section.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/rest/section.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/rest/section.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<section xmlns:xlink="http://www.w3.org/1999/xlink"
+       xmlns:tal="http://xml.zope.org/namespaces/tal"
+       xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+       i18n:domain="schooltool">
+  <title tal:content="context/title" />
+  <description tal:content="context/description" />
+  <relationships xlink:type="simple" xlink:title="Relationships"
+      i18n:attributes="xlink:title Relationships"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/relationships" />
+  <acl xlink:type="simple" xlink:title="ACL"
+      i18n:attributes="xlink:title ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/acl" />
+</section>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/rest/section.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/rest/section.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/rest/section.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/rest/section.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,109 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for Courses
+
+$Id: section.py 6047 2006-05-11 18:31:03Z mg $
+"""
+from zope.component import adapts
+
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.app import ApplicationObjectFile
+from schooltool.app.rest.app import ApplicationObjectFileFactory
+from schooltool.app.rest.app import GenericContainerView
+from schooltool.app.rest.errors import RestError
+
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.course.section import Section
+from schooltool.course.interfaces import ISectionContainer, ISection
+
+class SectionFileFactory(ApplicationObjectFileFactory):
+    """Adapter that adapts SectionContainer to FileFactory."""
+
+    adapts(ISectionContainer)
+
+    schema = '''<?xml version="1.0" encoding="UTF-8"?>
+        <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                 ns="http://schooltool.org/ns/model/0.1"
+                 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+          <start>
+            <element name="object">
+              <attribute name="title">
+                <text/>
+              </attribute>
+              <optional>
+                <attribute name="course">
+                  <text/>
+                </attribute>
+              </optional>
+              <optional>
+                <attribute name="description">
+                  <text/>
+                </attribute>
+              </optional>
+              <optional>
+                <attribute name="location">
+                  <text/>
+                </attribute>
+              </optional>
+            </element>
+          </start>
+        </grammar>
+        '''
+
+    factory = Section
+
+    def parseDoc(self, doc):
+        kwargs = {}
+        node = doc.query('/m:object')[0]
+        kwargs['title'] = node['title']
+        kwargs['description'] = node.get('description')
+        # Locations can be requested by title, we map them to the actual
+        # Resource object here:
+        desired_location = node.get('location')
+        if desired_location:
+            resources = getSchoolToolApplication()['resources']
+            try:
+                location = resources[desired_location]
+                kwargs['location'] = location
+            except KeyError:
+                raise RestError("No such location.")
+        return kwargs
+
+
+class SectionContainerView(GenericContainerView):
+    """RESTive view of a section container."""
+
+
+class SectionFile(ApplicationObjectFile):
+    """Adapter that adapts ISection to IWriteFile"""
+
+    adapts(ISection)
+
+    def modify(self, title=None, description=None):
+        """Modifies underlying schema."""
+        self.context.title = title
+        self.context.description = description
+
+
+class SectionView(View):
+    """RESTive view for sections."""
+
+    template = Template("section.pt",
+                        content_type="text/xml; charset=UTF-8")


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/rest/section.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/rest/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/rest/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/rest/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,359 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for course-related RESTive views.
+
+$Id: tests.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+from cStringIO import StringIO
+
+from zope.interface import Interface
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.filerepresentation.interfaces import IFileFactory
+from zope.app.testing import setup, ztapi
+from zope.traversing import namespace
+from zope.traversing.interfaces import ITraversable
+
+from schooltool.testing import setup as sbsetup
+from schooltool.testing.util import compareXML
+from schooltool.course.course import Course, CourseContainer
+from schooltool.course.interfaces import ICourseContainer
+from schooltool.course.rest.course import CourseFile, CourseFileFactory
+from schooltool.course.rest.course import CourseView, CourseContainerView
+from schooltool.course.section import Section, SectionContainer
+from schooltool.course.interfaces import ISectionContainer
+from schooltool.course.rest.section import SectionFile, SectionFileFactory
+from schooltool.course.rest.section import SectionView, SectionContainerView
+
+
+def doctest_CourseFileFactory():
+    r"""Tests for CourseFileFactory
+
+        >>> factory = CourseFileFactory(CourseContainer)
+
+    We can create a few courses
+
+        >>> course = factory("course1", None,
+        ...              '''<object xmlns="http://schooltool.org/ns/model/0.1"
+        ...                         title="New Course"/>''')
+        >>> course.title
+        u'New Course'
+        >>> course.description
+
+        >>> course = factory("course2", None,
+        ...              '''<object xmlns="http://schooltool.org/ns/model/0.1"
+        ...                         title="Newer Course"
+        ...                         description="Newer, Better"/>''')
+
+        >>> course.title
+        u'Newer Course'
+        >>> course.description
+        u'Newer, Better'
+
+    """
+
+
+def doctest_CourseFile():
+    r"""Tests for CourseFile.
+
+        >>> ztapi.provideAdapter(ICourseContainer,
+        ...                      IFileFactory,
+        ...                      CourseFileFactory)
+
+        >>> courses = CourseContainer()
+        >>> course = Course(title="History", description="US History")
+        >>> course.title
+        'History'
+        >>> course.description
+        'US History'
+
+        >>> courses['course'] = course
+        >>> file = CourseFile(course)
+        >>> file.write('''<object xmlns="http://schooltool.org/ns/model/0.1"
+        ...                       title="Herstory"
+        ...                       description="Gender Aware History"/>''')
+        >>> course.title
+        u'Herstory'
+        >>> course.description
+        u'Gender Aware History'
+
+    """
+
+
+def doctest_CourseContainerView():
+    r"""Tests for RESTive container view.
+
+    Lets create a container and a course:
+
+        >>> setup.placefulSetUp()
+        >>> ztapi.provideView(Interface, Interface, ITraversable, 'view',
+        ...                   namespace.view)
+        >>> ztapi.provideAdapter(ICourseContainer,
+        ...                     IFileFactory,
+        ...                     CourseFileFactory)
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> courses = app['courses']
+        >>> courses['course1'] = course1 = Course()
+
+    lets create a RESTive view for it:
+
+        >>> view = CourseContainerView(courses, TestRequest())
+        >>> result = view.GET()
+        >>> response = view.request.response
+        >>> response.getHeader('content-type')
+        'text/xml; charset=UTF-8'
+        >>> compareXML(result,
+        ... '''<container xmlns:xlink="http://www.w3.org/1999/xlink">
+        ...    <name>courses</name>
+        ...    <items>
+        ...      <item xlink:href="http://127.0.0.1/courses/course1"
+        ...            xlink:type="simple"/>
+        ...    </items>
+        ...    <acl xlink:href="http://127.0.0.1/courses/acl" xlink:title="ACL"
+        ...         xlink:type="simple"/>
+        ...  </container>''')
+        True
+
+    We can post to the container to create a course:
+
+        >>> len(courses)
+        1
+        >>> body = '''<object xmlns="http://schooltool.org/ns/model/0.1"
+        ...           title="new course" description="something new"/>'''
+        >>> view = CourseContainerView(courses,
+        ...                          TestRequest(StringIO(body)))
+        >>> result = view.POST()
+        >>> response = view.request.response
+        >>> response.getStatus()
+        201
+        >>> response._reason
+        'Created'
+        >>> len(courses)
+        2
+        >>> courses['Course'].title
+        u'new course'
+        >>> courses['Course'].description
+        u'something new'
+
+    """
+
+
+def doctest_CourseView():
+    r"""Test for RESTive view of courses.
+
+        >>> setup.placefulSetUp()
+        >>> ztapi.provideView(Interface, Interface, ITraversable, 'view',
+        ...                   namespace.view)
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> courses = app['courses']
+        >>> courses['course1'] = course1 = Course(title="Course 1",
+        ...                                       description="Something")
+        >>> view = CourseView(course1, TestRequest())
+        >>> result = view.GET()
+        >>> response = view.request.response
+        >>> response.getHeader('content-type')
+        'text/xml; charset=UTF-8'
+        >>> compareXML(result,'''
+        ... <course xmlns:xlink="http://www.w3.org/1999/xlink">
+        ...   <title>
+        ...     Course 1
+        ...   </title>
+        ...   <description>Something</description>
+        ...   <relationships
+        ...      xlink:href="http://127.0.0.1/courses/course1/relationships"
+        ...      xlink:title="Relationships"
+        ...      xlink:type="simple"/>
+        ...   <acl xlink:href="http://127.0.0.1/courses/course1/acl"
+        ...      xlink:title="ACL" xlink:type="simple"/>
+        ... </course>
+        ... ''')
+        True
+
+    """
+
+
+def doctest_SectionFileFactory():
+    r"""Tests for SectionFileFactory
+
+        >>> setup.placefulSetUp()
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+        >>> factory = SectionFileFactory(SectionContainer)
+
+    We can create a few sections
+
+        >>> section = factory("section1", None,
+        ...              '''<object xmlns="http://schooltool.org/ns/model/0.1"
+        ...                         title="New Section"
+        ...                         course="history"/>''')
+        >>> section.title
+        u'New Section'
+        >>> section.description
+
+        >>> section = factory("section2", None,
+        ...              '''<object xmlns="http://schooltool.org/ns/model/0.1"
+        ...                         title="Newer Section"
+        ...                         course="history"
+        ...                         description="Newer, Better"/>''')
+
+        >>> section.title
+        u'Newer Section'
+        >>> section.description
+        u'Newer, Better'
+
+    """
+
+
+def doctest_SectionFile():
+    r"""Tests for SectionFile.
+
+        >>> ztapi.provideAdapter(ISectionContainer,
+        ...                      IFileFactory,
+        ...                      SectionFileFactory)
+
+        >>> sections = SectionContainer()
+        >>> section = Section(title="Section 1", description="Good Students")
+        >>> section.title
+        'Section 1'
+        >>> section.description
+        'Good Students'
+
+        >>> sections['section'] = section
+        >>> file = SectionFile(section)
+        >>> file.write('''<object xmlns="http://schooltool.org/ns/model/0.1"
+        ...                       title="Section A"
+        ...                       course="algebra"
+        ...                       description="Still pretty good"/>''')
+        >>> section.title
+        u'Section A'
+        >>> section.description
+        u'Still pretty good'
+
+    """
+
+
+def doctest_SectionContainerView():
+    r"""Tests for RESTive section container view.
+
+    Lets create a container and a section:
+
+        >>> setup.placefulSetUp()
+        >>> ztapi.provideView(Interface, Interface, ITraversable, 'view',
+        ...                   namespace.view)
+        >>> ztapi.provideAdapter(ISectionContainer,
+        ...                     IFileFactory,
+        ...                     SectionFileFactory)
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> sections = app['sections']
+        >>> sections['section1'] = section1 = Section()
+
+    lets create a RESTive view for it:
+
+        >>> view = SectionContainerView(sections, TestRequest())
+        >>> result = view.GET()
+        >>> response = view.request.response
+        >>> response.getHeader('content-type')
+        'text/xml; charset=UTF-8'
+        >>> compareXML(result,
+        ... '''<container xmlns:xlink="http://www.w3.org/1999/xlink">
+        ...    <name>sections</name>
+        ...    <items>
+        ...      <item xlink:href="http://127.0.0.1/sections/section1"
+        ...            xlink:title="Section" xlink:type="simple"/>
+        ...    </items>
+        ...    <acl xlink:href="http://127.0.0.1/sections/acl" xlink:title="ACL"
+        ...         xlink:type="simple"/>
+        ...  </container>''')
+        True
+
+    We can post to the container to create a section:
+
+        >>> len(sections)
+        1
+        >>> body = '''<object xmlns="http://schooltool.org/ns/model/0.1"
+        ...                   title="new section"
+        ...                   course="algebra"
+        ...                   description="something new"/>'''
+        >>> view = SectionContainerView(sections,
+        ...                          TestRequest(StringIO(body)))
+        >>> result = view.POST()
+        >>> response = view.request.response
+        >>> response.getStatus()
+        201
+        >>> response._reason
+        'Created'
+        >>> len(sections)
+        2
+        >>> sections['Section'].title
+        u'new section'
+        >>> sections['Section'].description
+        u'something new'
+
+    """
+
+
+def doctest_SectionView():
+    r"""Test for RESTive view of sections.
+
+        >>> setup.placefulSetUp()
+        >>> ztapi.provideView(Interface, Interface, ITraversable, 'view',
+        ...                   namespace.view)
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> sections = app['sections']
+        >>> sections['section1'] = section1 = Section(title="Section 1",
+        ...                                       description="Something")
+        >>> view = SectionView(section1, TestRequest())
+        >>> result = view.GET()
+        >>> response = view.request.response
+        >>> response.getHeader('content-type')
+        'text/xml; charset=UTF-8'
+        >>> compareXML(result,'''
+        ... <section xmlns:xlink="http://www.w3.org/1999/xlink">
+        ...   <title>
+        ...     Section 1
+        ...   </title>
+        ...   <description>Something</description>
+        ...   <relationships
+        ...      xlink:href="http://127.0.0.1/sections/section1/relationships"
+        ...      xlink:title="Relationships"
+        ...      xlink:type="simple"/>
+        ...   <acl xlink:href="http://127.0.0.1/sections/section1/acl"
+        ...      xlink:title="ACL" xlink:type="simple"/>
+        ... </section>
+        ... ''')
+        True
+
+    """
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(setUp=setup.placelessSetUp,
+                                     tearDown=setup.placelessTearDown,
+                                     optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/rest/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,216 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Sample courses generation
+
+$Id: sampledata.py 6565 2007-01-11 16:43:11Z ignas $
+"""
+
+import random
+
+from zope.interface import implements
+from zope.security.proxy import removeSecurityProxy
+
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.course.course import Course
+from schooltool.course.section import Section
+from schooltool.app.relationships import Instruction, CourseSections
+from schooltool.app.relationships import URICourse, URISection
+from schooltool.app.membership import Membership
+from schooltool.relationship import getRelatedObjects
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.timetable.interfaces import ITimetables
+from schooltool.timetable import TimetableActivity
+from schooltool.app.cal import CalendarEvent
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.timetable.interfaces import ITimetableCalendarEvent
+
+
+class SampleCourses(object):
+
+    implements(ISampleDataPlugin)
+
+    name = 'courses'
+    dependencies = ()
+
+    subjects = ("English", "Math", "History", "Science", "Spanish", "Art")
+
+    def generate(self, app, seed=None):
+        courses = app['courses']
+
+        for name in self.subjects:
+            for subname in ('A', 'B', 'C', 'D'):
+                obname = ("%s_%s" % (name, subname)).lower()
+                title = "%s %s" % (name, subname)
+                courses[obname] = Course(title)
+
+
+class SampleSections(object):
+    """Sample data plugin for sections
+
+    This plugin creates sections and associates them with courses,
+    teachers, rooms and students.
+    """
+
+    implements(ISampleDataPlugin)
+
+    name = 'sections'
+    dependencies = ('teachers', 'students', 'courses', 'resources')
+
+    def generate(self, app, seed=None):
+        app = removeSecurityProxy(app)
+        self.random = random.Random()
+        self.random.seed(str(seed) + self.name)
+
+        # Create 5 sections for each teacher.
+        sections = []
+        for i in range(48 * 5):
+            sectionname = 'section%03d' % i
+            section = Section(sectionname)
+            app['sections'][sectionname] = section
+            sections.append(section)
+
+        # For each teacher, assign a course and 5 sections.
+        courses = list(app['courses'].values()) * 2
+        assert len(courses) >= 48, len(courses)
+        for personid in app['persons']:
+            if personid.startswith('teacher'):
+                teacher = app['persons'][personid]
+                course = self.random.choice(courses)
+                courses.remove(course)
+
+                for i in range(5):
+                    section = self.random.choice(sections)
+                    sections.remove(section)
+                    Instruction(instructor=teacher, section=section)
+                    CourseSections(course=course, section=section)
+        assert len(courses) == 0
+        assert len(sections) == 0
+
+        # Now let's assign rooms to sections.  In order to avoid
+        # collisions we'll in fact assign rooms to teachers.
+
+        rooms = [resource
+                 for resource in app['resources'].values()
+                 if resource.__name__.startswith('room')]
+
+        for person in app['persons'].values():
+            if person.__name__.startswith('teacher'):
+                room = self.random.choice(rooms)
+                rooms.remove(room)
+                for section in getRelatedObjects(person, URISection):
+                    section.resources.add(room)
+
+
+class SampleTimetables(object):
+    """Set up a random schedule for teachers and students"""
+
+    implements(ISampleDataPlugin)
+
+    name = "section_timetables"
+
+    dependencies = ("sections", "ttschema", "terms")
+
+    def assignPeriodToSection(self, app, period, section):
+        course = getRelatedObjects(section, URICourse)[0]
+        for ttname in '2005-fall.simple', '2006-spring.simple':
+            timetable = app['ttschemas'].getDefault().createTimetable()
+            for day_id in timetable.keys():
+                activity = TimetableActivity(course.title, owner=section,
+                                             resources=section.resources)
+                timetable[day_id].add(period, activity, send_events=False)
+            ITimetables(section).timetables[ttname] = timetable
+
+    def generate(self, app, seed=None):
+        # Let's assign a period for each teacher's sections
+        self.random = random.Random()
+        self.random.seed(str(seed) + self.name)
+        app = removeSecurityProxy(app)
+        sections = {}
+        for person in app['persons'].values():
+            if person.__name__.startswith('teacher'):
+                periods = ['A', 'B', 'C', 'D', 'E', 'F']
+                for section in getRelatedObjects(person, URISection):
+                    course = getRelatedObjects(section, URICourse)[0]
+                    subject = course.title.split()[0]
+                    period = self.random.choice(periods)
+                    periods.remove(period)
+                    self.assignPeriodToSection(app, period, section)
+                    if (subject, period) not in sections:
+                        sections[(subject, period)] = []
+                    sections[(subject, period)].append(section)
+
+        assert len(sections) == 36, "Try a different random seed please"
+
+        # Now, let's choose timetables for each student:
+        for person in app['persons'].values():
+            if person.__name__.startswith('student'):
+                periods = ['A', 'B', 'C', 'D', 'E', 'F']
+                for subject in SampleCourses.subjects:
+                    period = self.random.choice(periods)
+                    periods.remove(period)
+                    section = self.random.choice(sections[(subject, period)])
+                    Membership(group=section, member=person)
+
+
+class SampleSectionAssignments(object):
+    """A plugin that generates assignments and other events for sections"""
+
+    implements(ISampleDataPlugin)
+
+    name = "section_events"
+
+    dependencies = ('section_timetables', 'resources')
+
+    excuses = ('Assignment', 'Quiz', 'Quiz', 'Quiz', 'Homework',
+               'Homework', 'Homework','Homework', 'Test',
+               'Presentation', 'Deadline for essay',
+               'Deadline for project', 'Read the book', 'Lab work', )
+
+    def _findProjector(self, ev, projectors):
+        for projector in projectors:
+            if (projector, ev.dtstart) not in self.taken_projectors:
+                return projector
+        return None
+
+    def generate(self, app, seed=None):
+        app = removeSecurityProxy(app)
+        self.random = random.Random()
+        self.random.seed(str(seed) + self.name)
+
+        projectors = [resource
+                      for resource in app['resources'].values()
+                          if resource.__name__.startswith('projector')]
+
+        # tuples of (projector, datetime)
+        self.taken_projectors = set()
+
+        for section in app['sections'].values():
+            calendar = ISchoolToolCalendar(section)
+            for event in sorted(calendar):
+                if (ITimetableCalendarEvent.providedBy(event) and
+                    self.random.randrange(13) == 7): # is today lucky?
+                    title = self.random.choice(self.excuses)
+                    ev = CalendarEvent(event.dtstart, event.duration, title)
+                    projector = self._findProjector(ev, projectors)
+                    if projector is not None:
+                        ev.bookResource(projector)
+                        self.taken_projectors.add((projector, ev.dtstart))
+                    calendar.addEvent(ev)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/section.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/section.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/section.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,154 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Section implementation
+
+$Id: section.py 6300 2006-06-18 22:18:12Z ignas $
+"""
+from persistent import Persistent
+import zope.interface
+
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.container import btree, contained
+from zope.component import adapts
+
+from schooltool.relationship import RelationshipProperty
+from schooltool.app import membership
+from schooltool.app.cal import Calendar
+from schooltool.group.interfaces import IBaseGroup as IGroup
+from schooltool.person.interfaces import IPerson
+from schooltool.resource.interfaces import IResource
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app import relationships
+from schooltool.course import interfaces, booking
+from schooltool.securitypolicy.crowds import Crowd, AggregateCrowd
+from schooltool.course.interfaces import ISection
+from schooltool.person.interfaces import IPerson
+from schooltool.app.security import ConfigurableCrowd
+from schooltool.relationship.relationship import getRelatedObjects
+
+
+class Section(Persistent, contained.Contained):
+
+    zope.interface.implements(interfaces.ISectionContained,
+                              IAttributeAnnotatable)
+
+    _location = None
+
+    def __init__(self, title="Section", description=None, schedule=None):
+        self.title = title
+        self.description = description
+
+    @property
+    def label(self):
+        instructors = " ".join([i.title for i in self.instructors])
+        courses = " ".join([c.title for c in self.courses])
+        msg = _('${instructors} -- ${courses}',
+                mapping={'instructors': instructors, 'courses': courses})
+        return msg
+
+    @property
+    def size(self):
+        size = 0
+        for member in self.members:
+            if IPerson.providedBy(member):
+                size = size + 1
+            elif IGroup.providedBy(member):
+                size = size + len(member.members)
+        return size
+
+    instructors = RelationshipProperty(relationships.URIInstruction,
+                                       relationships.URISection,
+                                       relationships.URIInstructor)
+
+    courses = RelationshipProperty(relationships.URICourseSections,
+                                   relationships.URISectionOfCourse,
+                                   relationships.URICourse)
+
+    members = RelationshipProperty(membership.URIMembership,
+                                   membership.URIGroup,
+                                   membership.URIMember)
+
+    resources = RelationshipProperty(booking.URISectionBooking,
+                                     booking.URISection,
+                                     booking.URIResource)
+
+
+class SectionContainer(btree.BTreeContainer):
+    """Container of Sections."""
+
+    zope.interface.implements(interfaces.ISectionContainer,
+                              IAttributeAnnotatable)
+
+
+def addSectionContainerToApplication(event):
+    event.object['sections'] = SectionContainer()
+
+
+class InstructorsCrowd(Crowd):
+    """Crowd of instructors of a section."""
+    def contains(self, principal):
+        return IPerson(principal, None) in ISection(self.context).instructors
+
+
+class PersonInstructorsCrowd(Crowd):
+    """Crowd of instructors of a person."""
+
+    def _getSections(self, ob):
+        return [section for section in getRelatedObjects(ob, membership.URIGroup)
+                if ISection.providedBy(section)]
+
+    def contains(self, principal):
+        user = IPerson(principal, None)
+        person = IPerson(self.context)
+        # First check the the sections a pupil is in directly
+        for section in self._getSections(person):
+            if user in section.instructors:
+                return True
+        # Now check the section membership via groups
+        for group in person.groups:
+            for section in self._getSections(group):
+                if user in section.instructors:
+                    return True
+        return False
+
+
+class LearnersCrowd(Crowd):
+    """Crowd of learners of a section.
+
+    At the moment only direct members of a section are considered as
+    learners.
+    """
+    adapts(ISection)
+    def contains(self, principal):
+        return IPerson(principal, None) in self.context.members
+
+
+class SectionCalendarSettingCrowd(ConfigurableCrowd):
+    adapts(ISection)
+    setting_key = 'everyone_can_view_section_info'
+
+
+class SectionCalendarViewers(AggregateCrowd):
+    """Crowd of those who can see the section calendar."""
+    adapts(ISection)
+
+    def crowdFactories(self):
+        return [InstructorsCrowd, LearnersCrowd, SectionCalendarSettingCrowd]


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/section.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/security.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/security.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/security.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+<configure xmlns="http://schooltool.org/securitypolicy"
+           xmlns:zope="http://namespaces.zope.org/zope">
+
+  <!-- Security -->
+
+  <crowd
+      name="section_instructors"
+      factory="schooltool.course.section.InstructorsCrowd" />
+
+  <crowd
+      name="section_learners"
+      factory=".section.LearnersCrowd" />
+
+  <crowd
+      name="configurable_section_viewers"
+      factory=".section.SectionCalendarSettingCrowd" />
+
+  <zope:adapter
+      trusted="yes"
+      factory=".section.SectionCalendarViewers"
+      provides="schooltool.app.interfaces.ICalendarParentCrowd"
+      name="schooltool.view" />
+
+  <zope:adapter
+      trusted="yes"
+      for=".interfaces.ISection"
+      factory=".section.InstructorsCrowd"
+      provides="schooltool.app.interfaces.ICalendarParentCrowd"
+      name="schooltool.edit" />
+
+  <allow
+      interface="schooltool.course.interfaces.ISectionContainer"
+      crowds="administration configurable_section_viewers"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.course.interfaces.ISectionContainer"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <allow
+      interface="schooltool.course.interfaces.ISection"
+      crowds="administration section_instructors section_learners configurable_section_viewers"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.course.interfaces.ISection"
+      crowds="administration section_instructors"
+      permission="schooltool.edit" />
+
+  <setting
+      key="everyone_can_view_section_info"
+      text="Everyone can view section information and calendars"
+      default="False" />
+
+  <allow
+      interface="schooltool.course.interfaces.ICourseContainer"
+      crowds="administration everybody"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.course.interfaces.ICourseContainer"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <allow
+      interface="schooltool.course.interfaces.ICourse"
+      crowds="everybody"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.course.interfaces.ICourse"
+      crowds="administration leaders"
+      permission="schooltool.edit" />
+
+  <!-- Grant read access to person's data to his instructors -->
+  <allow
+      interface="schooltool.person.interfaces.IPerson"
+      crowds="person_instructors"
+      permission="schooltool.view" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/security.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/tests/test_course.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/tests/test_course.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/tests/test_course.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,305 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for course and section implementations.
+
+$Id: test_course.py 6253 2006-06-15 15:40:21Z alga $
+"""
+import unittest
+from zope.testing import doctest
+from zope.interface.verify import verifyObject
+
+
+def doctest_CourseContainer():
+    r"""Schooltool toplevel container for Courses.
+
+        >>> from schooltool.course.interfaces import ICourseContainer
+        >>> from schooltool.course.course import CourseContainer
+        >>> courses = CourseContainer()
+        >>> verifyObject(ICourseContainer, courses)
+        True
+
+    It should only be able to contain courses
+
+        >>> from schooltool.course.course import Course
+        >>> from schooltool.course.section import Section
+        >>> from zope.app.container.constraints import checkObject
+        >>> checkObject(courses, 'name', Course())
+
+        >>> checkObject(courses, 'name', Section())
+        Traceback (most recent call last):
+          ...
+        InvalidItemType: ...
+    """
+
+
+def doctest_Course():
+    r"""Tests for Courses
+
+    Courses are similar to SchoolBell groups but have sections instead of
+    members.
+
+        >>> from schooltool.course.course import Course
+        >>> algebraI = Course("Algebra I", "First year math.")
+        >>> from schooltool.course.interfaces import ICourse
+        >>> verifyObject(ICourse, algebraI)
+        True
+
+    Basic properties:
+
+        >>> algebraI.title
+        'Algebra I'
+        >>> algebraI.description
+        'First year math.'
+
+    Courses are instructional content that is taught in Sections, the Sections
+    are related to the course with the schooltool URICourseSections
+    relationship.
+
+    To test the relationship we need to do some setup:
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> from schooltool.app.relationships import enforceCourseSectionConstraint
+        >>> setUp()
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> zope.event.subscribers.append(enforceCourseSectionConstraint)
+
+    We need some sections and a person to test:
+
+        >>> from schooltool.course.course import Course
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.person.person import Person
+        >>> section1 = Section(title="section1")
+        >>> section2 = Section(title="section2")
+        >>> section3 = Section(title="section3")
+        >>> person = Person()
+
+    Our course doesn't have any sections yet:
+
+        >>> for section in algebraI.sections:
+        ...     print section
+
+    Lets add one:
+
+        >>> algebraI.sections.add(section1)
+        >>> for section in algebraI.sections:
+        ...     print section.title
+        section1
+
+    Lets try to add a person to the course:
+
+        >>> algebraI.sections.add(person)
+        Traceback (most recent call last):
+        ...
+        InvalidRelationship: Sections must provide ISection.
+
+    Lets try to add a course to the course:
+
+        >>> history = Course()
+        >>> algebraI.sections.add(history)
+        Traceback (most recent call last):
+        ...
+        InvalidRelationship: Sections must provide ISection.
+
+    No luck, you can only add sections:
+
+        >>> algebraI.sections.add(section2)
+        >>> algebraI.sections.add(section3)
+        >>> for section in algebraI.sections:
+        ...     print section.title
+        section1
+        section2
+        section3
+
+    That's it:
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+    """
+
+
+def doctest_Section():
+    r"""Tests for course section groups.
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+        >>> from schooltool.course.section import Section
+        >>> section = Section(title="section 1", description="advanced")
+        >>> from schooltool.course.interfaces import ISection
+        >>> verifyObject(ISection, section)
+        True
+
+    sections have some basic properties:
+
+        >>> section.title
+        'section 1'
+        >>> section.description
+        'advanced'
+        >>> section.size
+        0
+
+    We'll add an instructor to the section.
+
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.person.interfaces import IPerson
+        >>> teacher = Person('teacher', 'Mr. Jones')
+        >>> section.instructors.add(teacher)
+
+    Now we'll add some learners to the Section with the sections membership
+    RelationshipProperty.
+
+        >>> section.members.add(Person('first','First'))
+        >>> section.members.add(Person('second','Second'))
+        >>> section.members.add(Person('third','Third'))
+
+        >>> for person in section.members:
+        ...     print person.title
+        First
+        Second
+        Third
+        >>> section.size
+        3
+
+    We can add a Group as a member
+
+        >>> from schooltool.group.group import Group
+        >>> group = Group('group','Group')
+        >>> section.members.add(group)
+        >>> for member in section.members:
+        ...     print member.title
+        First
+        Second
+        Third
+        group
+
+    That group is empty so the size of our section doesn't change:
+
+        >>> section.size
+        3
+
+    If the group grows, our section grows as well:
+
+        >>> group.members.add(Person('fourth','Fourth'))
+        >>> group.members.add(Person('fifth','Fifth'))
+        >>> section.size
+        5
+
+        >>> for person in section.instructors:
+        ...     print person.title
+        Mr. Jones
+
+    Sections are generally shown in the interface by their label.  Labels are
+    created from the list of instructors, courses, and XXX time (not yet).
+
+        >>> from zope.i18n import translate
+        >>> translate(section.label)
+        u'Mr. Jones -- '
+
+    Labels are updated dynamically when more instructors are added.
+
+        >>> section.instructors.add(Person('teacher2', 'Mrs. Smith'))
+        >>> translate(section.label)
+        u'Mr. Jones Mrs. Smith -- '
+
+    Label s should include the courses that a Section is part of:
+
+        >>> from schooltool.course.course import Course
+        >>> course = Course(title="US History")
+        >>> course.sections.add(section)
+        >>> translate(section.label)
+        u'Mr. Jones Mrs. Smith -- US History'
+
+    The course should be listed in courses:
+
+        >>> for course in section.courses:
+        ...     print course.title
+        US History
+
+    Sections can be part of more than one Course:
+
+        >>> english = Course(title="English")
+        >>> section.courses.add(english)
+        >>> for course in section.courses:
+        ...     print course.title
+        US History
+        English
+
+    We're done:
+
+        >>> tearDown()
+
+    """
+
+
+def doctest_PersonInstructorCrowd():
+    """Unit test for the PersonInstructorCrowd
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+    We'll need a section, a group, and a couple of persons:
+
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.group.group import Group
+        >>> section = Section(title="section 1", description="advanced")
+        >>> teacher = Person('teacher', 'Mr. Jones')
+        >>> p1 = Person('p1','First')
+        >>> p2 = Person('p2','Second')
+        >>> group = Group('group','Group')
+
+    Let the first pupil be a direct member of the section, and the
+    second -- via a group:
+
+        >>> section.instructors.add(teacher)
+        >>> section.members.add(p1)
+        >>> section.members.add(group)
+        >>> group.members.add(p2)
+
+    The PersonInstructorCrowd should contain teacher for both p1 and p2:
+
+        >>> from schooltool.course.section import PersonInstructorsCrowd
+        >>> PersonInstructorsCrowd(p1).contains(teacher)
+        True
+        >>> PersonInstructorsCrowd(p2).contains(teacher)
+        True
+
+    However, non-teachers are not in the crowd:
+
+        >>> PersonInstructorsCrowd(p2).contains(p2)
+        False
+        >>> PersonInstructorsCrowd(p2).contains(p1)
+        False
+
+    Cleanup.
+
+        >>> tearDown()
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+           ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/tests/test_course.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/course/tests/test_sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/course/tests/test_sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/course/tests/test_sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,436 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.course.sampledata
+
+$Id: test_sampledata.py 6531 2006-12-28 15:52:02Z ignas $
+"""
+
+import unittest
+
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup
+from zope.app.testing import ztapi
+from zope.component import provideSubscriptionAdapter
+
+from schooltool.testing import setup as stsetup
+from schooltool.relationship.tests import setUpRelationships
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.timetable.source import OwnedTimetableSource
+from schooltool.timetable.interfaces import IOwnTimetables
+from schooltool.timetable.interfaces import ITimetableSource
+
+
+def setUp(test):
+    setup.placefulSetUp()
+    setUpRelationships()
+    app = stsetup.setUpSchoolToolSite()
+    ztapi.provideAdapter(None, ISchoolToolApplication, lambda x: app)
+    provideSubscriptionAdapter(OwnedTimetableSource,
+                               (IOwnTimetables,),
+                               ITimetableSource)
+    stsetup.setUpTimetabling()
+    stsetup.setUpCalendaring()
+    stsetup.setUpApplicationPreferences()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def doctest_SampleCourse():
+    """A sample data plugin that generates courses
+
+        >>> from schooltool.course.sampledata import SampleCourses
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleCourses()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    As always, we'll need an application instance:
+
+        >>> app = stsetup.setUpSchoolToolSite()
+
+    The plugin generates 24 courses:
+
+        >>> plugin.generate(app, 42)
+
+        >>> len(app['courses'])
+        24
+
+    The courses nave names like 'English A', 'History D', etc.
+
+        >>> app['courses']['math_a'].title
+        'Math A'
+
+        >>> app['courses']['history_d'].title
+        'History D'
+
+    """
+
+
+def doctest_SampleSections():
+    """A sample data plugin that generates sections
+
+        >>> from schooltool.course.sampledata import SampleSections
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleSections()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    As always, we'll need an application instance:
+
+        >>> from schooltool.group.group import Group
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> app['groups']['teachers'] = Group('Teachers')
+        >>> app['groups']['students'] = Group('Students')
+
+    This plugins depends on lots of stuff, so I'm afraid we'll have to
+    run it all:
+
+        >>> plugin.dependencies
+        ('teachers', 'students', 'courses', 'resources')
+
+        >>> from schooltool.demographics.sampledata import SampleStudents
+        >>> from schooltool.demographics.sampledata import SampleTeachers
+        >>> from schooltool.course.sampledata import SampleCourses
+        >>> from schooltool.resource.sampledata import SampleResources
+        >>> SampleTeachers().generate(app, 42)
+        >>> SampleStudents().generate(app, 42)
+        >>> SampleCourses().generate(app, 42)
+        >>> SampleResources().generate(app, 42)
+
+    Let's go:
+
+        >>> plugin.generate(app, 42)
+
+    5 sections for each of 48 teachers are created:
+
+        >>> len(app['sections'])
+        240
+
+    This generates 5 sections for each teacher:
+
+        >>> from schooltool.relationship import getRelatedObjects
+        >>> from schooltool.app.relationships import URISection
+        >>> for i in range(48):
+        ...    teacher = app['persons']['teacher%03d' % i]
+        ...    assert len(getRelatedObjects(teacher, URISection)) == 5
+
+    Each course gets assigned 2 teachers, and 10 sections:
+
+        >>> from schooltool.app.relationships import URISectionOfCourse
+        >>> for course in app['courses'].values():
+        ...    assert len(getRelatedObjects(course, URISectionOfCourse)) == 10
+
+    All sections of a teacher gather in one room:
+
+        >>> import zope.i18n
+        >>> student = app['persons']['teacher042']
+        >>> for section in getRelatedObjects(student, URISection):
+        ...     print list(section.resources)[0].title
+        Room 60
+        Room 60
+        Room 60
+        Room 60
+        Room 60
+
+    """
+
+
+def doctest_SampleTimetables():
+    """A sample data plugin that creates timetables for students and teachers
+
+        >>> from schooltool.course.sampledata import SampleTimetables
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleTimetables()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    This plugin needs the sections set up, and that requires a lot:
+
+        >>> plugin.dependencies
+        ('sections', 'ttschema', 'terms')
+
+        >>> from schooltool.group.group import Group
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> app['groups']['teachers'] = Group('Teachers')
+
+        >>> from schooltool.demographics.sampledata import SampleStudents
+        >>> from schooltool.demographics.sampledata import SampleTeachers
+        >>> from schooltool.course.sampledata import SampleCourses
+        >>> from schooltool.resource.sampledata import SampleResources
+        >>> from schooltool.course.sampledata import SampleSections
+        >>> from schooltool.timetable.sampledata import SampleTimetableSchema
+        >>> from schooltool.term.sampledata import SampleTerms
+        >>> SampleTeachers().generate(app, 42)
+        >>> SampleStudents().generate(app, 42)
+        >>> SampleCourses().generate(app, 42)
+        >>> SampleResources().generate(app, 42)
+        >>> SampleSections().generate(app, 42)
+        >>> SampleTimetableSchema().generate(app, 42)
+        >>> SampleTerms().generate(app, 42)
+
+    Let's call the plugin:
+
+        >>> plugin.generate(app, 42)
+
+    It randomly assigns a period for each section, so that no sections
+    of the same teacher happen on the same period:
+
+        >>> from schooltool.timetable.interfaces import ITimetables
+        >>> from schooltool.relationship import getRelatedObjects
+        >>> from schooltool.app.relationships import URISection
+        >>> teacher = app['persons']['teacher042']
+        >>> for section in getRelatedObjects(teacher, URISection):
+        ...     timetables = ITimetables(section)
+        ...     timetable = timetables.timetables['2005-fall.simple']
+        ...     for period, activities in timetable['Day 1'].items():
+        ...         if activities:
+        ...             print period, section.__name__
+        F section215
+        E section009
+        B section117
+        A section188
+        C section212
+
+    Also, on each day the same section gets the same slot:
+
+        >>> section = getRelatedObjects(teacher, URISection)[0]
+        >>> timetable = ITimetables(section).timetables['2005-fall.simple']
+        >>> for day, period, activity in timetable.activities():
+        ...     print day, period, activity.title
+        Day 1 F Spanish C
+        Day 2 F Spanish C
+        Day 3 F Spanish C
+        Day 4 F Spanish C
+        Day 5 F Spanish C
+        Day 6 F Spanish C
+
+    The students get assigned to sections so that they get into one
+    section of each subject, and they fall into different periods.
+
+        >>> student = app['persons']['student042']
+        >>> from schooltool.app.membership import URIGroup
+        >>> for section in getRelatedObjects(student, URIGroup):
+        ...     if section.title != 'Students':
+        ...         timetable = ITimetables(section).timetables['2005-fall.simple']
+        ...         for day, period, activity in timetable.activities()[:1]:
+        ...             print period, activity.title
+        D English B
+        B Math A
+        A History A
+        E Science C
+        C Spanish A
+        F Art A
+
+    """
+
+
+def doctest_SampleTimetables_assignPeriodToSection():
+    """Test for SampleTimetables.assignPeriodToSection method
+
+        >>> from schooltool.course.sampledata import SampleTimetables
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleTimetables()
+
+    We need a section and a course for this method:
+
+        >>> from schooltool.course.course import Course
+        >>> from schooltool.course.section import Section
+        >>> from schooltool.app.relationships import CourseSections
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> c = app['courses']['my_course'] = Course('My Course')
+        >>> s = app['sections']['the_sect'] = Section('Sect')
+        >>> CourseSections(course=c, section=s)
+
+    Also, we need a timetable schema with terms:
+
+        >>> from schooltool.timetable.sampledata import SampleTimetableSchema
+        >>> from schooltool.term.sampledata import SampleTerms
+        >>> SampleTimetableSchema().generate(app, 42)
+        >>> SampleTerms().generate(app, 42)
+
+    Let's call the method:
+
+        >>> plugin.assignPeriodToSection(app, 'B', s)
+
+    Now, let's inspect the timetables for this section:
+
+        >>> from schooltool.timetable.interfaces import ITimetables
+        >>> timetable = ITimetables(s).timetables['2005-fall.simple']
+        >>> for day, period, activity in timetable.activities():
+        ...     print day, period, activity.title
+        Day 1 B My Course
+        Day 2 B My Course
+        Day 3 B My Course
+        Day 4 B My Course
+        Day 5 B My Course
+        Day 6 B My Course
+
+        >>> timetable = ITimetables(s).timetables['2006-spring.simple']
+        >>> for day, period, activity in timetable.activities():
+        ...     print day, period, activity.title
+        Day 1 B My Course
+        Day 2 B My Course
+        Day 3 B My Course
+        Day 4 B My Course
+        Day 5 B My Course
+        Day 6 B My Course
+
+    """
+
+
+def doctest_SampleSectionAssignments():
+    """A sample data plugin that creates events in section calendars
+
+        >>> from zope.component import provideSubscriptionAdapter
+        >>> from schooltool.timetable.interfaces import ITimetableReplacedEvent
+        >>> from schooltool.timetable.model import handleTimetableReplacedEvent
+        >>> from zope.component import provideHandler
+        >>> provideHandler(handleTimetableReplacedEvent,
+        ...                adapts=[ITimetableReplacedEvent])
+
+
+        >>> from schooltool.course.sampledata import SampleSectionAssignments
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleSectionAssignments()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    This plugin needs the timetables to be set up for sections, so we
+    need lots of set up:
+
+        >>> plugin.dependencies
+        ('section_timetables', 'resources')
+
+        >>> app = ISchoolToolApplication(None)
+
+        >>> from schooltool.course.course import Course
+        >>> from schooltool.course.section import Section
+        >>> s0 = app['sections']['section000'] = Section('section000')
+        >>> s1 = app['sections']['section001'] = Section('section001')
+        >>> s2 = app['sections']['section002'] = Section('section002')
+        >>> s3 = app['sections']['section003'] = Section('section003')
+        >>> s4 = app['sections']['section004'] = Section('section004')
+        >>> s5 = app['sections']['section005'] = Section('section005')
+        >>> s6 = app['sections']['section006'] = Section('section006')
+        >>> s7 = app['sections']['section007'] = Section('section007')
+        >>> s8 = app['sections']['section008'] = Section('section008')
+        >>> c = app['courses']['somecourse'] = Course('Hard Science')
+
+        >>> from schooltool.app.relationships import CourseSections
+        >>> CourseSections(course=c, section=s0)
+        >>> CourseSections(course=c, section=s1)
+        >>> CourseSections(course=c, section=s2)
+        >>> CourseSections(course=c, section=s3)
+        >>> CourseSections(course=c, section=s4)
+        >>> CourseSections(course=c, section=s5)
+        >>> CourseSections(course=c, section=s6)
+        >>> CourseSections(course=c, section=s7)
+        >>> CourseSections(course=c, section=s8)
+
+        >>> from schooltool.timetable.sampledata import SampleTimetableSchema
+        >>> from schooltool.term.sampledata import SampleTerms
+        >>> SampleTimetableSchema().generate(app, 42)
+        >>> SampleTerms().generate(app, 42)
+
+        >>> from schooltool.resource.sampledata import SampleResources
+        >>> SampleResources().generate(app, 42)
+
+    The sections will need to have some timetables.  We'll assign them
+    to the same period
+
+        >>> from schooltool.timetable.interfaces import ITimetables
+        >>> from schooltool.timetable import TimetableActivity
+        >>> Timetable = app['ttschemas'].getDefault().createTimetable
+        >>> for sect in (s0, s1, s2, s3, s4, s5, s6, s7, s8):
+        ...     timetables = ITimetables(sect).timetables
+        ...     tt = Timetable()
+        ...     for day in range(1, 7):
+        ...         activity = TimetableActivity('Stuff', owner=sect)
+        ...         tt['Day %d' % day].add('A', activity, send_events=False)
+        ...     timetables['2005-fall.simple'] = tt
+
+    Now, let's run the plugin:
+
+        >>> plugin.generate(app, 42)
+
+    What we get is that the calendars of sections get events in them
+    roughly once in 13 times the group meets.
+
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> len(ISchoolToolCalendar(s0))
+        97
+        >>> len(ISchoolToolCalendar(s1))
+        98
+        >>> len(ISchoolToolCalendar(s2))
+        97
+
+    These events have random titles and times coinciding with section
+    timetable events:
+
+        >>> from schooltool.timetable.interfaces import ITimetableCalendarEvent
+        >>> for ev in sorted(ISchoolToolCalendar(s8)):
+        ...     if ITimetableCalendarEvent.providedBy(ev):
+        ...         continue
+        ...     resources = [res.__name__ for res in ev.resources]
+        ...     print ev.dtstart, ev.title, resources
+        2005-08-31 13:30:00+00:00 Quiz [u'projector01']
+        2005-09-07 08:00:00+00:00 Quiz [u'projector01']
+        2005-09-22 09:00:00+00:00 Lab work [u'projector01']
+        2005-11-10 10:00:00+00:00 Read the book [u'projector00']
+        2005-11-11 09:00:00+00:00 Homework [u'projector00']
+        2005-11-24 12:30:00+00:00 Read the book [u'projector00']
+        2005-12-13 11:00:00+00:00 Homework [u'projector00']
+        2005-12-14 10:00:00+00:00 Quiz [u'projector00']
+        2005-12-15 09:00:00+00:00 Homework [u'projector00']
+
+    Resources must have events in calendars.
+
+        >>> projector = app['resources']['projector00']
+        >>> calendar = ISchoolToolCalendar(projector)
+        >>> for ev in sorted(calendar)[0:10]:
+        ...     if ITimetableCalendarEvent.providedBy(ev):
+        ...         continue
+        ...     print ev.dtstart, ev.duration, ev.title
+        2005-08-23 13:30:00+00:00 1:00:00 Quiz
+        2005-08-24 12:30:00+00:00 0:55:00 Deadline for essay
+        2005-08-26 10:00:00+00:00 0:55:00 Read the book
+        2005-08-29 09:00:00+00:00 0:55:00 Quiz
+        2005-08-31 13:30:00+00:00 1:00:00 Quiz
+        2005-09-01 12:30:00+00:00 0:55:00 Homework
+        2005-09-02 11:00:00+00:00 0:55:00 Homework
+        2005-09-05 10:00:00+00:00 0:55:00 Homework
+        2005-09-07 08:00:00+00:00 0:55:00 Assignment
+        2005-09-12 11:00:00+00:00 0:55:00 Homework
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS),
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/course/tests/test_sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/browser"
+    xmlns:zope="http://namespaces.zope.org/zope"
+    i18n_domain="schooltool">
+
+  <page
+      name="dashboard.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      template="dashboardpage.pt"
+      permission="schooltool.view"
+      />
+  <page
+      name="dashboardContent"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      template="dashContent.pt"
+      permission="schooltool.view"
+      />
+
+  <viewlet
+      name="dashboard"
+      for="*"
+      manager="schooltool.skin.IHeaderManager"
+      template="dashboard.pt"
+      permission="schooltool.view"
+      class="schooltool.dashboard.dashboard.DashboardTabView"
+      />
+
+  <viewletManager
+      name="schooltool.dashboard"
+      for="*"
+      permission="schooltool.view"
+      class=".dashboard.Dashboard"
+      provides=".interfaces.IDashboard"
+      template="dashboard_manager.pt"
+      />
+
+  <navigationViewlet
+      name="sections"
+      for="*"
+      manager=".interfaces.IDashboard"
+      template="sections.pt"
+      class=".dashboard.SectionsCategory"
+      permission="schooltool.edit"
+      title="My Sections"
+      weight="10"
+      />
+
+  <navigationViewlet
+      name="term_admin"
+      for="*"
+      manager=".interfaces.IDashboard"
+      template="term.pt"
+      class=".dashboard.DashboardCategory"
+      permission="schooltool.view"
+      title="Term Administration"
+      weight="50"
+      />
+
+  <navigationViewlet
+      name="school_admin"
+      for="*"
+      manager=".interfaces.IDashboard"
+      template="school.pt"
+      class=".dashboard.DashboardCategory"
+      permission="schooltool.view"
+      title="School Administration"
+      weight="200"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/dashContent.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/dashContent.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/dashContent.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<div i18n:domain="schooltool" tal:content="structure provider:schooltool.dashboard" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/dashContent.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.dashboard" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,98 @@
+<tal:block i18n:domain="schooltool">
+<script type="text/javascript" tal:content="view/dynamicVariables">
+</script>
+
+<script type="text/javascript">
+  maxHeight = 75; //height it should go to in percent
+  opened = false;
+  moving = false;
+  written = false;
+  function mouseDaemon(url){
+    if (opened == false && moving == false){
+      if (written == false){
+        document.getElementById('dashboardContents').innerHTML = 'loading...'
+        getDashboardContent();
+        written = true;
+      }
+      moving = true;
+      openDash();
+      opened = true;
+    }
+    else if (moving == false){
+      moving = true;
+      closeDash();
+      opened = false;
+    }
+  }
+  function openDash(){
+    tab = $('dashboardTab').style;
+    content = $('dashboardContents').style;
+    content.display = '';
+    if (parseInt(content.height) < maxHeight){
+      content.height = parseInt(content.height)+10+'%';
+      tab.bottom = parseInt(tab.bottom)+10+'%';
+      blah = setTimeout("openDash();",20);
+    }
+    else moving = false;
+  }
+  function closeDash(){
+    tab = $('dashboardTab').style;
+    content = $('dashboardContents').style;
+    content.display = '';
+    if (parseInt(content.height) > 0){
+      content.height = parseInt(content.height)-10+'%';
+      tab.bottom = parseInt(tab.bottom)-10+'%';
+      blah = setTimeout("closeDash();",20);
+    }
+    else {content.display = 'none'; moving = false; }
+  }
+
+  function getDashboardContent(){
+    deferred = doSimpleXMLHttpRequest(ajaxURL);
+    deferred.addCallback(alertContents);
+  }
+
+  function alertContents(http_request) {
+    $('dashboardContents').innerHTML = http_request.responseText;
+  }
+</script>
+
+<style type="text/css">
+  .dashboardButton {
+    position: fixed;
+    width: 20%;
+    right: 40%;
+    background: #EAE8E3;
+    text-align: center;
+    font-weight: bold;
+    z-index: 99;
+    border: solid 0px #000;
+    border-bottom: 0px;
+  }
+  div .dashboardContents {
+    position: fixed;
+    bottom: 0px;
+    width: 80%;
+    right: 10%;
+    background: #fff;
+    background: #EAE8E3;
+    text-align: center;
+    z-index: 98;
+    border: solid 1px #BAB5AB;
+    border-bottom: 0px;
+    overflow: auto;
+    text-align: left;
+  }
+</style>
+
+<a style="bottom: 0px;" class="dashboardButton" tal:attributes="href string:${context/schooltool:app/@@absolute_url}/@@dashboard.html"
+   i18n:translate=""
+   id="dashboardTab">Dashboard</a>
+<div id="dashboardContents" class="dashboardContents"
+     style="height: 0%; display: none;">
+</div>
+<script type="text/javascript">
+$('dashboardTab').href="javascript:mouseDaemon()";
+roundElement($('dashboardTab'), {corners: "top", border: "#BAB5AB"});
+</script>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,127 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Dashboard Implementation
+
+$Id: dashboard.py 6815 2007-04-10 08:03:19Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+import zope.component
+import zope.interface
+from zope.viewlet import manager, viewlet
+from zope.traversing.browser.absoluteurl import absoluteURL
+
+import schooltool.person
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.dashboard import interfaces
+
+
+class Dashboard(manager.ViewletManagerBase):
+    zope.interface.implements(interfaces.IDashboard)
+
+    table = None
+
+    def __getitem__(self, name):
+        """See zope.interface.common.mapping.IReadMapping"""
+        viewlet = super(Dashboard, self).__getitem__(name)
+        if not viewlet.isAvailable():
+            raise zope.component.interfaces.ComponentLookupError(
+                'Viewlet `%s` is not available.' %name)
+
+    def createTable(self):
+        self.table = [[], []]
+        for index in range(len(self.viewlets)):
+            try:
+                html = {'title':self.viewlets[index].title,
+                        'content':self.viewlets[index].render()}
+            except Exception, e:
+                html = {'title':self.viewlets[index].title,
+                        'error':"An %s error occurred: %s" %
+                        (e.__class__.__name__, str(e))}
+            self.table[index%2].append(html)
+
+    def filter(self, viewlets):
+        """Filter by by availability."""
+        viewlets = super(Dashboard, self).filter(viewlets)
+        return [(name, viewlet) for name, viewlet in viewlets
+                if viewlet.isAvailable()]
+
+    def sort(self, viewlets):
+        """Sort the viewlets by weight."""
+        return sorted(viewlets, key=lambda v: v[1].getWeight())
+
+    def update(self):
+        super(Dashboard, self).update()
+        self.createTable()
+
+class DashboardTabView(object):
+
+    def dynamicVariables(self):
+        return """
+            var ajaxURL = '%s/dashboardContent';
+            """ % (absoluteURL(ISchoolToolApplication(None), self.request))
+
+
+class DashboardCategory(viewlet.ViewletBase):
+    zope.interface.implements(interfaces.IDashboardCategory)
+
+    groups = []
+    weight = 100
+
+    # See interfaces.IDashboardCategory
+    title = ''
+
+    def appURL(self):
+        return absoluteURL(ISchoolToolApplication(None), self.request)
+
+    def getWeight(self):
+        """See interfaces.IDashboardCategory"""
+        return int(self.weight)
+
+    def isAvailable(self):
+        return True
+
+
+class PersonDashboardCategory(DashboardCategory):
+    """A person-centric dashboard category.
+
+    It is aware of person objects, and is only available for
+    schooltool users.
+    """
+
+    def __init__(self, context, request, view, manager):
+        super(PersonDashboardCategory, self).__init__(context, request,
+                                                      view, manager)
+        # Since unauthenticated users cannot be adapted to Person object,
+        # we must catch the exception
+        try:
+            self.context = schooltool.person.interfaces.IPerson(self.request.principal)
+        except TypeError:
+            self.context = None
+
+    def isAvailable(self):
+        return self.context != None
+
+class SectionsCategory(PersonDashboardCategory):
+
+    def getSections(self):
+        person = schooltool.person.interfaces.IPerson(self.request.principal)
+        for section in ISchoolToolApplication(None)['sections'].values():
+            if person in section.members:
+                yield section
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard_manager.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard_manager.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard_manager.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,21 @@
+<tal:block i18n:domain="schooltool">
+<style type="text/css">
+  h5 {
+    border-top: 1px #d6d6d6 solid;
+    padding-top: .5em;
+  }
+</style>
+<table width="100%">
+  <tr>
+    <td tal:repeat="column view/table" valign="top"
+        style="width: 50%; padding: 1em;">
+      <tal:block repeat="category column">
+          <h5 tal:content="category/title"
+              i18n:translate="">Management</h5>
+          <tal:block replace="structure category/content|nothing" />
+          <tal:block replace="category/error|nothing" />
+      </tal:block>
+    </td>
+  </tr>
+</table>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboard_manager.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboardpage.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/dashboardpage.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/dashboardpage.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,41 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="context/title" />
+</head>
+<body>
+<h1 metal:fill-slot="content-header">Dashboard</h1>
+
+<metal:block metal:fill-slot="body">
+<style type="text/css">
+  .dashboardButton {
+    position: fixed;
+    width: 20%;
+    right: 40%;
+    background:#fff;
+    text-align: center;
+    font-weight: bold;
+    z-index: 99;
+    border: solid 2px #000;
+    border-bottom: 0px;
+  }
+  div .dashboardContents {
+    position: fixed;
+    bottom: 0px;
+    width: 80%;
+    right: 10%;
+    background: #fff;
+    text-align: center;
+    z-index: 98;
+    border: solid 2px #000;
+    border-bottom: 0px;
+    overflow: auto;
+    text-align: left;
+  }
+</style>
+
+<div id="dashboardContents">
+  <div tal:content="structure provider:schooltool.dashboard" />
+</div>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/dashboardpage.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,60 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Dashboard Interfaces
+
+$Id: interfaces.py 5680 2006-01-23 16:58:55Z srichter $
+"""
+__docformat__ = 'reStructuredText'
+import zope.schema
+from zope.viewlet import interfaces
+from schooltool import SchoolToolMessage as _
+
+
+class IDashboard(interfaces.IViewletManager):
+    """Dashboard
+
+    The dashboard is a central place, which provides an overview of the tasks
+    a particular user can complete.
+    """
+
+
+class IDashboardCategory(interfaces.IViewlet):
+    """Dashbard Category
+
+    One of the categories in the dashboard.
+    """
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        description=_("Category Title."),
+        required=True)
+
+    weight = zope.schema.Int(
+        title=_("Weight"),
+        description=_("Weight"),
+        required=True,
+        default=100)
+
+    def isAvailable(self):
+        """Determine whether the category is available.
+
+        Ususally, the discrimination the viewlet provides is enough to
+        determine availability. However, in this case we want to determine
+        availability by user group.
+        """


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/school.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/school.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/school.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,27 @@
+<ul style="list-style: disc; left-padding: 2em;"
+    i18n:domain="schooltool">
+  <li>
+    <a tal:attributes="href string:${view/appURL}/levels"
+       href="levels" i18n:translate="">
+      Levels
+    </a>
+  </li>
+  <li>
+    <a tal:attributes="href string:${view/appURL}/@@categories.html"
+       href="@@categories.html" i18n:translate="">
+      Activity Categories
+    </a>
+  </li>
+  <li>
+    <a tal:attributes="href string:${view/appURL}/ttschemas"
+       href="ttschemas" i18n:translate="">
+      School Timetables
+    </a>
+  </li>
+  <li>
+    <a tal:attributes="href string:${view/appURL}/resources"
+       href="resources" i18n:translate="">
+      Resources
+    </a>
+  </li>
+</ul>


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/school.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/sections.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/sections.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/sections.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<ul style="list-style: disc; left-padding: 2em;"
+    i18n:domain="schooltool">
+  <li tal:repeat="section view/getSections">
+    <a href=""
+       tal:attributes="href section/@@absolute_url"
+       tal:content="section/title">
+      Section A
+    </a>
+  </li>
+</ul>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/sections.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/dashboard/term.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/dashboard/term.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/dashboard/term.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,21 @@
+<ul style="list-style: disc; left-padding: 2em;"
+    i18n:domain="schooltool">
+  <li>
+    <a tal:attributes="href string:${view/appURL}/courses"
+       href="courses" i18n:translate="">
+      Courses
+    </a>
+  </li>
+  <li>
+    <a tal:attributes="href string:${view/appURL}/sections"
+       href="sections" i18n:translate="">
+      Sections
+    </a>
+  </li>
+  <li>
+    <a tal:attributes="href string:${view/appURL}/terms"
+       href="terms" i18n:translate="">
+      Terms
+    </a>
+  </li>
+</ul>


Property changes on: schooltool/branches/upstream/current/src/schooltool/dashboard/term.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.10
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.10
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.10-0.11.4
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.10-0.11.4
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.11.4
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-0.11.4
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-2006.0-alpha1
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/Data.fs-2006.0-alpha1
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/setup.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/setup.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/setup.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,60 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Run schooltool with given Data.fs
+
+$Id: setup.py 6304 2006-06-22 18:09:21Z vidas $
+"""
+import os
+import sys
+import shutil
+import tempfile
+
+def runSchoolToolWith(datafs):
+    script_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
+    basedir = os.path.abspath(
+        os.path.dirname(os.path.dirname(os.path.dirname(script_dir))))
+
+    tempdir = tempfile.mkdtemp()
+    skeldir = os.path.join(tempdir, 'schooltool-skel')
+    os.mkdir(skeldir)
+
+    mydir = os.path.dirname(sys.argv[0])
+    topskeldir = os.path.join(basedir, 'schooltool-skel')
+    shutil.copytree(os.path.join(topskeldir, 'bin'),
+                    os.path.join(skeldir, 'bin'))
+    shutil.copytree(os.path.join(topskeldir, 'etc'),
+                    os.path.join(skeldir, 'etc'))
+    logdir = os.path.join(skeldir, 'log')
+    os.mkdir(logdir)
+    open(os.path.join(logdir, 'schooltool.log'), 'w')
+    datafsdir = os.path.join(skeldir, 'var')
+    os.mkdir(datafsdir)
+    shutil.copy(os.path.join(mydir, datafs),
+                os.path.join(datafsdir, 'Data.fs'))
+
+    sys.path.insert(0, os.path.join(basedir, 'src'))
+    z3dir = os.path.join(basedir, 'Zope3', 'src')
+    sys.path.insert(0, z3dir)
+    import site
+    site.addsitedir(z3dir)
+
+    os.chdir(tempdir)
+    from schooltool.app.main import StandaloneServer
+    StandaloneServer().main()


Property changes on: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/setup.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/test_migration_from.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/test_migration_from.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/test_migration_from.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional test for migration from arbitrary Data.fs (given on command line).
+
+$Id: test_migration_from.py 6304 2006-06-22 18:09:21Z vidas $
+"""
+import setup
+import sys
+
+setup.runSchoolToolWith(sys.argv[1])


Property changes on: schooltool/branches/upstream/current/src/schooltool/db-conversion-tests/test_migration_from.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,125 @@
+The Design of the Demographics Package
+======================================
+
+Not a doctest
+-------------
+
+This document is not a doctest. This has a reason: the demographics
+functionality does not contain a lot of algorithmic or API-heavy code,
+but is mostly an exercise in integration of existing packages without
+the introduction of much that is new in the way of APIs.
+
+What the demographics package does
+----------------------------------
+
+The demographics package takes care of person-specific data, for
+example information about the name of the person (INameInfo), or
+contact information for a person. These different informational
+aspects are presented in a menu of "tabs" on the top of the screen
+when viewing or editing a person.
+
+The demographics package has facilities to display this information in
+a browsable, batched table form.
+
+The demographics package also has a facility to index this information
+so that it can be searched. Search results can be browsed.
+
+Design
+------
+
+The person class is subclassed from
+``demographics.person.person.Person``. New data is added to the person
+class using dumb data objects that implement schemas. These data
+objects need to have a location, as they will have their own views
+attached to them. This is managed in
+``schooltool.demographics.person``.  The schemas are defined in
+``schooltool.demographics.interfaces``.
+
+Formlib-driven edit and display forms are hooked up to the dumb data
+classes. This is managed in
+``schooltool.demographics.browser.personform``.
+
+The container (IPersonContainer) has attached to it with a
+``zc.table`` driven view. This view defines the columns visible in the
+table (including sortability of such columns). This is arranged in
+``schooltool.demographics.browser.table``.
+
+The container also has a search page attached to it. The catalog and
+its indexes are defined in ``schooltool.demographics.utility``. Also
+there is the implementation of the ``ISearch`` interface, which
+provides the data that is cataloged. The search screen itself is in
+``schooltool.demographics.browser.table``.
+
+Customizability
+---------------
+
+The demographics package tries to be friendly to customization. If a
+customization of schooltool wants to install a different Person
+subclass, it can do so by setting up a different PersonFactory
+utility. See ``utility.py`` for how the demographics package does it.
+
+Tricky bits
+-----------
+
+In general some of the tricky bits have to do with the rendering of
+things in the context of the parent, not the attribute. This is a
+drawback of the composition approach in this case. The
+``actualContext`` method on views -- informs the view code to use a
+different context object for the rendering of the action menu (usually
+``__parent__``).
+
+The ``schooltool.demographics.browser.personform.AttributeMenu`` not
+only shows the menu in the context of the parent object, but also
+creates different relative links for each different object that's
+participating in the menu (in this case, different persons). It also
+highlights the menu we're currently looking at.
+
+The add form in ``schooltool.demographics.browser.personform`` is
+based on the add form in ``schooltool.person.browser``, but adds an
+extra required field to it (last_name).
+
+In defense of composition
+-------------------------
+
+The demographics package chooses subclassing and composition to add
+new information items to person objects. Compared to a strategy using
+annotations, or a strategy using a single object implementing multiple
+schemas (INameInfo, ISchoolData, etc) this has various benefits and
+drawbacks. Advantages of the attribute strategy are:
+
+* It supports extensibility and customizability using subclassing. A
+  subclass can create a new person object with different or added
+  attributes. This is a familiar Python pattern. 
+
+* Annotations allow doing this without subclassing. If the same
+  information needs to be added multiple times to a person object
+  (which is the case for contact information, which exists for both
+  parents and three emergencies), this becomes more cumbersome than
+  with the use of attributes.
+
+* It's easy to reuse both data storage *and* views in subclasses
+  without having to re-register views in ZCML, as the views are on the
+  attributes. Annotations allow the reuse of data storage but views
+  would need to be reregistered.
+
+* There is less chance of nameclashes than if Person object
+  implemented all the interfaces directly.
+
+* Attributes allow for high-speed access without the need for an
+  adapter looking as is the case for annotations. This can be
+  important to reduce overhead in tabular presentation of thousands of
+  persons. (is verified by eyeball-test only)
+
+* Annotations are attractive as no existing code needs to be changed
+  to store new data on an object. Taking into account the presentation
+  of this information in tabular browsing, or the indexing of this
+  information in a catalog, implies a lot of knowledge of this data
+  needs to exist in the codebase anyway. This means the benefits of
+  using annotations in part go away.
+
+Of course there are also valid arguments to be made for the use of
+annotations, or for the storage of all the attributes on the person
+object itself. It is as usual in software a matter of tradeoffs. In my
+(Martijn's) opinion however, given these arguments, the attributes
+approach seems a reasonable one to at least try out in the
+demographics package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# this is a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,297 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <page
+      name="demographics_macros"
+      for="*"
+      permission="zope.Public"
+      template="demographics_macros.pt"
+      />
+
+  <page
+      name="index.html"
+      for="schooltool.demographics.interfaces.IDemographicsPerson"
+      class=".personform.PersonView"
+      permission="zope.View"
+      menu="schooltool_actions"
+      title="View"
+      />
+
+  <page
+      name="edit.html"
+      for="schooltool.demographics.interfaces.IDemographicsPerson"
+      class=".personform.PersonEditView"
+      permission="zope.View"
+      menu="schooltool_actions"
+      title="Edit"
+      />
+
+  <zope:subscriber
+      for="schooltool.demographics.interfaces.IDemographicsPerson zope.publisher.interfaces.IPublisherRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".personform.nameinfo_traverser"
+      permission="zope.Public"
+      />
+
+  <page
+      for="..interfaces.INameInfo"
+      name="edit.html"
+      class=".personform.NameInfoEdit"
+      permission="schooltool.edit"
+      />
+
+  <page
+      for="..interfaces.INameInfo"
+      name="index.html"
+      class=".personform.NameInfoDisplay"
+      permission="schooltool.view"
+      />
+
+  <zope:subscriber
+      for="schooltool.demographics.interfaces.IDemographicsPerson
+           zope.publisher.interfaces.IPublisherRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".personform.demographics_traverser"
+      permission="zope.Public"
+      />
+
+  <page
+      for="..interfaces.IDemographics"
+      name="edit.html"
+      class=".personform.DemographicsEdit"
+      permission="schooltool.edit"
+      />
+
+  <page
+      for="..interfaces.IDemographics"
+      name="index.html"
+      class=".personform.DemographicsDisplay"
+      permission="schooltool.view"
+      />
+
+  <zope:subscriber
+      for="schooltool.demographics.interfaces.IDemographicsPerson
+           zope.publisher.interfaces.IPublisherRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".personform.schooldata_traverser"
+      permission="zope.Public"
+      />
+
+  <page
+      for="..interfaces.ISchoolData"
+      name="edit.html"
+      class=".personform.SchoolDataEdit"
+      permission="schooltool.edit"
+      />
+
+  <page
+      for="..interfaces.ISchoolData"
+      name="index.html"
+      class=".personform.SchoolDataDisplay"
+      permission="schooltool.view"
+      />
+
+  <zope:subscriber
+      for="schooltool.demographics.interfaces.IDemographicsPerson
+           zope.publisher.interfaces.IPublisherRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".personform.parent1_traverser"
+      permission="zope.Public"
+      />
+  <zope:subscriber
+      for="schooltool.demographics.interfaces.IDemographicsPerson
+           zope.publisher.interfaces.IPublisherRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".personform.parent2_traverser"
+      permission="zope.Public"
+      />
+  <zope:subscriber
+      for="schooltool.demographics.interfaces.IDemographicsPerson
+           zope.publisher.interfaces.IPublisherRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".personform.emergency1_traverser"
+      permission="zope.Public"
+      />
+  <zope:subscriber
+      for="schooltool.demographics.interfaces.IDemographicsPerson
+           zope.publisher.interfaces.IPublisherRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".personform.emergency2_traverser"
+      permission="zope.Public"
+      />
+  <zope:subscriber
+      for="schooltool.demographics.interfaces.IDemographicsPerson
+           zope.publisher.interfaces.IPublisherRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".personform.emergency3_traverser"
+      permission="zope.Public"
+      />
+
+  <page
+      for="..interfaces.IContactInfo"
+      name="edit.html"
+      class=".personform.ContactInfoEdit"
+      permission="schooltool.edit"
+      />
+
+  <page
+      for="..interfaces.IContactInfo"
+      name="index.html"
+      class=".personform.ContactInfoDisplay"
+      permission="schooltool.view"
+      />
+
+  <!-- to get simple drop down lists in widgets -->
+  <zope:adapter
+      for="zope.schema.interfaces.IIterableSource
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory=".personform.Terms"
+      />
+
+  <!-- list of teachers -->
+  <zope:adapter
+      for="schooltool.demographics.interfaces.ITeachersSource
+           zope.publisher.interfaces.browser.IBrowserRequest"
+           factory=".personform.TeachersTerms"
+      />
+
+  <!-- list of groups -->
+  <zope:adapter
+      for="schooltool.demographics.interfaces.IGroupsSource
+           zope.publisher.interfaces.browser.IBrowserRequest"
+           factory=".personform.GroupsTerms"
+      />
+
+  <page
+    name="menu_macros"
+    for="*"
+    permission="zope.View"
+    template="menu_macros.pt"
+    />
+
+  <!-- menu for different screens -->
+  <menu
+    id="person_edit_menu"
+    title="Schooltool Person Menu"
+    class=".personform.AttributeMenu"
+  />
+
+  <menuItems
+    for="*"
+    menu="person_edit_menu"
+    >
+
+    <menuItem
+      title="name info"
+      action="/nameinfo/@@edit.html"
+      permission="schooltool.edit"
+      />
+
+    <menuItem
+      title="demographics"
+      action="/demographics/@@edit.html"
+      permission="schooltool.edit"
+     />
+
+    <menuItem
+      title="schooldata"
+      action="/schooldata/@@edit.html"
+      permission="schooltool.edit"
+     />
+
+    <menuItem
+      title="parent1"
+      action="/parent1/@@edit.html"
+      permission="schooltool.edit"
+     />
+
+    <menuItem
+      title="parent2"
+      action="/parent2/@@edit.html"
+      permission="schooltool.edit"
+     />
+
+    <menuItem
+      title="emergency1"
+      action="/emergency1/@@edit.html"
+      permission="schooltool.edit"
+     />
+
+    <menuItem
+      title="emergency2"
+      action="/emergency2/@@edit.html"
+      permission="schooltool.edit"
+     />
+
+    <menuItem
+      title="emergency3"
+      action="/emergency3/@@edit.html"
+      permission="schooltool.edit"
+     />
+
+  </menuItems>
+
+  <menu
+    id="person_display_menu"
+    title="Schooltool Person Display Menu"
+    class=".personform.AttributeMenu"
+  />
+
+  <menuItems
+    for="*"
+    menu="person_display_menu"
+    >
+
+    <menuItem
+      title="name info"
+      action="/nameinfo"
+      permission="schooltool.view"
+      />
+
+    <menuItem
+      title="demographics"
+      action="/demographics"
+      permission="schooltool.view"
+     />
+
+    <menuItem
+      title="schooldata"
+      action="/schooldata"
+      permission="schooltool.view"
+     />
+
+    <menuItem
+      title="parent1"
+      action="/parent1"
+      permission="schooltool.view"
+     />
+
+    <menuItem
+      title="parent2"
+      action="/parent2"
+      permission="schooltool.view"
+     />
+
+    <menuItem
+      title="emergency1"
+      action="/emergency1"
+      permission="schooltool.view"
+     />
+
+    <menuItem
+      title="emergency2"
+      action="/emergency2"
+      permission="schooltool.view"
+     />
+
+    <menuItem
+      title="emergency3"
+      action="/emergency3"
+      permission="schooltool.view"
+     />
+
+  </menuItems>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,335 @@
+============
+Demographics
+============
+
+We can add a person:
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.addHeader('Authorization', 'Basic manager:schooltool')
+  >>> browser.open('http://localhost/persons/@@add.html')
+  >>> browser.getControl(name='form.prefix').value = 'Mr'
+  >>> browser.getControl(name='form.full_name').value = 'foobar'
+  >>> browser.getControl(name='form.username').value = 'foobar'
+  >>> browser.getControl(name='form.last_name').value = 'barson'
+  >>> browser.getControl(name="form.password").value = "barfoo"
+  >>> browser.getControl(name="form.password.confirm").value = "barfoo"
+  >>> browser.getControl('Add').click()
+
+We expect the data to be there:
+
+  >>> browser.open('http://localhost/persons/foobar/nameinfo/@@edit.html')
+  >>> browser.getControl(name='form.prefix').value
+  'Mr'
+  >>> browser.getControl(name='form.full_name').value
+  'foobar'
+  >>> browser.getControl(name='form.last_name').value
+  'barson'
+
+We expect no photo to be there yet as we didn't upload one:
+
+  >>> browser.open('http://localhost/persons/foobar/nameinfo')
+  >>> 'photo.jpg' in browser.contents
+  False
+
+Try logging in with the shiny new user:
+
+  >>> ubrowser = Browser()
+  >>> ubrowser.handleErrors = False
+  >>> ubrowser.addHeader('Authorization', 'Basic foobar:barfoo')
+  >>> ubrowser.open('http://localhost/')
+
+And we can edit its name info (also adding a photo):
+
+  >>> from StringIO import StringIO
+  >>> browser.open('http://localhost/persons/foobar/nameinfo/@@edit.html')
+  >>> browser.getControl(name='form.full_name').value = 'Someone Schooltool'
+  >>> browser.getControl(name='form.photo').add_file(StringIO('my_photo'),
+  ...     'binary/octet-stream', 'test.jpg')
+  >>> browser.getControl(name='form.actions.apply').click()
+  >>> browser.open('http://localhost/persons/foobar/nameinfo/@@edit.html')
+  >>> browser.getControl(name='form.full_name').value
+  'Someone Schooltool'
+
+We also expect the photo to be there:
+
+  >>> browser.open('http://localhost/persons/foobar/nameinfo')
+  >>> 'photo.jpg' in browser.contents
+  True
+
+Editing the name info again without supplying a photo will not change
+the photo:
+
+  >>> browser.open('http://localhost/persons/foobar/nameinfo/@@edit.html')
+  >>> browser.getControl(name='form.prefix').value = 'Mrs'
+  >>> browser.getControl(name='form.actions.apply').click()
+  >>> browser.open('http://localhost/persons/foobar/nameinfo')
+  >>> 'photo.jpg' in browser.contents
+  True
+
+We can also go there by browsing the table:
+
+  >>> browser.open('http://localhost/persons')
+  >>> browser.getLink('Someone Schooltool').click()
+  >>> 'Prefix' in browser.contents
+  True
+  >>> 'Full name' in browser.contents
+  True
+  >>> 'Someone Schooltool' in browser.contents
+  True
+
+We can also view the name info:
+
+  >>> browser.open('http://localhost/persons/foobar/nameinfo')
+  >>> 'Someone Schooltool' in browser.contents
+  True
+
+We can edit its demographics:
+
+  >>> browser.open('http://localhost/persons/foobar/demographics/@@edit.html')
+  >>> previous_school = browser.getControl(name='form.previous_school')
+  >>> previous_school.value = 'Some text'
+  >>> browser.getControl(name='form.actions.apply').click()
+
+and view it:
+
+  >>> browser.open('http://localhost/persons/foobar/demographics')
+  >>> 'Some text' in browser.contents
+  True
+
+and its school data:
+
+  >>> browser.open('http://localhost/persons/foobar/schooldata/@@edit.html')
+  >>> id = browser.getControl(name='form.id')
+  >>> id.value = 'ABC'
+  >>> browser.getControl(name='form.actions.apply').click()
+  >>> browser.open('http://localhost/persons/foobar/schooldata')
+  >>> 'ABC' in browser.contents
+  True
+
+and various parent and emergency contact screens:
+
+  >>> browser.open('http://localhost/persons/foobar/parent1/@@edit.html')
+  >>> name = browser.getControl(name='form.name').value = 'Zorro'
+  >>> browser.getControl(name='form.actions.apply').click()
+
+  >>> browser.open('http://localhost/persons/foobar/parent2/@@edit.html')
+  >>> browser.open('http://localhost/persons/foobar/emergency1/@@edit.html')
+  >>> browser.open('http://localhost/persons/foobar/emergency2/@@edit.html')
+  >>> browser.open('http://localhost/persons/foobar/emergency3/@@edit.html')
+
+It's possible to submit screen by screen by using the Apply and Next
+button:
+
+  >>> browser.open('http://localhost/persons/foobar/@@edit.html')
+  >>> browser.getControl('Prefix').value = 'Mrs'
+  >>> browser.getControl('Apply and Next').click()
+  >>> browser.getControl('Gender').value = ['female']
+  >>> browser.getControl('Apply and Next').click()
+  >>> browser.getControl('Enrollment date').value = '2006-06-08'
+  >>> browser.getControl('Apply and Next').click()
+  >>> browser.getControl('Relationship to student').value = ['parent']
+  >>> browser.getControl('Apply and Next').click()
+  >>> browser.getControl('Relationship to student').value = ['parent']
+  >>> browser.getControl('Apply and Next').click()
+  >>> browser.getControl('Relationship to student').value = ['other']
+  >>> browser.getControl('Apply and Next').click()
+  >>> browser.getControl('Relationship to student').value = ['other']
+  >>> browser.getControl('Apply and Next').click()
+  >>> browser.getControl('Relationship to student').value = ['other']
+  >>> browser.getControl('Apply and Next').click()
+
+at the last 'Apply and Next', we go to the person's display form for
+name info::
+
+  >>> browser.url
+  'http://localhost/persons/foobar/nameinfo'
+  >>> 'Mrs' in browser.contents
+  True
+
+We can also add people as CSV data:
+
+  >>> browser.open('http://localhost/persons/@@person-csvimport.html')
+  >>> csv = browser.getControl(name='csvtext')
+  >>> csv.value = 'delta, Delta\nomega, Omega'
+  >>> browser.getControl(name="UPDATE_SUBMIT").click()
+
+We can browse to the nameinfo of the newly added persons:
+
+  >>> browser.open('http://localhost/persons/delta/nameinfo')
+  >>> browser.open('http://localhost/persons/omega/nameinfo')
+
+We can also see the persons added so far in tabular display:
+
+  >>> browser.open('http://localhost/persons')
+  >>> 'delta' in browser.contents
+  True
+  >>> 'omega' in browser.contents
+  True
+  >>> 'foobar' in browser.contents
+  True
+
+We can search for the persons:
+
+  >>> browser.open('http://localhost/persons/@@search.html')
+  >>> sb = browser.getControl(name="form.fulltext")
+  >>> sb.value = 'delt'
+  >>> browser.getControl(name="form.actions.submit").click()
+
+Check that the persons appeared on the output of the search:
+
+  >>> 'delta' in browser.contents
+  True
+
+Check that the search didn't return un-matching cases:
+
+  >>> 'foobar' in browser.contents
+  False
+
+We can also search on parents:
+
+  >>> browser.open('http://localhost/persons/@@search.html')
+  >>> browser.getControl(name='form.parentName').value = 'Zorro'
+  >>> browser.getControl(name='form.actions.submit').click()
+
+Check that we found foobar, whose parent is Zorro:
+
+  >>> 'foobar' in browser.contents
+  True
+
+But not delta or omega:
+
+  >>> 'delta' in browser.contents
+  False
+  >>> 'omega' in browser.contents
+  False
+
+We can also do the same for the student id ABC:
+
+  >>> browser.open('http://localhost/persons/@@search.html')
+  >>> id = browser.getControl(name='form.studentId')
+  >>> id.value = 'ABC'
+  >>> browser.getControl(name='form.actions.submit').click()
+
+Check that we found foobar, whose student id is ABC:
+
+  >>> 'foobar' in browser.contents
+  True
+
+But not delta or omega:
+
+  >>> 'delta' in browser.contents
+  False
+  >>> 'omega' in browser.contents
+  False
+
+There's a quick search form in the table view:
+
+  >>> browser.open('http://localhost/persons')
+  >>> sb = browser.getControl(name="form.fulltext")
+  >>> sb.value = 'del*'
+  >>> browser.getControl(name="form.actions.submit").click()
+  >>> 'delta' in browser.contents
+  True
+  >>> 'foobar' in browser.contents
+  False
+
+The form is not reset so your query stays visible:
+
+  >>> sb.value
+  'del*'
+
+Allow normal users to view the table of persons:
+
+  >>> browser.open('http://localhost/access_control.html')
+  >>> browser.getControl('Everyone can view the list of persons').click()
+  >>> browser.getControl('Apply').click()
+
+Try seeing the table of persons with a normal user:
+
+  >>> ubrowser.open('http://localhost/persons')
+  >>> "foobar" in ubrowser.contents
+  True
+  >>> "manager" in ubrowser.contents
+  True
+  >>> "delta" in ubrowser.contents
+  True
+  >>> "omega" in ubrowser.contents
+  True
+
+The user delta is not a teacher:
+
+  >>> browser.open("http://localhost/persons/delta/")
+  >>> "Teachers" in browser.contents
+  False
+
+but it can be:
+
+  >>> browser.open('http://localhost/persons/delta/@@groups.html')
+  >>> 'Teachers' in browser.contents
+  True
+  >>> tc = browser.getControl("Teachers").click()
+  >>> browser.getControl("Add").click()
+
+Now it should be a teacher:
+
+  >>> browser.open("http://localhost/persons/delta/schooldata")
+  >>> "Teachers" in browser.contents
+  True
+
+Let's make delta the advisor of omega:
+
+  >>> browser.open("http://localhost/persons/omega/schooldata/")
+  >>> "delta" in browser.contents
+  False
+  >>> browser.open("http://localhost/persons/omega/schooldata/@@edit.html")
+  >>> adv = browser.getControl(name="form.advisor")
+  >>> adv.value = ["delta"]
+  >>> browser.getControl(name="form.actions.apply").click()
+  >>> browser.open("http://localhost/persons/omega/schooldata/")
+  >>> "Delta" in browser.contents
+  True
+
+Let's put omega in the omega team:
+
+  >>> browser.open("http://localhost/groups/+/addSchoolToolGroup.html")
+  >>> t = browser.getControl(name="field.title")
+  >>> t.value = "Gamma"
+  >>> browser.getControl("Add").click()
+  >>> browser.open("http://localhost/persons/omega/schooldata/")
+  >>> "Gamma" in browser.contents
+  False
+  >>> browser.open("http://localhost/persons/omega/schooldata/@@edit.html")
+  >>> adv = browser.getControl(name="form.team")
+  >>> adv.value = ["gamma"]
+  >>> browser.getControl(name="form.actions.apply").click()
+  >>> browser.open("http://localhost/persons/omega/schooldata/")
+  >>> "Gamma" in browser.contents
+  True
+
+Let's try removing the advisor and see that nothing goes wrong:
+
+  >>> browser.open("http://localhost/persons")
+  >>> delete = browser.getControl(name="delete.delta")
+  >>> delete.value = True
+  >>> browser.getControl("Delete").click()
+  >>> browser.getControl("Confirm").click()
+  >>> browser.open("http://localhost/persons/omega/schooldata/")
+  >>> "Delta" in browser.contents
+  False
+  >>> "Invalid teacher" in browser.contents
+  True
+
+Now let's try removing the team and see that nothing goes wrong:
+
+  >>> browser.open("http://localhost/groups")
+  >>> delete = browser.getControl(name="delete.gamma")
+  >>> delete.value = True
+  >>> browser.getControl("Delete").click()
+  >>> browser.getControl("Confirm").click()
+  >>> browser.open("http://localhost/persons/omega/schooldata/")
+  >>> "Gamma" in browser.contents
+  False
+  >>> "Invalid group" in browser.contents
+  True


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<metal:block define-macro="next_controls"
+             i18n:domain="schooltool">
+        <input type="submit" id="form.actions.apply" name="form.actions.apply" value="Apply" class="button-ok" 
+          title="Shortcut: Alt-A" accesskey="A" 
+          i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" id="form.actions.apply_next" name="form.actions.apply_and_next" value="Apply and Next" class="button-ok" 
+          title="Shortcut: Alt-N" accesskey="N" 
+          i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" id="form.actions.cancel" name="form.actions.cancel" value="Cancel" class="button-cancel" 
+          i18n:attributes="value cancel-button" />
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/demographics_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/display_form.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/display_form.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/display_form.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <head>
+    <title metal:fill-slot="title" i18n:translate="">Display</title>
+  </head>
+  <body>
+    <metal:block metal:fill-slot="body">
+      <metal:block use-macro="view/@@menu_macros/tab_menu" />
+      <metal:block use-macro="view/@@formlib_macros/display" />
+
+    <tal:block replace="structure context/__parent__/@@notes|nothing" />
+
+    </metal:block>
+
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/display_form.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/edit_form.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/edit_form.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/edit_form.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,16 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <metal:block use-macro="view/@@menu_macros/tab_menu" />
+
+  <metal:block use-macro="view/@@formlib_macros/edit">
+     <metal:block fill-slot="controls">
+          <metal:block use-macro="view/@@demographics_macros/next_controls" />
+     </metal:block>
+  </metal:block>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/edit_form.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool.help" file="meta.zcml" />
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.demographics" />
+
+  <includeOverrides package="schooltool.demographics" file="overrides.zcml" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,75 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.demographics.
+
+$Id: ftests.py 6562 2007-01-11 13:05:38Z ignas $
+"""
+
+import unittest
+import os
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.testing.functional import ZCMLLayer
+from schooltool.app.browser.ftests.setup import logInManager
+
+def addPerson(name, username=None, password=None, groups=None, browser=None):
+    """Add a demographics person.
+
+    If username is not specified, it will be taken to be name.lower().
+
+    If password is not specified, it will be taken to be username + 'pwd'.
+    """
+    if not username:
+        username = name.lower()
+    if not password:
+        password = username + 'pwd'
+    if browser is None:
+        browser = logInManager()
+    browser.getLink('Persons').click()
+    browser.getLink('New Person').click()
+    browser.getControl('Full name').value = name
+    browser.getControl('First name').value = name
+    # XXX Last name is a required field defined by demographics
+    browser.getControl('Last name').value = 'Fake'
+    browser.getControl('Username').value = username
+    browser.getControl('Password').value = password
+    browser.getControl('Confirm').value = password
+    browser.getControl('Add').click()
+
+    if groups:
+        browser.getLink('schooldata').click()
+        browser.getLink('edit groups').click()
+        for group in groups:
+            browser.getControl(name='add_item.%s' % group).value = True
+        browser.getControl('Add').click()
+    browser.open('http://localhost/persons')
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+demographics_functional_layer = ZCMLLayer(filename,
+                                          __name__,
+                                          'demographics_functional_layer')
+
+def test_suite():
+    return collect_ftests(layer=demographics_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/menu_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/menu_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/menu_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,18 @@
+<metal:block define-macro="tab_menu"
+             i18n:domain="schooltool">
+  <tal:block define="menu view/getMenu | nothing;" condition="menu">
+  <div style="margin-bottom: 5px">
+    <tal:block repeat="menuitem menu">
+      <a 
+        i18n:translate=""
+        tal:content="string:${menuitem/title}"
+        tal:attributes="
+          href string:${menuitem/action};
+          title menuitem/description;
+          id python: menuitem['selected'] and 'selected' or None"
+        />
+      <tal:block condition="not: repeat/menuitem/end">-</tal:block>
+    </tal:block>
+  </div>
+  </tal:block>
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/menu_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/nameinfo_view.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/nameinfo_view.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/nameinfo_view.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,20 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <head>
+    <title metal:fill-slot="title" i18n:translate="">Display</title>
+  </head>
+  <body>
+    <metal:block metal:fill-slot="body">
+      <metal:block use-macro="view/@@menu_macros/tab_menu" />
+      <metal:block use-macro="view/@@formlib_macros/display" />
+      <fieldset>
+        <tal:if define="person context/__parent__" condition="person/photo">
+          <img src="photo" class="person-photo" alt="photo" i18n:attributes="alt"
+             tal:attributes="src string:${person/@@absolute_url}/photo.jpg" />
+        </tal:if>
+      </fieldset>
+
+
+    <tal:block replace="structure context/__parent__/@@notes|nothing" />
+    </metal:block>
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/nameinfo_view.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/person_add.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/person_add.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/person_add.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,18 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <metal:block use-macro="view/@@formlib_macros/edit">
+    <metal:block fill-slot="controls">
+      <input type="submit" id="form.actions.apply" name="form.actions.apply" value="Add" class="button-ok" 
+        title="Shortcut: Alt-A" accesskey="A" 
+       i18n:attributes="value submit-button; accesskey" />
+     <input type="submit" id="form.actions.cancel" name="form.actions.cancel" value="Cancel" class="button-cancel" 
+       i18n:attributes="value cancel-button" />
+    </metal:block>
+  </metal:block>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/person_add.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/personform.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/personform.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/personform.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,402 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+
+from zope.app import zapi
+from zope.interface import implements
+from zope.formlib import form
+from zope.schema import TextLine, Password, getFields
+from zope.app.pagetemplate import ViewPageTemplateFile
+from zope.app.form.browser.interfaces import ITerms
+from zope.app.publisher.browser.menu import getMenu, BrowserMenu
+from zope.schema.interfaces import ITitledTokenizedTerm
+from zope.publisher.browser import BrowserView
+from zope.component import getUtility
+from zope.exceptions.interfaces import UserError
+
+from schooltool.person.interfaces import IPersonFactory
+from schooltool.skin.form import AttributeEditForm
+from schooltool.traverser.traverser import SingleAttributeTraverserPlugin
+from schooltool.person.interfaces import IReadPerson
+from schooltool.demographics import interfaces
+from schooltool import SchoolToolMessage as _
+from schooltool.app.app import ISchoolToolApplication
+from schooltool.skin.form import BasicForm
+from schooltool.widget.password import PasswordConfirmationWidget
+
+
+class PersonDisplayForm(form.PageDisplayForm):
+    """Base class for all person display forms.
+    """
+    template = ViewPageTemplateFile('display_form.pt')
+
+    def actualContext(self):
+        return self.context.__parent__
+
+    def getMenu(self):
+        return getMenu('person_display_menu', self.context, self.request)
+
+
+class AttributeMenu(BrowserMenu):
+    """A special menu that can:
+
+    * display the menu in context of the parent of the current
+      attribute object.
+
+    * displays relative links for the parent object
+
+    * can show which attribute is currently highlighted
+    """
+
+    def getMenuItems(self, object, request):
+        # all rather hackish, but functional
+        obj_url = zapi.absoluteURL(object.__parent__, request)
+        items = super(AttributeMenu, self).getMenuItems(object, request)
+        for item in items:
+            action = item['action']
+            if action.startswith('/'):
+                # determine which attribute we're viewing by looking at
+                # the action supplied..
+                attribute_name = action.split('/')[1]
+                if attribute_name == object.__name__:
+                    item['selected'] = True
+                item['action'] = '%s%s' % (obj_url, item['action'])
+        return items
+
+
+class PersonEditForm(AttributeEditForm):
+    """Base class of all person edit forms.
+    """
+    template = ViewPageTemplateFile('edit_form.pt')
+
+    def getMenu(self):
+        return getMenu('person_edit_menu', self.context, self.request)
+
+    def fullname(self):
+        return IReadPerson(self.context.__parent__).title
+
+    @form.action(_('Apply'), name='apply')
+    def handle_apply(self, action, data):
+        self.edit_action(action, data)
+
+    @form.action(_('Apply and Next'), name='apply_and_next')
+    def handle_apply_next(self, action, data):
+        self.edit_action(action, data)
+        # if we succeeded we'll have a status
+        if self.status:
+            next = self.getNextMenuUrl()
+            if next:
+                return self.request.response.redirect(next)
+            else:
+                return ''
+
+    @form.action(_('Cancel'), name='cancel')
+    def handle_cancel(self, action, data):
+        self.cancel_action(action, data)
+
+    def getNextMenuUrl(self):
+        """Given current menu we're in, get the URL for the next one.
+        """
+        menu = self.getMenu()
+        base_url = zapi.absoluteURL(self.context, self.request)
+        url =  base_url + '/@@' + self.__name__
+        return_next = False
+        for entry in menu:
+            if return_next:
+                return entry['action']
+            if entry['action'] == url:
+                return_next = True
+        url = zapi.absoluteURL(self.actualContext(), self.request)
+        return url + '/nameinfo'
+
+nameinfo_traverser = SingleAttributeTraverserPlugin('nameinfo')
+
+
+class PersonView(BrowserView):
+    """The default view of the person. Redirects to the nameinfo view.
+    """
+    def __call__(self):
+        url = zapi.absoluteURL(self.context.nameinfo, self.request)
+        return self.request.response.redirect(url)
+
+
+class PersonEditView(BrowserView):
+    """The default edit view of the person. Redirects to the edit view
+    of nameinfo.
+    """
+    def __call__(self):
+        url = (zapi.absoluteURL(self.context.nameinfo, self.request) +
+               '/edit.html')
+        return self.request.response.redirect(url)
+
+
+class NameInfoEdit(PersonEditForm):
+
+    def title(self):
+        return _(u'Change name information for ${fullname}',
+                 mapping={'fullname':self.fullname()})
+
+    form_fields = form.Fields(interfaces.INameInfo)
+
+    def edit_action(self, action, data):
+        # not uploading a photo results in no changes
+        if not data['photo']:
+            data['photo'] = self.context.photo
+        super(NameInfoEdit, self).edit_action(action, data)
+
+
+class NameInfoDisplay(PersonDisplayForm):
+    template = ViewPageTemplateFile("nameinfo_view.pt")
+
+    def title(self):
+        return _(u'Change name')
+
+    form_fields = form.Fields(interfaces.INameInfo)
+    form_fields = form_fields.omit('photo')
+
+
+demographics_traverser = SingleAttributeTraverserPlugin('demographics')
+
+
+class DemographicsEdit(PersonEditForm):
+    def title(self):
+        return _(u'Change demographics for ${fullname}',
+                 mapping={'fullname': self.fullname()})
+
+    form_fields = form.Fields(interfaces.IDemographics)
+
+
+class DemographicsDisplay(PersonDisplayForm):
+    def title(self):
+        return _(u'Demographics')
+    form_fields = form.Fields(interfaces.IDemographics)
+
+
+schooldata_traverser = SingleAttributeTraverserPlugin('schooldata')
+
+
+class SchoolDataEdit(PersonEditForm):
+    template = ViewPageTemplateFile("schooldata_edit.pt")
+
+    def title(self):
+        return _(u'Change school data for ${fullname}',
+                 mapping={'fullname': self.fullname()})
+
+    form_fields = form.Fields(interfaces.ISchoolData)
+
+
+class SchoolDataDisplay(PersonDisplayForm):
+    template = ViewPageTemplateFile("schooldata_view.pt")
+
+    def title(self):
+        return _(u'School data')
+
+    form_fields = form.Fields(interfaces.ISchoolData)
+
+
+parent1_traverser = SingleAttributeTraverserPlugin('parent1')
+parent2_traverser = SingleAttributeTraverserPlugin('parent2')
+emergency1_traverser = SingleAttributeTraverserPlugin('emergency1')
+emergency2_traverser = SingleAttributeTraverserPlugin('emergency2')
+emergency3_traverser = SingleAttributeTraverserPlugin('emergency3')
+
+
+class ContactInfoEdit(PersonEditForm):
+    # XXX need to distinguish between the different contact informations
+    # somehow. Is there a sane way to do this without introducing an
+    # abundance of views *and* interfaces *and* change the content
+    # model?
+    def title(self):
+        return _(u"Change contact information for ${fullname}",
+                 mapping={'fullname': self.fullname()})
+
+    form_fields = form.Fields(interfaces.IContactInfo)
+
+
+class ContactInfoDisplay(PersonDisplayForm):
+    def title(self):
+        return _(u"Contact information")
+
+    form_fields = form.Fields(interfaces.IContactInfo)
+
+
+class Term(object):
+    """Simplistic term that uses value as token.
+    """
+    implements(ITitledTokenizedTerm)
+
+    def __init__(self, value):
+        self.title = value
+        self.token = value
+        self.value = value
+
+
+class Terms(object):
+    """Simplistic term that just uses the value as the token.
+    """
+    implements(ITerms)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getTerm(self, value):
+        return Term(value)
+
+    def getValue(self, token):
+        return token
+
+
+class IPersonAddForm(interfaces.INameInfo):
+    """Like schooltool.app.person's addform, but add the last name field.
+    """
+    username = TextLine(
+        title=_("Username"),
+        description=_("Username"),
+        required=True)
+
+    password = Password(
+        title=_("Password"),
+        required=False)
+
+
+class PersonAddView(BasicForm):
+    """Like schooltool.app.person's addform, but add last_name field.
+    """
+    template = ViewPageTemplateFile('person_add.pt')
+
+    form_fields = form.Fields(IPersonAddForm, render_context=False)
+    form_fields['password'].custom_widget = PasswordConfirmationWidget
+
+    @form.action(_("Apply"))
+    def handle_apply_action(self, action, data):
+        if data['username'] in self.context:
+            self.status = _("This username is already used!")
+            return None
+
+        try:
+            from zope.app.container.interfaces import INameChooser
+            INameChooser(self.context).checkName(data['username'], None)
+        except UserError:
+            self.status = _("Names cannot begin with '+' or '@' or contain '/'")
+            return None
+
+        person = self._factory(data['username'], data['full_name'])
+        if data['password']:
+            person.setPassword(data['password'])
+
+        # get data pertaining to nameinfo
+        nameinfo_data = {}
+        for key in getFields(interfaces.INameInfo).keys():
+            nameinfo_data[key] = data[key]
+        # set them on nameinfo
+        form.applyChanges(person.nameinfo, NameInfoEdit.form_fields,
+                          nameinfo_data)
+
+        self.addPerson(person)
+        url = (zapi.absoluteURL(person, self.request) +
+               '/demographics/@@edit.html')
+        self.request.response.redirect(url)
+        return ''
+
+    @form.action(_("Cancel"))
+    def handle_cancel_action(self, action, data):
+        # XXX validation upon cancellation doesn't make any sense
+        # how to make this work properly?
+        return self._redirect()
+
+    def _redirect(self):
+        url = zapi.absoluteURL(self.context, self.request)
+        self.request.response.redirect(url)
+        return ''
+
+    def _factory(self, username, title):
+        return getUtility(IPersonFactory)(username, title)
+
+    def addPerson(self, person):
+        """Add `person` to the container.
+
+        Uses the username of `person` as the object ID (__name__).
+        """
+        name = person.username
+        self.context[name] = person
+        return person
+
+
+class TeachersTerm(object):
+    """A term for displaying a teacher.
+    """
+    implements(ITitledTokenizedTerm)
+
+    def __init__(self, value):
+        persons = ISchoolToolApplication(None)['persons']
+        if value in persons:
+            self.title = persons[value].title
+        else:
+            self.title = _(
+                u"Invalid teacher. Possible causes: deleted or renamed.")
+        self.token = value
+        self.value = value
+
+
+class TeachersTerms(object):
+    """Displaying teachers.
+    """
+    implements(ITerms)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getTerm(self, value):
+        return TeachersTerm(value)
+
+    def getValue(self, token):
+        return token
+
+
+class GroupsTerm(object):
+    """A term for displaying a group.
+    """
+    implements(ITitledTokenizedTerm)
+
+    def __init__(self, value):
+        groups = ISchoolToolApplication(None)['groups']
+        if value in groups:
+            self.title = groups[value].title
+        else:
+            self.title = _(
+                u"Invalid group. Possible causes: deleted or renamed.")
+        self.token = value
+        self.value = value
+
+
+class GroupsTerms(object):
+    """Displaying groups.
+    """
+    implements(ITerms)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getTerm(self, value):
+        return GroupsTerm(value)
+
+    def getValue(self, token):
+        return token


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/personform.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_edit.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_edit.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_edit.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,18 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <body>
+    <metal:block metal:fill-slot="body">
+      <metal:block use-macro="view/@@menu_macros/tab_menu" />
+
+      <metal:block use-macro="view/@@formlib_macros/edit">
+        <metal:block fill-slot="controls">
+          <metal:block use-macro="view/@@demographics_macros/next_controls" />
+        </metal:block>
+      </metal:block>
+
+      <fieldset>
+        <tal:block define="context python:context.__parent__"
+                   tal:replace="structure provider:schooltool.person.Info"/>
+      </fieldset>
+    </metal:block>
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_edit.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_view.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_view.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_view.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <head>
+    <title metal:fill-slot="title" i18n:translate="">Display</title>
+  </head>
+  <body>
+    <metal:block metal:fill-slot="body">
+      <metal:block use-macro="view/@@menu_macros/tab_menu" />
+      <metal:block use-macro="view/@@formlib_macros/display" />
+      <fieldset>
+        <tal:block define="context python:context.__parent__"
+                   tal:replace="structure provider:schooltool.person.Info"/>
+      </fieldset>
+    </metal:block>
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/schooldata_view.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/search.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/search.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/search.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,45 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <p i18n:translate="">Search for persons here. Note that in fulltext
+  fields you can use wildcard characters such as *. For example, to search for everyone with John
+  in their name, use <em>*john*</em>.</p>
+
+  <form action="." method="get"
+        tal:attributes="action request/URL"
+        class="standalone">
+    <fieldset>
+      <div metal:use-macro="context/@@form_macros/widget_rows" />
+    </fieldset>
+    <div class="controls">
+      <input tal:repeat="action view/actions"
+             tal:replace="structure action/render" />
+    </div>
+  </form>
+
+  <tal:block replace="view/table/batch" />
+  <form method="post" tal:attributes="action string:${context/@@absolute_url}">
+    <tal:if condition="view/table/batch">
+      <div class="count">
+        <span i18n:translate="">Showing</span>
+        <span tal:content="view/table/batch/length"/>
+        <span i18n:translate="">of</span>
+        <span tal:content="view/table/batch/full_size"/>
+        <span i18n:translate="">items</span>
+      </div>
+        <tal:block replace="structure view/table/render" />
+        <div class="controls" tal:condition="view/canModify">
+          <input type="submit" class="button-cancel" value="Delete"
+                 name="DELETE"
+                 i18n:attributes="value delete-button;" />
+        </div>
+    </tal:if>
+  </form>
+
+  <p tal:condition="python:not view.table.batch and view.search_data" i18n:translate="">There were no results.</p>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/search.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,58 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="view/index_title" i18n:translate="">
+    Contents
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/index_title" i18n:translate="">Contents</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="batch view/table/batch;
+                         canModify view/canModify">
+  <tal:block replace="structure batch/render" />
+  <form method="post" tal:attributes="action string:${context/@@absolute_url}">
+    <tal:if condition="batch">
+      <div class="count">
+        <span i18n:translate="">Showing</span>
+        <span tal:content="batch/length"/>
+        <span i18n:translate="">of</span>
+        <span tal:content="batch/full_size"/>
+        <span i18n:translate="">items</span>
+      </div>
+        <tal:block replace="structure view/table/render" />
+        <div class="controls" tal:condition="canModify">
+          <input type="submit" class="button-cancel" value="Delete"
+                 name="DELETE"
+                 i18n:attributes="value delete-button;" />
+        </div>
+    </tal:if>
+  </form>
+  <p tal:condition="not:batch" i18n:translate="">There are none.</p>
+
+  <form action="@@search.html" method="get">
+    <input class="textType"
+           id="form.fulltext"
+           name="form.fulltext"
+           size="20" type="text"
+           value=""/>
+    <input type="hidden"
+           id="form.parentName"
+           name="form.parentName"
+           value=""/>
+    <input type="hidden"
+           id="form.studentId"
+           name="form.studentId"
+           value=""/>
+    <input type="submit"
+           id="form.actions.submit"
+           name="form.actions.submit"
+           value="Search" class="button" />
+  </form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,250 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+from datetime import date
+
+from zope.interface import directlyProvides
+from zope.app import zapi
+from zope.formlib import form
+from zc.table.interfaces import ISortableColumn
+from zc.table import column
+from zc.table import table
+from zc.table.column import GetterColumn
+from zope.app.pagetemplate import ViewPageTemplateFile
+from zope.i18n import translate
+from hurry.query.interfaces import IQuery
+from hurry.query import query
+from zope.security.proxy import removeSecurityProxy
+
+from schooltool.app.browser import ViewPreferences
+from schooltool.person.browser.person import PersonContainerView
+from schooltool.table.table import DependableCheckboxColumn
+from schooltool.demographics import interfaces
+from schooltool import SchoolToolMessage as _
+
+
+class PersonTable(PersonContainerView):
+    """Browse persons in a table.
+    """
+    template = ViewPageTemplateFile('table.pt')
+
+    def __init__(self, context, request):
+        # anyone who can see this view can see infomration for the
+        # container and persons in it
+        context = removeSecurityProxy(context)
+        super(PersonTable, self).__init__(context, request)
+
+    def setUpTableFormatter(self, formatter):
+        columns_before = []
+        if self.canModify():
+            columns_before = [DependableCheckboxColumn(prefix="delete",
+                                                       name='delete_checkbox',
+                                                       title=u'')]
+        formatter.setUp(columns=self.columns(),
+                        sort_on=self.sortOn(),
+                        columns_before=columns_before)
+
+    def columns(self):
+        username = GetterColumn(
+            name='username',
+            title=_(u'Username'),
+            getter=lambda i, f: i.username,
+            subsort=True)
+        directlyProvides(username, ISortableColumn)
+        full_name = FullnameColumn(
+            name='full_name',
+            title=_(u'Full name'),
+            subsort=True)
+        directlyProvides(full_name, ISortableColumn)
+        birth_date = DateColumn(
+            name='birth_date',
+            title=_(u'Birth'),
+            getter=lambda i, f: (i.demographics.birth_date or ''),
+            subsort=True)
+        directlyProvides(birth_date, ISortableColumn)
+        enrollment_date = DateColumn(
+            name='enrollment_date',
+            title=_(u'Enrollment'),
+            getter=lambda i, f: (i.schooldata.enrollment_date or ''),
+            subsort=True)
+        directlyProvides(enrollment_date, ISortableColumn)
+        modified = ModifiedColumn(
+            name='modified',
+            title=_(u'Modified'),
+            subsort=True)
+        directlyProvides(modified, ISortableColumn)
+
+        return [
+            username,
+            full_name,
+            birth_date,
+            enrollment_date,
+            modified,
+            EditColumn(name='edit', title=_(u'Edit')),
+            DisplayColumn(name='display', title=_(u'Display'))
+            ]
+
+    def sortOn(self):
+        return (("modified", True),)
+
+
+class SearchTable(form.FormBase, PersonTable):
+    """Browse person search results in a table.
+    """
+    form_fields = form.Fields(interfaces.ISearch, render_context=False)
+    template = ViewPageTemplateFile('search.pt')
+
+    def __init__(self, context, request):
+        super(SearchTable, self).__init__(context, request)
+        self.search_data = {}
+
+    def setUpTableFormatter(self, formatter):
+        columns_before = []
+        if self.canModify():
+            columns_before = [DependableCheckboxColumn(prefix="delete",
+                                                       name='delete_checkbox',
+                                                       title=u'')]
+        formatter.setUp(items=self.values(),
+                        columns=self.columns(),
+                        sort_on=self.sortOn(),
+                        columns_before=columns_before,
+                        table_formatter=table.StandaloneFullFormatter)
+
+    @form.action("submit")
+    def handle_submit(self, action, data):
+        self.search_data = data
+        self.form_reset = False
+        self.setUpTableFormatter(self.table)
+
+    def setUpWidgets(self, ignore_request=False):
+        form.FormBase.setUpWidgets(self, ignore_request)
+
+    def values(self):
+        if not self.search_data:
+            return []
+        # XXX Some search problems seem to occur in the underlying Zope 3
+        # text index code:
+        # - *a* matches "Alpha" but not "Beta"
+        # - queries smaller than three letters result in a parsetree.ParseError
+        #   exception.
+        q = zapi.getUtility(IQuery)
+        s = None
+        fulltext = self.search_data['fulltext']
+        if fulltext:
+            if not fulltext.endswith('*'):
+                fulltext += "*"
+            s = query.Text(('demographics_catalog', 'fulltext'),
+                           fulltext)
+        parentName = self.search_data['parentName']
+        if parentName:
+            t = query.Text(('demographics_catalog', 'parentName'),
+                               parentName)
+            if s is None:
+                s = t
+            else:
+                s = s & t
+        studentId = self.search_data['studentId']
+        if studentId:
+            t = query.Eq(('demographics_catalog', 'studentId'), studentId)
+            if s is None:
+                s = t
+            else:
+                s = s & t
+        # if we have no query at all
+        if not s:
+            return []
+        return q.searchResults(s)
+
+    def extraUrl(self):
+        return self.searchOptions()
+
+    def searchOptions(self):
+        result = []
+        form = self.request.form
+        for key in form:
+            if key.startswith('form.'):
+                result.append((key, form[key]))
+        if not result:
+            return ''
+        return '&' + '&'.join(['%s=%s' % (key, value)
+                               for (key, value) in result])
+
+
+class EditColumn(column.Column):
+    """Table column that displays edit link.
+    """
+    def renderCell(self, item, formatter):
+        return '<a href="%s">%s</a>' % (
+            zapi.absoluteURL(item, formatter.request) + '/nameinfo/@@edit.html',
+            translate(_("Edit")))
+
+
+class DisplayColumn(column.Column):
+    """Table column that displays display link.
+    """
+    def renderCell(self, item, formatter):
+        return '<a href="%s">%s</a>' % (
+            zapi.absoluteURL(item, formatter.request) + '/nameinfo',
+            translate(_("Display")))
+
+
+class FullnameColumn(column.GetterColumn):
+    """Table column that displays full name as link.
+    """
+    def getSortKey(self, item, formatter):
+        return item.nameinfo.last_name
+
+    def getter(self, item, formatter):
+        return item.title
+
+    def cell_formatter(self, value, item, formatter):
+        return '<a href="%s">%s</a>' % (
+            zapi.absoluteURL(item, formatter.request) + '/nameinfo',
+            value)
+
+
+class ModifiedColumn(column.GetterColumn):
+    """Table column that displays modified date, sortable.
+    """
+    _renderDatetime = None
+
+    def getSortKey(self, item, formatter):
+        return item.modified
+
+    def getter(self, item, formatter):
+        return item.modified
+
+    def cell_formatter(self, value, item, formatter):
+        # cache _renderDatetime for performance
+        if self._renderDatetime is None:
+            self._renderDatetime = ViewPreferences(
+                formatter.request).renderDatetime
+        return self._renderDatetime(value)
+
+
+class DateColumn(column.GetterColumn):
+    """Table column that displays dates.
+
+    Sortable even when None values are around.
+    """
+
+    def getSortKey(self, item, formatter):
+        if self.getter(item, formatter) is None:
+            return date.min
+        else:
+            return self.getter(item, formatter)


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/browser/table.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="schooltool">
+
+  <class class=".person.Person">
+    <implements interface="schooltool.app.interfaces.IHaveCalendar" />
+    <implements interface="schooltool.person.interfaces.IHavePreferences" />
+    <require
+        permission="schooltool.view"
+        interface="schooltool.person.interfaces.IReadPerson"
+        attributes="__cmp__" />
+    <require
+        permission="schooltool.edit"
+        interface="schooltool.person.interfaces.IWritePerson"
+        set_schema="schooltool.person.interfaces.IPerson" />
+    <require
+        permission="schooltool.view"
+        attributes="nameinfo demographics schooldata parent1 parent2 emergency1 emergency2 emergency3 modified" />
+    <require
+        permission="schooltool.edit"
+        set_attributes="modified" />
+  </class>
+
+  <subscriber
+    for="schooltool.person.interfaces.IPerson
+         zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+    handler=".person.personModifiedSubscriber"
+   />
+
+  <subscriber
+    for="schooltool.demographics.interfaces.IDemographics
+         zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+    handler=".person.personDemographicsModifiedSubscriber"
+   />
+
+  <subscriber
+    for="schooltool.demographics.interfaces.INameInfo
+         zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+    handler=".person.personDemographicsModifiedSubscriber"
+   />
+
+  <subscriber
+    for="schooltool.demographics.interfaces.ISchoolData
+         zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+    handler=".person.personDemographicsModifiedSubscriber"
+   />
+
+  <subscriber
+    for="schooltool.demographics.interfaces.IContactInfo
+         zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+    handler=".person.personDemographicsModifiedSubscriber"
+   />
+
+  <class class=".person.NameInfo">
+    <require
+       permission="schooltool.view"
+       interface=".interfaces.INameInfo"
+       />
+    <require
+       permission="schooltool.edit"
+       set_schema=".interfaces.INameInfo"
+       />
+  </class>
+
+  <class class=".person.Demographics">
+    <require
+       permission="schooltool.view"
+       interface=".interfaces.IDemographics"
+       />
+    <require
+       permission="schooltool.edit"
+       set_schema=".interfaces.IDemographics"
+       />
+  </class>
+
+  <class class=".person.SchoolData">
+    <require
+       permission="schooltool.view"
+       interface=".interfaces.ISchoolData"
+       />
+    <require
+       permission="schooltool.edit"
+       set_schema=".interfaces.ISchoolData"
+       />
+  </class>
+
+  <class class=".person.ContactInfo">
+    <require
+       permission="schooltool.view"
+       interface=".interfaces.IContactInfo"
+       />
+    <require
+       permission="schooltool.edit"
+       set_schema=".interfaces.IContactInfo"
+       />
+  </class>
+
+  <include package=".browser" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/demographics-overrides.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/demographics-overrides.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/demographics-overrides.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.demographics" file="overrides.zcml" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/demographics-overrides.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/event_titles.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/event_titles.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/event_titles.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,29 @@
+Audition
+Badminton
+Baseball
+Birding
+Birthday
+Boating
+Bowling
+Circus
+Concert
+Cricket
+Dentist
+Disco
+Fishing
+Flashmob
+Horse racing
+Movie theater
+Paintball
+Party
+Quake tournament
+Rodeo
+Roleplay games
+Soccer
+Street fight
+Theater
+Tribal dances
+Music school
+Irc meeting
+Hack school database
+Principal


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/event_titles.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,310 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+
+from zope.interface import Interface, implements, Attribute
+from zope import schema
+from zope.schema.interfaces import IIterableSource
+
+from schooltool.app.app import ISchoolToolApplication
+from schooltool import SchoolToolMessage as _
+from schooltool.person.interfaces import IPerson
+
+class IDemographicsPerson(IPerson):
+    nameinfo = Attribute('Name info')
+    demographics = Attribute('Demographics')
+    schooldata = Attribute('School data')
+    parent1 = Attribute('Parental contact')
+    parent2 = Attribute('Parental contact')
+    emergency1 = Attribute('Emergency contact')
+    emergency2 = Attribute('Emergency contact')
+    emergency3 = Attribute('Emergency contact')
+
+class INameInfo(Interface):
+    """Name information for a person.
+    """
+
+    prefix = schema.TextLine(
+        title=_(u"Prefix"),
+        description=_(u"Prefix such as Mr., Mrs."),
+        required=False,
+        )
+
+    first_name = schema.TextLine(
+        title=_(u"First name"),
+        required=False,
+        )
+
+    middle_name = schema.TextLine(
+        title=_(u"Middle name"),
+        required=False,
+        )
+
+    last_name = schema.TextLine(
+        title=_(u"Last name"),
+        required=True,
+        )
+
+    suffix = schema.TextLine(
+        title=_(u"Suffix"),
+        required=False,
+        )
+
+    preferred_name = schema.TextLine(
+        title=_(u"Preferred name"),
+        description=_(u"Name by which the student prefers to be called"),
+        required=False,
+        )
+
+    full_name = schema.TextLine(
+        title=_(u"Full name"),
+        required=True,
+        )
+
+    photo = schema.Bytes(
+        title=_("Photo"),
+        required=False,
+        description=_("""Photo (in JPEG format)"""),
+        )
+
+class SourceList(list):
+    """A simple list-based source for Choice fields.
+    """
+    implements(IIterableSource)
+
+
+ethnicitySource = SourceList([
+    _('American Indian or Alaska Native'),
+    _('Asian'),
+    _('Black or African American'),
+    _('Native Hawaiian or Other Pacific Islander'),
+    _('White')])
+
+
+languageSource = SourceList([
+    _('English'),
+    _('Spanish'),
+    _('Chinese'),
+    _('German'),
+    _('Tagalog'),
+    _('Vietnamese'),
+    _('Italian'),
+    _('Korean'),
+    _('Russian'),
+    _('Polish'),
+    _('Arabic'),
+    ])
+
+
+class IDemographics(Interface):
+    """Demographical information about a person.
+    """
+
+    gender = schema.Choice(
+        title=_(u"Gender"),
+        source=SourceList([_('male'), _('female')]),
+        required=False,
+        )
+
+    birth_date = schema.Date(
+        title=_(u"Birth date"),
+        required=False,
+        )
+
+    ethnicity = schema.Choice(
+        title=_(u"Ethnicity"),
+        source=ethnicitySource,
+        required=False,
+        )
+
+    primary_language = schema.Choice(
+        title=_(u"Primary language"),
+        source=languageSource,
+        required=False,
+        )
+
+    special_education = schema.Bool(
+        title=_(u"Special education"),
+        required=False
+        )
+
+    previous_school = schema.Text(
+        title=_(u"Previous school"),
+        required=False
+        )
+
+
+class ITeachersSource(IIterableSource):
+    """A source of names of teachers.
+    """
+
+class IGroupsSource(IIterableSource):
+    """A source of names of groups.
+    """
+
+class TeachersSource(object):
+    implements(ITeachersSource)
+
+    def teachers(self):
+        teachers = []
+        for teacher in ISchoolToolApplication(
+            None)['groups']['teachers'].members:
+            teachers.append(teacher.__name__)
+        return teachers
+
+    def __iter__(self):
+        return iter(self.teachers())
+
+    def __len__(self):
+        return len(self.teachers())
+
+
+class GroupsSource(object):
+    implements(IGroupsSource)
+
+    def __iter__(self):
+        return iter(ISchoolToolApplication(None)['groups'].keys())
+
+    def __len__(self):
+        return len(ISchoolToolApplication(None)['groups'].keys())
+
+class ISchoolData(Interface):
+    """School-specific data for a person.
+    """
+    id = schema.TextLine(
+        title=_(u"ID"),
+        required=False,
+        )
+
+    enrollment_date = schema.Date(
+        title=_(u"Enrollment date"),
+        required=False,
+        )
+
+    projected_graduation_year = schema.Int(
+        title=_(u"Projected graduation year"),
+        required=False,
+        )
+
+    advisor = schema.Choice(
+        title=_(u"Advisor"),
+        source=TeachersSource(),
+        required=False,
+        )
+
+    team = schema.Choice(
+        title=_(u"Team"),
+        source=GroupsSource(),
+        required=False,
+        )
+
+    health_information = schema.Text(
+        title=_(u"Health information"),
+        required=False,
+        )
+
+
+relationshipToStudentSource = SourceList([
+    _('parent'),
+    _('guardian'),
+    _('grandparent'),
+    _('step-parent'),
+    _('friend of family'),
+    _('other')])
+
+
+class IContactInfo(Interface):
+    """Contact information for a person.
+
+    A person can have more than one contact informations at the
+    same time.
+    """
+    name = schema.TextLine(
+        title=_(u"Name"),
+        required=False,
+        )
+
+    relationship_to_student = schema.Choice(
+        title=_(u"Relationship to student"),
+        source=relationshipToStudentSource,
+        required=False,
+        )
+
+    street = schema.Text(
+        title=_(u"Street"),
+        required=False,
+        )
+
+    city = schema.TextLine(
+        title=_(u"City"),
+        required=False,
+        )
+
+    state = schema.TextLine(
+        title=_(u"State"),
+        required=False,
+        )
+
+    postal_code = schema.TextLine(
+        title=_(u"Postal code"),
+        required=False,
+        )
+
+    home_phone = schema.TextLine(
+        title=_(u"Home phone"),
+        required=False,
+        )
+
+    work_phone = schema.TextLine(
+        title=_(u"Work phone"),
+        required=False,
+        )
+
+    cell_phone = schema.TextLine(
+        title=_(u"Cell phone"),
+        required=False,
+        )
+
+    notes = schema.Text(
+        title=_(u"Notes"),
+        required=False,
+        )
+
+
+class ISearch(Interface):
+    """Particular aspects of a person that can be indexed for search.
+    """
+
+    fulltext = schema.TextLine(
+        title=_(u"Text"),
+        description=_(u"Full text search in name"),
+        required=False,
+        )
+
+    parentName = schema.TextLine(
+        title=_(u"Name of parent"),
+        description=_(u"Full text search in parent names"),
+        required=False,
+        )
+
+    studentId = schema.TextLine(
+        title=_(u"Student ID"),
+        required=False,
+        )
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/overrides.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/overrides.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/overrides.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="schooltool">
+
+  <browser:page
+      name="add.html"
+      for="schooltool.person.interfaces.IPersonContainer"
+      class=".browser.personform.PersonAddView"
+      permission="schooltool.edit"
+      menu="schooltool_actions" title="New Person"
+      />
+
+  <browser:page
+     for="schooltool.person.interfaces.IPersonContainer"
+     name="index.html"
+     class=".browser.table.PersonTable"
+     permission="schooltool.view"
+     />
+
+  <browser:page
+     for="schooltool.person.interfaces.IPersonContainer"
+     name="search.html"
+     class=".browser.table.SearchTable"
+     permission="schooltool.view"
+     menu="schooltool_actions"
+     title="Search"
+     />
+
+  <utility factory=".utility.PersonFactoryUtility" />
+
+  <!-- sample data -->
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+
+    <utility
+        factory=".sampledata.SampleStudents"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="students"
+        />
+
+    <utility
+        factory=".sampledata.SampleTeachers"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="teachers"
+        />
+
+    <utility
+        factory=".sampledata.SamplePersonalEvents"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="personal_events"
+        />
+
+  </configure>
+
+  <!-- install catalog -->
+
+  <subscriber
+      for="schooltool.app.interfaces.ICatalogSetUpEvent"
+      handler=".utility.catalogSetUpSubscriber"
+      />
+
+  <!-- search adapter -->
+  <adapter
+      factory=".utility.Search"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/overrides.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/person.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/person.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/person.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,127 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+from pytz import utc
+from datetime import datetime
+from persistent import Persistent
+
+from zope.lifecycleevent import ObjectModifiedEvent
+from zope.interface import implements
+from zope import schema
+from zope.location import locate, ILocation
+from zope.event import notify
+
+import interfaces
+from schooltool.person.person import Person as PersonBase
+
+
+class Person(PersonBase):
+    """Special person that adds demographics information.
+    """
+    implements(interfaces.IDemographicsPerson)
+
+    def __init__(self, username=None, title=None):
+        super(Person, self).__init__(username, title)
+        self.modified = now()
+        self.nameinfo = NameInfo()
+        locate(self.nameinfo, self, 'nameinfo')
+        self.demographics = Demographics()
+        locate(self.demographics, self, 'demographics')
+        self.schooldata = SchoolData()
+        locate(self.schooldata, self, 'schooldata')
+        self.parent1 = ContactInfo()
+        locate(self.parent1, self, 'parent1')
+        self.parent2 = ContactInfo()
+        locate(self.parent2, self, 'parent2')
+        self.emergency1 = ContactInfo()
+        locate(self.emergency1, self, 'emergency1')
+        self.emergency2 = ContactInfo()
+        locate(self.emergency2, self, 'emergency2')
+        self.emergency3 = ContactInfo()
+        locate(self.emergency3, self, 'emergency3')
+
+
+class NameInfo(Persistent):
+    implements(interfaces.INameInfo, ILocation)
+
+    def __init__(self):
+        initializeSchemaAttributes(interfaces.INameInfo, self,
+                                   ['full_name', 'photo'])
+
+    def _get_full_name(self):
+        return self.__parent__.title
+
+    def _set_full_name(self, s):
+        self.__parent__.title = s
+
+    full_name = property(_get_full_name, _set_full_name)
+
+    def _get_photo(self):
+        return self.__parent__.photo
+
+    def _set_photo(self, d):
+        self.__parent__.photo = d
+
+    photo = property(_get_photo, _set_photo)
+
+
+class Demographics(Persistent):
+    implements(interfaces.IDemographics, ILocation)
+
+    def __init__(self):
+        initializeSchemaAttributes(interfaces.IDemographics, self)
+
+
+class SchoolData(Persistent):
+    implements(interfaces.ISchoolData, ILocation)
+
+    def __init__(self):
+        initializeSchemaAttributes(interfaces.ISchoolData, self)
+
+
+class ContactInfo(Persistent):
+    implements(interfaces.IContactInfo, ILocation)
+
+    def __init__(self):
+        initializeSchemaAttributes(interfaces.IContactInfo, self)
+
+
+def initializeSchemaAttributes(iface, obj, suppress=None):
+    """Initialize an object given the schema attributes in an interface.
+
+    The names of the attributes given in suppress are not initialized.
+    This can be useful in case that attribute is managed by a property.
+    """
+    suppress = suppress or []
+    for field in schema.getFields(iface).values():
+        if field.__name__ in suppress:
+            continue
+        field.set(obj, field.default)
+
+
+def personModifiedSubscriber(person, event):
+    person.modified = now()
+
+
+def personDemographicsModifiedSubscriber(demographics, event):
+    # notify the owner of the demographics that we were modified
+    notify(ObjectModifiedEvent(demographics.__parent__))
+
+
+def now():
+    return utc.localize(datetime.utcnow())


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/person.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,172 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Person sample data generation
+
+$Id: sampledata.py 6507 2006-11-30 13:18:21Z ignas $
+"""
+
+import datetime
+import random
+import os
+
+from pytz import utc
+from zope.interface import implements
+from zope.security.proxy import removeSecurityProxy
+
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.sampledata.name import NameGenerator
+from schooltool.demographics.person import Person
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.cal import CalendarEvent
+from schooltool.common import DateRange
+
+class ChoiceGenerator(object):
+    def __init__(self, seed, choices):
+        self.random = random.Random()
+        self.random.seed(seed)
+        self.choices = choices
+
+    def generate(self):
+        return self.random.choice(self.choices)
+
+
+class SampleStudents(object):
+
+    implements(ISampleDataPlugin)
+
+    name = 'students'
+    dependencies = ()
+
+    # Number of persons to generate
+    power = 1000
+
+    def generate(self, app, seed=None):
+        namegen = NameGenerator(str(seed) + self.name)
+        prefixgen = ChoiceGenerator(str(seed), ['Mr', 'Mrs', 'Miss', ''])
+        gendergen = ChoiceGenerator(str(seed), ['male', 'female'])
+
+        # some of the tests (e.g., for groups) are set up on the assumption that
+        # we won't populate the student group as we create students.  This
+        # is annoying, since we end up with an empty student group.  I'm not
+        # sure how to get around this except with a try/except here.
+        try:
+            students = app['groups']['students']
+            stud_group = True
+        except KeyError:
+            stud_group = False
+        for i in range(self.power):
+            first_name, last_name, full_name = namegen.generate()
+            person_id = 'student%03d' % i
+            person = Person(person_id, title=full_name)
+            person.nameinfo.prefix = prefixgen.generate()
+            person.nameinfo.first_name = first_name
+            person.nameinfo.last_name = last_name
+            person.setPassword(person_id)
+            # Without removeSecurityProxy we can't add members a
+            # group.
+            if stud_group:
+                removeSecurityProxy(students.members).add(person)
+
+            person.demographics.gender = gendergen.generate()
+            person.schooldata.id = person_id
+            person.parent1.name = namegen.generate()[2]
+            person.parent2.name = namegen.generate()[2]
+            app['persons'][person_id] = person
+
+
+class SampleTeachers(object):
+    implements(ISampleDataPlugin)
+
+    name = 'teachers'
+    dependencies = ()
+
+    # Number of teachers to generate
+    power = 48
+
+    def generate(self, app, seed=None):
+        namegen = NameGenerator(str(seed) + self.name)
+        teachers = app['groups']['teachers']
+        for i in range(self.power):
+            first_name, last_name, full_name = namegen.generate()
+            person_id = 'teacher%03d' % i
+            person = Person(person_id, title=full_name)
+            person.nameinfo.first_name = first_name
+            person.nameinfo.last_name = last_name
+            person.setPassword(person_id)
+            # Without removeSecurityProxy we can't add members a
+            # group.
+            removeSecurityProxy(teachers.members).add(person)
+            app['persons'][person_id] = person
+
+
+class SamplePersonalEvents(object):
+    """Sample data plugin class that generates personal random events."""
+
+    implements(ISampleDataPlugin)
+
+    name = 'personal_events'
+    dependencies = ('students', 'teachers', 'terms')
+
+    probability = 10 # probability of having an event on any day
+
+    def _readLines(self, filename):
+        """Read in lines from file
+
+        Filename is relative to the module.
+        Returned lines are stripped.
+        """
+        fullpath = os.path.join(os.path.dirname(__file__), filename)
+        lines = file(fullpath).readlines()
+        return [line.strip() for line in lines]
+
+    def generate(self, app, seed=None):
+        self.random = random.Random(seed)
+        event_titles = self._readLines('event_titles.txt')
+        person_ids = [person for person in app['persons'].keys()
+                      if person.startswith('student') or
+                         person.startswith('teacher')]
+        dates = []
+        for term in app['terms'].values():
+            dates.append(term.first)
+            dates.append(term.last)
+        first = min(dates)
+        last = max(dates)
+        days = DateRange(first, last)
+        for person_id in person_ids:
+            person = app['persons'][person_id]
+            calendar = ISchoolToolCalendar(person)
+            for day in days:
+                if self.random.randrange(0, 100) < self.probability:
+                    event_title = self.random.choice(event_titles)
+                    time_hour = self.random.randint(6, 23)
+                    time_min = self.random.choice((0, 30))
+                    event_time = datetime.datetime(day.year,
+                                                   day.month,
+                                                   day.day,
+                                                   time_hour,
+                                                   time_min,
+                                                   tzinfo=utc)
+                    event_duration = datetime.timedelta(
+                                       minutes=self.random.randint(1, 12)*30)
+                    event = CalendarEvent(event_time,
+                                          event_duration,
+                                          event_title)
+                    calendar.addEvent(event)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,234 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.demographics.sampledata
+
+$Id: tests.py 6515 2006-12-06 15:27:36Z ignas $
+"""
+
+import unittest
+
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup
+
+from schooltool.testing import setup as stsetup
+from schooltool.relationship.tests import setUpRelationships
+from schooltool.app.interfaces import ISchoolToolCalendar
+
+
+def setUp(test):
+    setup.placefulSetUp()
+    stsetup.setUpCalendaring()
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def doctest_SampleStudents():
+    """A sample data plugin that generates students
+
+        >>> from schooltool.demographics.sampledata import SampleStudents
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleStudents()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    This plugin simply creates a 1000 persons with random names and
+    usernames of a form 'student123'.
+
+        >>> plugin.power
+        1000
+
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> len(app['persons'])
+        0
+
+        >>> plugin.generate(app, 42)
+
+        >>> len(app['persons'])
+        1000
+
+        >>> for i in range(5):
+        ...     print app['persons']['student%03d' % i].title
+        Freja Freeman
+        Daniela Petersen
+        Jeffery Hardy
+        Thelma Vaughn
+        Pip Stewart
+
+    The students get their passwords set the same as their logins:
+
+        >>> for i in range(5):
+        ...     login = 'student%03d' % i
+        ...     assert app['persons'][login].checkPassword(login)
+
+    """
+
+
+def doctest_SampleTeachers():
+    """A sample data plugin that generates students
+
+        >>> setUpRelationships()
+
+        >>> from schooltool.demographics.sampledata import SampleTeachers
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleTeachers()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    This plugin creates this many teachers:
+
+        >>> plugin.power
+        48
+
+    This plugin creates a number of teachers and adds them to the
+    Teachers group.
+
+        >>> from schooltool.group.group import Group
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> teachers = app['groups']['teachers'] = Group('Teachers')
+        >>> len(app['persons'])
+        0
+        >>> len(teachers.members)
+        0
+
+        >>> plugin.generate(app, 42)
+        >>> len(teachers.members)
+        48
+
+    Teachers' names are different from the students' names above:
+
+        >>> for i in range(5):
+        ...     teacher = app['persons']['teacher%03d' % i]
+        ...     print teacher.title, (teacher.nameinfo.first_name,
+        ...                           teacher.nameinfo.last_name)
+        Catherine Martin ('Catherine', 'Martin')
+        Kimmy Cooper ('Kimmy', 'Cooper')
+        Helen Patterson ('Helen', 'Patterson')
+        Iris Laurent ('Iris', 'Laurent')
+        Philippa Stewart ('Philippa', 'Stewart')
+
+    The teachers get their passwords set the same as their logins:
+
+        >>> for i in range(5):
+        ...     login = 'teacher%03d' % i
+        ...     assert app['persons'][login].checkPassword(login)
+
+    """
+
+
+def doctest_SamplePersonalEvents():
+    """A sample data plugin that generates random personal events.
+
+        >>> setUpRelationships()
+
+        >>> from schooltool.demographics.sampledata import SamplePersonalEvents
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SamplePersonalEvents()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+        >>> from schooltool.group.group import Group
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> app['groups']['teachers'] = Group('Teachers')
+
+        >>> from schooltool.demographics.sampledata import SampleStudents
+        >>> from schooltool.demographics.sampledata import SampleTeachers
+        >>> from schooltool.term.sampledata import SampleTerms
+        >>> plugin_students = SampleStudents()
+        >>> plugin_students.power = 20
+        >>> plugin_teachers = SampleTeachers()
+        >>> plugin_teachers.power = 3
+        >>> plugin_terms = SampleTerms()
+        >>> plugin_students.generate(app, 42)
+        >>> plugin_teachers.generate(app, 42)
+        >>> plugin_terms.generate(app, 42)
+
+    Probability of person having event on any day in percents:
+
+        >>> plugin.probability
+        10
+
+        >>> plugin.probability = 50
+
+    Create random events for all students and teachers.
+
+        >>> plugin.generate(app, 42)
+
+        >>> for i in range(5):
+        ...     person = app['persons']['student%03d' % i]
+        ...     calendar = ISchoolToolCalendar(person)
+        ...     print len(calendar)
+        233
+        250
+        227
+        252
+        248
+
+        >>> person = app['persons']['teacher000']
+        >>> calendar = ISchoolToolCalendar(person)
+        >>> len(calendar)
+        240
+
+        >>> events = list(calendar)
+        >>> events.sort()
+        >>> for event in events[0:5]:
+        ...     print event.dtstart,
+        ...     print event.duration,
+        ...     print event.title
+        2005-08-24 12:00:00+00:00 5:00:00 Tribal dances
+        2005-08-25 17:30:00+00:00 1:30:00 Dentist
+        2005-08-27 11:30:00+00:00 4:00:00 Concert
+        2005-08-28 23:30:00+00:00 3:30:00 Quake tournament
+        2005-08-29 19:00:00+00:00 6:00:00 Boating
+    """
+
+
+def doctest_PersonFactoryUtility():
+    """Tests for PersonFactoryUtility.
+
+        >>> from schooltool.demographics.utility import PersonFactoryUtility
+        >>> factory = PersonFactoryUtility()
+
+        >>> from schooltool.person.interfaces import IPersonFactory
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(IPersonFactory, factory)
+        True
+
+        >>> for column in factory.columns():
+        ...     print "%s, %s" % (column.name, column.title)
+        first_name, Name
+        last_name, Surname
+
+        >>> factory.sortOn()
+        (('last_name', False),)
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS),
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/demographics/utility.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/demographics/utility.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/demographics/utility.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,113 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+
+from persistent import Persistent
+from zope.app.container.contained import Contained
+from zope.app.intid.interfaces import IIntIds
+from zope.app.intid import IntIds
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.catalog import Catalog
+from zope.app.catalog.text import TextIndex
+from zope.app.catalog.field import FieldIndex
+from zope.interface import implements
+from zope.component import adapts
+from zope.interface import directlyProvides
+
+from zc.table.interfaces import ISortableColumn
+
+from schooltool.utility import UtilitySpecification, UtilitySetUp
+
+from schooltool.demographics.interfaces import ISearch
+from schooltool.demographics.person import Person
+from schooltool.person.interfaces import IPerson
+from schooltool.person.interfaces import IPersonFactory
+from schooltool.table.table import LocaleAwareGetterColumn
+from schooltool.table.table import url_cell_formatter
+from schooltool import SchoolToolMessage as _
+
+
+class Search(object):
+    implements(ISearch)
+    adapts(IPerson)
+
+    def __init__(self, context):
+        self.context = context
+
+    @property
+    def fulltext(self):
+        return [self.context.title]
+
+    @property
+    def parentName(self):
+        result = []
+        if self.context.parent1.name:
+            result.append(self.context.parent1.name)
+        if self.context.parent2.name:
+            result.append(self.context.parent2.name)
+        return result
+
+    @property
+    def studentId(self):
+        if not self.context.schooldata.id:
+            return ''
+        return self.context.schooldata.id
+
+def catalogSetUp(catalog):
+    catalog['fulltext'] = TextIndex('fulltext', ISearch)
+    catalog['parentName'] = TextIndex('parentName', ISearch)
+    catalog['studentId'] = FieldIndex('studentId', ISearch)
+
+catalogSetUpSubscriber = UtilitySetUp(
+    Catalog, ICatalog, 'demographics_catalog', setUp=catalogSetUp)
+
+class PersonFactory(Persistent, Contained):
+    """BBB: as old utilities are persistent, we need this here."""
+
+
+class PersonFactoryUtility(object):
+
+    implements(IPersonFactory)
+
+    def columns(self):
+        first_name = LocaleAwareGetterColumn(
+            name='first_name',
+            title=_(u'Name'),
+            getter=lambda i, f: i.nameinfo.first_name,
+            cell_formatter=url_cell_formatter,
+            subsort=True)
+        directlyProvides(first_name, ISortableColumn)
+
+        last_name = LocaleAwareGetterColumn(
+            name='last_name',
+            title=_(u'Surname'),
+            getter=lambda i, f: i.nameinfo.last_name,
+            cell_formatter=url_cell_formatter,
+            subsort=True)
+        directlyProvides(last_name, ISortableColumn)
+
+        return [first_name, last_name]
+
+    def sortOn(self):
+        return (("last_name", False),)
+
+    def __call__(self, *args, **kw):
+        result = Person(*args, **kw)
+        result.nameinfo.first_name = result.title
+        result.nameinfo.last_name = u'Unknown last name'
+        return result


Property changes on: schooltool/branches/upstream/current/src/schooltool/demographics/utility.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+# Make a package
+
+# Patch ZCML module, since SchoolTool's startup is different
+import apidoc
+apidoc.patchZCMLModule()
+
+# Due to a different structure, the apidoc BASEDIR is no good.
+import schooltool
+from os.path import dirname
+from zope.app.apidoc import utilities
+utilities.BASEDIR = dirname(dirname(dirname(schooltool.__file__)))


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.css
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.css	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.css	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,571 @@
+body {
+    font: 0.8em Verdana, Helvetica, Arial, sans-serif;
+    background: white;
+    color: black;
+    margin: 1em;
+    padding: 0;
+}
+
+body.menu {
+    padding: 0;
+    margin: 0;
+    background: #eae8e3;
+}
+
+body.modulelist {
+    padding: 0;
+    margin: 0;
+    background: #eae8e3;
+}
+
+code, pre, span.pre {
+    font-size: 120%;
+}
+
+a[href] {
+    color: #304D6B;
+    font-weight: bold;
+}
+
+ul {
+    margin: 0;
+    margin-left: 1.5em;
+    padding: 0;
+}
+
+table.menu {
+    font-size: 95%;
+}
+
+table.menu td.list-item {
+    font-weight: bold;
+}
+
+div.apihead {
+    font-weight: bold;
+    font-size: 120%;
+    margin: 0;
+    padding: 2pt;
+    margin-bottom: 3pt;
+    color: #f0f0f0;
+    background: #990000 url(/++resource++toolbar-background.png) top left repeat-x;
+    border-top: 2px #800 solid;
+    border-bottom: 2px #700 solid;
+}
+
+div.apihead a {
+    color: #f0f0f0;
+}
+
+div.menu {
+    margin: 0;
+    padding: 0 1em;
+    margin-bottom: 3pt;
+    font-weight: bold;
+    font-size: small;
+    border-bottom: 1px #bab5ab solid;
+    background: #d6d6d6;
+}
+
+#preference_entry {
+    margin-top: 5pt;
+    font-style: italic;
+}
+
+p.small, div.small {
+    font-size: 85%;
+    padding: 4pt;
+}
+
+span.small {
+    font-size: 85%;
+}
+
+div.indent {
+    margin-left: 1.5em;
+}
+
+h1.details-header {
+    font-size: 220%;
+    font-weight: normal;
+    background: #eae8e3;
+    padding: 5px;
+    margin-top: 0;
+    border-bottom: 1px #bab5ab solid;
+}
+
+div.details-subheader {
+    font-size: 125%;
+    font-weight: normal;
+    margin-top: 0;
+}
+
+h2.details-section {
+    font-size: 150%;
+    font-style: italic;
+    background: #d6d6d6;
+    color: #fff !important;
+    background: #7590ae;
+    border-top: 1px #bab5ab solid;
+    border-bottom: 1px #bab5ab solid;
+    padding: 2px 0.5em 2px 0.5em;
+}
+
+h3 {
+    font-size: 130%;
+}
+
+h3.details-section {
+    margin-bottom: 2pt;
+    background: #d6d6d6;
+    border-top: 1px #bab5ab solid;
+    border-bottom: 1px #bab5ab solid;
+    padding: 2px 0.5em 2px 0.5em;
+}
+
+h4 {
+    background: #d6d6d6;
+    padding: 3px;
+    font-size: 90%;
+    font-style: italic;
+}
+
+p.breadcrumbs {
+    color: #f0f0f0;
+    background: #990000 url(/++resource++toolbar-background.png) top left repeat-x;
+    border-top: 2px #800 solid;
+    border-bottom: 2px #700 solid;
+    padding: 2pt;
+    padding-left: 1em;
+}
+
+p.breadcrumbs a {
+    color: #f0f0f0;
+}
+
+.important {
+    font-size: 120%;
+}
+
+.highlight {
+    padding: 0.5ex 0.5em  0.1ex 0.5em;
+    background: #eeeeee;
+}
+
+.highlight p {
+    padding: 0pt;
+    margin: 0pt;
+    padding-bottom: 0.5ex;
+}
+
+ul.attr-list li {
+    margin-bottom: 0.5ex;
+}
+
+/* Styles that are associated with STX-generated HTML */
+
+div.documentation {
+}
+
+div.documentation h1 {
+    font-size: 120%;
+}
+
+div.documentation h2 {
+    font-size: 110%;
+    font-style: italic;
+}
+
+div.documentation h3 {
+    font-style: italic;
+    font-weight: normal;
+    padding: 0;
+    margin: 0;
+}
+
+div.documentation p {
+    padding: 0;
+    margin-top: 0;
+    margin-bottom: 1em;
+}
+
+div.documentation ul, ol {
+    margin: 0.5em 2em;
+}
+
+div.documentation a.reference img {
+    border: none;
+}
+
+
+div.inline h1 {
+    padding: 0;
+    margin: 0;
+    margin-bottom: 0.5ex;
+}
+
+div.inline h2 {
+    margin-bottom: 0.5ex;
+}
+
+div.inline h3 {
+    margin-bottom: 0.5ex;
+}
+
+div.inline p {
+    margin: 0;
+    margin-bottom: 0.5ex;
+}
+
+/* reST markup - based on tools/stylesheets/default.css in the docutils dist */
+div.documentation .first {
+    margin-top: 0 ! important;
+}
+
+div.documentation .last,
+div.documentation .with-subtitle {
+    margin-bottom: 0 ! important;
+}
+
+div.documentation .hidden {
+    display: none;
+}
+
+div.documentation a.toc-backref {
+    text-decoration: none;
+    color: black;
+}
+
+div.documentation blockquote.epigraph {
+    margin: 2em 5em;
+}
+
+div.documentation dl.docutils dd {
+    margin-bottom: 0.5em;
+}
+
+div.documentation div.abstract {
+    margin: 2em 5em;
+}
+
+div.documentation div.abstract p.topic-title {
+    font-weight: bold;
+    text-align: center;
+}
+
+div.documentation div.admonition,
+div.documentation div.attention,
+div.documentation div.caution,
+div.documentation div.danger,
+div.documentation div.error,
+div.documentation div.hint,
+div.documentation div.important,
+div.documentation div.note,
+div.documentation div.tip,
+div.documentation div.warning {
+    margin: 2em;
+    border: medium outset;
+    padding: 1em;
+}
+
+div.documentation div.admonition p.admonition-title,
+div.documentation div.hint p.admonition-title,
+div.documentation div.important p.admonition-title,
+div.documentation div.note p.admonition-title,
+div.documentation div.tip p.admonition-title {
+    font-weight: bold;
+    font-family: sans-serif;
+}
+
+div.documentation div.attention p.admonition-title,
+div.documentation div.caution p.admonition-title,
+div.documentation div.danger p.admonition-title,
+div.documentation div.error p.admonition-title,
+div.documentation div.warning p.admonition-title {
+    color: red;
+    font-weight: bold;
+    font-family: sans-serif;
+}
+
+div.documentation div.dedication {
+    margin: 2em 5em;
+    text-align: center;
+    font-style: italic;
+}
+
+div.documentation div.dedication p.topic-title {
+    font-weight: bold;
+    font-style: normal;
+}
+
+div.documentation div.figure {
+    margin-left: 2em;
+}
+
+div.documentation div.footer,
+div.documentation div.header {
+    font-size: smaller;
+}
+
+div.documentation div.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+div.documentation div.line-block div.line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+div.documentation div.sidebar {
+    margin-left: 1em;
+    border: medium outset;
+    padding: 1em;
+    background-color: #ffffee;
+    width: 40%;
+    float: right;
+    clear: right;
+}
+
+div.documentation div.sidebar p.rubric {
+    font-family: sans-serif;
+    font-size: medium;
+}
+
+div.documentation div.system-messages {
+    margin: 5em;
+}
+
+div.documentation div.system-messages h1 {
+    color: red;
+}
+
+div.documentation div.system-message {
+    border: medium outset;
+    padding: 1em;
+}
+
+div.documentation div.system-message p.system-message-title {
+    color: red;
+    font-weight: bold;
+}
+
+div.documentation div.topic {
+    margin: 2em;
+}
+
+div.documentation h1.section-subtitle,
+div.documentation h2.section-subtitle,
+div.documentation h3.section-subtitle,
+div.documentation h4.section-subtitle,
+div.documentation h5.section-subtitle,
+div.documentation h6.section-subtitle {
+    margin-top: 0.4em;
+}
+
+div.documentation h1.title {
+    text-align: center;
+}
+
+div.documentation h2.subtitle {
+    text-align: center;
+}
+
+div.documentation hr.docutils {
+    width: 75%;
+}
+
+div.documentation ol.simple,
+div.documentation ul.simple {
+    margin-bottom: 1em;
+}
+
+div.documentation ol.arabic {
+    list-style: decimal;
+}
+
+div.documentation ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+div.documentation ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+div.documentation ol.lowerroman {
+    list-style: lower-roman;
+}
+
+div.documentation ol.upperroman {
+    list-style: upper-roman;
+}
+
+div.documentation p.attribution {
+    text-align: right;
+    margin-left: 50%;
+}
+
+div.documentation p.caption {
+    font-style: italic;
+}
+
+div.documentation p.credits {
+    font-style: italic;
+    font-size: smaller;
+}
+
+div.documentation p.label {
+    white-space: nowrap;
+}
+
+div.documentation p.rubric {
+    font-weight: bold;
+    font-size: larger;
+    color: maroon;
+    text-align: center;
+}
+
+div.documentation p.sidebar-title {
+    font-family: sans-serif;
+    font-weight: bold;
+    font-size: larger;
+}
+
+div.documentation p.sidebar-subtitle {
+    font-family: sans-serif;
+    font-weight: bold;
+}
+
+div.documentation p.topic-title {
+    font-weight: bold;
+}
+
+div.documentation pre.address {
+    margin-bottom: 0;
+    margin-top: 0;
+    font-family: serif;
+    font-size: 100%;
+}
+
+div.documentation pre.line-block {
+    font-family: serif;
+    font-size: 100%;
+}
+
+div.documentation pre.literal-block,
+div.documentation pre.doctest-block {
+    margin-left: 2em;
+    margin-right: 2em;
+    background-color: #eeeeee;
+}
+
+div.documentation span.classifier {
+    font-family: sans-serif;
+    font-style: oblique;
+}
+
+div.documentation span.classifier-delimiter {
+    font-family: sans-serif;
+    font-weight: bold;
+}
+
+div.documentation span.interpreted {
+    font-family: sans-serif;
+}
+
+div.documentation span.option {
+    white-space: nowrap;
+}
+
+div.documentation span.pre {
+    white-space: pre;
+}
+
+div.documentation span.problematic {
+    color: red;
+}
+
+div.documentation span.section-subtitle {
+  /* font-size relative to parent (<h#> element) */
+    font-size: 80%;
+}
+
+div.documentation table.citation {
+    border-left: solid thin gray;
+}
+
+div.documentation table.docinfo {
+    margin: 2em 4em;
+}
+
+div.documentation table.docutils {
+    margin-top: 0.5em;
+    margin-bottom: 0.5em;
+}
+
+div.documentation table.footnote {
+    border-left: solid thin black;
+}
+
+div.documentation table.docutils td,
+div.documentation table.docutils th,
+div.documentation table.docinfo td,
+div.documentation table.docinfo th {
+    padding-left: 0.5em;
+    padding-right: 0.5em;
+    vertical-align: top;
+}
+
+div.documentation table.docutils th.field-name,
+div.documentation table.docinfo th.docinfo-name {
+    font-weight: bold;
+    text-align: left;
+    white-space: nowrap;
+    padding-left: 0;
+}
+
+div.documentation h1 tt.docutils,
+div.documentation h2 tt.docutils,
+div.documentation h3 tt.docutils,
+div.documentation h4 tt.docutils,
+div.documentation h5 tt.docutils,
+div.documentation h6 tt.docutils {
+    font-size: 100%;
+}
+
+div.documentation tt.docutils {
+    background-color: #eeeeee;
+}
+
+div.documentation ul.auto-toc {
+    list-style-type: none;
+}
+
+/* Styles for ZCML markup */
+
+code.zcml a {
+    color: inherit;
+    font-style: italic;
+}
+
+code.zcml .attribute {
+    color: MediumVioletRed;
+}
+
+code.zcml .tagname {
+    color: blue;
+    font-weight: bold;
+}
+
+code.zcml .objectref {
+    color: DarkSalmon;
+}
+
+b.required {
+    color: red;
+}
+
+b.optional {
+}

Added: schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,101 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+API doc views
+
+$Id: apidoc.py 5669 2006-01-20 19:58:16Z mg $
+"""
+__docformat__ = 'restructuredtext'
+
+import zope.interface
+
+import zope.app.apidoc.ifacemodule.menu
+import zope.app.apidoc.codemodule.browser.menu
+import zope.app.apidoc.bookmodule.browser
+from zope.app.apidoc import apidoc
+from zope.app.apidoc import ifacemodule, codemodule, bookmodule, zcmlmodule
+from zope.app.apidoc.browser.skin import APIDOC
+
+from schooltool.devmode.skin import IDevModeLayer
+
+
+class schooltoolApidocNamespace(apidoc.apidocNamespace):
+    """Used to traverse to an API Documentation."""
+    def __init__(self, ob, request=None):
+        super(schooltoolApidocNamespace, self).__init__(ob, request)
+        # A small hack to ensure that SchoolTool stuff is available.
+        if request:
+            zope.interface.directlyProvides(
+                request, [IDevModeLayer, APIDOC])
+
+    def traverse(self, name, ignore):
+        return apidoc.handleNamespace(self.context, name)
+
+
+
+class InterfaceMenu(ifacemodule.menu.Menu):
+
+    def findInterfaces(self):
+        for entry in super(InterfaceMenu, self).findInterfaces():
+            if 'schooltool' not in entry['name']:
+                continue
+            entry['name'] = entry['name'].replace('schooltool', 'st')
+            yield entry
+
+
+class CodeMenu(codemodule.browser.menu.Menu):
+
+    def findClasses(self):
+        for entry in super(CodeMenu, self).findClasses():
+            if 'schooltool' not in entry['path']:
+                continue
+            entry['path'] = entry['path'].replace('schooltool', 'st')
+            yield entry
+
+
+class BookMenu(bookmodule.browser.Menu):
+
+    def getMenuLink(self, node):
+        link = super(BookMenu, self).getMenuLink(node)
+        return link and '../' + link or None
+
+
+def patchZCMLModule():
+    from schooltool.app import main
+    from zope.configuration import docutils, xmlconfig, config
+
+    def _makeDocStructure(self):
+        context = config.ConfigurationMachine()
+        context.provideFeature('devmode')
+        xmlconfig.registerCommonDirectives(context)
+        context = xmlconfig.file(main.SCHOOLTOOL_SITE_DEFINITION,
+                                 context=context,
+                                 execute=False)
+        namespaces, subdirs = docutils.makeDocStructures(context)
+
+        # Empty keys are not so good for a container
+        if namespaces.has_key(''):
+            namespaces['ALL'] = namespaces['']
+            del namespaces['']
+
+        # Some trivial caching
+        zcmlmodule.namespaces = namespaces
+        zcmlmodule.subdirs = subdirs
+
+    zcmlmodule.ZCMLModule._makeDocStructure = _makeDocStructure


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/apidoc.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/box-bottom.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/box-bottom.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/devmode/code_menu.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/code_menu.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/code_menu.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+<html metal:use-macro="views/apidoc_macros/menu"
+    i18n:domain="zope">
+<body>
+
+  <div metal:fill-slot="menu" class="small">
+
+    <div>
+      <span i18n:translate="">Class Finder:</span> <br/>
+      <i i18n:translate="">(Enter partial Python path)</i></div>
+    <form action="menu.html" method="post">
+      <input type="text" name="path"
+             style="font-size: 80%; width=95%" />
+      <input type="submit" name="SUBMIT" value="Find"
+             i18n:attributes="value find-button" style="font-size: 80%"/>
+    </form>
+
+    <p style="font-size: 120%">
+      <a href="./schooltool/index.html" target="main" i18n:translate="">
+        Browse SchoolTool Source
+      </a>
+    </p>
+
+    <div tal:define="classes view/findClasses"
+        tal:condition="classes">
+
+        <a href="" target="main"
+           tal:repeat="info classes"
+           tal:attributes="href info/url"
+           tal:content="info/path">
+          /zope/app/Application
+        </a>
+    </div>
+
+  </div>
+
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/code_menu.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,192 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:security="http://schooltool.org/securitypolicy"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    xmlns:apidoc="http://namespaces.zope.org/apidoc">
+
+  <!-- Setup schooltool as a top-level package in API doc -->
+  <apidoc:rootModule module="schooltool" />
+
+  <!-- Generic DevMode setup -->
+
+  <interface
+      interface="schooltool.devmode.skin.ISchoolToolDevModeSkin"
+      type="zope.publisher.interfaces.browser.IBrowserSkinType"
+      name="SchoolToolDevMode"
+      />
+
+  <browser:viewlet
+      name="devmode"
+      for="*"
+      manager="schooltool.skin.IHeaderManager"
+      template="devmode.pt"
+      permission="zope.View"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <browser:viewlet
+      name="devmode_javascript"
+      for="*"
+      manager="schooltool.skin.IJavaScriptManager"
+      class=".devmode.DevmodeJavascriptViewlet"
+      permission="zope.View"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <browser:viewlet
+      name="devmode_css"
+      for="*"
+      manager="schooltool.skin.ICSSManager"
+      class=".devmode.DevmodeCSSViewlet"
+      permission="zope.View"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <!-- DevTools Menu configuration -->
+
+  <browser:resource
+      name="devmode.css" file="devmode.css"
+      layer=".skin.IDevModeLayer"
+      />
+
+  <browser:resource
+      name="box-bottom.png" file="box-bottom.png"
+      layer=".skin.IDevModeLayer"
+      />
+
+  <browser:resource
+      name="varrow.png" file="varrow.png"
+      layer=".skin.IDevModeLayer"
+      />
+
+  <browser:resource
+      name="harrow.png" file="harrow.png"
+      layer=".skin.IDevModeLayer"
+      />
+
+  <browser:resource
+      name="switch.js" file="switch.js"
+      layer=".skin.IDevModeLayer"
+      />
+
+  <!-- Introspector -->
+  <browser:viewlet
+      name="introspector_css"
+      for="*"
+      manager="schooltool.skin.ICSSManager"
+      class=".devmode.IntrospectorCSSViewlet"
+      permission="zope.View"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <browser:resource
+      name="introspector.css" file="introspector.css"
+      layer=".skin.IDevModeLayer"
+      />
+
+  <!-- Menu entries for Error Reporting Utility -->
+
+  <browser:menuItem
+      menu="schooltool_actions"
+      for="zope.app.error.interfaces.IErrorReportingUtility"
+      action="@@configure.html"
+      title="Configure"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <browser:menuItem
+      menu="schooltool_actions"
+      for="zope.app.error.interfaces.IErrorReportingUtility"
+      action="@@index.html"
+      title="Error List"
+      layer=".skin.IDevModeLayer"
+      />
+
+  <!-- apidoc customization -->
+  <browser:resource
+      name="apidoc.css" file="apidoc.css"
+      layer=".skin.IDevModeLayer"
+      />
+
+  <browser:pages
+      for="zope.app.apidoc.apidoc.APIDocumentation"
+      class="zope.app.apidoc.browser.apidoc.APIDocumentationView"
+      permission="zope.app.apidoc.UseAPIDoc"
+      layer="schooltool.devmode.skin.IDevModeLayer">
+
+    <browser:page
+        name="modulelist.html"
+        template="modules.pt" />
+
+  </browser:pages>
+
+  <configure package="zope.app.apidoc.ifacemodule">
+    <browser:page
+        for=".ifacemodule.InterfaceModule"
+        permission="zope.app.apidoc.UseAPIDoc"
+        class="schooltool.devmode.apidoc.InterfaceMenu"
+        name="menu.html"
+        template="menu.pt"
+        layer="schooltool.devmode.skin.IDevModeLayer"
+        />
+  </configure>
+
+  <browser:page
+      for="zope.app.apidoc.codemodule.codemodule.CodeModule"
+      permission="zope.app.apidoc.UseAPIDoc"
+      class="schooltool.devmode.apidoc.CodeMenu"
+      name="menu.html"
+      template="code_menu.pt"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <configure package="zope.app.apidoc.bookmodule">
+    <browser:page
+        for="zope.app.onlinehelp.onlinehelptopic.RESTOnlineHelpTopic"
+        permission="zope.app.apidoc.UseAPIDoc"
+        class="schooltool.devmode.apidoc.BookMenu"
+        name="menu.html"
+        template="menu.pt"
+        />
+  </configure>
+
+  <!-- RESTive API documentation -->
+  <browser:page
+      for="*"
+      name="restdoc_macros"
+      permission="zope.View"
+      class=".restdoc.RESTDocMacros"
+      allowed_interface="zope.interface.common.mapping.IItemMapping"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <browser:page
+      for="*"
+      name="restdoc_details_macros"
+      permission="zope.View"
+      template="restdoc_macros.pt"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <browser:page
+      for="zope.app.apidoc.codemodule.codemodule.CodeModule"
+      permission="zope.app.apidoc.UseAPIDoc"
+      class="schooltool.devmode.restdoc.RESTMenu"
+      name="restmenu.html"
+      template="restmenu.pt"
+      layer="schooltool.devmode.skin.IDevModeLayer"
+      />
+
+  <browser:page
+      for="*"
+      permission="zope.app.apidoc.UseAPIDoc"
+      class=".restdoc.RESTDocumentation"
+      name="restviews.html"
+      template="restdoc.pt"
+      />
+
+  <security:allow
+      crowds="administration"
+      permission="zope.app.apidoc.UseAPIDoc" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/devmode-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/devmode-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/devmode-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4 @@
+<include
+    xmlns:zcml="http://namespaces.zope.org/zcml"
+    zcml:condition="have devmode"
+    package="schooltool.devmode" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/devmode-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/devmode-ftesting-overrides.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/devmode-ftesting-overrides.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/devmode-ftesting-overrides.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.devmode" file="overrides.zcml" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/devmode-ftesting-overrides.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/devmode-overrides.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/devmode-overrides.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/devmode-overrides.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.devmode" file="overrides.zcml" />
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/devmode-overrides.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/devmode.css
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/devmode.css	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/devmode.css	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,46 @@
+
+div.devtools {
+    position: fixed;
+    right: 0px;
+    top: 0px;
+    background: url(++resource++box-bottom.png) bottom left no-repeat;
+    width: 200px;
+    z-index: 99;
+}
+
+div.devtools .header {
+    font-size: small;
+    padding: 4px;
+}
+
+div.devtools .header h4 {
+    margin: 0;
+    padding: 0em 1em 0em 2em;
+    font-size: small;
+}
+
+div.devtools .body {
+    padding-left: 1px;
+    border-top: 1px #bab5ab solid;
+    border-bottom: 1px #bab5ab solid;
+    margin-bottom: 1ex;
+}
+
+div.devtools .body a {
+    display: block;
+    padding: 2px 1em;
+    color: #304D6B;
+    font-weight: bold;
+    text-decoration: none;
+
+    background: #eae8e3;
+    border-top: 1px #eae8e3 solid;
+    border-bottom: 1px #eae8e3 solid;
+}
+
+div.devtools .body a:hover {
+    background: #7590ae;
+    border-top: 1px #314e6c solid;
+    border-bottom: 1px #314e6c solid;
+    color: #fff !important;
+}

Added: schooltool/branches/upstream/current/src/schooltool/devmode/devmode.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/devmode.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/devmode.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,25 @@
+<div class="devtools"
+     i18n:domain="schooltool">
+
+  <div class="header" style="clear: both">
+    <a href="javascript:switchDisplay('devtools')"
+       style="text-decoration: none">
+      <img src="/@@/harrow.png" border="0" id=".arrow"
+           style="vertical-align: middle"
+           alt="(>)"
+           tal:attributes="id string:devtools.arrow" />
+      <h4 i18n:translate="">Developer Tools</h4>
+    </a>
+  </div>
+
+  <div id="devtools" style="display:none;">
+    <div class="body">
+      <a href="/++etc++site/default/RootErrorReportingUtility" i18n:translate="">Errors</a>
+      <a href="@@introspector.html" i18n:translate="">Introspector</a>
+      <a href="/++apidoc++/@@index.html" i18n:translate="">API Docs</a>
+      <a href="/@@sampledata.html" i18n:translate="">Sample data</a>
+      <a href="/@@setupdata.html" i18n:translate="">Setup data</a>
+    </div>
+  </div>
+
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/devmode.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/devmode.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/devmode.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/devmode.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,29 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Devmode view support.
+
+$Id: devmode.py 5669 2006-01-20 19:58:16Z mg $
+"""
+from zope.viewlet import viewlet
+
+DevmodeJavascriptViewlet = viewlet.JavaScriptViewlet('switch.js')
+DevmodeCSSViewlet = viewlet.CSSViewlet('devmode.css')
+
+IntrospectorCSSViewlet = viewlet.CSSViewlet('introspector.css')


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/devmode.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/devmode.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/devmode.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/devmode.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,617 @@
+=============================
+Developer Mode User Interface
+=============================
+
+The developer mode of the user interface is intended to help SchoolTool
+developers and people using SchoolTool as a development platform to debug
+their code and find documentation as quickly as possible. To start, open the
+SchoolTool site in your browser
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> browser = Browser()
+    >>> browser.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> browser.open('http://localhost/')
+
+The developer mode should be visible:
+
+    >>> browser.contents
+    '...<h4>Developer Tools</h4>...
+     ...<a href=".../RootErrorReportingUtility">Errors</a>...
+     ...<a href="@@introspector.html">Introspector</a>...
+     ...<a href="/++apidoc++/@@index.html">API Docs</a>...
+     ...<a href="/@@sampledata.html">Sample data</a>...'
+
+Note that we only see the developer tools here, because these tests are run
+with the developer mode turned on. Commonly, the developer mode can be
+controlled using ``schooltool.conf``'s ``devmode`` switch. Simply add
+``devmode on`` to your ``schooltool.conf`` file to turn on the developer's
+mode.
+
+
+Error Reporting
+---------------
+
+Even though error reporting is always available, it is usually not easily
+accessible via the Web UI. By clicking on the `Errors` menu option
+
+    >>> browser.getLink('Errors').click()
+
+you are brought to the root error reporting utility.
+
+Here you can configure the utility and view errors:
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+            <a href="http://localhost/++etc++site/default/RootErrorReportingUtility/@@configure.html">Configure</a>
+            <a href="http://localhost/++etc++site/default/RootErrorReportingUtility/@@index.html">Error List</a>
+    ...
+
+In the configuration
+
+    >>> browser.getLink('Configure').click()
+
+you can specify how many exceptions to keep, whether to copy the errors to the
+event log and what exceptions can be ignored:
+
+    >>> keep_entries = browser.getControl(name='keep_entries')
+    >>> keep_entries.value
+    '20'
+    >>> keep_entries.value = '30'
+
+    >>> copy_to_zlog = browser.getControl(name='copy_to_zlog')
+    >>> copy_to_zlog.value
+    False
+    >>> copy_to_zlog.value = True
+
+    >>> ignored_exceptions = browser.getControl(name='ignored_exceptions:lines')
+    >>> ignored_exceptions.value
+    'Unauthorized'
+    >>> ignored_exceptions.value += '\nNotImplementedError'
+
+    >>> browser.getControl('Save Changes').click()
+
+    >>> browser.getControl(name='keep_entries').value
+    '30'
+    >>> browser.getControl(name='copy_to_zlog').value
+    True
+    >>> print browser.getControl(name='ignored_exceptions:lines').value
+    Unauthorized
+    NotImplementedError
+
+Let's now make sure that we can get to the error list. First let's create a
+``NotFound`` error:
+
+    # Unfortunately, urllib2 raises errors on HTTP Not Found errors. :-(
+    >>> import urllib2
+    >>> try:
+    ...     browser.open('http://localhost/foo')
+    ... except urllib2.HTTPError:
+    ...     pass
+
+    Now let's see the report:
+
+    >>> browser.open('http://localhost/'
+    ...              '++etc++site/default/RootErrorReportingUtility')
+    >>> browser.getLink('Error List').click()
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <tr>
+      <td valign="top" nowrap="nowrap">
+        <span>...</span>
+      </td>
+      <td>
+        <span>unauthenticated, sb.person.manager, SchoolTool Manager, </span>
+      </td>
+      <td valign="top">
+        <a href="showEntry.html?id=...">
+          <span>NotFound</span>:
+          <span>Object: &lt;schooltool.app.app.SchoolToolApplication ...</span>
+        </a>
+      </td>
+    </tr>
+    ...
+
+
+The Introspector
+----------------
+
+The introspector allows you to look at the current object, without any
+security constraints. The actual functionality of the introspector is part of
+the Zope 3 core and is simply "repackaged" for SchoolTool.
+
+The first step is to get to the object we would like to
+introspect. For example, let's see what the SchoolTool Manager looks
+like. We can open the introspector using the Developer Tools menu in
+the top-right corner:
+
+    >>> browser.open('http://localhost/persons/manager/@@introspector.html')
+
+Let me explain some of the features now. The headline gives you the class of
+the object, followed by the name:
+
+    >>> print browser.contents.strip()
+    <!DOC...
+    ...
+    <h1>
+      Object Introspector:
+      <a href="...person/Person/index.html">schooltool.person.person.Person</a>
+      ( manager )
+    </h1>
+    ...
+
+Below the title is a link to the parent:
+
+    >>> print browser.contents.strip()
+    <!DOC...
+    ...
+    <em>
+      Parent:
+      <a href=" http://localhost/persons/@@introspector.html">
+        persons
+      </a>
+    </em>
+    ...
+
+The probably most important information that the introspector can give a
+developer, are the directly provided interfaces; usually there are none, as in
+this case:
+
+    >>> print browser.contents.strip()
+    <!DOC...
+    ...
+    <h2>Directly Provided Interfaces</h2>
+    <div class="indent">
+      <div>
+        No interfaces are directly provided.
+     </div>
+    </div>
+    ...
+
+The following sections "Provided Interfaces", "Bases", "Attribute/Properties",
+and "Methods" are simply taken from the class documentation of the apidoc,
+with the exception of the attribute and property values, which are the actual
+values on the object.
+
+The introspector also allows you to see the mapping or sequence items of the
+object, if it is a mapping or sequence, respectively. Since the `Person`
+object is neither, those sections are not available in our example.
+
+The final section of the introspector shows you a list of annotations, if they
+are inspectable. Since the attribute annotations are inspectable, we can see a
+range of annotation keys and their values:
+
+    >>> f = open('/tmp/dump.txt', 'w')
+    >>> f.write(browser.contents)
+    >>> f.close()
+    >>> print browser.contents.strip()
+    <!DOC...
+    ...
+    <h2>Annotations</h2>
+    <div class="indent">
+      <ul class="attr-list">
+        <li>
+          <b>
+            <code>'schooltool.app.PersonPreferences'</code>
+          </b>
+          <br />
+          <a href="++annotations++schooltool.app.PersonPreferences/@@introspector.html">
+            <code>&lt;schooltool.person.preference.PersonPreferences object at ...&gt;</code>
+          </a>
+            (<span>type:</span>
+            <a href="http://localhost/++apidoc++/Code/schooltool/person/preference/PersonPreferences/index.html">
+              <code>PersonPreferences</code></a>)
+        </li>
+    ...
+
+The best part about it is that you can usually click on the annotation value
+to inspect it even further:
+
+    >>> browser.getLink('schooltool.person.preference.PersonPreferences').click()
+
+And now it starts all over again:
+
+    >>> print browser.contents.strip()
+    <!DOC...
+    ...
+    <h1>
+      Object Introspector:
+      <a href=".../index.html">schooltool.person.preference.PersonPreferences</a>
+      ( preferences )
+    </h1>
+    <em>
+      Parent:
+      <a href=" http://localhost/persons/manager/@@introspector.html">
+        manager
+      </a>
+    </em>
+    ...
+
+That's it. Since the code should allow you to inspect annotations, as well as
+mapping and sequence items as deep as you wish, you can gain a lot of insight
+of the functionality of SchoolTool by simply "browsing" the objects.
+
+
+API Documentation
+-----------------
+
+The SchoolTool API Documentation is a customized version of the regular Zope 3
+API documentation. Some features are removed, others added. But let's have a
+look.
+
+    >>> browser.getLink('API Docs').click()
+
+We can now look at the module list:
+
+    >>> browser.getLink(url='modulelist.html').click()
+
+The modules available in the SchoolTool API documentation are:
+
+    >>> browser.getLink('Interfaces')
+    <Link text='Interfaces' url='.../++apidoc++/Interface/@@menu.html'>
+    >>> browser.getLink('Code')
+    <Link text='Code' url='.../++apidoc++/Code/@@menu.html'>
+    >>> browser.getLink('RESTive Views')
+    <Link text='RESTive Views' url='.../++apidoc++/Code/@@restmenu.html'>
+    >>> browser.getLink('Book')
+    <Link text='Book' url='.../++apidoc++/Book/schooltool/@@menu.html'>
+
+You can also access the user preferences that are specific to the API
+documentation:
+
+    >>> browser.getLink('User Preferences').click()
+    >>> browser.getLink('Interface Details').click()
+
+On the main contents frame of the apidoc now appears a long list of options
+that specify the detail level you will see by default in the interface details
+screen.
+
+We can, for example, turn on the "Extended Browser Views" option, which is
+turned off by default:
+
+    >>> browser.getControl('Extended Browser Views').selected
+    False
+    >>> browser.getControl('Extended Browser Views').click()
+    >>> browser.getControl('Change').click()
+
+So now that we know how to change the preferences, let's have a detailed look
+at the various documentation modules:
+
+
+Interfaces
+~~~~~~~~~~
+
+The interfaces documentation module let's you search through all registered
+SchoolTool interfaces. Zope 3 interfaces are purposefully excluded:
+
+    >>> browser.open('http://localhost/')
+    >>> browser.getLink('API Docs').click()
+    >>> browser.getLink(url='modulelist.html').click()
+    >>> browser.getLink('Interfaces').click()
+
+You are now presented with a menu, where you can search for various
+interfaces. Let's search for the devmode interfaces:
+
+    >>> browser.getControl(name='search_str').value = 'devmode'
+    >>> browser.getControl('Find').click()
+
+When the screen returns we should see our devmode layer and skin interface:
+
+    >>> print browser.contents.strip()
+    <!DOC...
+    ...
+    <div>
+      ...
+      <div>
+        <a href="./schooltool.devmode.skin.IDevModeLayer/index.html"
+           target="main">st.devmode.skin.IDevModeLayer</a>
+      </div>
+      ...
+    </div>
+    ...
+
+You can also see how "schooltool" is abbreviated as "st" to make the name
+shorter. Clicking on one of those results will give you the typical interface
+details screen:
+
+    >>> browser.getLink('st.devmode.skin.IDevModeLayer').click()
+    >>> browser.contents
+    '...schooltool.devmode.skin.IDevModeLayer...'
+
+
+Code
+~~~~
+
+Similar to the interfaces, you can search the SchoolTool source code for
+classes of a particular name.
+
+    >>> browser.open('http://localhost/')
+    >>> browser.getLink('API Docs').click()
+    >>> browser.getLink(url='modulelist.html').click()
+    >>> browser.getLink('Code').click()
+
+Again, searching by the term "devmode" gives us multiple results:
+
+    >>> browser.getControl(name='path').value = 'devmode'
+    >>> browser.getControl('Find').click()
+    >>> print browser.contents.strip()
+    <!DOC...
+    ...
+    <div>
+      ...
+      <a href=".../++apidoc++/Code/schooltool/devmode/apidoc/BookMenu/"
+         target="main">st.devmode.apidoc.BookMenu</a>
+      <a href=".../++apidoc++/Code/schooltool/devmode/apidoc/CodeMenu/"
+         target="main">st.devmode.apidoc.CodeMenu</a>
+      <a href=".../++apidoc++/Code/schooltool/devmode/apidoc/InterfaceMenu/"
+         target="main">st.devmode.apidoc.InterfaceMenu</a>
+      ...
+    </div>
+    ...
+
+Again, "schooltool" is collapsed to "st" and the documentation comes right up
+when clicking a link:
+
+    >>> browser.getLink('st.devmode.apidoc.InterfaceMenu').click()
+    >>> browser.contents
+    '...schooltool.devmode.apidoc.InterfaceMenu...'
+
+
+RESTive Views
+~~~~~~~~~~~~~
+
+This documentation section provides detailed information about the available
+restive views of all SchoolTool content type classes.
+
+    >>> browser.open('http://localhost/')
+    >>> browser.getLink('API Docs').click()
+    >>> browser.getLink(url='modulelist.html').click()
+    >>> browser.getLink('RESTive Views').click()
+
+Since it is not expected that there are many content types around, no search
+interface is provided and all the content classes are listed. Let's select the
+`Person`, which is the most interesting class:
+
+    >>> browser.getLink('st.person.person.Person').click()
+
+The view begins with a list of all available HTTP verbs. For the 'GET' view
+you can see the ZCML file the factory was registered at as well as the
+factory path:
+
+    >>> print browser.contents
+    <!DOC...
+    ...
+    <h3>GET</h3>
+    <div class="indent">
+      <div>
+        <i>Registered at:</i>
+        <a href="...">Zope3/.../schooltool/person/rest/configure.zcml</a>
+       <span class="small">
+         (line ...)</span>
+      </div>
+      <div>
+        <i>Factory path:</i>
+        <a href="...">schooltool.person.rest.person.PersonFile</a>
+      </div>
+    </div>
+    ...
+
+The 'PUT' view has a lot more information besides the standard information,
+
+    >>> print browser.contents
+    <!DOC...
+    ...
+    <h3>PUT</h3>
+    <div class="indent">
+    <div>
+      <i>Registered at:</i>
+      <a href="...">Zope3/.../zope/app/http/configure.zcml</a>
+      <span class="small">
+        (line ...)</span>
+    </div>
+    <div>
+      <i>Factory path:</i>
+      <a href="...">zope.app.http.put.FilePUT</a>
+    </div>
+    <div>
+      <i>Permission:</i>
+      zope.Public
+    </div>
+    ...
+
+you also receive information about the adapter that can create a person inside
+a given container,
+
+    >>> print browser.contents
+    <!DOC...
+    ...
+    <div>
+      <i><b>Creation Adapter:</b></i>
+      <div class="indent" style="padding-bottom: 0.5em">
+        <div>
+          <i>Registered at:</i>
+          <a href="...">Zope3/.../schooltool/person/rest/configure.zcml</a>
+          <span class="small">
+            (line ...)</span>
+        </div>
+        <div>
+          <i>Factory path:</i>
+          <a href="...">schooltool.person.person.Person</a>
+        </div>
+        <div>
+          <i>Container:</i>
+          <a href="...">schooltool.person.interfaces.IPersonContainer</a>
+        </div>
+      </div>
+    </div>
+    ...
+
+the modification adapter,
+
+    >>> print browser.contents
+    <!DOC...
+    ...
+    <div>
+      <i><b>Modification Adapter:</b></i>
+      <div class="indent" style="padding-bottom: 0.5em">
+        <div>
+          <i>Registered at:</i>
+          <a href="...">Zope3/.../schooltool/person/rest/configure.zcml</a>
+          <span class="small">
+            (line ...)</span>
+        </div>
+        <div>
+          <i>Factory path:</i>
+          <a href="...">schooltool.person.rest.person.PersonFile</a>
+        </div>
+      </div>
+    </div>
+    ...
+
+and the schema used to create and/or modify the content:
+
+    >>> print browser.contents
+    <!DOC...
+    ...
+    <div>
+      <i><b>Schema:</b></i>
+      <div class="indent">
+        <pre style="font-size: 100%; margin: 0">...</pre>
+      </div>
+    </div>
+    ...
+
+The final verb for the person is 'DELETE'. Besides the usual information, we
+also get a list of containers from which the verb is valid:
+
+    >>> print browser.contents
+    <!DOC...
+    ...
+    <div class="indent">
+      <h3>DELETE</h3>
+      <div class="indent">
+        <div>
+          <i>Registered at:</i>
+          <a href="...">Zope3/.../zope/app/http/configure.zcml</a>
+          <span class="small">
+            (line ...)</span>
+        </div>
+        <div>
+          <i>Factory path:</i>
+          <a href="...">zope.app.http.delete.DELETE</a>
+        </div>
+        <div>
+          <i>Container:</i>
+          <a href="...">schooltool.person.interfaces.IPersonContainer</a>
+        </div>
+        <div>
+          <i>Permission:</i>
+          zope.Public
+        </div>
+      </div>
+    </div>
+    ...
+
+# Following the HTTP verbs, all identifiable name traversers are listed,
+# including the access control list, `acl`:
+
+
+#     >>> print browser.contents
+#     <!DOC...
+#     ...
+#     <div class="indent">
+#       <h3>acl</h3>
+#       <div class="indent">
+#         <div>
+#           <i>Resolves to:</i>
+#           <a href="...">schooltool.app.rest.acl.ACLAdapter</a>
+#         </div>
+#         <div>
+#           <i>Registered at:</i>
+#           <a href="...">Zope3/.../schooltool/app/rest/configure.zcml</a>
+#           <span class="small">
+#            (line ...)</span>
+#         </div>
+#       </div>
+#     </div>
+#     ...
+
+# However, the link to the resolved component does not link the the class
+# documentation, but another RESTive view documentation screen. This is to allow
+# the inspection of the complete RESTive API:
+
+#     >>> browser.getLink('schooltool.app.rest.acl.ACLAdapter').click()
+#     >>> browser.url
+#     '.../++apidoc++/Code/schooltool/app/rest/acl/ACLAdapter/restviews.html'
+
+# In the ACL view, you can also see an example of a 'POST' view:
+
+#     >>> print browser.contents
+#     <!DOC...
+#     ...
+#     <div class="indent">
+#       <h3>POST</h3>
+#       <div class="indent">
+#         <div>
+#           <i>Registered at:</i>
+#           <a href="...">Zope3/.../schooltool/app/rest/configure.zcml</a>
+#           <span class="small">
+#             (line ...)</span>
+#         </div>
+#         <div>
+#           <i>Factory path:</i>
+#           <a href="...">schooltool.app.rest.acl.ACLView</a>
+#         </div>
+#         <div>
+#           <i>Template:</i>
+#           Zope3/.../schooltool/app/rest/templates/acl.pt
+#         </div>
+#         <div>
+#           <i>Permission:</i>
+#           n/a
+#         </div>
+#         <div>
+#           <i><b>Schema:</b></i>
+#           <div class="indent">
+#             <pre style="font-size: 100%; margin: 0">...</pre>
+#           </div>
+#         </div>
+#       </div>
+#     </div>
+#     ...
+
+
+Book
+~~~~
+
+The book is a collection of many text documentation files of the SchoolTool
+project.
+
+    >>> browser.open('http://localhost/')
+    >>> browser.getLink('API Docs').click()
+    >>> browser.getLink(url='modulelist.html').click()
+    >>> browser.getLink('Book').click()
+
+It is really the section of the entire apidoc book. The menu provides you with
+a tree-based outline. One of the chapters is "Calendar", so let's have a look:
+
+    >>> browser.getLink('Calendar').click()
+    >>> browser.contents
+    '...SchoolBell calendaring library...'
+
+
+Sample Data
+-----------
+
+SchoolTool also features a data generator, which will fill your SchoolTool
+instance with a lot of random data, which is perfect for performing and
+advanced functional testing. So let's have a look:
+
+    >>> browser.open('http://localhost/')
+    >>> browser.getLink('Sample data').click()
+
+You are now presented with a screen in which you can choose a random seed key
+for the data and a "Generate" button. The purpose of the seed is that you can
+reproduce a particular set of generated data. Since the generation process
+takes a very long time, I am refraining from a demonstration.


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/devmode.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,19 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:meta="http://namespaces.zope.org/meta"
+           i18n_domain="zope">
+
+  <meta:provides feature="devmode" />
+
+  <include package="schooltool.help" file="meta.zcml" />
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.devmode" />
+
+  <!-- Provide local overrides of standard configurations-->
+  <includeOverrides package="schooltool.devmode" file="overrides.zcml" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,43 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.devmode.
+
+$Id: ftests.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+import os
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+devmode_functional_layer = ZCMLLayer(filename,
+                                     __name__,
+                                     'devmode_functional_layer')
+
+def test_suite():
+    return collect_ftests(filenames=['devmode.txt'],
+                          layer=devmode_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/harrow.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/harrow.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/devmode/introspector.css
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/introspector.css	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/introspector.css	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,410 @@
+div.indent {
+    margin-left: 1.5em;
+}
+
+ol {
+    margin: 0px;
+    padding: 0px;
+}
+
+h1 {
+    font-size: 130%;
+}
+
+h2 {
+    margin-top: 1em;
+}
+
+ul.attr-list li {
+    margin-bottom: 0.5ex;
+}
+
+div.small {
+    font-size: 85%;
+    padding: 4pt;
+}
+
+span.small {
+    font-size: 85%;
+}
+
+/* Styles that are associated with STX-generated HTML */
+
+div.documentation {
+}
+
+div.documentation h1 {
+    font-size: 120%;
+}
+
+div.documentation h2 {
+    font-size: 110%;
+    font-style: italic;
+}
+
+div.documentation h3 {
+    font-style: italic;
+    font-weight: normal;
+    padding: 0;
+    margin: 0;
+}
+
+div.documentation p {
+    padding: 0;
+    margin-top: 0;
+    margin-bottom: 1em;
+}
+
+div.documentation ul, ol {
+    margin: 0.5em 2em;
+}
+
+div.documentation a.reference img {
+    border: none;
+}
+
+
+div.inline h1 {
+    padding: 0;
+    margin: 0;
+    margin-bottom: 0.5ex;
+}
+
+div.inline h2 {
+    margin-bottom: 0.5ex;
+}
+
+div.inline h3 {
+    margin-bottom: 0.5ex;
+}
+
+div.inline p {
+    margin: 0;
+    margin-bottom: 0.5ex;
+}
+
+/* reST markup - based on tools/stylesheets/default.css in the docutils dist */
+div.documentation .first {
+    margin-top: 0 ! important;
+}
+
+div.documentation .last,
+div.documentation .with-subtitle {
+    margin-bottom: 0 ! important;
+}
+
+div.documentation .hidden {
+    display: none;
+}
+
+div.documentation a.toc-backref {
+    text-decoration: none;
+    color: black;
+}
+
+div.documentation blockquote.epigraph {
+    margin: 2em 5em;
+}
+
+div.documentation dl.docutils dd {
+    margin-bottom: 0.5em;
+}
+
+div.documentation div.abstract {
+    margin: 2em 5em;
+}
+
+div.documentation div.abstract p.topic-title {
+    font-weight: bold;
+    text-align: center;
+}
+
+div.documentation div.admonition,
+div.documentation div.attention,
+div.documentation div.caution,
+div.documentation div.danger,
+div.documentation div.error,
+div.documentation div.hint,
+div.documentation div.important,
+div.documentation div.note,
+div.documentation div.tip,
+div.documentation div.warning {
+    margin: 2em;
+    border: medium outset;
+    padding: 1em;
+}
+
+div.documentation div.admonition p.admonition-title,
+div.documentation div.hint p.admonition-title,
+div.documentation div.important p.admonition-title,
+div.documentation div.note p.admonition-title,
+div.documentation div.tip p.admonition-title {
+    font-weight: bold;
+    font-family: sans-serif;
+}
+
+div.documentation div.attention p.admonition-title,
+div.documentation div.caution p.admonition-title,
+div.documentation div.danger p.admonition-title,
+div.documentation div.error p.admonition-title,
+div.documentation div.warning p.admonition-title {
+    color: red;
+    font-weight: bold;
+    font-family: sans-serif;
+}
+
+div.documentation div.dedication {
+    margin: 2em 5em;
+    text-align: center;
+    font-style: italic;
+}
+
+div.documentation div.dedication p.topic-title {
+    font-weight: bold;
+    font-style: normal;
+}
+
+div.documentation div.figure {
+    margin-left: 2em;
+}
+
+div.documentation div.footer,
+div.documentation div.header {
+    font-size: smaller;
+}
+
+div.documentation div.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+div.documentation div.line-block div.line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+div.documentation div.sidebar {
+    margin-left: 1em;
+    border: medium outset;
+    padding: 1em;
+    background-color: #ffffee;
+    width: 40%;
+    float: right;
+    clear: right;
+}
+
+div.documentation div.sidebar p.rubric {
+    font-family: sans-serif;
+    font-size: medium;
+}
+
+div.documentation div.system-messages {
+    margin: 5em;
+}
+
+div.documentation div.system-messages h1 {
+    color: red;
+}
+
+div.documentation div.system-message {
+    border: medium outset;
+    padding: 1em;
+}
+
+div.documentation div.system-message p.system-message-title {
+    color: red;
+    font-weight: bold;
+}
+
+div.documentation div.topic {
+    margin: 2em;
+}
+
+div.documentation h1.section-subtitle,
+div.documentation h2.section-subtitle,
+div.documentation h3.section-subtitle,
+div.documentation h4.section-subtitle,
+div.documentation h5.section-subtitle,
+div.documentation h6.section-subtitle {
+    margin-top: 0.4em;
+}
+
+div.documentation h1.title {
+    text-align: center;
+}
+
+div.documentation h2.subtitle {
+    text-align: center;
+}
+
+div.documentation hr.docutils {
+    width: 75%;
+}
+
+div.documentation ol.simple,
+div.documentation ul.simple {
+    margin-bottom: 1em;
+}
+
+div.documentation ol.arabic {
+    list-style: decimal;
+}
+
+div.documentation ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+div.documentation ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+div.documentation ol.lowerroman {
+    list-style: lower-roman;
+}
+
+div.documentation ol.upperroman {
+    list-style: upper-roman;
+}
+
+div.documentation p.attribution {
+    text-align: right;
+    margin-left: 50%;
+}
+
+div.documentation p.caption {
+    font-style: italic;
+}
+
+div.documentation p.credits {
+    font-style: italic;
+    font-size: smaller;
+}
+
+div.documentation p.label {
+    white-space: nowrap;
+}
+
+div.documentation p.rubric {
+    font-weight: bold;
+    font-size: larger;
+    color: maroon;
+    text-align: center;
+}
+
+div.documentation p.sidebar-title {
+    font-family: sans-serif;
+    font-weight: bold;
+    font-size: larger;
+}
+
+div.documentation p.sidebar-subtitle {
+    font-family: sans-serif;
+    font-weight: bold;
+}
+
+div.documentation p.topic-title {
+    font-weight: bold;
+}
+
+div.documentation pre.address {
+    margin-bottom: 0;
+    margin-top: 0;
+    font-family: serif;
+    font-size: 100%;
+}
+
+div.documentation pre.line-block {
+    font-family: serif;
+    font-size: 100%;
+}
+
+div.documentation pre.literal-block,
+div.documentation pre.doctest-block {
+    margin-left: 2em;
+    margin-right: 2em;
+    background-color: #eeeeee;
+}
+
+div.documentation span.classifier {
+    font-family: sans-serif;
+    font-style: oblique;
+}
+
+div.documentation span.classifier-delimiter {
+    font-family: sans-serif;
+    font-weight: bold;
+}
+
+div.documentation span.interpreted {
+    font-family: sans-serif;
+}
+
+div.documentation span.option {
+    white-space: nowrap;
+}
+
+div.documentation span.pre {
+    white-space: pre;
+}
+
+div.documentation span.problematic {
+    color: red;
+}
+
+div.documentation span.section-subtitle {
+  /* font-size relative to parent (<h#> element) */
+    font-size: 80%;
+}
+
+div.documentation table.citation {
+    border-left: solid thin gray;
+}
+
+div.documentation table.docinfo {
+    margin: 2em 4em;
+}
+
+div.documentation table.docutils {
+    margin-top: 0.5em;
+    margin-bottom: 0.5em;
+}
+
+div.documentation table.footnote {
+    border-left: solid thin black;
+}
+
+div.documentation table.docutils td,
+div.documentation table.docutils th,
+div.documentation table.docinfo td,
+div.documentation table.docinfo th {
+    padding-left: 0.5em;
+    padding-right: 0.5em;
+    vertical-align: top;
+}
+
+div.documentation table.docutils th.field-name,
+div.documentation table.docinfo th.docinfo-name {
+    font-weight: bold;
+    text-align: left;
+    white-space: nowrap;
+    padding-left: 0;
+}
+
+div.documentation h1 tt.docutils,
+div.documentation h2 tt.docutils,
+div.documentation h3 tt.docutils,
+div.documentation h4 tt.docutils,
+div.documentation h5 tt.docutils,
+div.documentation h6 tt.docutils {
+    font-size: 100%;
+}
+
+div.documentation tt.docutils {
+    background-color: #eeeeee;
+}
+
+div.documentation ul.auto-toc {
+    list-style-type: none;
+}

Added: schooltool/branches/upstream/current/src/schooltool/devmode/modules.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/modules.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/modules.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,43 @@
+<html metal:use-macro="views/apidoc_macros/details"
+    i18n:domain="zope">
+<body metal:fill-slot="contents" class="modulelist" >
+
+  <div class="apihead">
+      <a href="contents.html" target="main" i18n:translate="">
+        ST API Docs
+      </a>
+  </div>
+
+  <div class="modulelist" style="margin-left: 0.5em">
+    <ul class="modules">
+      <li>
+        <a href="Interface/@@menu.html" target="menu" i18n:translate="">
+          Interfaces
+        </a>
+      </li>
+      <li>
+        <a href="Code/@@menu.html" target="menu" i18n:translate="">
+          Code
+        </a>
+      </li>
+      <li>
+        <a href="Code/@@restmenu.html" target="menu" i18n:translate="">
+          RESTive Views
+        </a>
+      </li>
+      <li>
+        <a href="Book/schooltool/@@menu.html" target="menu" i18n:translate="">
+          Book
+        </a>
+      </li>
+    </ul>
+    <div id="preference_entry">
+      <a href="./++preferences++/apidoc/@@apidocMenu.html" target="menu"
+        i18n:translate="">
+        User Preferences
+      </a>
+    </div>
+  </div>
+
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/modules.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/overrides.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/overrides.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/overrides.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,23 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser">
+
+  <subscriber
+      handler=".skin.schoolToolTraverseSubscriber"
+      for="zope.app.publication.interfaces.IBeforeTraverseEvent"
+      />
+
+  <!-- apidoc overriding -->
+
+  <view
+      name="apidoc" type="*"
+      provides="zope.traversing.interfaces.ITraversable" for="*"
+      factory=".apidoc.schooltoolApidocNamespace"
+      />
+  <adapter
+      name="apidoc"
+      provides="zope.traversing.interfaces.ITraversable" for="*"
+      factory=".apidoc.schooltoolApidocNamespace"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/overrides.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,136 @@
+<html metal:use-macro="views/apidoc_macros/details"
+    i18n:domain="zope">
+<body metal:fill-slot="contents"
+      tal:define="rootURL view/apidocRoot">
+
+  <h1 class="details-header" i18n:translate="">
+    RESTive API for
+    <a href="index.html">
+      <code tal:content="view/name" i18n:name="iface" />
+    </a>
+  </h1>
+
+  <h2 class="details-section" i18n:translate="">Verbs</h2>
+
+
+  <div class="indent"
+       tal:define="info view/getGETInfo"
+       tal:condition="info">
+
+    <h3>GET</h3>
+    <div class="indent">
+
+      <metal:block use-macro="context/@@restdoc_macros/zcml"/>
+      <metal:block use-macro="context/@@restdoc_macros/factory"/>
+      <metal:block use-macro="context/@@restdoc_macros/template"/>
+      <metal:block use-macro="context/@@restdoc_macros/permission"/>
+
+    </div>
+
+  </div>
+
+  <div class="indent"
+       tal:define="info view/getPOSTInfo"
+       tal:condition="info">
+
+    <h3>POST</h3>
+    <div class="indent">
+
+      <metal:block use-macro="context/@@restdoc_macros/zcml"/>
+      <metal:block use-macro="context/@@restdoc_macros/factory"/>
+      <metal:block use-macro="context/@@restdoc_macros/template"/>
+      <metal:block use-macro="context/@@restdoc_macros/permission"/>
+      <metal:block use-macro="context/@@restdoc_macros/schema"/>
+
+    </div>
+
+  </div>
+
+  <div class="indent"
+       tal:define="info view/getPUTInfo"
+       tal:condition="info">
+
+    <h3>PUT</h3>
+    <div class="indent">
+
+      <metal:block use-macro="context/@@restdoc_macros/zcml"/>
+      <metal:block use-macro="context/@@restdoc_macros/factory"/>
+      <metal:block use-macro="context/@@restdoc_macros/permission"/>
+
+      <div tal:condition="info/create|nothing">
+        <i><b i18n:translate="">Creation Adapter:</b></i>
+        <div class="indent" style="padding-bottom: 0.5em"
+             tal:define="info info/create">
+          <metal:block use-macro="context/@@restdoc_macros/zcml"/>
+          <metal:block use-macro="context/@@restdoc_macros/adapter-factory"/>
+          <tal:block define="info info/container">
+            <metal:block use-macro="context/@@restdoc_macros/container"/>
+          </tal:block>
+          <metal:block use-macro="context/@@restdoc_macros/permission"/>
+        </div>
+      </div>
+
+      <div tal:condition="info/edit|nothing">
+        <i><b i18n:translate="">Modification Adapter:</b></i>
+        <div class="indent" style="padding-bottom: 0.5em"
+             tal:define="info info/edit">
+          <metal:block use-macro="context/@@restdoc_macros/zcml"/>
+          <metal:block use-macro="context/@@restdoc_macros/adapter-factory"/>
+          <metal:block use-macro="context/@@restdoc_macros/permission"/>
+        </div>
+      </div>
+
+      <metal:block use-macro="context/@@restdoc_macros/schema"/>
+
+    </div>
+
+  </div>
+
+  <div class="indent"
+       tal:define="info view/getDELETEInfo">
+
+    <h3>DELETE</h3>
+
+    <div class="indent">
+
+      <metal:block use-macro="context/@@restdoc_macros/zcml"/>
+      <metal:block use-macro="context/@@restdoc_macros/factory"/>
+      <tal:block repeat="info info/containers">
+        <metal:block use-macro="context/@@restdoc_macros/container"/>
+      </tal:block>
+      <metal:block use-macro="context/@@restdoc_macros/permission"/>
+
+    </div>
+
+  </div>
+
+  <div tal:define="traversers view/getNameTraversers"
+       tal:condition="traversers">
+
+    <h2 class="details-section" i18n:translate="">Name Traversers</h2>
+    <div class="indent"
+         tal:repeat="info traversers">
+      <h3 tal:content="info/name">acl</h3>
+      <div class="indent">
+        <div tal:condition="info/component/path">
+          <i i18n:translate="">Resolves to:</i>
+          <a href=""
+             tal:condition="info/component/referencable"
+             tal:attributes="href
+                 string:$rootURL/Code/${info/component/url}/restviews.html"
+             tal:content="info/component/path" />
+          <span
+             tal:condition="not:info/component/referencable"
+             tal:content="info/component/path" />
+        </div>
+
+        <metal:block use-macro="context/@@restdoc_macros/zcml"/>
+        <metal:block use-macro="context/@@restdoc_macros/permission"/>
+
+      </div>
+    </div>
+
+  </div>
+
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,354 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Documentation for RESTive views
+
+$Id: restdoc.py 6001 2006-04-28 10:22:08Z faassen $
+"""
+__docformat__ = 'restructuredtext'
+import types
+
+import zope.interface
+from zope.component.registry import AdapterRegistration, SubscriptionRegistration
+from zope.publisher.interfaces.http import IHTTPRequest
+
+from zope.app import zapi
+from zope.app.apidoc import presentation, utilities, component
+from zope.app.apidoc.ifacemodule.browser import findAPIDocumentationRoot
+from zope.app.apidoc.classregistry import classRegistry
+from zope.app.apidoc.interfaces import IDocumentationModule
+from zope.app.basicskin.standardmacros import StandardMacros
+from zope.app.container.interfaces import IContainer
+from zope.app.content.interfaces import IContentType
+from zope.filerepresentation.interfaces import IFileFactory, IWriteFile
+from zope.app.http.put import FilePUT
+from zope.publisher.browser import BrowserView
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.traverser.interfaces import ITraverserPlugin
+from schooltool.traverser.traverser import AdapterTraverserPluginTemplate
+from schooltool.traverser.traverser import NullTraverserPluginTemplate
+
+
+def getHTTPViewRegistration(klass, name):
+    """Return a view registration for the given object, type and name."""
+    gsm = zapi.getGlobalSiteManager()
+    spec = zope.interface.implementedBy(klass)
+    adapter = gsm.adapters.lookup(
+        (spec, IHTTPRequest), zope.interface.Interface, name)
+
+    if adapter is None:
+        return
+
+    for reg in gsm.registeredAdapters():
+        if reg.factory == adapter:
+            return reg
+
+def getContainerInterfaces(klass):
+    """Get a list of interfaces that describe containers in which instances of
+    the given class can be located.
+    """
+    spec = zope.interface.implementedBy(klass)
+    parentAttr = spec.get('__parent__')
+
+    if parentAttr is None or not hasattr(parentAttr, 'constraint'):
+        # Custom hack to give schooltool containers a container interface
+        if spec.isOrExtends(IContainer):
+            return (ISchoolToolApplication,)
+        return ()
+
+    return parentAttr.constraint.types
+
+
+def getAdapters(spec, provided):
+    gsm = zapi.getGlobalSiteManager()
+    factories = [
+        factory
+        for name, factory in gsm.adapters.lookupAll((spec,), provided)]
+    return [
+        reg
+        for reg in gsm.registeredAdapters()
+        if reg.factory in factories]
+
+
+def getNameTraversers(klass):
+    gsm = zapi.getGlobalSiteManager()
+    spec = zope.interface.implementedBy(klass)
+    factories = [f for f in gsm.adapters.subscriptions((spec, IHTTPRequest),
+                                                       ITraverserPlugin)]
+    return [
+        reg
+        for reg in gsm.registeredSubscriptionAdapters()
+        if reg.factory in factories]
+
+
+class RESTDocMacros(StandardMacros):
+    """Page Template METAL macros for API Documentation"""
+    macro_pages = ('restdoc_details_macros',)
+
+
+class RESTMenu(object):
+
+    def listContentClasses(self):
+        # Make sure that the class registry is setup.
+        self.context.get('')
+
+        results = []
+        for name, iface in zapi.getUtilitiesFor(IContentType):
+
+            for path, klass in classRegistry.getClassesThatImplement(iface):
+                if path.startswith('zope'):
+                    continue
+                results.append(
+                    {'path': path.replace('schooltool', 'st'),
+                     'url': path.replace('.', '/') + '/@@restviews.html'
+                     })
+
+        results.sort(lambda x, y: cmp(x['path'], y['path']))
+        return results
+
+
+class RESTDocumentation(BrowserView):
+
+    def __init__(self, context, request):
+        super(RESTDocumentation, self).__init__(context, request)
+        try:
+            self.apidocRoot = findAPIDocumentationRoot(context, request)
+        except TypeError:
+            # Probably context without location; it's a test
+            self.apidocRoot = ''
+
+        # Ensure that the class registry is populated
+        zapi.getUtility(IDocumentationModule, 'Code').setup()
+
+        # We need the naked class for introspection everywhere.
+        self.klass = classRegistry[context.getPath()]
+        self.name = zapi.getName(context)
+
+
+    def getGETInfo(self):
+        """Get the info dictionary of the GET RESTive view.
+
+        If there is no such view, return None.
+        """
+        reg = getHTTPViewRegistration(self.klass, 'GET')
+
+        if reg is None:
+            return None
+
+        info = presentation.getViewInfoDictionary(reg)
+
+        # Doctor up the info dict a little bit. This is easier than trying to
+        # do the info dict from scratch.
+        factory = component.getRealFactory(reg.factory)
+
+        # We deal with a zope.app.component.metaconfigure.ProxyView
+        if hasattr(factory, 'template'):
+            fn = factory.template.filename
+            info['factory']['template'] = presentation.relativizePath(fn)
+
+        # In plain HTTP views, `__call__` is the right method to get perms
+        # for.
+        if hasattr(factory, 'checker'):
+            info.update(
+                utilities.getPermissionIds('__call__', checker=factory.checker))
+
+        return info
+
+
+    def getPOSTInfo(self):
+        """Get the info dictionary of the POST RESTive view.
+
+        If there is no such view, return None.
+        """
+        reg = getHTTPViewRegistration(self.klass, 'POST')
+        if reg is None:
+            return
+
+        info = presentation.getViewInfoDictionary(reg)
+
+        # In plain HTTP views, `__call__` is the right method to get perms for.
+        if hasattr(reg.factory, 'checker'):
+            info.update(utilities.getPermissionIds(
+                '__call__', checker=reg.factory.checker))
+
+        if hasattr(reg.factory, 'factory'):
+            # Try to find a schema
+            schema  = getattr(reg.factory.factory, 'schema', None)
+            if schema:
+                schema = utilities.dedentString(schema)
+                info['schema'] = schema
+
+            # We deal with a zope.app.component.metaconfigure.ProxyView
+            if hasattr(reg.factory.factory, 'template'):
+                fn = reg.factory.factory.template.filename
+                info['factory']['template'] = presentation.relativizePath(fn)
+
+        return info
+
+
+    def getPUTInfo(self):
+        """Get the info dictionary of the PUT RESTive view.
+
+        If there is no such view, return None.
+        """
+        reg = getHTTPViewRegistration(self.klass, 'PUT')
+        if reg is None:
+            return
+
+        info = presentation.getViewInfoDictionary(reg)
+
+        # Doctor up the info dict a little bit. This is easier than trying to
+        # do the info dict from scratch.
+        schema  = getattr(reg.factory.factory, 'schema', None)
+        if schema:
+            schema = utilities.dedentString(schema)
+        info['schema'] = schema
+
+        # Try to get the checker
+        checker = getattr(reg.factory, 'checker', None)
+        if checker:
+            info.update(utilities.getPermissionIds('PUT', checker=checker))
+
+        # Generically Zope 3 supports putting files by extension using the
+        # IWriteFile interface; so we have to collect all of this info here.
+        if component.getRealFactory(reg.factory.factory) is FilePUT:
+
+            # The should be only one IWriteFile adapter too.
+            spec = zope.interface.implementedBy(self.klass)
+            reg = getAdapters(spec, IWriteFile)
+            if reg:
+                reg = reg[0]
+                info['edit'] = component.getAdapterInfoDictionary(reg)
+
+            # Usually there will be only one container per content type, so
+            # only using the first found container is a good assumption
+            container = getContainerInterfaces(self.klass)
+            if not container:
+                return info
+            container = container[0]
+
+            # Also, while we could have a file factory for various different
+            # extensions of an object, SchoolTool commonly only uses the
+            # default adapter without any extensions.
+            reg = getAdapters(container, IFileFactory)
+            if reg:
+                reg = reg[0]
+                info['create'] = component.getAdapterInfoDictionary(reg)
+                cdict = component.getInterfaceInfoDictionary(container)
+                info['create']['container'] = cdict
+
+                # Also, if we have a schema, show it.
+                factory = getattr(reg.factory, 'factory', None)
+                schema  = getattr(factory, 'schema', None)
+                if schema:
+                    schema = utilities.dedentString(schema)
+                    info['schema'] = schema
+
+        return info
+
+
+    def getDELETEInfo(self):
+        """Get the info dictionary of the DELETE RESTive view.
+
+        If there is no such view, return None.
+        """
+        # Get the DELETE view registration
+        reg = getHTTPViewRegistration(self.klass, 'DELETE')
+
+        # If none was found (which should never happen), then return None
+        if reg is None:
+            return None
+
+        info = presentation.getViewInfoDictionary(reg)
+
+        # Retrieve better security information
+        checker = getattr(reg.factory, 'checker', None)
+        if checker:
+            info.update(utilities.getPermissionIds('DELETE', checker=checker))
+
+        # Now look up the containers and create an entry for each.
+        containers = []
+        for container in getContainerInterfaces(self.klass):
+            containers.append(component.getInterfaceInfoDictionary(container))
+        info['containers'] = containers
+        return info
+
+
+    def getNameTraversers(self):
+        """Get a list of all name traversers."""
+        result = []
+        for reg in getNameTraversers(self.klass):
+            # Get rid of all sorts of security and location wrappers
+            factory = component.getRealFactory(reg.factory)
+
+            if not hasattr(factory, 'traversalName'):
+                continue
+
+            info = {
+                'name': factory.traversalName,
+                'component': {'path': None, 'url': None, 'referencable': None}
+                }
+
+            # Does not work yet.
+            info.update(utilities.getPermissionIds(
+                'publishTraverse', klass=getattr(factory, 'factory', factory)))
+
+            if isinstance(reg.info, (str, unicode)):
+                info['zcml'] = None
+            else:
+                info['zcml'] = component.getParserInfoInfoDictionary(reg.info)
+
+            adapter = None
+            if AdapterTraverserPluginTemplate in factory.__bases__:
+                gsm = zapi.getGlobalSiteManager()
+                iface = factory.interface
+                spec = zope.interface.implementedBy(self.klass)
+                adapter = gsm.adapters.lookup(
+                    (spec,), iface, name=factory.adapterName)
+
+                adapter = component.getRealFactory(adapter)
+
+                # Sometimes the adapters are functions, so we have to dig deeper
+                if isinstance(adapter, types.FunctionType):
+                    # Make a guess.
+                    for n, k in classRegistry.getClassesThatImplement(iface):
+                        adapter = k
+                        break
+
+            elif NullTraverserPluginTemplate in factory.__bases__:
+                adapter = self.klass
+
+            elif hasattr(factory, 'component'):
+                adapter = factory.component
+
+            if adapter:
+                adapterClass = component.getRealFactory(adapter)
+
+                path = utilities.getPythonPath(adapterClass)
+                referencable = utilities.isReferencable(path)
+                info['component'] = {
+                    'path': path,
+                    'referencable': referencable,
+                    'url': referencable and path.replace('.', '/') or None}
+
+            result.append(info)
+
+        result.sort(lambda x, y: cmp(x['name'], y['name']))
+        return result


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,698 @@
+===========================
+RESTive Views Documentation
+===========================
+
+One of the additions to the standard apidoc modules is the the `restdoc`
+module implement in
+
+   >>> from schooltool.devmode import restdoc
+
+The RESTive view documentation provides a list of classes that implement an
+interface that claims to be a content type. The REST views are collected for
+classes instead of the content type interfaces, because SchoolTool content
+type classes implement several marker interfaces that enhance the availability
+of RESTive views.
+
+
+`getHTTPViewRegistration(klass, name)`
+--------------------------------------
+
+This function returns the registration that matches the adapter lookup::
+
+  zope.component.getMultiAdapter(
+      (implementedBy(klass), IHTTPRequest), zope.interface.Interface, name=name)
+
+Let's first write a sensible class:
+
+  >>> import zope.interface
+
+  >>> class IFile(zope.interface.Interface):
+  ...     contents = zope.interface.Attribute('File contents.')
+
+  >>> class File(object):
+  ...     zope.interface.implements(IFile)
+  ...     def __init__(self):
+  ...         self.contents = ''
+
+Now we need to develop a view for the file. For plain HTTP views, the view
+usually implements a verb:
+
+  >>> class GETFile(object):
+  ...
+  ...     def __init__(self, context, request):
+  ...         self.context = context
+  ...         self.request = request
+  ...
+  ...     def __call__(self):
+  ...         return self.context.content
+
+  >>> import zope.component
+  >>> import zope.publisher.interfaces.http
+  >>> zope.component.provideAdapter(
+  ...     GETFile,
+  ...     (IFile, zope.publisher.interfaces.http.IHTTPRequest),
+  ...     zope.interface.Interface,
+  ...     name='GET')
+
+We can now invoke the function to get the registration:
+
+  >>> restdoc.getHTTPViewRegistration(File, 'GET')
+  AdapterRegistration(<BaseGlobalComponents base>, 
+                      [IFile, IHTTPRequest], Interface, 'GET', GETFile, u'')
+
+If a view does not exist, `None` should be returned:
+
+  >>> restdoc.getHTTPViewRegistration(File, 'HEAD') is None
+  True
+
+
+`getContainerInterfaces(klass)`
+-------------------------------
+
+This function determines the interfaces of containers to which the passed
+class instances can be added. It does this by inspecting the interface
+constraints:
+
+  >>> import zope.app.container.interfaces
+  >>> import zope.app.container.constraints
+  >>> class IFileContainer(zope.app.container.interfaces.IContainer):
+  ...     zope.app.container.constraints.contains(IFile)
+
+  >>> class IFileContained(IFile, zope.app.container.interfaces.IContained):
+  ...     zope.app.container.constraints.containers(IFileContainer)
+
+Originally, when no cosntraints are specified, the function returns an empty
+list:
+
+  >>> restdoc.getContainerInterfaces(File)
+  ()
+
+However, once we add the constraints to the implementation,
+
+  >>> zope.interface.classImplements(File, IFileContained)
+
+the container will be found:
+
+  >>> restdoc.getContainerInterfaces(File)
+  (<InterfaceClass schooltool.devmode.devmode_txt.IFileContainer>,)
+
+In order to make life easier, if no container interface is found for a given
+content type and the content type implements the container interface, then the
+`ISchoolToolApplication` interface is returned as the container, since typically
+content containers are located inside the SchoolTool application object:
+
+  >>> class FileFolder(object):
+  ...     zope.interface.implements(IFileContainer)
+
+  >>> restdoc.getContainerInterfaces(FileFolder)
+  (<InterfaceClass schooltool.app.interfaces.ISchoolToolApplication>,)
+
+
+`getAdapters(spec, provided)`
+-----------------------------
+
+Given a sepcification and the provided interface, this function returns the
+registrations for the adapters from `spec` to `provided`. The function
+basically does a low level adapter lookup and then looks for the correct
+registrations for those adapters.
+
+Let's say I am writing an `ISized` adapter for our file:
+
+  >>> from zope import size
+  >>> class FileSized(object):
+  ...     zope.component.adapts(IFile)
+  ...     zope.interface.implements(size.interfaces.ISized)
+
+  >>> zope.component.provideAdapter(FileSized)
+
+Now we get its registration:
+
+  >>> spec = zope.interface.implementedBy(File)
+  >>> restdoc.getAdapters(spec, size.interfaces.ISized)
+  [AdapterRegistration(<BaseGlobalComponents base>, 
+                       [IFile], ISized, '', FileSized, u'')]
+
+
+`getNameTraversers(klass)`
+--------------------------
+
+In terms of REST documentation, name traversers are traversal plugins for pure
+HTTP requests that traverse a single name. Those traversers are recognized by
+the fact that they have a `traversalName` attribute. For details on how to
+work with the pluggable traverser framework and implemenetions of plugins, see
+the documentation in the ``schooltool.traverser`` package.
+
+Let's register a couple of null-traversers:
+
+  >>> from schooltool.traverser import traverser, interfaces
+  >>> plugin = traverser.NullTraverserPlugin('data')
+  >>> zope.component.provideSubscriptionAdapter(
+  ...     plugin,
+  ...     (IFile, zope.publisher.interfaces.http.IHTTPRequest),
+  ...     interfaces.ITraverserPlugin)
+
+  >>> class ISomeContent(zope.interface.Interface):
+  ...     pass
+
+  >>> plugin = traverser.NullTraverserPlugin('info')
+  >>> zope.component.provideSubscriptionAdapter(
+  ...     plugin,
+  ...     (ISomeContent, zope.publisher.interfaces.http.IHTTPRequest),
+  ...     interfaces.ITraverserPlugin)
+
+When asking for all the name adapters we only get the first one, since the
+other one requires an interface that is not implemented by the file class:
+
+  >>> restdoc.getNameTraversers(File)
+  [SubscriptionRegistration(<BaseGlobalComponents base>, 
+                            [IFile, IHTTPRequest], ITraverserPlugin, u'', 
+                            NullTraverserPlugin, u'')]
+
+
+`RESTMenu` class
+----------------
+
+The special RESTive menu only displays classes that implement a content type
+interface. So if we register the `IFile` interface as an `IContentType`,
+
+  >>> from zope.app import content
+  >>> zope.interface.directlyProvides(IFile, content.interfaces.IContentType)
+  >>> zope.component.provideUtility(IFile, content.interfaces.IContentType,
+  ...                               name='schooltool.file.IFile')
+
+and add the `File` class to the class registry
+
+  >>> from zope.app.apidoc import classregistry
+  >>> classregistry.classRegistry['schooltool.devmode.devmode_txt.File'] = File
+
+then we can get it from the menu:
+
+  >>> class FauxCodeModule(object):
+  ...     def get(self, name):
+  ...         pass
+
+  >>> menu = restdoc.RESTMenu()
+  >>> menu.context = FauxCodeModule()
+  >>> pprint(menu.listContentClasses())
+  [{'path': 'st.devmode.devmode_txt.File',
+    'url': 'schooltool/devmode/devmode_txt/File/@@restviews.html'}]
+
+Note how the `schooltool` package has been collapsed to `st`. This is
+intentional to save horizontal space in the thin menu column. Also, since this
+is a SchoolTool and not a Zope 3 API documentation, all content types starting
+with `zope` will be ignored:
+
+  >>> classregistry.classRegistry['zope.file.ZopeFile'] = File
+
+  >>> pprint(menu.listContentClasses())
+  [{'path': 'st.devmode.devmode_txt.File',
+    'url': 'schooltool/devmode/devmode_txt/File/@@restviews.html'}]
+
+
+`RESTDocumentation` class
+-------------------------
+
+This class is the main driver of the documentation. All features of the
+RESTive view documentation originate here. This class heavily relies on the
+apidoc inspection API to generate it's information. Please see the text files
+in the ``zope.app.apidoc`` package for more details.
+
+Already the initialization of the class does a lot of work. It first gets the
+apidoc root URL; fortunately, setup is not necessary for this step. Next the
+constructor ensures that the class registry is populated. Thus we need to
+register the `CodeModule` as an `IDocumentationModule` utility:
+
+  >>> from zope.app.apidoc.codemodule import codemodule
+  >>> from zope.app.apidoc.interfaces import IDocumentationModule
+  >>> zope.component.provideUtility(
+  ...     codemodule.CodeModule(), IDocumentationModule, 'Code')
+
+Next the view looks up the naked class and class name, given the code module's
+`Class` documentation object:
+
+  >>> import types
+  >>> fileModule = types.ModuleType('schooltool.file')
+
+  >>> from zope.app.apidoc.codemodule import module
+  >>> docModule = module.Module(
+  ...     None, 'schooltool.file', fileModule)
+
+  >>> from zope.app.apidoc.codemodule import class_
+  >>> docClass = class_.Class(docModule, 'File', File)
+
+We are now ready to instantiate the view,
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> doc = restdoc.RESTDocumentation(docClass, TestRequest)
+
+and get the class and name:
+
+  >>> doc.klass
+  <class 'schooltool.devmode.devmode_txt.File'>
+  >>> doc.name
+  'File'
+
+The following sub-sections introduce the various HTTP-verb documentation
+segements.
+
+
+`getGETInfo()`
+~~~~~~~~~~~~~~
+
+This method looks up the plain 'GET' HTTP view and displays its
+information. Thus we first have to create such an add view:
+
+  >>> class FileGETView(object):
+  ...    pass
+
+  # Often factories are wrapped:
+  >>> def GET(*args):
+  ...     return FileGETView(*args)
+  >>> GET.factory = FileGETView
+
+  >>> from zope.publisher.interfaces.http import IHTTPRequest
+  >>> zope.component.provideAdapter(
+  ...     GET, (IFile, IHTTPRequest), zope.interface.Interface, 'GET')
+
+We are now ready to look up the view info:
+
+  >>> pprint(doc.getGETInfo())
+  {'doc': u'',
+   'factory': {'path': 'schooltool.devmode.devmode_txt.FileGETView',
+               'referencable': True,
+               'resource': None,
+               'template': None,
+               'url': 'schooltool/devmode/devmode_txt/FileGETView'},
+   'name': u'GET',
+   'provided': {'module': 'zope.interface',
+                'name': 'Interface'},
+   'read_perm': None,
+   'required': [{'module': 'schooltool.devmode.devmode_txt',
+                 'name': 'IFile'},
+                {'module': 'zope.publisher.interfaces.http',
+                 'name': 'IHTTPRequest'}],
+   'type': 'zope.publisher.interfaces.http.IHTTPRequest',
+   'write_perm': None,
+   'zcml': None}
+
+If the factory has a template, it is also added to the documentation:
+
+  >>> class FauxTemplate(object):
+  ...     filename = './devmode_txt/template.pt'
+
+  >>> FileGETView.template = FauxTemplate()
+
+  >>> pprint(doc.getGETInfo())
+  {...
+   'factory': {'path': 'schooltool.devmode.devmode_txt.FileGETView',
+               'referencable': True,
+               'resource': None,
+               'template': './devmode_txt/template.pt',
+               'url': 'schooltool/devmode/devmode_txt/FileGETView'},
+   ...}
+
+Furthermore, if the factory has a checker associated with it, then we can even
+get some security information:
+
+  >>> from zope.security import checker
+  >>> FileGETView.checker = checker.Checker({'__call__': 'schooltool.SeeIt'})
+
+  >>> pprint(doc.getGETInfo())
+  {...
+   'read_perm': 'schooltool.SeeIt',
+   ...
+   'write_perm': u'n/a',
+   ...}
+
+
+`getPOSTInfo()`
+~~~~~~~~~~~~~~~
+
+The information for the 'POST' verb is very similar to that of the 'GET' view.
+We first have to create such an add view:
+
+  >>> class FilePOSTView(object):
+  ...    pass
+
+  # Often factories are wrapped:
+  >>> def POST(*args):
+  ...     return FilePOSTView(*args)
+  >>> POST.factory = FilePOSTView
+
+  >>> zope.component.provideAdapter(
+  ...     POST, (IFile, IHTTPRequest), zope.interface.Interface, 'POST')
+
+We are now ready to look up the view info:
+
+  >>> pprint(doc.getPOSTInfo())
+  {'doc': u'',
+   'factory': {'path': 'schooltool.devmode.devmode_txt.FilePOSTView',
+               'referencable': True,
+               'resource': None,
+               'template': None,
+               'url': 'schooltool/devmode/devmode_txt/FilePOSTView'},
+   'name': u'POST',
+   'provided': {'module': 'zope.interface',
+                'name': 'Interface'},
+   'read_perm': None,
+   'required': [{'module': 'schooltool.devmode.devmode_txt',
+                 'name': 'IFile'},
+                {'module': 'zope.publisher.interfaces.http',
+                 'name': 'IHTTPRequest'}],
+   'type': 'zope.publisher.interfaces.http.IHTTPRequest',
+   'write_perm': None,
+   'zcml': None}
+
+If the factory has a template, it is also added to the documentation:
+
+  >>> class FauxTemplate(object):
+  ...     filename = './devmode_txt/template.pt'
+
+  >>> FilePOSTView.template = FauxTemplate()
+
+  >>> pprint(doc.getPOSTInfo())
+  {...
+   'factory': {'path': 'schooltool.devmode.devmode_txt.FilePOSTView',
+               'referencable': True,
+               'resource': None,
+               'template': './devmode_txt/template.pt',
+               'url': 'schooltool/devmode/devmode_txt/FilePOSTView'},
+   ...}
+
+Furthermore, if the factory has a checker associated with it, then we can even
+get some security information:
+
+  >>> from zope.security import checker
+  >>> POST.checker = checker.Checker({'__call__': 'schooltool.SeeIt'})
+
+  >>> pprint(doc.getPOSTInfo())
+  {...
+   'read_perm': 'schooltool.SeeIt',
+   ...
+   'write_perm': u'n/a',
+   ...}
+
+Additionally, some POST views have a schema associated with them, so this is
+retrieved too, when available:
+
+  >>> FilePOSTView.schema = '<schema>More here</schema>'
+
+  >>> pprint(doc.getPOSTInfo())
+  {...
+   'schema': '<schema>More here</schema>',
+   ...}
+
+
+`getPUTInfo()`
+~~~~~~~~~~~~~~
+
+If a 'PUT' view is written from scratch, it is usally very similar to the ones
+previously covered verbs. We first have to create such an add view:
+
+  >>> class FilePUTView(object):
+  ...    pass
+
+  # Often factories are wrapped:
+  >>> def PUT(*args):
+  ...     return FilePUTView(*args)
+  >>> PUT.factory = FilePUTView
+
+  >>> zope.component.provideAdapter(
+  ...     PUT, (IFile, IHTTPRequest), zope.interface.Interface, 'PUT')
+
+We are now ready to look up the view info:
+
+  >>> pprint(doc.getPUTInfo())
+  {'doc': u'',
+   'factory': {'path': 'schooltool.devmode.devmode_txt.FilePUTView',
+               'referencable': True,
+               'resource': None,
+               'template': None,
+               'url': 'schooltool/devmode/devmode_txt/FilePUTView'},
+   'name': u'PUT',
+   'provided': {'module': 'zope.interface',
+                'name': 'Interface'},
+   'read_perm': None,
+   'required': [{'module': 'schooltool.devmode.devmode_txt',
+                 'name': 'IFile'},
+                {'module': 'zope.publisher.interfaces.http',
+                 'name': 'IHTTPRequest'}],
+   'schema': None,
+   'type': 'zope.publisher.interfaces.http.IHTTPRequest',
+   'write_perm': None,
+   'zcml': None}
+
+If the factory has a checker associated with it, then we can even
+get some security information:
+
+  >>> from zope.security import checker
+  >>> PUT.checker = checker.Checker({'PUT': 'schooltool.SeeIt'})
+
+  >>> pprint(doc.getPUTInfo())
+  {...
+   'read_perm': 'schooltool.SeeIt',
+   ...
+   'write_perm': u'n/a',
+   ...}
+
+Furthermore, PUT views usually have a schema associated with them, so this is
+retrieved too, when available:
+
+  >>> FilePUTView.schema = '<schema>More here</schema>'
+
+  >>> pprint(doc.getPUTInfo())
+  {...
+   'schema': '<schema>More here</schema>',
+   ...}
+
+However, retrieving the info for the 'PUT' verb is usually more complex, since
+it invokes several adapters that do the work. By default, there is a 'PUT'
+view registered for all objects that uses the `FileFactory` and `IWriteFile`
+adapters of the context to implement the PUT functionality:
+
+  >>> from zope.app.http import put
+
+  # Often factories are wrapped:
+  >>> def PUT(*args):
+  ...     return put.FilePUT(*args)
+  >>> PUT.factory = put.FilePUT
+
+  >>> zope.component.provideAdapter(
+  ...     PUT, (IFile, IHTTPRequest), zope.interface.Interface, 'PUT')
+
+Without any adapters registered, the result is pretty skimpy:
+
+  >>> pprint(doc.getPUTInfo())
+  {'doc': u'',
+   'factory': {'path': 'zope.app.http.put.FilePUT',
+               'referencable': True,
+               'resource': None,
+               'template': None,
+               'url': 'zope/app/http/put/FilePUT'},
+   'name': u'PUT',
+   'provided': {'module': 'zope.interface',
+                'name': 'Interface'},
+   'read_perm': None,
+   'required': [{'module': 'schooltool.devmode.devmode_txt',
+                 'name': 'IFile'},
+                {'module': 'zope.publisher.interfaces.http',
+                 'name': 'IHTTPRequest'}],
+   'schema': None,
+   'type': 'zope.publisher.interfaces.http.IHTTPRequest',
+   'write_perm': None,
+   'zcml': None}
+
+If we now register an `IWriteFile` adapter, an 'edit' section will be added to
+the dictionary:
+
+  >>> from zope.filerepresentation.interfaces import IWriteFile
+  >>> class FileWriteFile(object):
+  ...     zope.component.adapts(IFile)
+  ...     zope.interface.implements(IWriteFile)
+
+  >>> zope.component.provideAdapter(FileWriteFile)
+
+  >>> pprint(doc.getPUTInfo())
+  {...
+   'edit': {'doc': u'',
+            'factory': 'schooltool.devmode.devmode_txt.FileWriteFile',
+            'factory_url': 'schooltool/devmode/devmode_txt/FileWriteFile',
+            'name': u'',
+            'provided': {'module': 'zope.filerepresentation.interfaces',
+                         'name': 'IWriteFile'},
+            'required': [{'module': 'schooltool.devmode.devmode_txt',
+                          'name': 'IFile'}],
+            'zcml': None},
+   ...}
+
+Now, the `IFileFactory` adapter must be registered for the *container* of the
+`IFile` interface. We already defined the container interface to be
+`IFileContainer`.
+
+  >>> from zope.filerepresentation.interfaces import IFileFactory
+  >>> class FileFileFactory(object):
+  ...     zope.component.adapts(IFileContainer)
+  ...     zope.interface.implements(IFileFactory)
+
+  >>> def FactoryWrapper(*args):
+  ...     return FileFileFactory(*args)
+  >>> FactoryWrapper.factory = FileFileFactory
+
+  >>> zope.component.provideAdapter(
+  ...     FactoryWrapper, [IFileContainer], IFileFactory)
+
+In addition to the 'edit' section, we should now have a 'create' section:
+
+  >>> pprint(doc.getPUTInfo())
+  {'create': {'container': {'module': 'schooltool.devmode.devmode_txt',
+                            'name': 'IFileContainer'},
+              'doc': u'',
+              'factory': 'schooltool.devmode.devmode_txt.FileFileFactory',
+              'factory_url': 'schooltool/devmode/devmode_txt/FileFileFactory',
+              'name': u'',
+              'provided': {'module': 'zope.filerepresentation.interfaces',
+                           'name': 'IFileFactory'},
+              'required': [{'module': 'schooltool.devmode.devmode_txt',
+                            'name': 'IFileContainer'}],
+              'zcml': None},
+   ...
+   'schema': None,
+   ...}
+
+Since most file factories use schemas, it is also retrieved when available:
+
+  >>> FileFileFactory.schema = '<schema>More here</schema>'
+
+  >>> pprint(doc.getPUTInfo())
+  {'create': {'container': {'module': 'schooltool.devmode.devmode_txt',
+                            'name': 'IFileContainer'},
+              'doc': u'',
+              'factory': 'schooltool.devmode.devmode_txt.FileFileFactory',
+              'factory_url': 'schooltool/devmode/devmode_txt/FileFileFactory',
+              'name': u'',
+              'provided': {'module': 'zope.filerepresentation.interfaces',
+                           'name': 'IFileFactory'},
+              'required': [{'module': 'schooltool.devmode.devmode_txt',
+                            'name': 'IFileContainer'}],
+              'zcml': None},
+   ...
+   'schema': '<schema>More here</schema>',
+   ...}
+
+
+`getDELETEInfo()`
+~~~~~~~~~~~~~~~~~
+
+The 'DELETE' view gives you the basic view information:
+
+  >>> class FileDELETEView(object):
+  ...    pass
+
+  >>> zope.component.provideAdapter(
+  ...     FileDELETEView, (IFile, IHTTPRequest), zope.interface.Interface,
+  ...     'DELETE')
+
+  >>> pprint(doc.getDELETEInfo())
+  {'containers': [{'module': 'schooltool.devmode.devmode_txt',
+                   'name': 'IFileContainer'}],
+   'doc': u'',
+   'factory': {'path': 'schooltool.devmode.devmode_txt.FileDELETEView',
+               'referencable': True,
+               'resource': None,
+               'template': None,
+               'url': 'schooltool/devmode/devmode_txt/FileDELETEView'},
+   'name': u'DELETE',
+   'provided': {'module': 'zope.interface',
+                'name': 'Interface'},
+   'read_perm': None,
+   'required': [{'module': 'schooltool.devmode.devmode_txt',
+                 'name': 'IFile'},
+                {'module': 'zope.publisher.interfaces.http',
+                 'name': 'IHTTPRequest'}],
+   'type': 'zope.publisher.interfaces.http.IHTTPRequest',
+   'write_perm': None,
+   'zcml': None}
+
+As you can see, the info also lists the containers from which the delete view
+can be called. If we add a checker to the factory, then we even get some
+better permission information:
+
+  >>> FileDELETEView.checker = checker.Checker({'DELETE': 'schooltool.SeeIt'})
+
+  >>> pprint(doc.getDELETEInfo())
+  {...
+   'read_perm': 'schooltool.SeeIt',
+   ...
+   'write_perm': u'n/a',
+   ...}
+
+
+`getNameTraversers()`
+~~~~~~~~~~~~~~~~~~~~~
+
+We already looked at the `getNameTraversers()` function; this method simply
+creates an `info` dictionary for each name traverser registration.
+
+  >>> pprint(doc.getNameTraversers())
+  [{'component': {'path': 'schooltool.devmode.devmode_txt.File',
+                  'referencable': True,
+                  'url': 'schooltool/devmode/devmode_txt/File'},
+    'name': 'data',
+    'read_perm': None,
+    'write_perm': None,
+    'zcml': None}]
+
+This is the correct result for the `NullTraverser` we registered
+earlier. However, the method has to work much harder for an adapter traverser,
+so let's set one up:
+
+  >>> class IMetaData(zope.interface.Interface):
+  ...     pass
+
+  >>> class FileMetaData(object):
+  ...     zope.component.adapts(IFile)
+  ...     zope.interface.implements(IMetaData)
+
+  >>> zope.component.provideAdapter(FileMetaData)
+
+  >>> plugin = traverser.AdapterTraverserPlugin('metadata', IMetaData)
+  >>> zope.component.provideSubscriptionAdapter(
+  ...     plugin, (IFile, IHTTPRequest), interfaces.ITraverserPlugin)
+
+If we call the method again, we should see the new traverser:
+
+  >>> traversers = doc.getNameTraversers()
+  >>> traversers.sort()
+  >>> pprint(traversers[1])
+  {'component': {'path': 'schooltool.devmode.devmode_txt.FileMetaData',
+                 'referencable': True,
+                 'url': 'schooltool/devmode/devmode_txt/FileMetaData'},
+   'name': 'metadata',
+   'read_perm': None,
+   'write_perm': None,
+   'zcml': None}
+
+In case you write your totally custom name traverser, just make sure that it
+has a `component` attribute that returns the class:
+
+  >>> class FileHistory(object):
+  ...     pass
+
+  >>> class FileHistoryTraverser(object):
+  ...     traversalName = 'history'
+  ...     component = FileHistory
+
+  >>> zope.component.provideSubscriptionAdapter(
+  ...     FileHistoryTraverser, (IFile, IHTTPRequest),
+  ...     interfaces.ITraverserPlugin)
+
+  >>> traversers = doc.getNameTraversers()
+  >>> traversers.sort()
+  >>> pprint(traversers[1])
+  {'component': {'path': 'schooltool.devmode.devmode_txt.FileHistory',
+                 'referencable': True,
+                 'url': 'schooltool/devmode/devmode_txt/FileHistory'},
+   'name': 'history',
+   'read_perm': None,
+   'write_perm': None,
+   'zcml': None}


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/restdoc.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/restdoc_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/restdoc_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/restdoc_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,80 @@
+<tal:block i18n:domain="schooltool">
+<metal:block define-macro="zcml">
+
+  <div tal:define="zcml info/zcml"
+       tal:condition="zcml">
+    <i i18n:translate="">Registered at:</i>
+    <metal:block use-macro="context/@@interface_macros/zcml" />
+  </div>
+
+</metal:block>
+
+<metal:block define-macro="factory">
+
+  <div tal:condition="info/factory/path">
+    <i i18n:translate="">Factory path:</i>
+    <a href=""
+       tal:condition="info/factory/referencable"
+       tal:attributes="href
+           string:$rootURL/Code/${info/factory/url}/index.html"
+       tal:content="info/factory/path" />
+    <span
+       tal:condition="not:info/factory/referencable"
+       tal:content="info/factory/path" />
+  </div>
+
+</metal:block>
+
+<metal:block define-macro="adapter-factory">
+
+  <div tal:condition="info/factory">
+    <i i18n:translate="">Factory path:</i>
+    <a href=""
+       tal:attributes="href
+           string:$rootURL/Code/${info/factory_url}/index.html"
+       tal:content="info/factory" />
+  </div>
+
+</metal:block>
+
+<metal:block define-macro="template">
+
+  <div tal:condition="info/factory/template">
+    <i i18n:translate="">Template:</i>
+    <span tal:replace="info/factory/template" />
+  </div>
+
+</metal:block>
+
+<metal:block define-macro="permission">
+
+  <div tal:condition="info/read_perm|nothing">
+    <i i18n:translate="">Permission:</i>
+    <span tal:replace="info/read_perm" i18n:translate="">zope.View</span>
+  </div>
+
+</metal:block>
+
+<metal:block define-macro="schema">
+
+  <div tal:condition="info/schema|nothing">
+    <i><b i18n:translate="">Schema:</b></i>
+    <div class="indent">
+      <pre style="font-size: 100%; margin: 0" tal:content="info/schema" />
+    </div>
+  </div>
+
+</metal:block>
+
+<metal:block define-macro="container">
+
+  <div tal:condition="info">
+    <i i18n:translate="">Container:</i>
+    <a href=""
+       tal:attributes="href
+           string:$rootURL/Interface/${info/module}.${info/name}/index.html"
+       tal:content="string:${info/module}.${info/name}" />
+  </div>
+
+</metal:block>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/restdoc_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/restmenu.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/restmenu.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/restmenu.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,21 @@
+<html metal:use-macro="views/apidoc_macros/menu"
+    i18n:domain="zope">
+<body>
+
+  <div metal:fill-slot="menu" class="small">
+
+    <div>Available Content Classes</div>
+
+    <div tal:define="classes view/listContentClasses">
+        <a href="" target="main"
+           tal:repeat="info classes"
+           tal:attributes="href info/url"
+           tal:content="info/path">
+          /zope/app/Application
+        </a>
+    </div>
+
+  </div>
+
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/restmenu.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/skin.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/skin.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/skin.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,45 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolBell skin.
+
+$Id: skin.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+from zope.publisher.browser import applySkin
+from zope.publisher.interfaces.browser import IBrowserRequest
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.skin import ISchoolToolSkin
+
+class IDevModeLayer(IBrowserRequest):
+    """SchoolBell devmode layer."""
+
+
+class ISchoolToolDevModeSkin(IDevModeLayer, ISchoolToolSkin):
+    """The SchoolBell devmode skin"""
+
+
+def schoolToolTraverseSubscriber(event):
+    """A subscriber to BeforeTraverseEvent.
+
+    Sets the SchoolBell skin if the object traversed is a SchoolBell
+    application instance.
+    """
+    if (ISchoolToolApplication.providedBy(event.object) and
+        IBrowserRequest.providedBy(event.request)):
+        applySkin(event.request, ISchoolToolDevModeSkin)


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/skin.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/switch.js
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/switch.js	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/switch.js	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,56 @@
+function switchDisplay(id) {
+
+    if(document.getElementById) {
+       // DOM
+       var element = document.getElementById(id);
+    } else {
+        if(document.all) {
+            // Proprietary DOM
+            var element = document.all[id];
+        } else {
+            // Create an object to prevent errors further on
+            var element = new Object();
+        }
+    }
+
+    if(!element) {
+        /* The page has not loaded or the browser claims to support
+        document.getElementById or document.all but cannot actually
+        use either */
+        return;
+    }
+
+    // Reference the style ...
+    if (element.style) { 
+        style = element.style;
+    }
+
+    if (typeof(style.display) == 'undefined' &&
+        !( window.ScriptEngine && ScriptEngine().indexOf('InScript') + 1 ) ) {
+        //The browser does not allow us to change the display style
+        //Alert something sensible (not what I have here ...)
+        window.alert( 'Your browser does not support this' );
+        return;
+    }
+
+    // Change the display style
+    if (style.display == 'none') {
+        style.display = '';
+        switchImage(id, 'varrow.png'); 
+   }
+    else {
+        style.display = 'none'
+        switchImage(id, 'harrow.png'); 
+    }
+}
+
+function switchImage(id, name) {
+    if(document.getElementById) {
+       // DOM
+       var element = document.getElementById(id+'.arrow');
+    } else {
+       // Proprietary DOM
+       var element = document.all[id+'.arrow'];
+    }
+    element.src = '/@@/'+name;
+}
\ No newline at end of file

Added: schooltool/branches/upstream/current/src/schooltool/devmode/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/devmode/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/devmode/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Devmode-related Browser View Tests
+
+$Id: tests.py 5669 2006-01-20 19:58:16Z mg $
+"""
+import unittest
+from zope.testing import doctest, doctestunit, module
+from schooltool.app.browser import testing
+
+def setUp(test):
+    testing.setUp(test)
+    module.setUp(test, 'schooltool.devmode.devmode_txt')
+
+def test_suite():
+    return unittest.TestSuite((
+        doctest.DocFileSuite(
+            'restdoc.txt',
+            setUp=setUp, tearDown=testing.tearDown,
+            globs={'pprint': doctestunit.pprint},
+            optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/devmode/varrow.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/devmode/varrow.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/generations/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,30 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Generations for database version upgrades.
+
+$Id: __init__.py 6852 2007-04-13 12:10:00Z ignas $
+"""
+
+from zope.app.generations.generations import SchemaManager
+
+schemaManager = SchemaManager(
+    minimum_generation=23,
+    generation=23,
+    package_name='schooltool.generations')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve1.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve1.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve1.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,51 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 1.
+
+The first incompatible change from generation 0 was introduced in rev 4128.
+
+$Id: evolve1.py 4822 2005-08-19 01:35:11Z srichter $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from persistent.dict import PersistentDict
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.timetable.interfaces import ITimetableModel
+
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        for schema in app['ttschemas'].values():
+            if ITimetableModel.providedBy(schema.model):
+                if not hasattr(schema.model, 'exceptionDays'):
+                    schema.model.exceptionDays = PersistentDict()
+                if not hasattr(schema.model, 'exceptionDayIds'):
+                    schema.model.exceptionDayIds = PersistentDict()
+        for object in (list(app['persons'].values()) +
+                       list(app['groups'].values()) +
+                       list(app['resources'].values())):
+            for timetable in object.timetables.values():
+                if ITimetableModel.providedBy(timetable.model):
+                    if not hasattr(timetable.model, 'exceptionDays'):
+                        timetable.model.exceptionDays = PersistentDict()
+                    if not hasattr(timetable.model, 'exceptionDayIds'):
+                        timetable.model.exceptionDayIds = PersistentDict()


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve1.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve10.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve10.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve10.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,50 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 10.
+
+Put a timezone attribute on all timetables and school timetables.
+Take the timezone out of the schoolwide setting.
+
+$Id: evolve10.py 6311 2006-06-23 15:12:55Z ignas $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.timetable.interfaces import IHaveTimetables
+from schooltool.timetable import TimetablesAdapter
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        tz = IApplicationPreferences(app).timezone
+
+        for tts in app['ttschemas'].values():
+            tts.timezone = tz
+
+        for tt in TimetablesAdapter(app).timetables.values():
+            tt.timezone = tz
+
+        for obj in findObjectsProviding(root, IHaveTimetables):
+            for tt in TimetablesAdapter(obj).timetables.values():
+                tt.timezone = tz


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve10.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve11.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve11.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve11.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,39 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 11.
+
+Introduce new permission schooltool.viewAttendance and roles for groups
+(teachers, administrators, etc).
+
+$Id: evolve11.py 6208 2006-06-08 12:24:19Z faassen $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.securitypolicy.interfaces import IPrincipalPermissionManager
+from zope.app.securitypolicy.interfaces import IPrincipalRoleManager
+
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+def evolve(context):
+    # this used to evolve role and permission settings but this has
+    # become obsolete after the new security policy was put into place
+    return


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve11.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve12.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve12.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve12.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 12.
+
+Introduce new permission schooltool.viewAttendance and roles for groups
+(teachers, administrators, etc).
+
+$Id: evolve12.py 6331 2006-06-28 11:09:43Z ignas $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from zope.annotation.interfaces import IAnnotations
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.attendance.interfaces import IUnresolvedAbsenceCache
+from schooltool.attendance.interfaces import IHomeroomAttendance
+from schooltool.attendance.interfaces import ISectionAttendance
+
+
+AbsenceCacheKey = 'schooltool.attendance.absencecache'
+
+
+class NullAbsenceCache(object):
+    def add(self, student, record):
+        pass
+
+
+def getUnresolvedAbsenceCache(app):
+    """Extract the absence cache from the application.
+
+    Internally the cache is stored as an annotation on the administrators'
+    group.
+    """
+    admin = app['groups']['administrators']
+    annotations = IAnnotations(admin)
+    if AbsenceCacheKey not in annotations:
+        return NullAbsenceCache()
+    return annotations[AbsenceCacheKey]
+
+SECTION_ATTENDANCE_KEY = 'schooltool.attendance.SectionAttendance'
+HOMEROOM_ATTENDANCE_KEY = 'schooltool.attendance.HomeroomAttendance'
+
+def getRecords(obj, key):
+    annotations = IAnnotations(obj)
+    attendance = annotations.get(key, [])
+    return attendance and list(attendance._records)
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        cache = getUnresolvedAbsenceCache(app)
+        for student in app['persons'].values():
+            annotations = IAnnotations(student)
+            homeroom_records = getRecords(student, HOMEROOM_ATTENDANCE_KEY)
+            section_records = getRecords(student, SECTION_ATTENDANCE_KEY)
+            for record in homeroom_records + section_records:
+                if ((record.isAbsent() or record.isTardy()) and
+                    not record.isExplained()):
+                    cache.add(student, record)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve12.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve13.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve13.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve13.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,28 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 13.
+
+$Id: evolve13.py 5946 2006-04-18 15:47:33Z ignas $
+"""
+
+def evolve(context):
+    # don't do anything anymore, but leave it in here since people may
+    # already have evolved to it
+    pass


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve13.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve14.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve14.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve14.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,93 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 14.
+
+Use schooltool.demographics.person.Person instead of
+schooltool.person.person.Person
+
+$Id: evolve13.py 5946 2006-04-18 15:47:33Z ignas $
+"""
+from BTrees.OOBTree import OOBTree
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from zope.location import locate, ILocation
+from zope.annotation.interfaces import IAnnotations
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.demographics.person import Person
+
+DEPENDABLE_KEY = 'zope.app.dependable.Dependents'
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        persons = app['persons']
+        for name, person in persons.items():
+            # wipe out dependency information temporarily
+            ann = IAnnotations(person, None)
+            if ann is not None:
+                dependents = ann.get(DEPENDABLE_KEY)
+            else:
+                dependents = None
+            if dependents is not None:
+                IAnnotations(person)[DEPENDABLE_KEY] = ()
+            # remove all relationships of this person to reestablish them
+            # later
+            related = list(person.groups)
+            for relation in related:
+                person.groups.remove(relation)
+            # also remove all overlaid calendars to reestablish them later
+            # XXX horrible way to remove calendars; due to some magic
+            # in the calendar overlays just removing the items we
+            # get when we do list(persons.overlaid_calendar) doesn't work
+            cal_infos = list(person.overlaid_calendars)
+            for cal_info in cal_infos:
+                person.overlaid_calendars.remove(cal_info.calendar)
+            new_person = Person(person.username, person.title)
+            new_person.photo = person.photo
+            new_person._hashed_password = person._hashed_password
+
+            # We create a new __annotations__ dict as it gets modified
+            # by del persons[name] (a new schooltool calendar is
+            # created on access just to get cleared by the event
+            # subscriber). So sharing the same annotation OOBTree
+            # might lead to various weird bugs.
+            new_person.__annotations__ = OOBTree()
+            for key, annotation in list(person.__annotations__.items()):
+                new_person.__annotations__[key] = annotation
+                # we don't want annotations affected by actions
+                # performed with the old person object
+                del person.__annotations__[key]
+                if (hasattr(annotation, '__parent__') and
+                    annotation.__parent__ is person):
+                    annotation.__parent__ = new_person
+
+            del persons[name]
+            persons[name] = new_person
+            # reestablish dependents if they are available
+            if dependents is not None:
+                IAnnotations(new_person)[DEPENDABLE_KEY] = dependents
+            # reestablish relationships
+            for relation in related:
+                new_person.groups.add(relation)
+            for cal_info in cal_infos:
+                new_person.overlaid_calendars.add(cal_info.calendar)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve14.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve15.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve15.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve15.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,49 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 15.
+
+Get rid of all local grants.
+
+$Id: evolve15.py 6188 2006-06-08 08:50:51Z vidas $
+"""
+
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+from zope.annotation.interfaces import IAnnotations
+from zope.annotation.interfaces import IAnnotatable
+
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+def removeLocalGrants(obj):
+    annotations = IAnnotations(obj)
+    perm_key = 'zopel.app.security.AnnotationPrincipalPermissionManager'
+    if annotations.has_key(perm_key):
+        del annotations[perm_key]
+    role_key = 'zope.app.security.AnnotationPrincipalRoleManager'
+    if annotations.has_key(role_key):
+        del annotations[role_key]
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        for obj in findObjectsProviding(app, IAnnotatable):
+            removeLocalGrants(obj)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve15.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve16.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve16.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve16.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,45 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 16.
+
+Update manager permissions.
+
+$Id: evolve16.py 6212 2006-06-08 13:01:04Z vidas $
+"""
+
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+from zope.annotation.interfaces import IAnnotations
+from zope.annotation.interfaces import IAnnotatable
+
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+MANAGER_USERNAME = 'manager'
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        manager = app['persons'].get('manager')
+        manager_group = app['groups']['manager']
+        if manager and manager not in manager_group.members:
+                manager_group.members.add(manager)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve16.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve17.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve17.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve17.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,62 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 17.
+
+Install catalog and reindex persons.
+
+$Id: evolve17.py 6212 2006-06-08 13:01:04Z vidas $
+"""
+
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.catalog import Catalog
+from zope.app.component.hooks import setSite
+from zope.app.intid import addIntIdSubscriber
+from zope.app.catalog.text import TextIndex
+from zope.app.catalog.field import FieldIndex
+from zope.app.intid.interfaces import IIntIds
+from zope.app.intid import IntIds
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.utility.utility import setUpUtilities
+from schooltool.utility.utility import UtilitySpecification
+from schooltool.demographics.interfaces import ISearch
+
+
+def catalogSetUp(catalog):
+    catalog['fulltext'] = TextIndex('fulltext', ISearch)
+    catalog['parentName'] = TextIndex('parentName', ISearch)
+    catalog['studentId'] = FieldIndex('studentId', ISearch)
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        # install the utilities
+        setSite(app)
+        setUpUtilities(app, [UtilitySpecification(IntIds, IIntIds),
+                             UtilitySpecification(Catalog, ICatalog,
+                                                  'demographics_catalog',
+                                                  setUp=catalogSetUp)])
+        # catalog all persons
+        for person in app['persons'].values():
+            person.nameinfo.last_name = 'Last name unknown'
+            addIntIdSubscriber(person, None)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve17.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve18.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve18.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve18.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,38 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 18.
+
+Install catalog and reindex persons.
+
+$Id: evolve18.py 6394 2006-08-18 17:21:29Z ignas $
+"""
+
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+from zope.traversing.interfaces import IContainmentRoot
+from zope.interface import directlyProvidedBy
+from zope.interface import directlyProvides
+
+from schooltool.app.interfaces import ISchoolToolApplication
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        directlyProvides(app, directlyProvidedBy(app) - IContainmentRoot)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve18.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve19.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve19.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve19.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,46 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 19.
+
+Install catalog and reindex persons.
+
+$Id: evolve19.py 6487 2006-11-16 15:06:30Z ignas $
+"""
+
+import base64
+
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+
+from schooltool.app.interfaces import IHaveCalendar
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for obj in findObjectsProviding(root, IHaveCalendar):
+        if not hasattr(obj, '__annotations__'):
+            continue
+        calendar = obj.__annotations__.get('schooltool.app.calendar.Calendar',
+                                           None)
+
+        if not calendar:
+            continue
+
+        for event in calendar:
+            event.__name__ = base64.encodestring(event.unique_id).replace('\n', '')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve19.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve2.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve2.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve2.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,39 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 1.
+
+The first incompatible change from generation 0 was introduced in rev 4128.
+
+$Id: evolve2.py 4822 2005-08-19 01:35:11Z srichter $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.cal import Calendar
+from schooltool.timetable import TimetableDict
+
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        app.calendar = Calendar(app)
+        app.timetables = TimetableDict()
+        app.timetables.__parent__ = app


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve2.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve20.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve20.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve20.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 20.
+
+Remove local IPersonFactory utility.
+
+$Id: evolve20.py 6510 2006-11-30 16:35:29Z ignas $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.component.hooks import setSite
+from zope.app import zapi
+from zope.component import queryUtility
+from zope.app.container.interfaces import IContained
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.person.interfaces import IPersonFactory
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        setSite(app)
+        manager = app.getSiteManager()
+        default = zapi.traverse(app, '++etc++site/default')
+
+        local_utility = queryUtility(IPersonFactory, default=None)
+        if (local_utility is not None and
+            IContained.providedBy(local_utility) and
+            local_utility.__parent__ is default):
+            name = local_utility.__name__
+            manager.unregisterUtility(local_utility, IPersonFactory)
+            del default[name]
+        setSite(None)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve20.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve21.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve21.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve21.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,48 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 21.
+
+Remove local IPersonFactory utility.
+
+$Id: evolve21.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+
+import zope.event
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        for section in app['sections'].values():
+            from zope.annotation.interfaces import IAnnotations
+            annotations = IAnnotations(section)
+            timetables = annotations.get('schooltool.timetable.timetables')
+            if timetables:
+                for key, timetable in timetables.items():
+                    from schooltool.timetable import TimetableReplacedEvent
+                    event = TimetableReplacedEvent(section,
+                                                   key,
+                                                   old_timetable=None,
+                                                   new_timetable=timetable)
+                    zope.event.notify(event)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve21.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve22.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve22.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve22.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,59 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 22.
+
+Install catalog  for groups and reindex them.
+
+$Id: evolve22.py 6854 2007-04-13 14:50:33Z ignas $
+"""
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.catalog import Catalog
+from zope.app.component.hooks import setSite
+from zope.app.intid import addIntIdSubscriber
+from zope.app.intid.interfaces import IIntIds
+from zope.app.intid import IntIds
+
+from zc.catalog.catalogindex import ValueIndex
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.utility.utility import setUpUtilities
+from schooltool.utility.utility import UtilitySpecification
+from schooltool.group.interfaces import IGroup
+
+
+def catalogSetUp(catalog):
+    catalog['__name__'] = ValueIndex('__name__', IGroup)
+    catalog['title'] = ValueIndex('title', IGroup)
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        # install the utilities
+        setSite(app)
+        setUpUtilities(app, [UtilitySpecification(IntIds, IIntIds),
+                             UtilitySpecification(Catalog, ICatalog,
+                                                  'schooltool.group',
+                                                  setUp=catalogSetUp)])
+        # catalog all groups
+        for group in app['groups'].values():
+            addIntIdSubscriber(group, None)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve22.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve23.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve23.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve23.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,56 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 23.
+
+Install catalog for persons and reindex them.
+
+$Id: evolve23.py 6852 2007-04-13 12:10:00Z ignas $
+"""
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.catalog import Catalog
+from zope.app.component.hooks import setSite
+from zope.app.intid import addIntIdSubscriber
+
+from zc.catalog.catalogindex import ValueIndex
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.utility.utility import setUpUtilities
+from schooltool.utility.utility import UtilitySpecification
+from schooltool.person.interfaces import IPerson
+
+
+def catalogSetUp(catalog):
+    catalog['__name__'] = ValueIndex('__name__', IPerson)
+    catalog['title'] = ValueIndex('title', IPerson)
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        # install the utilities
+        setSite(app)
+        setUpUtilities(app, [UtilitySpecification(Catalog, ICatalog,
+                                                  'schooltool.person',
+                                                  setUp=catalogSetUp)])
+        # catalog all persons
+        for person in app['persons'].values():
+            addIntIdSubscriber(person, None)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve23.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve3.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve3.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve3.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,56 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 3.
+
+evolve2.py creates a site calendar, but the default permissions prevent
+unknown visitors from seeing it.
+
+$Id: evolve3.py 4860 2005-08-25 01:55:16Z srichter $
+"""
+
+from zope.app import zapi
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.security.interfaces import IUnauthenticatedGroup
+from zope.app.securitypolicy.interfaces import IPrincipalPermissionManager
+from schooltool.app.interfaces import ISchoolToolApplication
+
+def evolve(context):
+    """Set the site security policy to the SchoolTool 0.11 defaults.
+
+    See schooltool.app.applicationCalendarPermissionsSubscriber for details.
+    """
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        unauthenticated = zapi.queryUtility(IUnauthenticatedGroup)
+
+        app_perms = IPrincipalPermissionManager(app)
+        app_perms.grantPermissionToPrincipal(
+            'schooltool.view', unauthenticated.id)
+        app_perms.grantPermissionToPrincipal(
+            'schooltool.viewCalendar', unauthenticated.id)
+
+        containers = ['persons', 'groups', 'resources', 'sections', 'courses']
+        for container in containers:
+            container_perms = IPrincipalPermissionManager(app[container])
+            container_perms.denyPermissionToPrincipal(
+                    'schooltool.view', unauthenticated.id)
+            container_perms.denyPermissionToPrincipal(
+                    'schooltool.viewCalendar', unauthenticated.id)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve3.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve4.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve4.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve4.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,44 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 4.
+
+This generation ensures that all schooltool applications have a levels folder
+and a manager group.
+
+$Id: evolve4.py 6233 2006-06-12 17:52:59Z ignas $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from schooltool.app.interfaces import ISchoolToolApplication
+
+import schooltool.app
+import schooltool.level.level
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        if 'levels' not in app:
+            app['levels'] = schooltool.level.level.LevelContainer()
+
+        if 'manager' not in app['groups']:
+            app['groups']['manager'] = schooltool.app.Group(
+                u'Manager', u'Manager Group.')
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve4.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve5.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve5.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve5.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,123 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 5.
+
+This generation converts all the old class paths to their new ones.
+
+1. Make sure that all content components have been loaded at least once,
+   so that their class reference is changed to the new one.
+
+2. Fix up all annotation references. This is tough, because we have to
+   find all objects that provide IAnnotatable.
+
+   List of annotatable objects in SchoolTool:
+
+   - (all primary content components)
+   - schooltool.app.app.SchoolToolApplication
+   - schooltool.app.cal.CalendarEvent
+   - schooltool.app.cal.Calendar
+
+3. Convert old attributes 'calendar' and 'timetables' to annotations.
+
+4. Update references to objects that were in packages previously located in
+   schoolbell, but are now in schooltool. Examples are `relationship` and
+   `calendar`.
+
+$Id: evolve5.py 6312 2006-06-23 15:14:09Z ignas $
+"""
+from zope.app.securitypolicy.securitymap import PersistentSecurityMap
+
+from schooltool.timetable import TIMETABLES_KEY
+from schooltool.timetable.interfaces import IHaveTimetables
+from schooltool.app.cal import CALENDAR_KEY
+from schooltool.app.interfaces import IHaveCalendar
+
+
+def fixAnnotations(obj):
+    if not hasattr(obj, '__annotations__'):
+        return
+    items = list(obj.__annotations__.items())
+    for key, data in items:
+        old_key = 'schoolbell'
+        if key.startswith(old_key):
+            obj.__annotations__['schooltool'+key[len(old_key):]] = data
+            del obj.__annotations__[key]
+
+
+def fixCalendar(obj):
+    if IHaveCalendar.providedBy(obj):
+        if hasattr(obj, 'calendar'):
+            calendar = obj.calendar
+            fixAnnotations(calendar)
+            for event in calendar:
+                fixAnnotations(event)
+            obj.__annotations__[CALENDAR_KEY] = calendar
+            del obj.calendar
+
+
+def fixTimetables(obj):
+    if IHaveTimetables.providedBy(obj):
+        if hasattr(obj, 'timetables'):
+            obj.__annotations__[TIMETABLES_KEY] = obj.timetables
+            del obj.timetables
+
+
+def fixOverlaidCalendars(obj):
+    if hasattr(obj, 'overlaid_calendars') and \
+           hasattr(obj.overlaid_calendars, 'show_timetables'):
+        show_timetables = obj.overlaid_calendars.show_timetables
+        IShowTimetables(obj.overlaid_calendars).showTimetables = show_timetables
+        del obj.overlaid_calendars.show_timetables
+
+
+def fixPermissionMap(obj):
+    if isinstance(obj, PersistentSecurityMap):
+        for pkey, data in obj._byrow.items():
+            if pkey.startswith('schoolbell'):
+                obj._byrow['schooltool' + pkey[10:]] = data
+                del obj._byrow[pkey]
+
+        for key, data in obj._bycol.items():
+            for pkey, pdata in data.items():
+                if pkey.startswith('schoolbell'):
+                    obj._bycol[key]['schooltool' + pkey[10:]] = pdata
+                    del obj._bycol[key][pkey]
+
+
+def evolve(context):
+    storage = context.connection._storage
+    next_oid = None
+    while True:
+        oid, tid, data, next_oid = storage.record_iternext(next_oid)
+        obj = context.connection.get(oid)
+        # Make sure that we tell all objects that they have been changed. Who
+        # cares whether it is true! :-)
+        obj._p_activate()
+        obj._p_changed = True
+
+        # Now fix up other things
+        fixAnnotations(obj)
+        fixCalendar(obj)
+        fixTimetables(obj)
+        fixOverlaidCalendars(obj)
+        fixPermissionMap(obj)
+
+        if next_oid is None:
+            break


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve5.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve6.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve6.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve6.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,39 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 6.
+
+Cleanup for http://issues.schooltool.org/issue369: remove stale
+calendar subscription relationships.
+
+$Id: evolve6.py 5054 2005-09-22 14:28:53Z ignas $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.person.interfaces import IPerson
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for person in findObjectsProviding(root, IPerson):
+        for calendar_info in list(person.overlaid_calendars):
+            if calendar_info.calendar.__parent__.__parent__ is None:
+                person.overlaid_calendars.remove(calendar_info.calendar)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve6.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve7.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve7.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve7.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,41 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 7.
+
+Change the format of exceptionDays on timetable models.
+
+$Id: evolve7.py 5268 2005-10-14 19:15:43Z alga $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.timetable.interfaces import ITimetableSchema
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for schema in findObjectsProviding(root, ITimetableSchema):
+        model = schema.model
+        for date, exception in model.exceptionDays.items():
+            periods = []
+            for slot in exception:
+                periods.append((slot.title, slot))
+            model.exceptionDays[date] = periods


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve7.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve8.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve8.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve8.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,53 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 8.
+
+Change the format of exceptionDays on timetable models.
+
+$Id: evolve8.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.dependable.interfaces import IDependable
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.group.group import Group
+
+
+def evolve(context):
+    default_groups =  [
+        ("manager",        "Site Managers",         "Manager Group."),
+        ("students",       "Students",              "Students."),
+        ("teachers",       "Teachers",              "Teachers."),
+        ("clerks",         "Clerks",                "Clerks."),
+        ("administrators", "School Administrators", "School Administrators."),
+    ]
+
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        group_container = app['groups']
+        for name, title, description in default_groups:
+            try:
+                group = group_container[name]
+            except KeyError:
+                group = Group(title, description)
+                group_container[name] = group
+            IDependable(group).addDependent("")


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve8.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/evolve9.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/evolve9.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/evolve9.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,41 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade SchoolTool to generation 9.
+
+Book section locations using relationships.
+
+$Id: evolve9.py 6311 2006-06-23 15:12:55Z ignas $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+def evolve(context):
+    root = context.connection.root()[ZopePublication.root_name]
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        section_container = app['sections']
+        for section in section_container.values():
+            location = getattr(section, 'location', None)
+            if location:
+                section.resources.add(location)
+                del section.location


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/evolve9.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,30 @@
+"""
+Tests for generation scripts.
+
+$Id: __init__.py 5054 2005-09-22 14:28:53Z ignas $
+"""
+
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.folder.folder import rootFolder
+
+
+class ContextStub(object):
+    """Stub for the context argument passed to evolve scripts.
+
+        >>> from zope.app.zopeappgenerations import getRootFolder
+        >>> context = ContextStub()
+        >>> getRootFolder(context) is context.root_folder
+        True
+
+    """
+
+    class ConnectionStub(object):
+        def __init__(self, root_folder):
+            self.root_folder = root_folder
+        def root(self):
+            return {ZopePublication.root_name: self.root_folder}
+
+    def __init__(self):
+        self.root_folder = rootFolder()
+        self.connection = self.ConnectionStub(self.root_folder)


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve1.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve1.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve1.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,159 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve1
+
+$Id: test_evolve1.py 5142 2005-10-01 10:25:55Z mg $
+"""
+
+import unittest
+
+from BTrees.OOBTree import OOBTree
+from zope.testing import doctest
+from zope.interface import implements
+from zope.app.publication.zopepublication import ZopePublication
+
+
+def doctest_evolve1():
+    """Evolution to generation 1.
+
+    The first change in this evolution was the introduction of
+    exceptionDays and exceptionDayIds attributes on the
+    ITimetableModel implementations.  Their factories are registered
+    as global utilities, and their instances are saved as a model
+    attribute on ITimetableSchemas and, consequently, on timetables.
+
+    Let's create some mock objects that demonstrates the current
+    situation:
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.timetable.interfaces import ITimetableModel
+        >>> class MockSchoolTool(dict):
+        ...     implements(ISchoolToolApplication)
+
+        >>> class MockTimetable:
+        ...     model = None
+
+        >>> class MockTimetableModel:
+        ...     implements(ITimetableModel)
+
+        >>> class MockPerson:
+        ...     timetables = {}
+
+    Let's say we have a schooltool object with two timetable schemas:
+
+        >>> app = MockSchoolTool()
+        >>> app['ttschemas'] = {}
+        >>> app['persons'] = OOBTree()
+        >>> app['groups'] = {}
+        >>> app['resources'] = {}
+        >>> app['ttschemas']["weekly"] = MockTimetable()
+        >>> app['ttschemas']["sequential"] = MockTimetable()
+        >>> app['ttschemas']["weekly"].model = MockTimetableModel()
+        >>> app['ttschemas']["sequential"].model = MockTimetableModel()
+        >>> model1 = app['ttschemas']["weekly"].model
+        >>> model2 = app['ttschemas']["sequential"].model
+
+    Also, there are some timetables utilizing these schemas:
+
+        >>> app['persons']['albertas'] = MockPerson()
+        >>> tts = app['persons']['albertas'].timetables
+        >>> tts['2005.sequential'] = MockTimetable()
+        >>> tts['2005.sequential'].model = model2
+
+        >>> app['groups']['haxors'] = MockPerson()
+        >>> tts = app['groups']['haxors'].timetables
+        >>> tts['2005.weekly'] = MockTimetable()
+        >>> tts['2005.weekly'].model = MockTimetableModel()
+        >>> model4 = tts['2005.weekly'].model
+        >>> model4.exceptionDayIds = {'foo': 'bar'}
+        >>> model4.exceptionDays = {'do not': 'touch'}
+
+    Also, strangely, there are timetables that use other schemas/models:
+
+        >>> app['resources']['beamer'] = MockPerson()
+        >>> tts = app['resources']['beamer'].timetables
+        >>> tts['2005.bizarre'] = MockTimetable()
+        >>> tts['2005.bizarre'].model = MockTimetableModel()
+        >>> model3 = tts['2005.bizarre'].model
+
+    Now, let's feed this app to the evolve script:
+
+        >>> class MockContext:
+        ...     pass
+        >>> class MockConnection:
+        ...     _root = {}
+        ...     def root(self):
+        ...         return self._root
+
+        >>> context = MockContext()
+        >>> context.connection = conn = MockConnection()
+        >>> conn._root[ZopePublication.root_name] = {'app': app}
+
+    Let's run the evolve script on this whole thing:
+
+        >>> from schooltool.generations.evolve1 import evolve
+        >>> evolve(context)
+
+    Now all models we created must have exceptionDays and
+    exceptionDayIds attributes, which should be empty PersistentDicts.
+
+        >>> model1.exceptionDayIds
+        <persistent.dict.PersistentDict ...>
+        >>> model2.exceptionDayIds
+        <persistent.dict.PersistentDict ...>
+        >>> model3.exceptionDayIds
+        <persistent.dict.PersistentDict ...>
+        >>> model1.exceptionDays
+        <persistent.dict.PersistentDict ...>
+        >>> model2.exceptionDays
+        <persistent.dict.PersistentDict ...>
+        >>> model3.exceptionDays
+        <persistent.dict.PersistentDict ...>
+
+        >>> list(model1.exceptionDayIds)
+        []
+        >>> list(model2.exceptionDayIds)
+        []
+        >>> list(model3.exceptionDayIds)
+        []
+        >>> list(model1.exceptionDays)
+        []
+        >>> list(model2.exceptionDays)
+        []
+        >>> list(model3.exceptionDays)
+        []
+
+    Models that already had those attributes should not have been modified:
+
+        >>> model4.exceptionDays
+        {'do not': 'touch'}
+        >>> model4.exceptionDayIds
+        {'foo': 'bar'}
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve1.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve10.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve10.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve10.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,119 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve10
+
+$Id: test_evolve10.py 6205 2006-06-08 12:11:00Z ignas $
+"""
+
+import unittest
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.app.container.btree import BTreeContainer
+from zope.interface import implements
+
+from schooltool.app import membership
+from schooltool.course.section import Section
+from schooltool.generations.tests import ContextStub
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def doctest_evolve10():
+    """Evolution to generation 10.
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> from schooltool.timetable.interfaces import ITimetables
+        >>> from schooltool.timetable.interfaces import IHaveTimetables
+
+        >>> class TimetableStub:
+        ...     pass
+
+        >>> from zope.annotation.interfaces import IAnnotations
+        >>> from schooltool.timetable import TIMETABLES_KEY
+        >>> class TimetabledStub(object):
+        ...     implements(IHaveTimetables)
+        ...     def __init__(self, name=None):
+        ...        timetables = {'foo.bar': TimetableStub(),
+        ...                       'baz.quux': TimetableStub()}
+        ...        self.annotations = {TIMETABLES_KEY: timetables}
+        ...        self.name = name
+        ...     def __repr__(self):
+        ...        return 'Timetabled(%r)' % self.name
+        ...     def __conform__(self, iface):
+        ...         if iface == IAnnotations:
+        ...             return self.annotations
+
+        >>> class MockSchoolTool(TimetabledStub, dict):
+        ...     implements(ISchoolToolApplication, IApplicationPreferences,
+        ...                IHaveTimetables)
+        ...     timezone = 'Asia/Tokyo'
+
+        >>> context = ContextStub()
+        >>> app = MockSchoolTool()
+        >>> app['ttschemas'] = BTreeContainer()
+        >>> app['persons'] = BTreeContainer()
+        >>> app['groups'] = BTreeContainer()
+        >>> app['sections'] = BTreeContainer()
+        >>> app['resources'] = BTreeContainer()
+        >>> context.root_folder['app'] = app
+
+    Let's create a few objects:
+
+        >>> s1 = app['sections']['section1'] = TimetabledStub('s1')
+        >>> s2 = app['sections']['section2'] = TimetabledStub('s1')
+        >>> r1 = app['resources']['r1'] = TimetabledStub('r1')
+        >>> p1 = app['persons']['p1'] = TimetabledStub('p1')
+        >>> g1 = app['groups']['g1'] = TimetabledStub('g1')
+
+        >>> app['ttschemas']['foo'] = TimetableStub()
+        >>> app['ttschemas']['bar'] = TimetableStub()
+
+    Shazam!
+
+        >>> from schooltool.generations.evolve10 import evolve
+        >>> evolve(context)
+
+        >>> for ob in app, s1, s2, r1, p1, g1:
+        ...    timetables = IAnnotations(ob)[TIMETABLES_KEY]
+        ...    assert timetables['foo.bar'].timezone == 'Asia/Tokyo', ob
+        ...    assert timetables['baz.quux'].timezone == 'Asia/Tokyo', ob
+        >>> for ob in app['ttschemas'].values():
+        ...    assert ob.timezone == 'Asia/Tokyo'
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve10.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve11.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve11.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve11.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,56 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve11
+
+$Id: test_evolve11.py 6208 2006-06-08 12:24:19Z faassen $
+"""
+
+import unittest
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import implements
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def doctest_evolve11():
+    """Evolution to generation 11.
+
+    We used to test things here, but since the rewrite of the security
+    system this entire evolution became unnecessary.
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve11.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve12.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve12.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve12.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,179 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve12
+
+$Id: test_evolve12.py 6331 2006-06-28 11:09:43Z ignas $
+"""
+
+import unittest
+import itertools
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import implements
+from zope.component import adapts, provideAdapter
+from zope.app.container.ordered import OrderedContainer
+from zope.annotation.interfaces import IAnnotations
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.attendance.interfaces import IUnresolvedAbsenceCache
+from schooltool.attendance.interfaces import IHomeroomAttendance
+from schooltool.attendance.interfaces import ISectionAttendance
+
+
+class StudentStub(object):
+
+    def __init__(self, name):
+        self.__name__ = name
+        self._section_attendance = []
+        self._homeroom_attendance = []
+        self.ha = HomeroomAttendanceStub(self)
+        self.sa = SectionAttendanceStub(self)
+
+    def __repr__(self):
+        return self.__name__
+
+    def __conform__(self, iface):
+        if iface == IAnnotations:
+            return {'schooltool.attendance.SectionAttendance': self.sa,
+                    'schooltool.attendance.HomeroomAttendance': self.ha}
+
+
+class AdminGroupStub(object):
+    def __conform__(self, iface):
+        if iface == IAnnotations:
+            return {'schooltool.attendance.absencecache': UnresolvedAbsenceCacheStub()}
+
+
+class AppStub(dict):
+    implements(ISchoolToolApplication)
+
+    def __init__(self):
+        # Real app has a simple unordered container, but we do not
+        # want to depend on dictionary internal order in our tests
+        self['persons'] = OrderedContainer()
+        for name in ['s1', 's2', 's3']:
+            self['persons'][name] = StudentStub(name)
+        self['groups'] = {}
+        self['groups']['administrators'] = AdminGroupStub()
+
+
+class UnresolvedAbsenceCacheStub(object):
+    adapts(AppStub)
+    implements(IUnresolvedAbsenceCache)
+
+    def add(self, student, ar):
+        print "cache.add(%r, %r)" % (student, ar)
+
+
+class HomeroomAttendanceStub(object):
+    adapts(StudentStub)
+    implements(IHomeroomAttendance)
+
+    def __init__(self, student):
+        self.student = student
+
+    @property
+    def _records(self):
+        return self.student._homeroom_attendance
+
+
+class SectionAttendanceStub(object):
+    adapts(StudentStub)
+    implements(ISectionAttendance)
+
+    def __init__(self, student):
+        self.student = student
+
+    @property
+    def _records(self):
+        return self.student._section_attendance
+
+
+class AttendanceRecordStub(object):
+    def __init__(self, absent=False, tardy=False, explained=False):
+        assert not (absent and tardy)
+        self.isAbsent = lambda: absent
+        self.isTardy = lambda: tardy
+        self.isExplained = lambda: explained
+
+    def __repr__(self):
+        if self.isAbsent():
+            what = 'absent'
+        elif self.isTardy():
+            what = 'tardy'
+        else:
+            what = 'neither'
+        if self.isExplained():
+            what += ' and explained'
+        return what
+
+
+def doctest_evolve12():
+    """Evolution to generation 12.
+
+        >>> context = ContextStub()
+        >>> context.root_folder['app'] = app = AppStub()
+
+        >>> s1 = app['persons']['s1']
+        >>> s1._section_attendance = [
+        ...     AttendanceRecordStub(),
+        ...     AttendanceRecordStub(absent=True),
+        ...     AttendanceRecordStub(tardy=True),
+        ...     AttendanceRecordStub(absent=True, explained=True),
+        ...     AttendanceRecordStub(tardy=True, explained=True),
+        ... ]
+        >>> s2 = app['persons']['s2']
+        >>> s2._homeroom_attendance = [
+        ...     AttendanceRecordStub(),
+        ...     AttendanceRecordStub(absent=True),
+        ...     AttendanceRecordStub(tardy=True),
+        ...     AttendanceRecordStub(absent=True, explained=True),
+        ...     AttendanceRecordStub(tardy=True, explained=True),
+        ... ]
+
+        >>> from schooltool.generations.evolve12 import evolve
+        >>> evolve(context)
+        cache.add(s1, absent)
+        cache.add(s1, tardy)
+        cache.add(s2, absent)
+        cache.add(s2, tardy)
+
+    """
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve12.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve14.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve14.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve14.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,109 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve13
+
+$Id: test_evolve12.py 5946 2006-04-18 15:47:33Z ignas $
+"""
+
+import unittest
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import implements
+from zope.component import adapts, provideAdapter
+from zope.app.container.ordered import OrderedContainer
+from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+
+class StudentStub(object):
+    implements(IAttributeAnnotatable)
+    
+    def __init__(self, name):
+        self.__name__ = name
+        self.username = name
+        self.title = name
+        self.photo = None
+        self._hashed_password = None
+        self.groups = []
+        self.overlaid_calendars = []
+        # initialize annotations
+        IAnnotations(self)['foo'] = 'init'
+        
+    def __repr__(self):
+        return self.__name__
+
+class AppStub(dict):
+    implements(ISchoolToolApplication)
+
+    def __init__(self):
+        # Real app has a simple unordered container, but we do not
+        # want to depend on dictionary internal order in our tests
+        self['persons'] = OrderedContainer()
+        for name in ['s1', 's2', 's3']:
+            self['persons'][name] = StudentStub(name)
+
+def doctest_evolve14():
+    """Evolution to generation 14.
+
+        >>> context = ContextStub()
+        >>> context.root_folder['app'] = app = AppStub()
+
+        >>> s1 = app['persons']['s1']
+        >>> hasattr(s1, 'nameinfo')
+        False
+
+       Make sure arbitrary annotations carry over too:
+
+        >>> from zope.annotation.interfaces import IAnnotations
+        >>> from zope.annotation.attribute import AttributeAnnotations
+        >>> IAnnotations(s1)['test'] = 'Bar'
+
+       Now evolve:
+       
+        >>> from schooltool.generations.evolve14 import evolve
+        >>> evolve(context)
+        >>> s1 = app['persons']['s1']
+        >>> hasattr(s1, 'nameinfo')
+        True
+
+        >>> s1.username == 's1'
+        True
+        >>> IAnnotations(s1)['test']
+        'Bar'
+    """
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve14.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve15.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve15.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve15.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,129 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve15
+
+$Id: test_evolve15.py 6188 2006-06-08 08:50:51Z vidas $
+"""
+
+import unittest
+
+from zope.annotation.interfaces import IAnnotations
+from zope.interface import directlyProvides
+from zope.annotation.interfaces import IAnnotatable
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import implements
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+class AppStub(dict):
+    implements(ISchoolToolApplication, IAnnotatable)
+
+    def __init__(self):
+        groups = self['groups'] = {}
+        persons = self['persons'] = {}
+
+    def __repr__(self):
+        return '<app>'
+
+
+class ObjectStub(dict):
+    implements(IAnnotatable)
+
+    def __init__(self, name='stub'):
+        self.name = name
+
+    def __repr__(self):
+        return '<Object %r>' % self.name
+
+
+def doctest_removeLocalGrants():
+    r"""Doctest for removeLocalGrants.
+
+    Prepare object with local grants:
+
+        >>> obj = ObjectStub('object')
+        >>> directlyProvides(obj, IAnnotations)
+        >>> from zope.app.securitypolicy.principalpermission import AnnotationPrincipalPermissionManager
+        >>> from zope.app.securitypolicy.principalrole import AnnotationPrincipalRoleManager
+        >>> ppm = AnnotationPrincipalPermissionManager(obj)
+        >>> ppm.grantPermissionToPrincipal('test.run', 'testrunner')
+        >>> prm = AnnotationPrincipalRoleManager(obj)
+        >>> prm.assignRoleToPrincipal('doctester', 'testrunner')
+        >>> ann = IAnnotations(obj)
+        >>> print '\n'.join(sorted(ann.keys()))
+        zope.app.security.AnnotationPrincipalRoleManager
+        zopel.app.security.AnnotationPrincipalPermissionManager
+
+        >>> from schooltool.generations.evolve15 import removeLocalGrants
+        >>> removeLocalGrants(obj)
+        >>> print '\n'.join(sorted(ann.keys()))
+        <BLANKLINE>
+    """
+
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 15.
+
+    Create context:
+
+        >>> context = ContextStub()
+        >>> context.root_folder['app'] = app = AppStub()
+        >>> directlyProvides(app, IAnnotations)
+
+        >>> person = app['persons']['person'] = ObjectStub('person')
+        >>> group = app['groups']['group'] = ObjectStub('group')
+        >>> directlyProvides(person, IAnnotations)
+        >>> directlyProvides(group, IAnnotations)
+
+        >>> from schooltool.generations import evolve15 as ev
+        >>> result = []
+        >>> def removeLocalGrantsStub(obj):
+        ...     result.append('removeLocalGrants from %r' % obj)
+        >>> old_removeLocalGrants = ev.removeLocalGrants
+        >>> ev.removeLocalGrants = removeLocalGrantsStub
+        >>> ev.evolve(context)
+        >>> print '\n'.join(sorted(result))
+        removeLocalGrants from <Object 'group'>
+        removeLocalGrants from <Object 'person'>
+        removeLocalGrants from <app>
+
+        >>> ev.removeLocalGrants = old_removeLocalGrants
+    """
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve15.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve16.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve16.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve16.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,90 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve16
+
+$Id: test_evolve16.py 6212 2006-06-08 13:01:04Z vidas $
+"""
+
+import unittest
+
+from zope.app.testing.setup import setUpAnnotations
+from zope.annotation.interfaces import IAnnotatable
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import implements
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.relationship.tests import setUpRelationships
+from schooltool.person.person import Person
+from schooltool.group.group import Group
+
+
+class AppStub(dict):
+    implements(ISchoolToolApplication, IAnnotatable)
+
+    def __init__(self):
+        groups = self['groups'] = {}
+        groups['manager'] = Group('Managers')
+        self['persons'] = {}
+
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 16.
+
+    Create context:
+
+        >>> context = ContextStub()
+        >>> context.root_folder['app'] = app = AppStub()
+        >>> manager_group = app['groups']['manager']
+        >>> print list(manager_group.members)
+        []
+
+    No effect if we have no manager user (for some reason...):
+
+        >>> from schooltool.generations.evolve16 import evolve
+        >>> evolve(context)
+        >>> print list(manager_group.members)
+        []
+
+        >>> app['persons']['manager'] = manager = Person('manager')
+        >>> evolve(context)
+        >>> manager in manager_group.members
+        True
+    """
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setUpAnnotations()
+    setUpRelationships()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve16.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve17.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve17.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve17.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,185 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve17
+
+$Id: test_evolve16.py 6212 2006-06-08 13:01:04Z vidas $
+"""
+
+import unittest
+
+from zope.app.testing.setup import setUpAnnotations
+from zope.annotation.interfaces import IAnnotatable
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import implements, directlyProvides
+from zope.app.folder.folder import Folder
+from zope.component.interfaces import IComponentLookup
+from zope.app.intid.interfaces import IIntIds
+from zope.app.catalog.interfaces import ICatalog
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.demographics.person import Person
+
+
+class AppStub(Folder):
+    implements(ISchoolToolApplication, IAnnotatable)
+
+    def __init__(self):
+        super(AppStub, self).__init__()
+        self['persons'] = {}
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 17.
+
+      >>> context = ContextStub()
+      >>> context.root_folder['app'] = app = AppStub()
+      >>> dummy = setup.createSiteManager(app)
+      >>> alpha = Person('alpha', 'Alpha')
+      >>> alpha.schooldata.id = 'a'
+      >>> beta = Person('beta', 'Beta')
+      >>> beta.schooldata.id = 'b'
+      >>> app['persons']['alpha'] = alpha
+      >>> app['persons']['beta'] = beta
+
+    Set the site:
+      >>> from zope.app.component.hooks import setSite
+      >>> setSite(app)
+
+    Make the person searchable:
+
+      >>> from zope.component import provideAdapter
+      >>> from schooltool.demographics.utility import Search
+      >>> from schooltool.demographics.interfaces import ISearch
+      >>> from schooltool.person.interfaces import IPerson
+      >>> provideAdapter(Search, [IPerson], ISearch)
+
+    Do the evolution:
+
+      >>> from schooltool.generations.evolve17 import evolve
+      >>> evolve(context)
+
+    We expect the utilities to be installed:
+
+      >>> from zope.component import getUtility
+      >>> utility = getUtility(IIntIds)
+      >>> IIntIds.providedBy(utility)
+      True
+      >>> catalog = getUtility(ICatalog, 'demographics_catalog')
+      >>> ICatalog.providedBy(catalog)
+      True
+
+    We also expect things to be indexed. Let's check the
+    studentId fieldindex:
+
+      >>> results = catalog.searchResults(studentId=('a', 'a'))
+      >>> [item.title for item in results]
+      ['Alpha']
+      >>> results = catalog.searchResults(studentId=('b', 'b'))
+      >>> [item.title for item in results]
+      ['Beta']
+      >>> results = catalog.searchResults(studentId=('c', 'c'))
+      >>> [item.title for item in results]
+      []
+
+    Since the last name is required now but we don't know what
+    last name people had, we expect to see 'Last name unknown':
+
+      >>> app['persons']['alpha'].nameinfo.last_name
+      'Last name unknown'
+
+    """
+
+from zope.app.keyreference.interfaces import IKeyReference
+
+
+_d = {}
+
+
+class StupidKeyReference(object):
+    implements(IKeyReference)
+    key_type_id = 'StupidKeyReference'
+    def __init__(self, ob):
+        global _d
+        self.id = id(ob)
+        _d[self.id] = ob
+    def __call__(self):
+        return _d[self.id]
+    def __hash__(self):
+        return self.id
+    def __cmp__(self, other):
+        return cmp(hash(self), hash(other))
+
+
+def setUp(test):
+    setup.placefulSetUp()
+    setup.setUpTraversal()
+    setUpAnnotations()
+
+    # this is code to set up the catalog for unit testing. it could
+    # be extracted and put into general setup functionality
+
+    # Make sure objects can be keyreferenced - necessary for int ids to
+    # work:
+
+    from zope.component import provideAdapter
+    from persistent.interfaces import IPersistent
+    provideAdapter(StupidKeyReference, [IPersistent], IKeyReference)
+
+    # Provide the int id subscribers:
+
+    from zope.component import provideHandler
+    from zope.app.intid import addIntIdSubscriber, removeIntIdSubscriber
+    from zope.location.interfaces import ILocation
+    from zope.app.container.interfaces import IObjectAddedEvent
+    from zope.app.container.interfaces import IObjectRemovedEvent
+    provideHandler(addIntIdSubscriber,
+                   [ILocation, IObjectAddedEvent])
+    provideHandler(removeIntIdSubscriber,
+                   [ILocation, IObjectRemovedEvent])
+
+    # And the catalog subscribers:
+
+    from zope.app.catalog import catalog
+    from zope.app.catalog.interfaces import ICatalogIndex
+    from zope.app.intid.interfaces import IIntIdAddedEvent,\
+         IIntIdRemovedEvent
+    from zope.lifecycleevent.interfaces import IObjectModifiedEvent
+    provideHandler(catalog.indexAdded,
+                   [ICatalogIndex, IObjectAddedEvent])
+    provideHandler(catalog.indexDocSubscriber,
+                   [IIntIdAddedEvent])
+    provideHandler(catalog.reindexDocSubscriber,
+                   [IObjectModifiedEvent])
+    provideHandler(catalog.unindexDocSubscriber,
+                   [IIntIdRemovedEvent])
+
+def tearDown(test):
+    setup.placefulTearDown()
+    _d = {}
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve17.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve18.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve18.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve18.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,76 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve18
+
+$Id: test_evolve18.py 6394 2006-08-18 17:21:29Z ignas $
+"""
+
+import unittest
+
+from zope.app.testing import setup
+from zope.app.component.interfaces import ISite
+from zope.location.interfaces import ILocation
+from zope.testing import doctest
+from zope.interface import implements, directlyProvides
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+class AppStub(object):
+    implements(ISchoolToolApplication, ILocation)
+    __parent__ = None
+    __name__ = None
+
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 18.
+
+      >>> context = ContextStub()
+      >>> context.root_folder['app'] = app = AppStub()
+      >>> from zope.traversing.interfaces import IContainmentRoot
+      >>> from zope.app.component.interfaces import ISite
+      >>> directlyProvides(app, IContainmentRoot, ISite)
+
+      >>> from schooltool.generations.evolve18 import evolve
+      >>> evolve(context)
+
+      >>> IContainmentRoot.providedBy(app)
+      False
+
+      >>> ISite.providedBy(app)
+      True
+
+    """
+
+def setUp(test):
+    setup.placelessSetUp()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve18.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve19.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve19.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve19.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,103 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve19
+
+$Id: test_evolve19.py 6487 2006-11-16 15:06:30Z ignas $
+"""
+
+import unittest
+
+from zope.app.testing import setup
+from zope.location.interfaces import ILocation
+from zope.testing import doctest
+from zope.interface import implements
+
+from schooltool.app.interfaces import IHaveCalendar
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+class AppStub(dict):
+    implements(ISchoolToolApplication, ILocation)
+    __parent__ = None
+    __name__ = None
+
+
+class HaveCalendarStub(object):
+    implements(IHaveCalendar)
+
+    def __init__(self):
+        self.__annotations__ = {}
+        self.__annotations__['schooltool.app.calendar.Calendar'] = []
+
+    def addEvent(self, event):
+        self.__annotations__['schooltool.app.calendar.Calendar'].append(event)
+
+
+class EventStub(object):
+    def __init__(self, uid):
+        self.unique_id = uid
+        self.__name__ = uid
+
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 19.
+
+      >>> context = ContextStub()
+      >>> context.root_folder['app'] = app = AppStub()
+      >>> calendar1 = app['c1'] = HaveCalendarStub()
+      >>> calendar2 = app['c2'] = HaveCalendarStub()
+      >>> ev1 = EventStub('lala')
+      >>> ev2 = EventStub('bobo')
+      >>> ev3 = EventStub('unique/id')
+      >>> ev4 = EventStub('@very/very/very/long/and/really_really_really/unique/id')
+      >>> calendar1.addEvent(ev1)
+      >>> calendar2.addEvent(ev2)
+      >>> calendar2.addEvent(ev3)
+      >>> calendar2.addEvent(ev4)
+
+      >>> from schooltool.generations.evolve19 import evolve
+      >>> evolve(context)
+
+      >>> ev1.__name__
+      'bGFsYQ=='
+      >>> ev2.__name__
+      'Ym9ibw=='
+      >>> ev3.__name__
+      'dW5pcXVlL2lk'
+      >>> ev4.__name__
+      'QHZlcnkvdmVyeS92ZXJ5L2xvbmcvYW5kL3JlYWxseV9yZWFsbHlfcmVhbGx5L3VuaXF1ZS9pZA=='
+
+    """
+
+def setUp(test):
+    setup.placelessSetUp()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve19.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve20.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve20.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve20.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,137 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve20
+
+$Id: test_evolve20.py 6510 2006-11-30 16:35:29Z ignas $
+"""
+
+import unittest
+
+from zope.app.component.hooks import setSite
+from zope.app.component.site import LocalSiteManager
+from zope.app.component.site import SiteManagerContainer
+from zope.app.container.interfaces import IContained
+from zope.app.testing import setup
+from zope.component import queryUtility
+from zope.interface import Interface
+from zope.interface import implements
+from zope.location.interfaces import ILocation
+from zope.testing import doctest
+
+from schooltool.person.interfaces import IPersonFactory
+from schooltool.app.interfaces import IHaveCalendar
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+class AppStub(SiteManagerContainer):
+    implements(ISchoolToolApplication, ILocation)
+    __parent__ = None
+    __name__ = None
+
+
+class UtilityStub(object):
+    implements(IContained)
+
+    def __init__(self, name):
+        self.__name__ = name
+        self.__parent__ = None
+
+    def __repr__(self):
+        return '<UtilityStub %s>' % self.__name__
+
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 20.
+
+      >>> context = ContextStub()
+      >>> context.root_folder['app'] = app = AppStub()
+
+    We are doing the placeful setup by hand as we want our schooltool
+    application to be the site:
+
+      >>> setup.placelessSetUp()
+      >>> setup.zope.app.component.hooks.setHooks()
+      >>> setup.setUpAnnotations()
+      >>> setup.setUpDependable()
+      >>> setup.setUpTraversal()
+      >>> setup.setUpSiteManagerLookup()
+      >>> manager = LocalSiteManager(app)
+      >>> app.setSiteManager(manager)
+      >>> setSite(app)
+
+      >>> from zope.app import zapi
+      >>> default = zapi.traverse(app, '++etc++site/default')
+
+      >>> utility = UtilityStub('Local_utility_1')
+      >>> default['Local_utility_1'] = utility
+      >>> manager.registerUtility(utility, IPersonFactory)
+
+      >>> utility = UtilityStub('Local_utility_2')
+      >>> default['Local_utility_2'] = utility
+      >>> manager.registerUtility(utility, Interface)
+
+      >>> sorted(dict(default).items())
+      [(u'Local_utility_1', <UtilityStub Local_utility_1>),
+       (u'Local_utility_2', <UtilityStub Local_utility_2>)]
+      >>> queryUtility(IPersonFactory)
+      <UtilityStub Local_utility_1>
+      >>> queryUtility(Interface)
+      <UtilityStub Local_utility_2>
+
+      >>> from schooltool.generations.evolve20 import evolve
+      >>> setSite(None)
+      >>> evolve(context)
+      >>> setSite(app)
+
+      >>> sorted(dict(default).items())
+      [(u'Local_utility_2', <UtilityStub Local_utility_2>)]
+      >>> queryUtility(IPersonFactory, default=None) is None
+      True
+      >>> queryUtility(Interface)
+      <UtilityStub Local_utility_2>
+
+    I am registering a global utility to check that nothing is being
+    done with it:
+
+      >>> queryUtility(IPersonFactory, default=None) is None
+      True
+
+      >>> utility = UtilityStub('Global_utility_1')
+      >>> zapi.getGlobalSiteManager().registerUtility(utility, IPersonFactory)
+
+      >>> setSite(None)
+      >>> evolve(context)
+      >>> setSite(app)
+
+      >>> queryUtility(IPersonFactory, default=None)
+      <UtilityStub Global_utility_1>
+
+      >>> setup.placefulTearDown()
+
+    """
+
+def test_suite():
+    return doctest.DocTestSuite(optionflags=doctest.NORMALIZE_WHITESPACE
+                                |doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve20.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve21.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve21.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve21.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,123 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve21
+
+$Id: test_evolve21.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+
+import unittest
+
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.testing import setup
+from zope.interface import implements
+from zope.location.interfaces import ILocation
+from zope.testing import doctest
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+class AppStub(dict):
+    implements(ISchoolToolApplication, ILocation)
+    __parent__ = None
+    __name__ = None
+
+    def __init__(self):
+        self['sections'] = {}
+
+
+class SectionStub(object):
+    implements(IAttributeAnnotatable)
+
+    def __init__(self, title):
+        self.title = title
+
+    def __repr__(self):
+        return '<Section %s>' % self.title
+
+    def __cmp__(self, other):
+        if self.title == other.title:
+            return 0
+        return self.title < other.title and -1 or 1
+
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 21.
+
+      >>> context = ContextStub()
+      >>> context.root_folder['app'] = app = AppStub()
+
+      >>> setup.placelessSetUp()
+      >>> setup.setUpAnnotations()
+
+      >>> event_list = []
+
+      >>> from zope.event import subscribers
+      >>> subscribers.append(event_list.append)
+
+   If there are no timetables - nothing is done:
+
+      >>> from schooltool.generations.evolve21 import evolve
+      >>> evolve(context)
+      >>> event_list
+      []
+
+   When we add some section without timetables - nothing happens too:
+
+      >>> tt_key = 'schooltool.timetable.timetables'
+      >>> from zope.annotation.interfaces import IAnnotations
+      >>> s1 = app['sections']['section1'] = SectionStub("Section 1")
+      >>> tts1 = IAnnotations(s1)[tt_key] = {}
+      >>> s2 = app['sections']['section2'] = SectionStub("Section 2")
+      >>> tts2 = IAnnotations(s2)[tt_key] = {}
+
+      >>> evolve(context)
+      >>> event_list
+      []
+
+   Let's add some timetables now:
+
+      >>> tts1['term1.schema1'] = "Timetable 1"
+      >>> tts2['term1.schema1'] = "Timetable 2"
+      >>> tts2['term2.schema1'] = "Timetable 3"
+
+   Events for every timetable are sent:
+
+      >>> evolve(context)
+      >>> sorted([(ev.object, ev.key, ev.old_timetable, ev.new_timetable)
+      ...         for ev in event_list])
+      [(<Section Section 1>, 'term1.schema1', None, 'Timetable 1'),
+       (<Section Section 2>, 'term1.schema1', None, 'Timetable 2'),
+       (<Section Section 2>, 'term2.schema1', None, 'Timetable 3')]
+
+   Clean up subscribers:
+
+      >>> subscribers = subscribers[:1]
+      >>> setup.placefulTearDown()
+
+    """
+
+def test_suite():
+    return doctest.DocTestSuite(optionflags=doctest.NORMALIZE_WHITESPACE
+                                |doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve21.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve22.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve22.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve22.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,104 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve22
+
+$Id: test_evolve22.py 6837 2007-04-12 12:12:28Z ignas $
+"""
+
+import unittest
+
+from zope.app.testing.setup import setUpAnnotations
+from zope.annotation.interfaces import IAnnotatable
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import implements, directlyProvides
+from zope.app.folder.folder import Folder
+from zope.component.interfaces import IComponentLookup
+from zope.app.intid.interfaces import IIntIds
+from zope.app.catalog.interfaces import ICatalog
+from schooltool.generations.tests.test_evolve17 import setUp, tearDown
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.demographics.person import Person
+
+
+class AppStub(Folder):
+    implements(ISchoolToolApplication, IAnnotatable)
+
+    def __init__(self):
+        super(AppStub, self).__init__()
+        self['groups'] = {}
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 22.
+
+      >>> context = ContextStub()
+      >>> context.root_folder['app'] = app = AppStub()
+      >>> dummy = setup.createSiteManager(app)
+      >>> from schooltool.group.group import Group
+      >>> alpha = Group('Alpha')
+      >>> beta = Group('Beta')
+      >>> app['groups']['alpha'] = alpha
+      >>> alpha.__name__ = 'alpha'
+      >>> app['groups']['beta'] = beta
+      >>> beta.__name__ = 'beta'
+
+    Set the site:
+      >>> from zope.app.component.hooks import setSite
+      >>> setSite(app)
+
+    Provide IntIds utility:
+
+      >>> from schooltool.utility.utility import setUpUtilities
+      >>> from schooltool.utility.utility import UtilitySpecification
+      >>> from zope.app.intid import IntIds
+      >>> from zope.app.intid.interfaces import IIntIds
+      >>> setUpUtilities(app, [UtilitySpecification(IntIds, IIntIds)])
+
+    Do the evolution:
+
+      >>> from schooltool.generations.evolve22 import evolve
+      >>> evolve(context)
+
+    We expect the utilities to be installed:
+
+      >>> from zope.component import getUtility
+      >>> catalog = getUtility(ICatalog, 'schooltool.group')
+      >>> ICatalog.providedBy(catalog)
+      True
+
+    We also expect things to be indexed. Let's check the
+    studentId fieldindex:
+
+      >>> sorted(catalog['__name__'].documents_to_values.values())
+      ['alpha', 'beta']
+      >>> sorted(catalog['title'].documents_to_values.values())
+      ['Alpha', 'Beta']
+
+    """
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve22.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve23.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve23.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve23.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,102 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve23
+
+$Id: test_evolve23.py 6852 2007-04-13 12:10:00Z ignas $
+"""
+
+import unittest
+
+from zope.annotation.interfaces import IAnnotatable
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import implements
+from zope.app.folder.folder import Folder
+from zope.app.catalog.interfaces import ICatalog
+from schooltool.generations.tests.test_evolve17 import setUp, tearDown
+
+from schooltool.generations.tests import ContextStub
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+class AppStub(Folder):
+    implements(ISchoolToolApplication, IAnnotatable)
+
+    def __init__(self):
+        super(AppStub, self).__init__()
+        self['persons'] = {}
+
+
+def doctest_evolve():
+    r"""Doctest for evolution to generation 23.
+
+      >>> context = ContextStub()
+      >>> context.root_folder['app'] = app = AppStub()
+      >>> dummy = setup.createSiteManager(app)
+      >>> from schooltool.person.person import Person
+      >>> alpha = Person('alpha', 'Alpha')
+      >>> beta = Person('beta', 'Beta')
+      >>> app['persons']['alpha'] = alpha
+      >>> alpha.__name__ = 'alpha'
+      >>> app['persons']['beta'] = beta
+      >>> beta.__name__ = 'beta'
+
+    Set the site:
+      >>> from zope.app.component.hooks import setSite
+      >>> setSite(app)
+
+    Provide IntIds utility:
+
+      >>> from schooltool.utility.utility import setUpUtilities
+      >>> from schooltool.utility.utility import UtilitySpecification
+      >>> from zope.app.intid import IntIds
+      >>> from zope.app.intid.interfaces import IIntIds
+      >>> setUpUtilities(app, [UtilitySpecification(IntIds, IIntIds)])
+
+    Do the evolution:
+
+      >>> from schooltool.generations.evolve23 import evolve
+      >>> evolve(context)
+
+    We expect the utilities to be installed:
+
+      >>> from zope.component import getUtility
+      >>> catalog = getUtility(ICatalog, 'schooltool.person')
+      >>> ICatalog.providedBy(catalog)
+      True
+
+    We also expect things to be indexed. Let's check the
+    studentId fieldindex:
+
+      >>> sorted(catalog['__name__'].documents_to_values.values())
+      ['alpha', 'beta']
+      >>> sorted(catalog['title'].documents_to_values.values())
+      ['Alpha', 'Beta']
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve23.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve6.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve6.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve6.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,157 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve6
+
+$Id: test_evolve6.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.app.container.btree import BTreeContainer
+
+from schooltool.generations.tests import ContextStub
+import schooltool.app # Dead chicken to avoid issue 390
+from schooltool.person.person import Person
+from schooltool.resource.resource import Resource
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.testing import setup as sbsetup
+from schooltool.relationship.tests import setUpRelationships
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+    sbsetup.setUpCalendaring()
+    setUpRelationships()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def doctest_evolve6_get_rid_of_dead_calendars():
+    """Evolution to generation 6.
+
+        >>> context = ContextStub()
+        >>> app = {'persons': BTreeContainer()}
+        >>> context.root_folder['app'] = app
+
+    The problem happens like this: we have a Person in the application.
+
+        >>> person = Person()
+        >>> app['persons']['person'] = person
+
+    There is another person, but it has been deleted
+
+        >>> dead_person = Person()
+
+    The first person has overlaid the dead person's calendar.
+
+        >>> dead_persons_calendar = ISchoolToolCalendar(dead_person)
+        >>> person.overlaid_calendars.add(dead_persons_calendar)
+        <...CalendarOverlayInfo object at ...>
+
+    (In real life, dead_person was alive when person overlaid his
+    calendar, but then dead_person got removed.  The late person's
+    calendar was supposed to be removed from all overlays, but that
+    didn't happen because of a bug.)
+
+    This evolution script is supposed to clean up such stale calendars
+    from overlay lists.
+
+        >>> from schooltool.generations.evolve6 import evolve
+        >>> evolve(context)
+
+    We can see that the stale calendar is gone now:
+
+        >>> list(person.overlaid_calendars)
+        []
+
+    """
+
+
+def doctest_evolve6_doesnt_do_too_much():
+    """Evolution to generation 6.
+
+        >>> context = ContextStub()
+
+        >>> person = Person()
+        >>> context.root_folder['person1'] = person
+        >>> another_person = Person()
+        >>> context.root_folder['person2'] = another_person
+
+    The evolution script shouldn't remove valid calendar overlays
+
+        >>> another_persons_calendar = ISchoolToolCalendar(another_person)
+        >>> person.overlaid_calendars.add(another_persons_calendar)
+        <...CalendarOverlayInfo object at ...>
+
+    The evolution script shouldn't try to access nonexistent properties
+    of other objects
+
+        >>> context.root_folder['resource1'] = Resource()
+
+    Let's see that it doesn't do either
+
+        >>> from schooltool.generations.evolve6 import evolve
+        >>> evolve(context)
+
+        >>> len(person.overlaid_calendars)
+        1
+
+    """
+
+
+def doctest_evolve6_removal_while_iteration():
+    """Evolution to generation 6.
+
+    The script needs to iterate over all related calendars and remove
+    some of them.  Removal during iteration is always tricky.
+
+        >>> context = ContextStub()
+        >>> person = Person()
+        >>> context.root_folder['person1'] = person
+
+        >>> for n in range(20):
+        ...     dead_person = Person()
+        ...     dead_persons_calendar = ISchoolToolCalendar(dead_person)
+        ...     info = person.overlaid_calendars.add(dead_persons_calendar)
+
+        >>> from schooltool.generations.evolve6 import evolve
+        >>> evolve(context)
+
+    We can see that all the stale calendars are gone now:
+
+        >>> list(person.overlaid_calendars)
+        []
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                    |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve6.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve7.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve7.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve7.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,120 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve6
+
+$Id: test_evolve7.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+from datetime import date, time, timedelta
+from pprint import pprint
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.app.container.btree import BTreeContainer
+
+from schooltool.generations.tests import ContextStub
+import schooltool.app # Dead chicken to avoid issue 390
+from schooltool.testing import setup as stsetup
+
+from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+from schooltool.timetable.model import SequentialDaysTimetableModel
+from schooltool.timetable.schema import TimetableSchema
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+    stsetup.setUpTimetabling()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def doctest_evolve7_convert_exceptions():
+    """Evolution to generation 7.
+
+        >>> context = ContextStub()
+        >>> app = {'ttschemas': BTreeContainer()}
+        >>> context.root_folder['app'] = app
+
+    Suppose we have a timetable schema with a model that has exception days:
+
+        >>> day_templates = {None: SchooldayTemplate()}
+        >>> model = SequentialDaysTimetableModel(('A', 'B'), day_templates)
+        >>> schema = TimetableSchema(('A', 'B'), model=model)
+        >>> app['ttschemas']['example'] = schema
+        >>> ex = model.exceptionDays[date(2005, 10, 14)] = SchooldayTemplate()
+        >>> p1 = SchooldaySlot(time(8, 0), timedelta(minutes=55))
+        >>> p2 = SchooldaySlot(time(9, 0), timedelta(minutes=55))
+        >>> p3 = SchooldaySlot(time(10, 0), timedelta(minutes=55))
+        >>> p4 = SchooldaySlot(time(11, 0), timedelta(minutes=55))
+
+        >>> ex.add(p1)
+        >>> ex.add(p2)
+        >>> ex.add(p3)
+        >>> ex.add(p4)
+
+    The slots are in fact old SchooldayPeriod instances, and they have
+    title attributes on them.
+
+        >>> p1.title = 'alpha'
+        >>> p2.title = 'beta'
+        >>> p3.title = 'gamma'
+        >>> p4.title = 'delta'
+
+    We call the evolution script:
+
+        >>> from schooltool.generations.evolve7 import evolve
+        >>> evolve(context)
+
+    Let's inspect the model exceptions:
+
+        >>> len(model.exceptionDays)
+        1
+
+    We see a list of tuples (period, slot).  They are sorted in the
+    chronological order.
+
+        >>> pprint(model.exceptionDays[date(2005, 10, 14)])
+        [('alpha', <schooltool.timetable.SchooldaySlot ...>),
+         ('beta', <schooltool.timetable.SchooldaySlot ...>),
+         ('gamma', <schooltool.timetable.SchooldaySlot ...>),
+         ('delta', <schooltool.timetable.SchooldaySlot ...>)]
+
+        >>> for period, slot in model.exceptionDays[date(2005, 10, 14)]:
+        ...     print period.ljust(5), slot.tstart, slot.duration
+        alpha 08:00:00 0:55:00
+        beta  09:00:00 0:55:00
+        gamma 10:00:00 0:55:00
+        delta 11:00:00 0:55:00
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve7.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve8.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve8.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve8.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,99 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve6
+
+$Id: test_evolve8.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.app.container.btree import BTreeContainer
+from zope.interface import implements
+
+from schooltool.group.group import Group
+from schooltool.generations.tests import ContextStub
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+    setup.setUpDependable()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def doctest_evolve8_convert_exceptions():
+    """Evolution to generation 8.
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.timetable.interfaces import ITimetableModel
+        >>> class MockSchoolTool(dict):
+        ...     implements(ISchoolToolApplication)
+
+        >>> context = ContextStub()
+        >>> app = MockSchoolTool()
+        >>> app['groups'] = BTreeContainer()
+        >>> context.root_folder['app'] = app
+
+    Suppose we have a nice fresh install of an older SchoolTool:
+
+        >>> app['groups']['manager'] = Group('Manager', 'Manager Group.')
+        >>> group = Group('Manager', 'Manager group.')
+
+        >>> from schooltool.generations.evolve8 import evolve
+        >>> evolve(context)
+
+     We should have groups with these names:
+
+        >>> group_names = ['administrators', 'clerks', 'manager', 'students',
+        ...                'teachers']
+
+     Proper titles should get set up:
+
+        >>> for name in sorted(group_names):
+        ...     group = app['groups'][name]
+        ...     print '%-15s %-25s %s' % (name, group.title, group.description)
+        administrators  School Administrators     School Administrators.
+        clerks          Clerks                    Clerks.
+        manager         Manager                   Manager Group.
+        students        Students                  Students.
+        teachers        Teachers                  Teachers.
+
+    As well as dependencies:
+
+        >>> from zope.app.dependable.interfaces import IDependable
+        >>> for group in app['groups'].values():
+        ...     assert IDependable(group).dependents() == ('/',)
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve8.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve9.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve9.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve9.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,115 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.generations.evolve6
+
+$Id: test_evolve9.py 5861 2006-04-04 17:24:56Z gintas $
+"""
+
+import unittest
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.app.container.btree import BTreeContainer
+from zope.interface import implements
+
+from schooltool.resource.resource import Resource
+from schooltool.course.section import Section
+from schooltool.generations.tests import ContextStub
+
+
+def setUp(test):
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+
+
+def tearDown(test):
+    setup.placelessTearDown()
+
+
+def doctest_evolve9_book_location():
+    """Evolution to generation 9.
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> class MockSchoolTool(dict):
+        ...     implements(ISchoolToolApplication)
+
+        >>> context = ContextStub()
+        >>> app = MockSchoolTool()
+        >>> app['sections'] = BTreeContainer()
+        >>> app['resources'] = BTreeContainer()
+        >>> context.root_folder['app'] = app
+
+        >>> from schooltool.relationship.interfaces import IRelationshipLinks
+        >>> from schooltool.course.interfaces import ISection
+        >>> class ResourceStub:
+        ...     def __repr__(self):
+        ...         return 'resource'
+        >>> class SectionStub:
+        ...     def __init__(self):
+        ...         self.resources = set()
+
+    Let's create a few sections and resources:
+
+        >>> s1 = app['sections']['section1'] = SectionStub()
+        >>> s2 = app['sections']['section2'] = SectionStub()
+        >>> r1 = app['resources']['r1'] = ResourceStub()
+
+        >>> s1.location = r1
+        >>> s1.resources
+        set([])
+
+    Shazam!
+
+        >>> from schooltool.generations.evolve9 import evolve
+        >>> evolve(context)
+
+    Let's check the first section (with a location).  The resource should now
+    be booked:
+
+        >>> s1.resources
+        set([resource])
+
+    And the locations attribute went away:
+
+        >>> s1.location
+        Traceback (most recent call last):
+            ...
+        AttributeError: SectionStub instance has no attribute 'location'
+
+    The second section didn't gain a booking and lost its attribute too:
+
+        >>> s2.resources
+        set([])
+        >>> s2.location
+        Traceback (most recent call last):
+            ...
+        AttributeError: SectionStub instance has no attribute 'location'
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                optionflags=doctest.ELLIPSIS
+                                |doctest.REPORT_ONLY_FIRST_FAILURE)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/generations/tests/test_evolve9.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,408 @@
+=============
+The Gradebook
+=============
+
+Traditionally, the gradebook is a simple spreadsheet where the columns are the
+activities to be graded and each row is a student. Since SchoolTool is an
+object-oriented application, we have the unique oppurtunity to implement it a
+little bit different and to provide some unique features.
+
+Categories
+----------
+
+When the SchoolTool instance is initially setup, it is part of the
+administations job to setup activity categories. Activity categories can be
+"homework", "paper", "test", "final exam", etc.
+
+    >>> from schooltool.testing import setup
+    >>> school = setup.setUpSchoolToolSite()
+
+By default, some categories should be available in the vocabulary. Since this
+is a test, we have to set them up manually:
+
+    >>> from schooltool.testing import registry
+    >>> registry.setupDefaultCategories(school)
+
+The categories are managed by a special option storage vocabulary. As soon as
+the SchoolTool application is registered as a site, the vocabulary can be
+easily initiated.
+
+    >>> from schooltool.gradebook import category
+    >>> categories = category.CategoryVocabulary()
+
+We can now see the default categories:
+
+    >>> sorted([term.title for term in categories])
+    [u'Assignment', u'Essay', u'Exam', u'Homework', u'Journal', u'Lab',
+     u'Presentation', u'Project']
+
+The actual categories, however, are not managed by the vocabulary directly,
+but by an option storage dictionary. The category module provides a high-level
+function to get the dictionary:
+
+    >>> dict = category.getCategories(school)
+
+Now we can add,
+
+    >>> dict.addValue('quiz', 'en', u'Quiz')
+    >>> sorted([term.title for term in categories])
+    [u'Assignment', u'Essay', u'Exam', u'Homework', u'Journal', u'Lab',
+     u'Presentation', u'Project', u'Quiz']
+
+delete,
+
+    >>> dict.delValue('quiz', 'en')
+    >>> sorted([term.title for term in categories])
+    [u'Assignment', u'Essay', u'Exam', u'Homework', u'Journal', u'Lab',
+     u'Presentation', u'Project']
+
+and query values:
+
+    >>> dict.getValue('assignment','en')
+    u'Assignment'
+
+    >>> dict.getValue('faux','en')
+    Traceback (most recent call last):
+    ...
+    KeyError: 'Invalid row/column pair'
+
+    >>> dict.queryValue('faux','en', default=u'default')
+    u'default'
+
+    >>> sorted(dict.getKeys())
+    ['assignment', 'essay', 'exam', 'homework', 'journal', 'lab',
+     'presentation', 'project']
+
+As you can see, the option storage also supports multiple languages, though
+only English is currently supported. (Of course, administrators can delete all
+default categories and register new ones in their favorite language.)
+
+
+Activities
+----------
+
+Activities are items that can be graded. In other software they are also
+referred to as assignments or grading items. Activities can be defined for
+courses and sections.
+
+Let's say we have an introductory algebra course:
+
+    >>> from schooltool.course import course
+    >>> alg1 = course.Course('Alg1', 'Algebra 1')
+
+We would like to mandate now that everyone teaching Algebra 1 must give a
+final exam. To do this we get the activities for the course,
+
+    >>> from schooltool.gradebook import interfaces
+    >>> alg1_act = interfaces.IActivities(alg1)
+
+and then add the activity:
+
+    >>> from schooltool.gradebook import activity
+    >>> from schooltool.requirement import scoresystem
+    >>> alg1_act['finalExam'] = activity.Activity(
+    ...     title=u'Final',
+    ...     description=u'Final Exam',
+    ...     category=u'Exam',
+    ...     scoresystem=scoresystem.PercentScoreSystem)
+    >>> final = alg1_act['finalExam']
+
+Besides the title and description, one must also specify the category and the
+score system. The category is used to group similar activities together and
+later facilitate in computing the final grade. The score system is an object
+describing the type of score that can be associated with the activity. In our
+case it will be a percentage.
+
+Now that we have created a course and added activities, let's now add a
+section:
+
+    >>> from schooltool.course import section
+    >>> sectionA = section.Section('Alg1-A')
+    >>> alg1.sections.add(sectionA)
+
+We also want to have some students in the class,
+
+    >>> from schooltool.person import person
+    >>> tom = person.Person('tom', 'Tom Hoffman')
+    >>> sectionA.members.add(tom)
+    >>> paul = person.Person('paul', 'Paul Cardune')
+    >>> sectionA.members.add(paul)
+    >>> claudia = person.Person('claudia', 'Claudia Richter')
+    >>> sectionA.members.add(claudia)
+
+as well as a teacher:
+
+    >>> stephan = person.Person('stephan', 'Stephan Richter')
+    >>> sectionA.instructors.add(stephan)
+
+Now we can add activities to the section using the same API as for the course:
+
+    >>> import datetime
+    >>> sectionA_act = interfaces.IActivities(sectionA)
+    >>> sectionA_act['hw1'] = activity.Activity(
+    ...     title=u'HW 1',
+    ...     description=u'Homework 1',
+    ...     category=u'Assginment',
+    ...     scoresystem=scoresystem.RangedValuesScoreSystem(max=10),
+    ...     date=datetime.date(2006, 2, 10))
+    >>> hw1 = sectionA_act['hw1']
+
+    >>> sectionA_act['hw2'] = activity.Activity(
+    ...     title=u'HW 2',
+    ...     description=u'Homework 2',
+    ...     category=u'Assginment',
+    ...     scoresystem=scoresystem.RangedValuesScoreSystem(max=15),
+    ...     date=datetime.date(2006, 4, 15))
+    >>> hw2 = sectionA_act['hw2']
+
+In this case we create a new score system. This is very typical for those type
+of assignments, since their score commonly varies. There is also an optional
+argument, ``date``, that allows you to specify the date of the activity. This
+can either be interpreted as the due date or the date an exam is taken.
+
+We can also look at the activities that we defined:
+
+    >>> sorted(sectionA_act.items())
+    [('finalExam', InheritedRequirement(<Activity u'Final'>)),
+     ('hw1', <Activity u'HW 1'>), ('hw2', <Activity u'HW 2'>)]
+
+As you can see, the section *always* inherits the activities from the
+course.
+
+
+Evaluations
+-----------
+
+Now that all of our activities have been defined, we can finally enter some
+grades using the gradebook.
+
+    >>> from schooltool.gradebook import interfaces
+    >>> gradebook = interfaces.IGradebook(sectionA)
+
+Let's enter some grades:
+
+    >>> gradebook.evaluate(student=tom, activity=hw1, score=8)
+    >>> gradebook.evaluate(student=paul, activity=hw1, score=10)
+    >>> gradebook.evaluate(student=claudia, activity=hw1, score=7)
+
+    >>> gradebook.evaluate(student=tom, activity=hw2, score=10)
+    >>> gradebook.evaluate(student=paul, activity=hw2, score=12)
+    >>> gradebook.evaluate(student=claudia, activity=hw2, score=14)
+
+    >>> gradebook.evaluate(student=tom, activity=final, score=85)
+    >>> gradebook.evaluate(student=paul, activity=final, score=99)
+    >>> gradebook.evaluate(student=claudia, activity=final, score=90)
+
+Of course there are some safety precautions:
+
+1. You cannot add a grade for someone who is not in the section:
+
+    >>> marius = person.Person('marius', 'Marius Gedminas')
+    >>> gradebook.evaluate(student=marius, activity=final, score=99)
+    Traceback (most recent call last):
+    ...
+    ValueError: Student 'marius' is not in this section.
+
+2. You cannot add a grade for an activity that does not belong to the section:
+
+    >>> hw3 = activity.Activity(
+    ...     title=u'HW 3',
+    ...     category=u'Assginment',
+    ...     scoresystem=scoresystem.RangedValuesScoreSystem(max=10))
+
+    >>> gradebook.evaluate(student=claudia, activity=hw3, score=8)
+    Traceback (most recent call last):
+    ...
+    ValueError: u'HW 3' is not part of this section.
+
+3. You cannot add a grade that is not a valid value of the score system:
+
+    >>> gradebook.evaluate(student=claudia, activity=hw2, score=-8)
+    Traceback (most recent call last):
+    ...
+    ValueError: -8 is not a valid score.
+
+    >>> gradebook.evaluate(student=claudia, activity=hw2, score=16)
+    Traceback (most recent call last):
+    ...
+    ValueError: 16 is not a valid score.
+
+There are a couple more management functions that can be used to maintain the
+evaluations. For example, you can ask whether an evaluation for a particular
+student and activity has been made:
+
+    >>> gradebook.hasEvaluation(student=tom, activity=hw1)
+    True
+
+You can then also delete evaluations:
+
+    >>> gradebook.removeEvaluation(student=tom, activity=hw1)
+    >>> gradebook.hasEvaluation(student=tom, activity=hw1)
+    False
+
+The gradebook also provides a simple, but powerful query function that allows
+you to look up the rows, columns or single cells of the virtual gradebook
+spreadsheet:
+
+    >>> sorted(gradebook.getEvaluationsForStudent(paul),
+    ...        key=lambda x: x[0].title)
+    [(<Activity u'Final'>, <Evaluation for <Activity u'Final'>, value=99>),
+     (<Activity u'HW 1'>, <Evaluation for <Activity u'HW 1'>, value=10>),
+     (<Activity u'HW 2'>, <Evaluation for <Activity u'HW 2'>, value=12>)]
+
+    >>> sorted(gradebook.getEvaluationsForActivity(hw2),
+    ...        key=lambda x: x[0].username)
+    [(<...Person ...>, <Evaluation for <Activity u'HW 2'>, value=14>),
+     (<...Person ...>, <Evaluation for <Activity u'HW 2'>, value=12>),
+     (<...Person ...>, <Evaluation for <Activity u'HW 2'>, value=10>)]
+
+    >>> gradebook.getEvaluation(tom, hw2)
+    <Evaluation for <Activity u'HW 2'>, value=10>
+
+Total score
+~~~~~~~~~~~
+
+Let's calculate the total score for Paul. First we'll verify Paul's
+individual scores:
+
+    >>> sorted(gradebook.getEvaluationsForStudent(paul),
+    ...        key=lambda (activity, evaluation): activity.title)
+    [(<Activity u'Final'>, <Evaluation for <Activity u'Final'>, value=99>),
+     (<Activity u'HW 1'>, <Evaluation for <Activity u'HW 1'>, value=10>),
+     (<Activity u'HW 2'>, <Evaluation for <Activity u'HW 2'>, value=12>)]
+
+Let's review Paul's evaluations. For the Final activity, he received a
+score of 99 out of a 100. For HW 1 he received 10 out of a range of 0
+to 10, and for HW 2 he received a 12 out of a maximum of 15. We first
+convert all these to fractions (a number between 0 and 1) and then
+calculate the final grade as an average of the fractions, and then
+transformed to a percentile.
+
+Let's do the calculation by hand first:
+
+    >>> from decimal import Decimal
+    >>> (Decimal(99) / Decimal(100) + 
+    ...  Decimal(10) / Decimal(10) +
+    ...  Decimal(12) / Decimal(15)) / 3 * 100
+    Decimal("93.00")
+
+We have a method on the gradebook that can do this calculation:
+
+    >>> gradebook.getTotalScoreForStudent(paul)
+    Decimal("93.00")
+
+Tom doesn't have a complete set of grades (the HW 1 grade is missing):
+
+    >>> sorted(gradebook.getEvaluationsForStudent(tom),
+    ...        key=lambda (activity, evaluation): activity.title)
+    [(<Activity u'Final'>, <Evaluation for <Activity u'Final'>, value=85>), 
+     (<Activity u'HW 2'>, <Evaluation for <Activity u'HW 2'>, value=10>)]
+
+The total score will be an average of these scores, and the missing score
+does not count:
+
+    >>> (Decimal(85) / Decimal(100) + 
+    ...  Decimal(10) / Decimal(15)) / 2 * 100
+    Decimal("75.83333333333333333333333335")
+
+Our score calculation method will give us the same result:
+
+    >>> gradebook.getTotalScoreForStudent(tom)
+    Decimal("75.83333333333333333333333335")
+
+Sorting by Column
+~~~~~~~~~~~~~~~~~
+
+Another important feature of the gradebook is to be able to tell the sorting
+rules for the grades table for a particular person. The method to get the
+sorting key is ``getSortKey(person)``. By default the gradebook is sorted by
+the student's title in A-Z:
+
+    >>> gradebook.getSortKey(stephan)
+    ('student', False)
+
+The first element of the returned tuple is the field to sort by. "student" is
+a special field. All other fields are the hash of the activity to be sorted
+by. The second element specifies whether the sorting should be reversed. You
+can set the key using the ``setSortKey(person, (key, reverse))`` method:
+
+    >>> gradebook.setSortKey(stephan, ('student', True))
+    >>> gradebook.getSortKey(stephan)
+    ('student', True)
+
+    >>> gradebook.setSortKey(stephan, ('-234', False))
+    >>> gradebook.getSortKey(stephan)
+    ('-234', False)
+
+And that's it. The gradebook itself will not interpret the sorting key any
+further. It is up to the view code to implement the rest of the sorting
+feature. This is because the view code can often be much more efficient in
+implement ordering.
+
+Statistics
+----------
+
+The gradebook comes also with a simple statistics package. The statistics are
+an adapter of the gradebook:
+
+    >>> statistics = interfaces.IStatistics(gradebook)
+
+You can now calculate the basic statistics:
+
+- The average grade of an activity:
+
+    >>> statistics.calculateAverage(hw2)
+    Decimal("12")
+
+  Of course, if there are no grades, the average cannot be computed:
+
+    >>> gradebook.removeEvaluation(student=paul, activity=hw1)
+    >>> gradebook.removeEvaluation(student=claudia, activity=hw1)
+    >>> statistics.calculateAverage(hw1) is None
+    True
+
+- The average grade as a percentage:
+
+    >>> statistics.calculatePercentAverage(hw2)
+    Decimal("80.0")
+    >>> statistics.calculatePercentAverage(hw1) is None
+    True
+
+- The median of an activity:
+
+    >>> statistics.calculateMedian(hw2)
+    Decimal("12")
+    >>> statistics.calculateMedian(hw1) is None
+    True
+
+- The standard deviation of an activity:
+
+    >>> statistics.calculateStandardDeviation(hw2)
+    Decimal("2.0")
+
+  Of course, we can only compute the standard deviation and variance, if we
+  have at least 2 values:
+
+    >>> statistics.calculateStandardDeviation(hw1) is None
+    True
+    >>> gradebook.evaluate(student=tom, activity=hw1, score=8)
+    >>> statistics.calculateStandardDeviation(hw1) is None
+    True
+
+- The variance of the activity:
+
+    >>> statistics.calculateVariance(hw2)
+    Decimal("4")
+    >>> statistics.calculateVariance(hw1) is None
+    True
+
+Okay, that's pretty much it. The statistics represent computations on the
+columns of the virtual spreadsheets. To make meaningful computations for the
+rows -- in other words computing the final grade of a student -- we need to
+work a little bit harder.
+
+
+Weight Scales
+-------------
+
+To be done later.


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,24 @@
+# Make a package
+
+def registerTestSetup():
+    from schooltool.testing import registry
+
+    def addDefaultCategories(app):
+        class FauxEvent(object):
+            object = app
+        from schooltool.gradebook import category
+        category.addDefaultCategoriesToApplication(FauxEvent())
+    registry.register('DefaultCategories', addDefaultCategories)
+
+registerTestSetup()
+del registerTestSetup
+
+def makeDecimalARock():
+    # XXX this is insecure
+    from decimal import Decimal
+    from zope.security.checker import NoProxy
+    import zope.security
+    zope.security.checker.BasicTypes[Decimal] = NoProxy
+
+makeDecimalARock()
+del makeDecimalARock


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/activity.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/activity.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/activity.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,93 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Activity implementation
+
+$Id: activity.py 5991 2006-04-27 16:57:46Z faassen $
+"""
+__docformat__ = 'reStructuredText'
+
+import datetime
+import zope.interface
+from zope import annotation
+
+from schooltool import SchoolToolMessage as _
+from schooltool.requirement import requirement
+from schooltool.traverser import traverser
+from schooltool.gradebook import interfaces
+
+ACTIVITIES_KEY = 'schooltool.gradebook.activities'
+
+class Activities(requirement.Requirement):
+    zope.interface.implements(interfaces.IActivities)
+
+
+class Activity(requirement.Requirement):
+    zope.interface.implements(interfaces.IActivity)
+
+    def __init__(self, title, category, scoresystem,
+                 description=None, date=None):
+        super(Activity, self).__init__(title)
+        self.description = description
+        self.category = category
+        self.scoresystem = scoresystem
+        if not date:
+            date = datetime.date.today()
+        self.date = date
+
+    def __repr__(self):
+        return '<%s %r>' %(self.__class__.__name__, self.title)
+
+def getCourseActivities(context):
+    '''IAttributeAnnotatable object to IActivities adapter.'''
+    annotations = annotation.interfaces.IAnnotations(context)
+    try:
+        return annotations[ACTIVITIES_KEY]
+    except KeyError:
+        activities = Activities(_('Activities'))
+        annotations[ACTIVITIES_KEY] = activities
+        zope.app.container.contained.contained(
+            activities, context, 'activities')
+        return activities
+
+# Convention to make adapter introspectable
+getCourseActivities.factory = Activities
+
+
+def getSectionActivities(context):
+    '''IAttributeAnnotatable object to IActivities adapter.'''
+    annotations = annotation.interfaces.IAnnotations(context)
+    try:
+        return annotations[ACTIVITIES_KEY]
+    except KeyError:
+        activities = Activities(_('Activities'))
+        # Make sure that the sections activities include all the activities of
+        # the courses as well
+        for course in context.courses:
+            activities.addBase(getCourseActivities(course))
+        annotations[ACTIVITIES_KEY] = activities
+        zope.app.container.contained.contained(
+            activities, context, 'activities')
+        return activities
+
+# Convention to make adapter introspectable
+getSectionActivities.factory = Activities
+
+# HTTP pluggable traverser plugin
+ActivitiesTraverserPlugin = traverser.AdapterTraverserPlugin(
+    'activities', interfaces.IActivities)


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/activity.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,616 @@
+=============
+The Gradebook
+=============
+
+There are many tasks that are involved in setting up and using a
+gradebook. The first task the administrator has to complete during the
+SchoolTool setup is the configuration of the categories. So let's log in as a
+manager:
+
+    >>> from zope.testbrowser.testing import Browser
+
+    >>> manager = Browser()
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+    >>> manager.getLink('Log In').click()
+    >>> manager.getControl('Username').value = 'manager'
+    >>> manager.getControl('Password').value = 'schooltool'
+    >>> manager.getControl('Log in').click()
+
+
+Initial School Setup
+--------------------
+
+We now go to the top and enter the category management page:
+
+    >>> manager.getLink('SchoolTool').click()
+    >>> manager.getLink('Activity Categories').click()
+
+As you can see, there are already several categories pre-defined. Oftentimes,
+those categories do not work for a school. Either you do not need some and/or
+others are missing. So let's start by deleting a couple of categories:
+
+    >>> 'essay' in manager.contents
+    True
+    >>> 'journal' in manager.contents
+    True
+
+    >>> manager.getControl(name='field.categories:list').value = [
+    ...     'essay', 'journal', 'homework', 'presentation']
+    >>> manager.getControl('Remove').click()
+
+    >>> 'essay' in manager.contents
+    False
+    >>> 'journal' in manager.contents
+    False
+
+Next, we add a new category:
+
+    >>> 'Lab Report' in manager.contents
+    False
+
+    >>> manager.getControl('New Category').value = 'Lab Report'
+    >>> manager.getControl('Add').click()
+
+    >>> 'Lab Report' in manager.contents
+    True
+
+We can also change the default category:
+
+    >>> manager.getControl('Default Category').value
+    ['assignment']
+
+    >>> manager.getControl('Default Category').value = ['exam']
+    >>> manager.getControl('Change').click()
+
+    >>> manager.getControl('Default Category').value
+    ['exam']
+
+Next the administrator defines the courses that are available in the school.
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('New Course').click()
+    >>> manager.getControl('Title').value = 'Physics I'
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('Physics I').click()
+
+In this particular case, the school also wants to mandate that the teacher
+always has to write a final exam in Physics I. In terms of SchoolTool this
+means that we need to add an activity:
+
+    >>> manager.getLink('Activities').click()
+
+    >>> manager.getLink('New Activity').click()
+    >>> manager.getControl('Title').value = 'Final'
+    >>> manager.getControl('Description').value = 'Final Exam'
+    >>> manager.getControl('Category').value = ['exam']
+    >>> manager.getControl(
+    ...     name='field.scoresystem.existing').value = ['100 Points']
+    >>> manager.getControl('Add').click()
+
+    >>> 'Final' in manager.contents
+    True
+
+This completes the initial school setup.
+
+
+Term Setup
+----------
+
+Every term, the administrators of a school are going to setup sections. So
+let's add a section for our course:
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('Physics I').click()
+
+    >>> manager.getLink('New Section').click()
+    >>> manager.getControl('Code').value = 'PHYI-1'
+    >>> manager.getControl('Description').value = 'Section 1'
+    >>> manager.getControl('Add').click()
+
+But what would a section be without some students and a teacher?
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Paul Cardune', 'paul', 'pwd', groups=['students'])
+    >>> addPerson('Tom Hoffman', 'tom', 'pwd', groups=['students'])
+    >>> addPerson('Claudia Richter', 'claudia', 'pwd', groups=['students'])
+    >>> addPerson('Stephan Richter', 'stephan', 'pwd', groups=['teachers'])
+
+Now we can add those people to the section:
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('Physics I').click()
+    >>> manager.getLink('(PHYI-1)').click()
+
+    >>> manager.getLink('edit individuals').click()
+    >>> manager.getControl('Paul Cardune').click()
+    >>> manager.getControl('Tom Hoffman').click()
+    >>> manager.getControl('Claudia Richter').click()
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('PHYI-1').click()
+
+    >>> 'Paul Cardune' in manager.contents
+    True
+
+    >>> manager.getLink('edit instructors').click()
+    >>> manager.getControl('Stephan Richter').click()
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Cancel').click()
+
+
+Instructor should be automatically capable of manipulating activities
+and other section data.
+
+Gradbook Management
+-------------------
+
+Once the term started, the instructor of the section will add more activities:
+
+    >>> stephan = Browser()
+    >>> stephan.open('http://localhost/')
+    >>> stephan.getLink('Log In').click()
+    >>> stephan.getControl('Username').value = 'stephan'
+    >>> stephan.getControl('Password').value = 'pwd'
+    >>> stephan.getControl('Log in').click()
+
+    >>> stephan.getLink('SchoolTool').click()
+    >>> stephan.getLink('Courses').click()
+    >>> stephan.getLink('Physics I').click()
+    >>> stephan.getLink('(PHYI-1)').click()
+    >>> stephan.getLink('Activities').click()
+
+Note that the final is already listed:
+
+      >>> 'Final' in stephan.contents
+      True
+
+    >>> stephan.getLink('New Activity').click()
+    >>> stephan.getControl('Title').value = 'HW 1'
+    >>> stephan.getControl('Description').value = 'Homework 1'
+    >>> stephan.getControl('Category').value = ['assignment']
+    >>> stephan.getControl(
+    ...     name='field.scoresystem.existing').value = ['100 Points']
+    >>> stephan.getControl('Add').click()
+    >>> 'HW 1' in stephan.contents
+    True
+
+    >>> stephan.getLink('New Activity').click()
+    >>> stephan.getControl('Title').value = 'HW 2'
+    >>> stephan.getControl('Description').value = 'Homework 2'
+    >>> stephan.getControl('Category').value = ['assignment']
+    >>> stephan.getControl(
+    ...     name='field.scoresystem.existing').value = ['100 Points']
+    >>> stephan.getControl('Add').click()
+    >>> 'HW 2' in stephan.contents
+    True
+
+But, oh, we really did not want to make Homework 2 out of a hundred points,
+but only out of 50. So let's edit it:
+
+    >>> stephan.getLink('HW 2').click()
+    >>> stephan.getControl('Custom score system').click()
+    >>> stephan.getControl('Maximum').value = '50'
+    >>> stephan.getControl('Apply').click()
+
+    >>> stephan.getControl('Maximum').value
+    '50'
+    >>> stephan.getLink('Activities').click()
+
+Now that we have all our activities setup, we would like to rearrange their
+order more logically. The final should really be at the end of the list. In
+the browser you should usually just select the new position and some
+Javascript would submit the form. Since Javascript is not working in the
+tests, we submit, the form manually:
+
+    >>> stephan.open(stephan.url+'?form-submitted=&pos.Activity=3')
+    >>> stephan.contents.find('HW 1') \
+    ...     < stephan.contents.find('HW 2') \
+    ...     < stephan.contents.find('Final')
+    True
+
+Also note that the final cannot be edited, since it is inherited:
+
+    >>> stephan.getLink('Final')
+    Traceback (most recent call last):
+    ...
+    LinkNotFoundError
+
+    >>> stephan.getLink('HW 1')
+    <Link text='HW 1' url='.../sections/phyi1/activities/Activity-2'>
+
+Finally, you can also delete activities that you have locally created:
+
+    >>> stephan.getLink('New Activity').click()
+    >>> stephan.getControl('Title').value = 'HW 3'
+    >>> stephan.getControl('Description').value = 'Homework 3'
+    >>> stephan.getControl('Category').value = ['assignment']
+    >>> stephan.getControl(
+    ...     name='field.scoresystem.existing').value = ['100 Points']
+    >>> stephan.getControl('Add').click()
+    >>> 'HW 3' in stephan.contents
+    True
+
+    >>> stephan.getControl(name='delete:list').value = ['Activity-4']
+    >>> stephan.getControl('Delete').click()
+    >>> 'HW 3' in stephan.contents
+    False
+
+
+Grading
+-------
+
+Now that we have both, students and activities, we can enter the gradebook.
+
+    >>> stephan.getLink('SchoolTool').click()
+    >>> stephan.getLink('Courses').click()
+    >>> stephan.getLink('Physics I').click()
+    >>> stephan.getLink('(PHYI-1)').click()
+    >>> stephan.getLink('Gradebook').click()
+
+The initial gradebook screen is a simple spreadsheet. In order to prevent
+accidental score submission, we do not allow to enter grades in this
+table. Instead you select a row (student), column (activity) or cell (student,
+activity) to enter the scores.
+
+
+Entering Scores for a Row (Student)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Let's say we want to enter the grades for Claudia. All we do is to simply
+click on her name:
+
+    >>> stephan.getLink('Claudia Richter').click()
+
+Now we just enter the grades:
+
+    >>> stephan.getControl('Final').value = u'93'
+    >>> stephan.getControl('HW 1').value = u'87'
+    >>> stephan.getControl('HW 2').value = u'56'
+
+    >>> stephan.getControl('Update').click()
+
+But since I entered an invlaid value for Homework 2, we get an error message:
+
+    >>> 'The grade 56 for activity HW 2 is not valid.' in stephan.contents
+    True
+
+Also note that all the other entered values should be retained:
+
+    >>> 'value="93"' in stephan.contents
+    True
+    >>> 'value="87"' in stephan.contents
+    True
+    >>> 'value="56"' in stephan.contents
+    True
+
+    >>> stephan.getControl('HW 2').value = u'36'
+    >>> stephan.getControl('Update').click()
+
+The screen will return to the grade overview, where the grades are no visible:
+
+    >>> '>93<' in stephan.contents
+    True
+    >>> '>87<' in stephan.contents
+    True
+    >>> '>36<' in stephan.contents
+    True
+
+Now let's enter again and change a grade:
+
+    >>> stephan.getLink('Claudia Richter').click()
+    >>> stephan.getControl('HW 2').value = u'46'
+    >>> stephan.getControl('Update').click()
+
+    >>> '>46<' in stephan.contents
+    True
+
+When you want to delete an evaluation altogether, simply blank the value:
+
+    >>> stephan.getLink('Claudia Richter').click()
+    >>> stephan.getControl('HW 2').value = u''
+    >>> stephan.getControl('Update').click()
+
+    >>> '>46<' in stephan.contents
+    False
+
+Of course, you can also abort the grading.
+
+    >>> stephan.getLink('Claudia Richter').click()
+    >>> stephan.getControl('Cancel').click()
+    >>> stephan.url
+    'http://localhost/sections/phyi1/gradebook/index.html'
+
+
+Entering Scores for a Column (Activity)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Let's say we want to enter the grades for Homework 1. All we do is to simply
+click on the activity's name:
+
+    >>> stephan.getLink('HW 1').click()
+
+Now we just enter the grades. Since Claudia has already a grade, we only need
+to grade Paul and Tom:
+
+    >>> stephan.getControl('Paul Cardune').value = u'190'
+    >>> stephan.getControl('Tom Hoffman').value = u'82'
+
+    >>> stephan.getControl('Update').click()
+
+Again, we entered an invalid value, this time for Paul:
+
+    >>> 'The grade 190 for Paul Cardune is not valid.' in stephan.contents
+    True
+
+Also note that all the other entered values should be retained:
+
+    >>> 'value="190"' in stephan.contents
+    True
+    >>> 'value="82"' in stephan.contents
+    True
+    >>> 'value="87"' in stephan.contents
+    True
+
+    >>> stephan.getControl('Paul Cardune').value = u'90'
+    >>> stephan.getControl('Update').click()
+
+The screen will return to the grade overview, where the grades are now
+visible:
+
+    >>> '>90<' in stephan.contents
+    True
+    >>> '>82<' in stephan.contents
+    True
+    >>> '>87<' in stephan.contents
+    True
+
+Now let's enter again and change a grade:
+
+    >>> stephan.getLink('HW 1').click()
+    >>> stephan.getControl('Claudia Richter').value = u'98'
+    >>> stephan.getControl('Update').click()
+
+    >>> '>98<' in stephan.contents
+    True
+
+When you want to delete an evaluation altogether, simply blank the value:
+
+    >>> stephan.getLink('HW 1').click()
+    >>> stephan.getControl('Claudia Richter').value = u''
+    >>> stephan.getControl('Update').click()
+
+    >>> '>98<' in stephan.contents
+    False
+
+Of course, you can also abort the grading.
+
+    >>> stephan.getLink('HW 1').click()
+    >>> stephan.getControl('Cancel').click()
+    >>> stephan.url
+    'http://localhost/sections/phyi1/gradebook/index.html'
+
+
+Entering Scores for a Cell (Student, Activity)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When you click directly on the grade, you can also edit it. Let's day that we
+want to modify Claudia's Homework 2 grade. Until now she had a 76:
+
+    >>> stephan.getLink('90').click()
+
+The screen that opens gives you several pieces of information, such as the
+student's name,
+
+    >>> 'Paul Cardune' in stephan.contents
+    True
+
+the activity name,
+
+    >>> 'HW 1' in stephan.contents
+    True
+
+the (due) date of the activity,
+
+    # Cannot show the value because it is variable
+    >>> '(Due) Date' in stephan.contents
+    True
+
+the last modification date,
+
+    # Cannot show the value because it is variable
+    >>> 'Modification Date' in stephan.contents
+    True
+
+and the maximum score:
+
+    >>> '100' in stephan.contents
+    True
+
+This for also allows you to delete the evaluation, which is sometimes
+necessary:
+
+    >>> stephan.getControl('Grade').value
+    '90'
+    >>> stephan.getControl('Delete').click()
+    >>> stephan.getControl('Grade').value
+    ''
+
+Now let's enter a new grade:
+
+    >>> stephan.getControl('Grade').value = '86'
+    >>> stephan.getControl('Update').click()
+
+    >>> stephan.url
+    'http://localhost/sections/phyi1/gradebook/index.html'
+    >>> '>86<' in stephan.contents
+    True
+
+Of course, you can also cancel actions:
+
+    >>> stephan.getLink('86').click()
+    >>> stephan.getControl('Grade').value = '66'
+    >>> stephan.getControl('Cancel').click()
+
+    >>> stephan.url
+    'http://localhost/sections/phyi1/gradebook/index.html'
+    >>> '>86<' in stephan.contents
+    True
+
+
+Statistics
+~~~~~~~~~~
+
+On the bottom of the gradebook, there are several statistical values for each
+activity. Let's clear all Homework 1 grades to see the effects:
+
+    >>> stephan.getLink('HW 1').click()
+    >>> stephan.getControl('Claudia Richter').value = u''
+    >>> stephan.getControl('Paul Cardune').value = u''
+    >>> stephan.getControl('Tom Hoffman').value = u''
+    >>> stephan.getControl('Update').click()
+
+If there are no grades, all statistical values should not be available:
+
+    >>> print stephan.contents
+    <BLANKLINE>
+    ...
+    <tr class="Statistic">
+      <td class="name">Average</td>
+      <td class="value">N/A</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Percent Average</td>
+      <td class="value">N/A</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Median</td>
+      <td class="value">N/A</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Standard Deviation</td>
+      <td class="value">N/A</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Variance</td>
+      <td class="value">N/A</td>
+      ...
+    </tr>
+    ...
+
+If I add a grade for Claudia, then the first statistics should show. Note that
+the standard deviation and variance cannot be computed, since there are no
+degrees of freedom.
+
+    >>> stephan.getLink('HW 1').click()
+    >>> stephan.getControl('Claudia Richter').value = u'80'
+    >>> stephan.getControl('Update').click()
+
+    >>> print stephan.contents
+    <BLANKLINE>
+    ...
+    <tr class="Statistic">
+      <td class="name">Average</td>
+      <td class="value">80</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Percent Average</td>
+      <td class="value">80.0</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Median</td>
+      <td class="value">80</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Standard Deviation</td>
+      <td class="value">N/A</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Variance</td>
+      <td class="value">N/A</td>
+      ...
+    </tr>
+    ...
+
+Once more than one grade is entered, all statistics show:
+
+    >>> stephan.getLink('HW 1').click()
+    >>> stephan.getControl('Paul Cardune').value = u'70'
+    >>> stephan.getControl('Tom Hoffman').value = u'90'
+    >>> stephan.getControl('Update').click()
+
+    >>> print stephan.contents
+    <BLANKLINE>
+    ...
+    <tr class="Statistic">
+      <td class="name">Average</td>
+      <td class="value">80</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Percent Average</td>
+      <td class="value">80.0</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Median</td>
+      <td class="value">80</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Standard Deviation</td>
+      <td class="value">10.0</td>
+      ...
+    </tr>
+    <tr class="Statistic">
+      <td class="name">Variance</td>
+      <td class="value">100</td>
+      ...
+    </tr>
+    ...
+
+
+Sorting
+~~~~~~~
+
+Another feature of the gradebook is the ability to sort each column in a
+descending and ascending fashion. By default the student's name is sorted
+alphabetically:
+
+    >>> stephan.contents.find('Claudia') \
+    ...     < stephan.contents.find('Paul') \
+    ...     < stephan.contents.find('Tom')
+    True
+
+Once I click on the name sort button (again), the order is reversed:
+
+    >>> stephan.getLink(url='sort_by=student').click()
+    >>> stephan.contents.find('Claudia') \
+    ...     > stephan.contents.find('Paul') \
+    ...     > stephan.contents.find('Tom')
+    True
+
+Then we want to sort by grade in Homework 1, so we should have:
+
+    >>> import re
+    >>> url = re.compile('.*sort_by=-?[0-9]+')
+    >>> stephan.getLink(url=url).click()
+    >>> stephan.contents.find('Paul') \
+    ...     < stephan.contents.find('Claudia') \
+    ...     < stephan.contents.find('Tom')
+    True
+
+Clicking it again, reverses the order:
+
+    >>> stephan.getLink(url=url).click()
+    >>> stephan.contents.find('Paul') \
+    ...     > stephan.contents.find('Claudia') \
+    ...     > stephan.contents.find('Tom')
+    True


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activities_overview.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activities_overview.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activities_overview.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,55 @@
+<tal:define define="dummy view/update"/>
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Activities</title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    i18n:translate="">Activities</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="activities view/activities">
+  <form method="post"
+        tal:attributes="action string:${context/@@absolute_url}">
+    <input type="hidden" name="form-submitted" value="" />
+    <div tal:repeat="activity activities">
+      <select name=""
+              onchange="this.form.submit()"
+              tal:attributes="name string:pos.${activity/name}">
+        <tal:block repeat="num view/positions">
+          <option value="1"
+              tal:condition="python:num != activity['pos']"
+              tal:attributes="value num"
+              tal:content="num" />
+          <option value="1" selected="selected"
+              tal:condition="python:num == activity['pos']"
+              tal:attributes="value num"
+              tal:content="num" />
+        </tal:block>
+      </select>
+      <input type="checkbox" name="delete:list" disabled=""
+             tal:attributes="value activity/name;
+                             disabled activity/disabled" />
+
+      <a tal:condition="not:activity/inherited"
+         tal:content="activity/title"
+         tal:attributes="href activity/url">Inherited Activity</a>
+
+      <span tal:condition="activity/inherited">
+        <span tal:content="activity/title">Inherited Activity</span>
+        <span i18n:translate="">(inherited)</span>
+      </span>
+
+    </div>
+    <div class="controls">
+      <input type="submit" class="button-cancel" name="DELETE" value="Delete"
+             i18n:attributes="value delete-button;" />
+    </div>
+  </form>
+
+  <p tal:condition="not:activities" i18n:translate="">There are none.</p>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activities_overview.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activity.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activity.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activity.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,71 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Activity Views.
+
+$Id: activity.py 5773 2006-02-23 17:20:41Z faassen $
+"""
+from zope.app import zapi
+from schooltool.app.browser import app
+from schooltool.gradebook import interfaces
+from schooltool.requirement import requirement
+
+class ActivitiesView(object):
+    """A Group Container view."""
+
+    __used_for__ = interfaces.IActivities
+
+    def activities(self):
+        pos = 0
+        for activity in self.context.values():
+            pos += 1
+            inherited = False
+            if zapi.isinstance(activity, requirement.InheritedRequirement):
+                inherited = True
+                activity = requirement.unwrapRequirement(activity)
+            yield {'name': zapi.name(activity),
+                   'title': activity.title,
+                   'inherited': inherited,
+                   'disabled': inherited and 'disabled' or '',
+                   'url': zapi.absoluteURL(activity, self.request),
+                   'pos': pos}
+
+    def positions(self):
+        return range(1, len(self.context)+1)
+
+    def update(self):
+        if 'DELETE' in self.request:
+            for name in self.request.get('delete', []):
+                del self.context[name]
+        elif 'form-submitted' in self.request:
+            old_pos = 0
+            for activity in self.context.values():
+                old_pos += 1
+                name = zapi.name(activity)
+                if 'pos.'+name not in self.request:
+                    continue
+                new_pos = int(self.request['pos.'+name])
+                if new_pos != old_pos:
+                    self.context.changePosition(name, new_pos-1)
+
+class ActivityAddView(app.BaseAddView):
+    """A view for adding an activity."""
+
+
+class ActivityEditView(app.BaseEditView):
+    """A view for editing activity info."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/activity.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/categories.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/categories.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/categories.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Manage Activity Categories
+  </title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <form action="." method="post" tal:attributes="action request/URL"
+        class="standalone" enctype="multipart/form-data">
+
+    <h3 i18n:translate="">
+      Manage Activity Categories
+    </h3>
+
+    <div class="info" tal:condition="view/message" tal:content="view/message"
+          i18n:translate="" />
+
+    <div class="row" tal:define="widget nocall:view/categories_widget">
+      <div metal:use-macro="context/@@form_macros/widget_row" />
+    </div>
+
+    <div class="controls">
+        <input type="submit" class="button-ok" name="REMOVE" value="Remove"
+               i18n:attributes="value remove-button" />
+    </div>
+
+    <div class="row" tal:define="widget nocall:view/newCategory_widget">
+      <div metal:use-macro="context/@@form_macros/widget_row" />
+    </div>
+
+    <div class="controls">
+        <input type="submit" class="button-ok" name="ADD" value="Add"
+               i18n:attributes="value add-button;" />
+    </div>
+
+    <div class="row" tal:define="widget nocall:view/defaultCategory_widget">
+      <div metal:use-macro="context/@@form_macros/widget_row" />
+    </div>
+
+    <div class="controls">
+        <input type="submit" class="button-ok" name="CHANGE" value="Change"
+               i18n:attributes="value change-button;" />
+    </div>
+  </form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/categories.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/category.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/category.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/category.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,87 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Category Views
+
+$Id: category.py 5640 2006-01-16 19:20:50Z srichter $
+"""
+__docformat__ = 'reStructuredText'
+
+import zope.interface
+import zope.schema
+from zope.app.form import utility
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app import app
+from schooltool.gradebook import category
+
+
+def getKey(name):
+    name = name.replace(' ', '')
+    name = name.lower()
+    return name.encode('utf-8')
+
+class ICategoriesForm(zope.interface.Interface):
+    """Schema for the form."""
+
+    categories = zope.schema.Set(
+        title=_('Categories'),
+        value_type=zope.schema.Choice(
+            vocabulary="schooltool.gradebook.categories")
+        )
+
+    newCategory = zope.schema.TextLine(
+        title=_("New Category"))
+
+    defaultCategory = zope.schema.Choice(
+        title=_("Default Category"),
+        vocabulary="schooltool.gradebook.categories")
+
+
+class CategoryOverview(object):
+
+    message = None
+
+    def __init__(self, context, request):
+        self.categories = category.getCategories(app.getSchoolToolApplication())
+        super(CategoryOverview, self).__init__(context, request)
+
+    def getData(self):
+        return {'categories': [],
+                'newCategory': '',
+                'defaultCategory': self.categories.getDefaultKey()}
+
+    def update(self):
+        if 'REMOVE' in self.request:
+            keys = utility.getWidgetsData(
+                self, ICategoriesForm, names=['categories'])['categories']
+            for key in keys:
+                self.categories.delValue(key, 'en')
+            self.message = _('Categories successfully deleted.')
+
+        elif 'ADD' in self.request:
+            value = utility.getWidgetsData(
+                self, ICategoriesForm, names=['newCategory'])['newCategory']
+            self.categories.addValue(getKey(value), 'en', value)
+            self.message = _('Category successfully added.')
+
+        elif 'CHANGE' in self.request:
+            key = utility.getWidgetsData(self, ICategoriesForm,
+                names=['defaultCategory'])['defaultCategory']
+            self.categories.setDefaultKey(key)
+            self.message = _('Default category successfully changed.')


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/category.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,153 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/browser"
+    xmlns:zope="http://namespaces.zope.org/zope">
+
+  <!-- Categories -->
+
+  <form
+      label="Activity Categories"
+      name="categories.html"
+      schema=".category.ICategoriesForm"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      template="categories.pt"
+      class=".category.CategoryOverview"
+      permission="schooltool.edit"
+      />
+
+  <configure package="schooltool.skin">
+
+    <navigationViewlet
+        name="categories"
+        for="*"
+        manager="schooltool.skin.INavigationManager"
+        template="templates/navigationViewlet.pt"
+        class="schooltool.skin.NavigationViewlet"
+        permission="schooltool.view"
+        link="categories.html"
+        title="Activity Categories"
+        order="200"
+        />
+
+  </configure>
+
+  <!-- Activities -->
+
+  <configure package="schooltool.skin">
+
+    <addform
+        label="Add an Activity"
+        name="addActivity.html"
+        schema="schooltool.gradebook.interfaces.IActivity"
+        fields="title description category scoresystem"
+        arguments="title category scoresystem"
+        content_factory="schooltool.gradebook.activity.Activity"
+        permission="schooltool.edit"
+        template="templates/simple_add.pt"
+        class="schooltool.gradebook.browser.activity.ActivityAddView">
+      <widget field="description" height="5" />
+    </addform>
+
+    <editform
+        label="Edit Activity"
+        name="edit.html"
+        for="schooltool.gradebook.interfaces.IActivity"
+        schema="schooltool.gradebook.interfaces.IActivity"
+        fields="title description category scoresystem"
+        permission="schooltool.edit"
+        template="templates/simple_edit.pt"
+        class="schooltool.gradebook.browser.activity.ActivityEditView"
+        menu="schooltool_actions"
+        title="Edit"
+        />
+
+  </configure>
+
+  <page
+      name="index.html"
+      for="..interfaces.IActivities"
+      class=".activity.ActivitiesView"
+      template="activities_overview.pt"
+      permission="schooltool.view"
+      />
+
+  <defaultView
+      for="..interfaces.IActivity"
+      name="edit.html"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="Activities"
+      for="schooltool.course.interfaces.ICourse"
+      action="activities/index.html"
+      permission="schooltool.view"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="Activities"
+      for="schooltool.course.interfaces.ISection"
+      action="activities/index.html"
+      permission="schooltool.view"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="Activities"
+      for="..interfaces.IGradebook"
+      action="../activities/index.html"
+      permission="schooltool.view"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="New Activity"
+      for="..interfaces.IActivities"
+      action="+/addActivity.html"
+      permission="schooltool.edit"
+      />
+
+  <!-- Gradebook -->
+
+  <page
+      name="index.html"
+      for="..interfaces.IGradebook"
+      class=".gradebook.GradebookOverview"
+      template="gradebook_overview.pt"
+      permission="schooltool.view"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="Gradebook"
+      for="schooltool.course.interfaces.ISection"
+      action="gradebook/index.html"
+      permission="schooltool.view"
+      />
+
+  <page
+      name="gradeStudent.html"
+      for="..interfaces.IGradebook"
+      class=".gradebook.GradeStudent"
+      template="gradebook_grade_student.pt"
+      permission="schooltool.edit"
+      />
+
+  <page
+      name="gradeActivity.html"
+      for="..interfaces.IGradebook"
+      class=".gradebook.GradeActivity"
+      template="gradebook_grade_activity.pt"
+      permission="schooltool.edit"
+      />
+
+  <page
+      name="grade.html"
+      for="..interfaces.IGradebook"
+      class=".gradebook.Grade"
+      template="gradebook_grade.pt"
+      permission="schooltool.edit"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.attendance" />
+  <include package="schooltool.requirement" />
+  <include package="schooltool.gradebook" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.gradebook.
+
+$Id: ftests.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+import os
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+gradebook_functional_layer = ZCMLLayer(filename,
+                                       __name__,
+                                       'gradebook_functional_layer')
+
+def test_suite():
+    return collect_ftests(layer=gradebook_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,312 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Gradebook Views
+
+$Id: gradebook.py 5677 2006-01-23 13:39:14Z srichter $
+"""
+__docformat__ = 'reStructuredText'
+import zope.schema
+from zope.security import proxy
+from zope.app import zapi
+from zope.app.keyreference.interfaces import IKeyReference
+
+from schooltool.app import app
+from schooltool.gradebook import interfaces
+from schooltool.person.interfaces import IPerson
+from schooltool.requirement.scoresystem import UNSCORED
+from schooltool import SchoolToolMessage as _
+
+
+class GradebookOverview(object):
+    """Gradebook Overview/Table"""
+
+    def update(self):
+        """Retrieve sorting information and store changes of it."""
+        person = IPerson(self.request.principal)
+        if 'sort_by' in self.request:
+            sort_by = self.request['sort_by']
+            key, reverse = self.context.getSortKey(person)
+            if sort_by == key:
+                reverse = not reverse
+            else:
+                reverse=False
+            self.context.setSortKey(person, (sort_by, reverse))
+        self.sortKey = self.context.getSortKey(person)
+
+    def activities(self):
+        """Get  a list of all activities."""
+        result = [
+            {'title': activity.title,
+             'max':activity.scoresystem.getBestScore(),
+             'hash': hash(IKeyReference(activity))}
+            for activity in self.context.activities]
+        return result
+
+    def table(self):
+        """Generate the table of grades."""
+        activities = [(hash(IKeyReference(activity)), activity)
+                      for activity in self.context.activities]
+        gradebook = proxy.removeSecurityProxy(self.context)
+        rows = []
+        for student in self.context.students:
+            grades = []
+            for act_hash, activity in activities:
+                ev = gradebook.getEvaluation(student, activity)
+                if ev is not None:
+                    grades.append({'activity': act_hash, 'value': ev.value})
+                else:
+                    grades.append({'activity': act_hash, 'value': '-'})
+
+            rows.append(
+                {'student': {'title': student.title, 'id': student.username},
+                 'grades': grades})
+
+        # Do the sorting
+        key, reverse = self.sortKey
+        def generateKey(row):
+            if key != 'student':
+                grades = dict([(str(grade['activity']), grade['value'])
+                               for grade in row['grades']])
+                return grades.get(key, row['student']['title'])
+            return row['student']['title']
+
+        return sorted(rows, key=generateKey, reverse=reverse)
+
+    def statistics(self):
+        """Calculate various statistical quantities for all activities."""
+        statistics = interfaces.IStatistics(self.context)
+        activities = self.context.activities
+        decimal = self.request.locale.numbers.getFormatter('decimal')
+        percent = self.request.locale.numbers.getFormatter('decimal')
+        stats = [
+            {'name': _('Average'), 'formatter': decimal,
+             'function': statistics.calculateAverage, 'values': []},
+            {'name': _('Percent Average'), 'formatter': percent,
+             'function': statistics.calculatePercentAverage, 'values': []},
+            {'name': _('Median'), 'formatter': decimal,
+             'function': statistics.calculateMedian, 'values': []},
+            {'name': _('Standard Deviation'), 'formatter': decimal,
+             'function': statistics.calculateStandardDeviation, 'values': []},
+            {'name': _('Variance'), 'formatter': decimal,
+             'function': statistics.calculateVariance, 'values': []},
+            ]
+        for act in activities:
+            for stat in stats:
+                value = stat['function'](act)
+                if not value:
+                    stat['values'].append(_('N/A'))
+                else:
+                    stat['values'].append(stat['formatter'].format(value))
+        return stats
+
+class GradeStudent(object):
+    """Grading a single student."""
+
+    message = ''
+
+    @property
+    def student(self):
+        id = self.request['student']
+        school = app.getSchoolToolApplication()
+        return school['persons'][id]
+
+    @property
+    def activities(self):
+        return [
+            {'title': activity.title,
+             'max': activity.scoresystem.getBestScore(),
+             'hash': hash(IKeyReference(activity))}
+            for activity in self.context.activities]
+
+    def grades(self):
+        activities = [(hash(IKeyReference(activity)), activity)
+                      for activity in self.context.activities]
+        student = self.student
+        gradebook = proxy.removeSecurityProxy(self.context)
+        for act_hash, activity in activities:
+            ev = gradebook.getEvaluation(student, activity)
+            value = self.request.get(str(act_hash))
+            if ev is not None and ev.value is not UNSCORED:
+                yield {'activity': act_hash, 'value': value or ev.value}
+            else:
+                yield {'activity': act_hash, 'value': value or ''}
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            self.request.response.redirect('index.html')
+
+        elif 'UPDATE_SUBMIT' in self.request:
+            student = self.student
+            evaluator = zapi.getName(IPerson(self.request.principal))
+            gradebook = proxy.removeSecurityProxy(self.context)
+            # Iterate through all activities
+            for activity in self.context.activities:
+                # Create a hash and see whether it is in the request
+                act_hash = str(hash(IKeyReference(activity)))
+                if act_hash in self.request:
+
+                    # If a value is present, create an evaluation, if the
+                    # score is different
+                    try:
+                        score = activity.scoresystem.fromUnicode(
+                            self.request[act_hash])
+                    except (zope.schema.ValidationError, ValueError):
+                        self.message = _(
+                            'The grade $value for activity $name is not valid.',
+                            mapping={'value': self.request[act_hash],
+                                     'name': activity.title})
+                        return
+                    ev = gradebook.getEvaluation(student, activity)
+                    # Delete the score
+                    if ev is not None and score is UNSCORED:
+                        self.context.removeEvaluation(student, activity)
+                    # Do nothing
+                    elif ev is None and score is UNSCORED:
+                        continue
+                    # Replace the score or add new one/
+                    elif ev is None or score != ev.value:
+                        self.context.evaluate(
+                            student, activity, score, evaluator)
+
+            self.request.response.redirect('index.html')
+
+
+class GradeActivity(object):
+    """Grading a single activity"""
+
+    message = ''
+
+    @property
+    def activity(self):
+        if hasattr(self, '_activity'):
+            return self._activity
+        act_hash = int(self.request['activity'])
+        for activity in self.context.activities:
+            if hash(IKeyReference(activity)) == act_hash:
+                self._activity = activity
+                return activity
+
+    @property
+    def grades(self):
+        gradebook = proxy.removeSecurityProxy(self.context)
+        for student in self.context.students:
+            ev = gradebook.getEvaluation(student, self.activity)
+            value = self.request.get(student.username)
+            if ev is not None:
+                value = value or ev.value
+            else:
+                value = value or ''
+
+            yield {'student': {'title': student.title, 'id': student.username},
+                   'value': value}
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            self.request.response.redirect('index.html')
+
+        elif 'UPDATE_SUBMIT' in self.request:
+            activity = self.activity
+            evaluator = zapi.getName(IPerson(self.request.principal))
+            gradebook = proxy.removeSecurityProxy(self.context)
+            # Iterate through all students
+            for student in self.context.students:
+                id = student.username
+                if id in self.request:
+
+                    # If a value is present, create an evaluation, if the
+                    # score is different
+                    try:
+                        score = activity.scoresystem.fromUnicode(
+                            self.request[id])
+                    except (zope.schema.ValidationError, ValueError):
+                        self.message = _(
+                            'The grade $value for $name is not valid.',
+                            mapping={'value': self.request[id],
+                                     'name': student.title})
+                        return
+                    ev = gradebook.getEvaluation(student, activity)
+                    # Delete the score
+                    if ev is not None and score is UNSCORED:
+                        self.context.removeEvaluation(student, activity)
+                    # Do nothing
+                    elif ev is None and score is UNSCORED:
+                        continue
+                    # Replace the score or add new one/
+                    elif ev is None or score != ev.value:
+                        self.context.evaluate(
+                            student, activity, score, evaluator)
+
+            self.request.response.redirect('index.html')
+
+
+class Grade(object):
+    """Grading a specific activity for a student."""
+
+    @property
+    def student(self):
+        id = self.request['student']
+        school = app.getSchoolToolApplication()
+        return school['persons'][id]
+
+    @property
+    def activity(self):
+        if hasattr(self, '_activity'):
+            return self._activity
+        act_hash = int(self.request['activity'])
+        for activity in self.context.activities:
+            if hash(IKeyReference(activity)) == act_hash:
+                self._activity = activity
+                return activity
+
+    @property
+    def activityInfo(self):
+        formatter = self.request.locale.dates.getFormatter('date', 'short')
+        return {'title': self.activity.title,
+                'date': formatter.format(self.activity.date),
+                'maxScore': self.activity.scoresystem.getBestScore()}
+
+    @property
+    def evaluationInfo(self):
+        formatter = self.request.locale.dates.getFormatter('dateTime', 'short')
+        gradebook = proxy.removeSecurityProxy(self.context)
+        ev = gradebook.getEvaluation(self.student, self.activity)
+        if ev is not None:
+            return {'value': ev.value,
+                    'time': formatter.format(ev.time)}
+        else:
+            return {'value': '', 'time': ''}
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            self.request.response.redirect('index.html')
+
+        elif 'DELETE' in self.request:
+            self.context.removeEvaluation(self.student, self.activity)
+
+        elif 'UPDATE_SUBMIT' in self.request:
+            evaluator = zapi.getName(IPerson(self.request.principal))
+
+            score = self.activity.scoresystem.fromUnicode(self.request['grade'])
+            gradebook = proxy.removeSecurityProxy(self.context)
+            ev = gradebook.getEvaluation(self.student, self.activity)
+            if ev is None or score != ev.value:
+                self.context.evaluate(
+                    self.student, self.activity, score, evaluator)
+
+            self.request.response.redirect('index.html')


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,75 @@
+<tal:tag condition="view/update" />
+<html metal:use-macro="context/@@standard_macros/page"
+      i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Gradebook
+  </title>
+</head>
+<body>
+<div metal:fill-slot="body">
+
+  <h3 i18n:translate="">
+    Grade
+  </h3>
+  <br />
+
+  <form tal:attributes="action request/URL"
+        method="post" enctype="multipart/form-data">
+
+    <input type="hidden" name="activity" value=""
+           tal:attributes="value request/activity" />
+
+    <input type="hidden" name="student" value=""
+           tal:attributes="value request/student" />
+
+    <table border="1">
+      <tr>
+       <th i18n:translate="">Student Name</th>
+       <th i18n:translate="">Activity Name</th>
+       <th i18n:translate="">(Due) Date</th>
+       <th i18n:translate="">Modification Date</th>
+       <th><label for="grade" i18n:translate="">Grade</label></th>
+       <th i18n:translate="">Max. Score</th>
+     </tr>
+     <tr tal:define="activity view/activityInfo;
+                     evaluation view/evaluationInfo;
+                     student view/student">
+       <td tal:content="student/title">
+         Tom Hoffman
+       </td>
+       <td tal:content="activity/title">
+         Homework 1
+       </td>
+       <td tal:content="activity/date">
+         January 5, 2006
+       </td>
+       <td tal:content="evaluation/time">
+         January
+       </td>
+       <td>
+         <input type="text" id="grade" name="grade" value="" size="4"
+             tal:attributes="value evaluation/value" />
+       </td>
+       <td tal:content="activity/maxScore">
+         100
+       </td>
+     </tr>
+    </table>
+
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Update"
+             title="Shortcut: Alt-U" accesskey="U"
+             i18n:attributes="value update-button; accesskey" />
+      <input type="submit" class="button-ok" name="DELETE" value="Delete"
+             title="Shortcut: Alt-D" accesskey="D"
+             i18n:attributes="value update-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+
+  </form>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_activity.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_activity.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_activity.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,69 @@
+<tal:tag condition="view/update" />
+<html metal:use-macro="context/@@standard_macros/page"
+      i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Gradebook
+  </title>
+</head>
+<body>
+<div metal:fill-slot="body">
+
+  <h3 i18n:translate="">
+    Grade <span tal:replace="view/activity/title" i18n:name="name" />
+  </h3>
+  <br />
+
+  <div class="message"
+       tal:condition="view/message"
+       tal:content="view/message"
+       i18n:translate="">
+    Message
+  </div>
+
+  <form tal:attributes="action request/URL"
+        method="post" enctype="multipart/form-data">
+
+    <input type="hidden" name="activity" value=""
+           tal:attributes="value request/activity" />
+
+    <table border="1">
+      <tr>
+       <th i18n:translate="">Name</th>
+       <th tal:define="activity view/activity">
+         <div tal:content="activity/title">
+           HW 1
+         </div>
+         <div tal:content="activity/max|nothing" />
+       </th>
+     </tr>
+     <tr tal:repeat="grade view/grades">
+       <td>
+         <label for=""
+             tal:attributes="for grade/student/id"
+             tal:content="grade/student/title">
+           Tom Hoffman
+         </label>
+       </td>
+       <td>
+         <input type="text" name="" value="" size="4"
+             tal:attributes="name grade/student/id;
+                             id grade/student/id;
+                             value grade/value" />
+       </td>
+     </tr>
+    </table>
+
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Update"
+             title="Shortcut: Alt-U" accesskey="U"
+             i18n:attributes="value update-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+
+  </form>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_activity.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_student.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_student.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_student.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,65 @@
+<tal:tag condition="view/update" />
+<html metal:use-macro="context/@@standard_macros/page"
+      i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Gradebook
+  </title>
+</head>
+<body>
+<div metal:fill-slot="body">
+
+  <h3 i18n:translate="">
+    Grade <span tal:replace="view/student/title" i18n:name="name" />
+  </h3>
+  <br />
+
+  <div class="message"
+       tal:condition="view/message"
+       tal:content="view/message"
+       i18n:translate="">
+    Message
+  </div>
+
+  <form tal:attributes="action request/URL"
+        method="post" enctype="multipart/form-data">
+
+    <input type="hidden" name="student" value=""
+           tal:attributes="value request/student" />
+
+    <table border="1">
+      <tr>
+       <th i18n:translate="">Activity</th>
+       <th tal:repeat="activity view/activities">
+         <label for=""
+                tal:attributes="for activity/hash"
+                tal:content="activity/title">
+           HW 1
+         </label>
+         <div tal:content="activity/max" />
+       </th>
+     </tr>
+     <tr>
+       <td>Grade</td>
+       <td tal:repeat="grade view/grades">
+         <input type="text" name="" value="" size="4"
+             tal:attributes="name grade/activity;
+                             id grade/activity;
+                             value grade/value" />
+       </td>
+     </tr>
+    </table>
+
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Update"
+             title="Shortcut: Alt-U" accesskey="U"
+             i18n:attributes="value update-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+
+  </form>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_grade_student.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_overview.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_overview.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_overview.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,69 @@
+<tal:tag condition="view/update" />
+<html metal:use-macro="context/@@standard_macros/page"
+      i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Gradebook
+  </title>
+</head>
+<body>
+<div metal:fill-slot="body">
+
+  <table class="grades" border="1">
+    <tr>
+     <th>
+       <div i18n:translate="">Name</div>
+       <a href="?sort_by=student" i18n:translate="">(sort)</a>
+     </th>
+     <th tal:repeat="activity view/activities">
+       <div>
+         <a href=""
+            tal:attributes="href
+                string:gradeActivity.html?activity=${activity/hash}"
+            tal:content="activity/title">
+           HW 1
+         </a>
+       </div>
+       <a href="?sort_by="
+          tal:attributes="href
+              string:${request/URL}?sort_by=${activity/hash}"
+          i18n:translate="">
+         (sort)
+       </a>
+       <div tal:content="activity/max" />
+     </th>
+    </tr>
+    <tr tal:repeat="row view/table">
+      <td>
+        <a href=""
+           tal:attributes="href
+               string:gradeStudent.html?student=${row/student/id}"
+           tal:content="row/student/title">
+          Tom Hoffman
+        </a>
+      </td>
+      <td tal:repeat="grade row/grades">
+        <a href=""
+           tal:attributes="href
+        string:grade.html?student=${row/student/id}&activity=${grade/activity}"
+           tal:content="grade/value" />
+      </td>
+    </tr>
+    <tr class="Statistic" tal:repeat="stat view/statistics">
+      <td class="name"
+          tal:content="stat/name"
+          i18n:translate="">
+        Quantity
+      </td>
+      <td class="value"
+          tal:repeat="value stat/values"
+          tal:content="value"
+          i18n:translate="">
+        50.0 %
+      </td>
+    </tr>
+  </table>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/browser/gradebook_overview.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/category.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/category.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/category.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,69 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Activity Category
+
+$Id: category.py 5982 2006-04-27 14:25:47Z faassen $
+"""
+__docformat__ = 'reStructuredText'
+
+from zope.interface import classProvides
+from zope.schema.interfaces import IVocabularyFactory
+
+import optionstorage
+from optionstorage import vocabulary, interfaces
+from schooltool.app import app
+from schooltool import SchoolToolMessage as _
+
+VOCABULARY_NAME = 'schooltool.gradebook.activities'
+
+class CategoryVocabulary(optionstorage.vocabulary.OptionStorageVocabulary):
+    """Activity Categories Vocabulary"""
+
+    classProvides(IVocabularyFactory)
+
+    def __init__(self, context=None, name=None):
+        st = app.getSchoolToolApplication()
+        if name is None:
+            name = VOCABULARY_NAME
+        self.dict = optionstorage.queryOptionStorage(st, name)
+        # TODO: Only support English for now.
+        self.language = 'en'
+        self.defaultlanguage = self.dict.getDefaultLanguage()
+
+
+def getCategories(app):
+    """Return the option dictionary for the categories."""
+    storage = optionstorage.interfaces.IOptionStorage(app)
+    if VOCABULARY_NAME not in storage:
+        storage[VOCABULARY_NAME] = optionstorage.OptionDict()
+    return storage[VOCABULARY_NAME]
+
+
+def addDefaultCategoriesToApplication(event):
+    dict = getCategories(event.object)
+    dict.addValue('assignment', 'en', _('Assignment'))
+    dict.addValue('essay', 'en', _('Essay'))
+    dict.addValue('exam', 'en', _('Exam'))
+    dict.addValue('homework', 'en', _('Homework'))
+    dict.addValue('journal', 'en', _('Journal'))
+    dict.addValue('lab', 'en', _('Lab'))
+    dict.addValue('presentation', 'en', _('Presentation'))
+    dict.addValue('project', 'en', _('Project'))
+    dict.setDefaultLanguage('en')
+    dict.setDefaultKey('assignment')


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/category.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,167 @@
+<?xml version="1.0"?>
+<configure
+    xmlns:security="http://schooltool.org/securitypolicy"
+    xmlns="http://namespaces.zope.org/zope">
+
+  <!-- Category Vocabulary -->
+
+  <utility
+      provides="zope.schema.interfaces.IVocabularyFactory"
+      component="schooltool.gradebook.category.CategoryVocabulary"
+      name="schooltool.gradebook.categories"
+      />
+
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".category.addDefaultCategoriesToApplication"
+      />
+
+  <!-- Activity Adapters -->
+
+  <adapter
+      for="schooltool.course.interfaces.ICourse"
+      provides=".interfaces.IActivities"
+      factory=".activity.getCourseActivities"
+      trusted="true"
+      />
+
+  <adapter
+      for="schooltool.course.interfaces.ISection"
+      provides=".interfaces.IActivities"
+      factory=".activity.getSectionActivities"
+      trusted="true"
+      />
+
+  <!-- Activity Content and Security -->
+
+  <class class=".activity.Activities">
+    <allow interface="zope.interface.common.mapping.IReadMapping" />
+    <require
+        permission="schooltool.view"
+        attributes="keys __iter__ values items __len__ addBase removeBase title"
+        />
+    <require
+        permission="schooltool.edit"
+        interface="zope.interface.common.mapping.IWriteMapping"
+        set_schema=".interfaces.IActivities"
+        attributes="changePosition"
+        />
+  </class>
+
+  <class class=".activity.Activity">
+    <allow interface="zope.interface.common.mapping.IReadMapping" />
+    <require
+        permission="schooltool.view"
+        attributes="keys __iter__ values items __len__
+                    addBase removeBase
+                    title description category scoresystem date"
+        />
+    <require
+        permission="schooltool.edit"
+        interface="zope.interface.common.mapping.IWriteMapping"
+        set_schema=".interfaces.IActivity"
+        />
+  </class>
+
+
+  <!-- Gradebook Adapter -->
+
+  <class class=".gradebook.Gradebook">
+    <require
+        permission="schooltool.view"
+        interface=".interfaces.IReadGradebook" />
+    <require
+        permission="schooltool.edit"
+        interface=".interfaces.IEditGradebook" />
+  </class>
+
+  <!-- This adapter locates itself. -->
+  <adapter
+      for="schooltool.course.interfaces.ISection"
+      provides=".interfaces.IGradebook"
+      factory=".gradebook.Gradebook"
+      trusted="true"
+      />
+
+  <!-- Statistics adapter -->
+
+  <class class=".statistic.Statistics">
+    <require
+        permission="schooltool.view"
+        interface=".interfaces.IStatistics" />
+  </class>
+
+  <adapter
+      for=".interfaces.IGradebook"
+      provides=".interfaces.IStatistics"
+      factory=".statistic.Statistics"
+      locate="true"
+      trusted="true"
+      />
+
+  <adapter
+      for=".interfaces.IGradebook"
+      provides="schooltool.course.interfaces.ISection"
+      factory=".gradebook.getGradebookSection"
+      />
+
+  <!-- Pluggable traverser plugins for HTTP paths -->
+
+  <subscriber
+      for="schooltool.course.interfaces.ISection
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".activity.ActivitiesTraverserPlugin"
+      />
+
+  <subscriber
+      for="schooltool.course.interfaces.ICourse
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".activity.ActivitiesTraverserPlugin"
+      />
+
+  <subscriber
+      for="schooltool.course.interfaces.ISection
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".gradebook.GradebookTraverserPlugin"
+      />
+
+  <!-- apidoc help setup -->
+
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      xmlns:apidoc="http://namespaces.zope.org/apidoc"
+      zcml:condition="have apidoc">
+
+    <apidoc:bookchapter
+        id="gradebook"
+        title="Gradebook API"
+        parent="schooltool"
+        doc_path="README.txt" />
+
+  </configure>
+
+  <include package=".browser" />
+
+  <security:setting
+      key="administration_can_grade_students"
+      text="Administration can grade students"
+      default="False" />
+
+  <security:crowd
+      name="grade_editors"
+      factory=".gradebook.GradebookEditorsCrowd" />
+
+  <security:allow
+      interface="schooltool.gradebook.interfaces.IGradebook"
+      permission="schooltool.view"
+      crowds="administration section_instructors" />
+
+  <security:allow
+      interface="schooltool.gradebook.interfaces.IGradebook"
+      permission="schooltool.edit"
+      crowds="section_instructors grade_editors" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.gradebook" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,175 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Gradebook Implementation
+
+$Id: gradebook.py 6275 2006-06-16 22:10:32Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+import persistent.dict
+
+from decimal import Decimal
+
+import zope.component
+import zope.interface
+from zope.security import proxy
+from zope import annotation
+from zope.app.keyreference.interfaces import IKeyReference
+
+from schooltool import course, requirement
+from schooltool.traverser import traverser
+from schooltool.securitypolicy.crowds import ConfigurableCrowd
+from schooltool.securitypolicy.crowds import AggregateCrowd
+from schooltool.securitypolicy.crowds import ManagersCrowd
+from schooltool.securitypolicy.crowds import ClerksCrowd
+from schooltool.securitypolicy.crowds import AdministratorsCrowd
+
+from schooltool.gradebook import interfaces
+
+GRADEBOOK_SORTING_KEY = 'schooltool.gradebook.sorting'
+
+
+class Gradebook(object):
+
+    zope.interface.implements(interfaces.IGradebook)
+    zope.component.adapts(course.interfaces.ISection)
+
+    def __init__(self, context):
+        self.context = context
+        # To make URL creation happy
+        self.__parent__ = context
+        self.__name__ = 'gradebook'
+        # Make sure we are not having inherited requirements
+        self.activities = []
+        for activity in interfaces.IActivities(context).values():
+            if isinstance(
+                activity, requirement.requirement.InheritedRequirement):
+                activity = activity.original
+            self.activities.append(activity)
+        self.students = list(self.context.members)
+
+    def _checkStudent(self, student):
+        if student not in self.students:
+            raise ValueError(
+                'Student %r is not in this section.' %student.username)
+        # Remove security proxy, so that the object can be referenced and
+        # adapters are not proxied. Note that the gradebook itself has
+        # sufficient tight security.
+        return proxy.removeSecurityProxy(student)
+
+    def _checkActivity(self, activity):
+        if activity not in self.activities:
+            raise ValueError(
+                '%r is not part of this section.' %activity.title)
+        # Remove security proxy, so that the object can be referenced and
+        # adapters are not proxied. Note that the gradebook itself has
+        # sufficient tight security.
+        return proxy.removeSecurityProxy(activity)
+
+    def hasEvaluation(self, student, activity):
+        """See interfaces.IGradebook"""
+        student = self._checkStudent(student)
+        activity = self._checkActivity(activity)
+        if activity in requirement.interfaces.IEvaluations(student):
+            return True
+        return False
+
+    def getEvaluation(self, student, activity, default=None):
+        """See interfaces.IGradebook"""
+        student = self._checkStudent(student)
+        activity = self._checkActivity(activity)
+        evaluations = requirement.interfaces.IEvaluations(student)
+        return evaluations.get(activity, default)
+
+    def evaluate(self, student, activity, score, evaluator=None):
+        """See interfaces.IGradebook"""
+        student = self._checkStudent(student)
+        activity = self._checkActivity(activity)
+        evaluation = requirement.evaluation.Evaluation(
+            activity, activity.scoresystem, score, evaluator)
+        evaluations = requirement.interfaces.IEvaluations(student)
+        evaluations.addEvaluation(evaluation)
+
+    def removeEvaluation(self, student, activity):
+        """See interfaces.IGradebook"""
+        student = self._checkStudent(student)
+        activity = self._checkActivity(activity)
+        evaluations = requirement.interfaces.IEvaluations(student)
+        del evaluations[activity]
+
+    def getEvaluationsForStudent(self, student):
+        """See interfaces.IGradebook"""
+        self._checkStudent(student)
+        evaluations = requirement.interfaces.IEvaluations(student)
+        for activity, evaluation in evaluations.items():
+            if activity in self.activities:
+                yield activity, evaluation
+
+    def getEvaluationsForActivity(self, activity):
+        """See interfaces.IGradebook"""
+        self._checkActivity(activity)
+        for student in self.context.members:
+            evaluations = requirement.interfaces.IEvaluations(student)
+            if activity in evaluations:
+                yield student, evaluations[activity]
+
+    def getTotalScoreForStudent(self, student):
+        """See interfaces.IGradebook"""
+        fractions = [
+            evaluation.scoreSystem.getFractionalValue(evaluation.value)
+            for activity, evaluation in self.getEvaluationsForStudent(student)]
+        return sum(fractions) / Decimal(len(fractions)) * Decimal(100)
+
+    def getSortKey(self, person):
+        person = proxy.removeSecurityProxy(person)
+        ann = annotation.interfaces.IAnnotations(person)
+        if GRADEBOOK_SORTING_KEY not in ann:
+            ann[GRADEBOOK_SORTING_KEY] = persistent.dict.PersistentDict()
+        section_id = hash(IKeyReference(self.context))
+        return ann[GRADEBOOK_SORTING_KEY].get(section_id, ('student', False))
+
+    def setSortKey(self, person, value):
+        person = proxy.removeSecurityProxy(person)
+        ann = annotation.interfaces.IAnnotations(person)
+        if GRADEBOOK_SORTING_KEY not in ann:
+            ann[GRADEBOOK_SORTING_KEY] = persistent.dict.PersistentDict()
+        section_id = hash(IKeyReference(self.context))
+        ann[GRADEBOOK_SORTING_KEY][section_id] = value
+
+
+# HTTP pluggable traverser plugin
+GradebookTraverserPlugin = traverser.AdapterTraverserPlugin(
+    'gradebook', interfaces.IGradebook)
+
+
+def getGradebookSection(gradebook):
+    """Adapt IGradebook to ISection."""
+    return course.interfaces.ISection(gradebook.context)
+
+
+class GradebookEditorsCrowd(AggregateCrowd, ConfigurableCrowd):
+
+    setting_key = 'administration_can_grade_students'
+
+    def crowdFactories(self):
+        return [ManagersCrowd, AdministratorsCrowd, ClerksCrowd]
+
+    def contains(self, principal):
+        """Return the value of the related setting (True or False)."""
+        return (ConfigurableCrowd.contains(self, principal) and
+                AggregateCrowd.contains(self, principal))


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/gradebook.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,139 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Gradebook interfaces
+
+$Id: interfaces.py 6275 2006-06-16 22:10:32Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+
+import zope.interface
+from schooltool.requirement import interfaces, scoresystem
+from schooltool import SchoolToolMessage as _
+
+
+class IActivities(interfaces.IRequirement):
+    '''A list of activities that must be fulfilled in a course or section.'''
+
+
+class IActivity(interfaces.IRequirement):
+    '''An activity to be graded'''
+
+    description = zope.schema.Text(
+        title=_("Description"),
+        description=_("A detailed description of the activity."),
+        required=False)
+
+    category = zope.schema.Choice(
+        title=_("Category"),
+        description=_("The activity category"),
+        vocabulary="schooltool.gradebook.categories",
+        required=True)
+
+    scoresystem = scoresystem.ScoreSystemField(
+        title=_("Scoresystem"),
+        description=_("The activity scoresystem."),
+        required=True)
+
+    date = zope.schema.Date(
+        title=_("Date"),
+        description=_("The date the activity was created."),
+        required=True)
+
+
+class IEditGradebook(zope.interface.Interface):
+
+    def evaluate(student, activity, score, evaluator=None):
+        """Evaluate a student for an activity"""
+
+    def removeEvaluation(student, activity):
+        """Remove evaluation."""
+
+
+class IReadGradebook(zope.interface.Interface):
+
+    activities = zope.schema.List(
+        title=_('Activities'),
+        description=_('Activities in this gradebook.'))
+
+    students = zope.schema.List(
+        title=_('Students'),
+        description=_('Students in this gradebook.'))
+
+    def hasEvaluation(student, activity):
+        """Check whether an evaluation exists for a student-activity pair."""
+
+    def getEvaluation(student, activity, default=None):
+        """Get the evaluation of a student for a given activity."""
+
+
+    def getEvaluationsForStudent(student):
+        """Get the evaluations of the section for this student.
+
+        Return iterable of 2-tuples of the form (activity, evaluation).
+        """
+
+    def getEvaluationsForActivity(activity):
+        """Get the evaluations of a particular activity in the section.
+
+        Return iterable of 2-tuples of the form (student, evaluation).
+        """
+
+    def getTotalScoreForStudent(student):
+        """Compute the total score for a student.
+
+        Return a percentile in the form of a decimal.
+        """
+
+    def getSortKey(person):
+        """Get the sortkey for the gradebook table."""
+
+    def setSortKey(person, value):
+        """Set the sortkey for the gradebook table.
+
+        The value is a 2-tuple. The entry in the tuple is either "student" to
+        sort by student title or the hash of the activity. The second entry
+        specifies whether the sorting is reversed.
+        """
+
+
+class IGradebook(IReadGradebook, IEditGradebook):
+    """The gradebook of a section.
+
+    The gradebook provides an API that allows the user to treat it like a
+    gradebook spreadsheet/table.
+    """
+
+
+class IStatistics(zope.interface.Interface):
+    """Statistics for the gradebook"""
+
+    def calculateAverage(activity):
+        """Calculate the average of the activity."""
+
+    def calculatePercentAverage(activity):
+        """Calculate the average as a percentage for the activity."""
+
+    def calculateMedian(activity):
+        """Calculate the median of the activity."""
+
+    def calculateStandardDeviation(activity):
+        """Calculate the standard deviation of the activity."""
+
+    def calculateVariance(activity):
+        """Calculate the variance of the activity."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/statistic.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/statistic.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/statistic.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,102 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Statistics for the gradebook
+
+$Id: statistic.py 5744 2006-02-08 18:35:14Z faassen $
+"""
+__docformat__ = 'reStructuredText'
+import math
+from decimal import Decimal
+import zope.component
+import zope.interface
+
+from schooltool.gradebook import interfaces
+
+
+class Statistics(object):
+    """Statistics adapter for the gradebook.
+
+    This implementation only works with scoresystems that are numerical.
+    """
+    zope.interface.implements(interfaces.IStatistics)
+    zope.component.adapts(interfaces.IGradebook)
+
+    def __init__(self, context):
+        self.context = context
+
+    def calculateAverage(self, activity):
+        """See interfaces.IStatistics"""
+        scores = [ev.scoreSystem.getNumericalValue(ev.value)
+                  for s, ev in self.context.getEvaluationsForActivity(activity)]
+
+        if len(scores) == 0:
+            return None
+
+        return sum(scores)/len(scores)
+
+
+    def calculatePercentAverage(self, activity):
+        """See interfaces.IStatistics"""
+        total = activity.scoresystem.getNumericalValue(
+            activity.scoresystem.getBestScore())
+        avg = self.calculateAverage(activity)
+
+        if avg is None:
+            return None
+
+        return avg/total*100
+
+
+    def calculateMedian(self, activity):
+        """See interfaces.IStatistics"""
+        scores = [ev.scoreSystem.getNumericalValue(ev.value)
+                  for s, ev in self.context.getEvaluationsForActivity(activity)]
+
+        if len(scores) == 0:
+            return None
+
+        scores.sort()
+        return scores[len(scores)/2]
+
+
+    def calculateStandardDeviation(self, activity):
+        """See interfaces.IStatistics"""
+        variance = self.calculateVariance(activity)
+
+        if variance is None:
+            return None
+
+        return Decimal(str(math.sqrt(variance)))
+
+
+    def calculateVariance(self, activity):
+        """See interfaces.IStatistics"""
+        avg = self.calculateAverage(activity)
+
+        if avg is None:
+            return None
+
+        scores = [ev.scoreSystem.getNumericalValue(ev.value)
+                  for s, ev in self.context.getEvaluationsForActivity(activity)]
+        help = [(score - avg)**2 for score in scores]
+
+        if len(scores) == 1:
+            return None
+
+        return sum(help)/(len(scores)-1)


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/statistic.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/gradebook/tests/test_gradebook.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/gradebook/tests/test_gradebook.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/gradebook/tests/test_gradebook.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,75 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Gradebook-related Tests
+
+$Id: test_gradebook.py 5982 2006-04-27 14:25:47Z faassen $
+"""
+import os
+import unittest
+
+import optionstorage
+import zope.component
+import zope.annotation.interfaces
+from zope.testing import doctest, doctestunit
+from zope.app.testing import setup
+
+# Has to be imported before
+import schooltool.app
+import schooltool.requirement.testing
+from schooltool import course, person, requirement
+from schooltool.relationship.tests import setUpRelationships
+from schooltool.gradebook import activity, gradebook, statistic, interfaces
+
+def setUp(test):
+    setup.placefulSetUp()
+    setUpRelationships()
+    schooltool.requirement.testing.setUpEvaluation()
+
+    zope.component.provideAdapter(
+        optionstorage.OptionStorage,
+        (zope.annotation.interfaces.IAnnotatable,),
+        optionstorage.interfaces.IOptionStorage)
+
+    zope.component.provideAdapter(
+        activity.getCourseActivities,
+        (course.interfaces.ICourse,), interfaces.IActivities)
+    zope.component.provideAdapter(
+        activity.getSectionActivities,
+        (course.interfaces.ISection,), interfaces.IActivities)
+
+    zope.component.provideAdapter(gradebook.Gradebook)
+    zope.component.provideAdapter(statistic.Statistics)
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def test_suite():
+    optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS
+    return unittest.TestSuite((
+        doctest.DocFileSuite('../README.txt',
+                             setUp=setUp, tearDown=tearDown,
+                             globs={'pprint': doctestunit.pprint},
+                             optionflags=optionflags),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/gradebook/tests/test_gradebook.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,20 @@
+# Make a package.
+
+def registerTestSetup():
+    from zope.interface import classImplements
+    from schooltool.testing import registry
+
+    def addGroupContainer(app):
+        from schooltool.group import group
+        app['groups'] = group.GroupContainer()
+    registry.register('ApplicationContainers', addGroupContainer)
+
+    def haveCalendar():
+        from schooltool.group import group
+        from schooltool.app.interfaces import IHaveCalendar
+        if not IHaveCalendar.implementedBy(group.Group):
+            classImplements(group.Group, IHaveCalendar)
+    registry.register('CalendarComponents', haveCalendar)
+
+registerTestSetup()
+del registerTestSetup


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,144 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <!-- Group Traverser -->
+  <zope:view
+      for="..interfaces.IBaseGroup"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.publisher.interfaces.browser.IBrowserPublisher"
+      factory="schooltool.traverser.browser.PluggableBrowserTraverser"
+      permission="zope.Public"
+      />
+
+  <configure package="schooltool.skin">
+    <page
+        name="index.html"
+        for="schooltool.group.interfaces.IGroupContainer"
+        class="schooltool.group.browser.group.GroupContainerView"
+        permission="schooltool.view"
+        menu="zmi_views"
+        title="View"
+        />
+
+    <addform
+        label="Add a Group"
+        name="addSchoolToolGroup.html"
+        schema="schooltool.group.interfaces.IGroup"
+        fields="title description"
+        set_before_add="title description"
+        content_factory="schooltool.group.group.Group"
+        permission="schooltool.edit"
+        template="templates/simple_add.pt"
+        class="schooltool.group.browser.group.GroupAddView">
+      <widget field="description" height="5" />
+    </addform>
+
+    <editform
+        for="schooltool.group.interfaces.IGroup"
+        name="edit.html"
+        label="Edit Group Information"
+        schema="schooltool.group.interfaces.IGroup"
+        fields="title description"
+        permission="schooltool.edit"
+        template="templates/simple_edit.pt"
+        class="schooltool.group.browser.group.GroupEditView"
+        menu="schooltool_actions"
+        title="Edit Info"
+        />
+
+    <navigationViewlet
+      name="groups"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.TopLevelContainerNavigationViewlet"
+      permission="schooltool.view"
+      link="groups"
+      title="Groups"
+      order="20"
+      />
+
+  </configure>
+
+  <viewlet
+      name="groupsinfo"
+      for="*"
+      manager="schooltool.person.browser.person.IPersonInfoManager"
+      template="groupsviewlet.pt"
+      class="schooltool.group.browser.group.GroupsViewlet"
+      permission="schooltool.view"
+      order="30"
+      />
+
+  <page
+      name="groups.html"
+      for="..interfaces.IGroupMember"
+      class=".group.GroupListView"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Change Membership"
+      />
+
+  <containerViews
+      for="..interfaces.IGroupContainer"
+      contents="schooltool.view"
+      add="schooltool.edit"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="New Group"
+      for="..interfaces.IGroupContainer"
+      action="+/addSchoolToolGroup.html"
+      />
+
+  <addMenuItem
+      title="SchoolBell Group"
+      description="A Group"
+      class="..group.Group"
+      permission="schooltool.edit"
+      view="addSchoolToolGroup.html"
+      />
+
+  <page
+      name="index.html"
+      for="..interfaces.IGroup"
+      class=".group.GroupView"
+      template="group.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="View"
+      />
+
+  <page
+      name="members_persons.html"
+      for="..interfaces.IBaseGroup"
+      class=".group.MemberViewPersons"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Add/Remove Members"
+      />
+
+  <page
+      name="group-csvimport.html"
+      for="..interfaces.IGroupContainer"
+      class=".csvimport.GroupCSVImportView"
+      template="group-csvimport.pt"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Import Groups"
+      />
+
+  <zope:adapter
+      for="schooltool.group.interfaces.IGroupContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory="schooltool.table.table.IndexedFilterWidget" />
+
+  <zope:adapter
+      for="schooltool.group.interfaces.IGroupContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory="schooltool.table.table.IndexedTableFormatter " />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/browser/csvimport.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/browser/csvimport.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/browser/csvimport.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,60 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+csv importing.
+
+$Id: csvimport.py 6047 2006-05-11 18:31:03Z mg $
+"""
+from schooltool.app.browser.csvimport import BaseCSVImporter, BaseCSVImportView
+from schooltool.group.group import Group
+
+from schooltool import SchoolToolMessage as _
+
+
+class GroupCSVImporter(BaseCSVImporter):
+    """Group CSV Importer"""
+
+    factory = Group
+
+    def createAndAdd(self, data, dry_run=True):
+        """Create objects and add them to the container."""
+
+        if len(data) < 1:
+            self.errors.fields.append(_('Insufficient data provided.'))
+            return
+
+        if not data[0]:
+            self.errors.fields.append(_('Titles may not be empty'))
+            return
+
+        if len(data) > 1:
+            description = data[1]
+        else:
+            description = ''
+
+        obj = self.factory(title=data[0], description=description)
+        name = self.chooser.chooseName('', obj)
+        if not dry_run:
+            self.container[name] = obj
+
+
+class GroupCSVImportView(BaseCSVImportView):
+    """View for Group CSV importer."""
+
+    importer_class = GroupCSVImporter


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/browser/csvimport.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/browser/group-csvimport.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/browser/group-csvimport.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/browser/group-csvimport.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+<tal:defs define="update view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <head>
+    <title metal:fill-slot="title" i18n:translate="">
+      Upload SchoolTool groups as CSV
+    </title>
+  </head>
+  <body>
+
+    <metal:block metal:fill-slot="body">
+
+      <div class="info" tal:condition="view/success">
+        <p i18n:translate=""
+           tal:repeat="msg view/success" tal:content="msg" />
+      </div>
+      <div class="error" tal:condition="view/errors"
+        tal:repeat="err view/errors" tal:content="err" i18n:translate=""/>
+
+      <form method="POST" enctype="multipart/form-data" class="standalone"
+        tal:attributes="action request/URL">
+
+        <h3 i18n:translate="">
+          Import Groups
+        </h3>
+        <p i18n:translate="">
+          CSV data <strong>must</strong> include a group title and
+          <strong>may</strong> include an optional group description.  Any
+          extra information will be discarded.
+        </p>
+        <p i18n:translate="">Example:</p>
+
+<pre i18n:translate="">
+LUG, Linux Users Group
+Chess Club
+Sports Club, After-school sports club, <em>text after a second comma</em>
+</pre>
+        <p i18n:translate="">
+          The above example will create 3 groups titled 'LUG', 'Chess Club' and
+          'Sports Club'.  The first and last group will have the descriptions
+          'Linux Users Group' and 'After-school sports club' respectively.  The
+          'Chess Club' group will have no description, and the extra "text
+          after a second comma" text on the third group will be ignored.
+        </p>
+
+        <fieldset>
+          <legend i18n:translate="">Upload CSV File</legend>
+          <div class="row">
+            <label for="csvfile" i18n:translate="">CSV File</label>
+            <input id="csvfile" type="file" name="csvfile"/>
+          </div>
+
+          <div class="row">
+            <tal:block i18n:translate="">Charset:</tal:block>
+            <select name="charset">
+              <option value="UTF-8" i18n:translate="">Unicode (UTF-8)</option>
+              <option value="ISO-8859-1" i18n:translate="">Western (ISO-8859-1)</option>
+              <option value="ISO-8859-15" i18n:translate="">Western (ISO-8859-15)</option>
+              <option value="Windows-1252" i18n:translate="">Western (Windows-1252)</option>
+              <option value="other" i18n:translate="">Other (please specify)</option>
+            </select>
+          </div>
+          <div class="row" i18n:translate="">
+            Other charset: <input name="other_charset" type="text" i18n:name="other_charset" />
+          </div>
+        </fieldset>
+        <fieldset>
+          <legend i18n:translate="">Input CSV Data</legend>
+          <label for="csvtext" i18n:translate="">CSV Data</label>
+          <textarea name="csvtext" id="csvtext" cols="50" rows="10"></textarea>
+        </fieldset>
+        <div class="controls">
+          <input name="UPDATE_SUBMIT" class="button-ok" type="submit"
+                 value="Submit" i18n:attributes="value submit-button" />
+        </div>
+      </form>
+    </metal:block>
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/browser/group-csvimport.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/browser/group.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/browser/group.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/browser/group.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="context/title" />
+</head>
+<body>
+<h1 metal:fill-slot="content-header"><span tal:replace="context/title" /></h1>
+
+<metal:block metal:fill-slot="body">
+
+  <tal:block replace="structure context/@@notes|nothing"/>
+
+  <div class="group-info">
+    <p class="description" tal:content="context/description"/>
+
+    <div tal:define="members view/getPersons" class="info-block">
+      <h5 i18n:translate="">Members</h5>
+      <ul tal:condition="members">
+        <li tal:repeat="obj members/sorted_filter_accessible:title">
+          <a tal:attributes="href obj/@@absolute_url" tal:content="obj/title" />
+        </li>
+      </ul>
+
+      <a class="modify" href=""
+         title="Change the people who are members of this group."
+         tal:attributes="href string:${context/@@absolute_url}/@@members_persons.html"
+         i18n:attributes="title"
+         i18n:translate="">
+         edit members
+      </a>
+    </div>
+  </div>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/browser/group.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/browser/group.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/browser/group.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/browser/group.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,119 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+group views.
+
+$Id: group.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+from zope.security import checkPermission
+from zope.publisher.browser import BrowserView
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.skin.containers import TableContainerView
+from schooltool.app.browser.app import BaseAddView, BaseEditView
+from schooltool.person.interfaces import IPerson
+from schooltool.course.interfaces import ISection
+from schooltool.resource.interfaces import IResource
+
+from schooltool.group.interfaces import IGroupMember
+from schooltool.group.interfaces import IGroupContainer, IGroupContained
+from schooltool.app.browser.app import RelationshipViewBase
+
+
+class GroupContainerView(TableContainerView):
+    """A Group Container view."""
+
+    __used_for__ = IGroupContainer
+
+    index_title = _("Group index")
+
+
+class GroupListView(RelationshipViewBase):
+    """View for managing groups that a person or a resource belongs to."""
+
+    __used_for__ = IGroupMember
+
+    @property
+    def title(self):
+        return _("Groups of ${person}", mapping={'person': self.context.title})
+    current_title = _("Current Groups")
+    available_title = _("Available Groups")
+
+    def getSelectedItems(self):
+        """Return a list of groups the current user is a member of."""
+        return [group for group in self.context.groups
+                if not ISection.providedBy(group)]
+
+    def getAvailableItemsContainer(self):
+        return ISchoolToolApplication(None)['groups']
+
+    def getCollection(self):
+        return self.context.groups
+
+
+class GroupView(BrowserView):
+    """A Group info view."""
+
+    __used_for__ = IGroupContained
+
+    def getPersons(self):
+        # XXX should use table views
+        return filter(IPerson.providedBy, self.context.members)
+
+
+class MemberViewPersons(RelationshipViewBase):
+    """View class for adding / removing members to / from a group."""
+
+    __used_for__ = IGroupContained
+
+    @property
+    def title(self):
+        return _("Members of ${group}", mapping={'group': self.context.title})
+    current_title = _("Current Members")
+    available_title = _("Add Members")
+
+    def getSelectedItems(self):
+        """Return a list of current group memebers."""
+        return filter(IPerson.providedBy, self.context.members)
+
+    def getAvailableItemsContainer(self):
+        return ISchoolToolApplication(None)['persons']
+
+    def getCollection(self):
+        return self.context.members
+
+
+class GroupAddView(BaseAddView):
+    """A view for adding a group."""
+
+
+class GroupEditView(BaseEditView):
+    """A view for editing group info."""
+
+    __used_for__ = IGroupContained
+
+
+class GroupsViewlet(BrowserView):
+    """A viewlet showing the groups a person is in."""
+
+    def memberOf(self):
+        """Seperate out generic groups from sections."""
+        return [group for group in self.context.groups if
+                not ISection.providedBy(group)]


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/browser/group.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/browser/groupsviewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/browser/groupsviewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/browser/groupsviewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,21 @@
+<div class="info-block person-groups"
+     tal:define="groups view/memberOf"
+     i18n:domain="schooltool">
+  <h5 i18n:translate="">Groups</h5>
+  <ul tal:condition="groups">
+    <tal:loop repeat="group groups/sorted_filter_accessible:title">
+      <li>
+        <a title=""
+          tal:attributes="href group/@@absolute_url;
+          title group/description|group/title"
+          tal:content="group/title"></a>
+      </li>
+    </tal:loop>
+  </ul>
+  <a class="modify" href="" title="Manage this person's memberships"
+     tal:attributes="href string:${context/@@absolute_url}/@@groups.html"
+     i18n:attributes="title"
+     i18n:translate="">
+     edit groups
+  </a>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/browser/groupsviewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/browser/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/browser/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/browser/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,545 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for group views.
+
+$Id: tests.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+import unittest
+
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.traversing.interfaces import IContainmentRoot
+from zope.component import provideAdapter
+
+from schooltool.app.browser.testing import setUp, tearDown
+from schooltool.testing import setup
+
+
+def doctest_GroupListView():
+    r"""Test for GroupListView
+
+    We will need a volunteer for this test:
+
+        # XXX: Should use stub
+        >>> from schooltool.person.person import Person
+        >>> person = Person(u'ignas')
+
+    One requirement: the person has to know where he is.
+
+        >>> app = setup.setUpSchoolToolSite()
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> provideAdapter(lambda context: app, (None,), ISchoolToolApplication)
+        >>> app['persons']['ignas'] = person
+
+    We will be testing the person's awareness of the world, so we will
+    create some (empty) groups.
+
+        >>> from schooltool.group.group import Group
+        >>> world = app['groups']['the_world'] = Group("Others")
+        >>> etria = app['groups']['etria'] = Group("Etria")
+        >>> pov = app['groups']['pov'] = Group("PoV")
+        >>> canonical = app['groups']['canonical'] = Group("Canonical")
+        >>> ms = app['groups']['ms'] = Group("The Enemy")
+
+    And we need a table formatter to display our groups:
+
+        >>> from schooltool.table.table import SchoolToolTableFormatter
+        >>> from schooltool.table.interfaces import ITableFormatter
+        >>> from zope.publisher.interfaces.browser import IBrowserRequest
+        >>> provideAdapter(SchoolToolTableFormatter, (None, IBrowserRequest), ITableFormatter)
+
+    Let's create a view for a person:
+
+        >>> from schooltool.group.browser.group import GroupListView
+        >>> request = TestRequest()
+        >>> view = GroupListView(person, request)
+        >>> view.filter = lambda l: l
+
+    Rendering the view does no harm:
+
+        >>> view.update()
+
+    First, all groups the person is not a member of should be listed:
+
+        >>> sorted([g.title for g in view.getAvailableItems()])
+        ['Canonical', 'Etria', 'Others', 'PoV', 'The Enemy']
+
+    As well as all groups the person is currently a member of:
+
+        >>> sorted([g.title for g in view.getSelectedItems()])
+        []
+
+    Let's tell the person to join PoV:
+
+        >>> request = TestRequest()
+        >>> request.form = {'add_item.pov': 'on', 'ADD_ITEMS': 'Apply'}
+        >>> view = GroupListView(person, request)
+        >>> view.filter = lambda l: l
+        >>> view.update()
+
+    He should have joined:
+
+        >>> [group.title for group in person.groups]
+        ['PoV']
+
+    Had we decided to make the guy join Etria but then changed our mind:
+
+        >>> request = TestRequest()
+        >>> request.form = {'remove_item.pov': 'on', 'add_group.etria': 'on',
+        ...                 'CANCEL': 'Cancel'}
+        >>> view = GroupListView(person, request)
+        >>> view.filter = lambda l: l
+        >>> view.update()
+
+    Nothing would have happened!
+
+        >>> [group.title for group in person.groups]
+        ['PoV']
+
+    Yet we would find ourselves in the person info page:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/persons/ignas'
+
+    Finally, let's remove him out of PoV for a weekend and add him
+    to The World.
+
+        >>> request = TestRequest()
+        >>> request.form = {'remove_item.pov': 'on', 'REMOVE_ITEMS': 'Apply'}
+        >>> view = GroupListView(person, request)
+        >>> view.filter = lambda l: l
+        >>> view.update()
+
+    Mission successful:
+
+        >>> [group.title for group in person.groups]
+        []
+
+    """
+
+
+def doctest_MemberListView():
+    r"""Test for MemberListView
+
+    We will be (ab)using a group and three test subjects:
+
+        >>> from schooltool.group.group import Group
+        >>> pov = Group('PoV')
+
+        # XXX: Use stub implementation
+        >>> from schooltool.person.person import Person
+        >>> gintas = Person('gintas', 'Gintas')
+        >>> ignas = Person('ignas', 'Ignas')
+        >>> alga = Person('alga', 'Albertas')
+
+    We need these objects to live in an application:
+
+        >>> app = setup.setUpSchoolToolSite()
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> provideAdapter(lambda context: app, (None,), ISchoolToolApplication)
+        >>> app['groups']['pov'] = pov
+        >>> app['persons']['gintas'] = gintas
+        >>> app['persons']['ignas'] = ignas
+        >>> app['persons']['alga'] = alga
+
+    And we need a table formatter to display our persons:
+
+        >>> from schooltool.table.table import SchoolToolTableFormatter
+        >>> from schooltool.table.interfaces import ITableFormatter
+        >>> from zope.publisher.interfaces.browser import IBrowserRequest
+        >>> provideAdapter(SchoolToolTableFormatter, (None, IBrowserRequest), ITableFormatter)
+
+    Let's create a view for our group:
+
+        >>> from schooltool.group.browser.group import MemberViewPersons
+        >>> request = TestRequest()
+        >>> view = MemberViewPersons(pov, request)
+        >>> view.filter = lambda l: l
+
+    Rendering the view does no harm:
+
+        >>> view.update()
+
+    First, all persons should be listed (the page template puts them in
+    alphabetical order later):
+
+        >>> sorted([g.title for g in view.getAvailableItems()])
+        ['Albertas', 'Gintas', 'Ignas']
+
+    Let's make Ignas a member of PoV:
+
+        >>> request = TestRequest()
+        >>> request.form = {'add_item.ignas': 'on', 'ADD_ITEMS': 'Apply'}
+        >>> view = MemberViewPersons(pov, request)
+        >>> view.filter = lambda l: l
+        >>> view.update()
+
+    He should have joined:
+
+        >>> sorted([person.title for person in pov.members])
+        ['Ignas']
+
+    We can cancel an action if we want to:
+
+        >>> request = TestRequest()
+        >>> request.form = {'add_item.gintas': 'on', 'CANCEL': 'Cancel'}
+        >>> view = MemberViewPersons(pov, request)
+        >>> view.filter = lambda l: l
+        >>> view.update()
+        >>> sorted([person.title for person in pov.members])
+        ['Ignas']
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/groups/pov'
+
+    Let's remove Ignas from PoV (he went home early today);
+
+        >>> request = TestRequest()
+        >>> request.form = {'remove_item.ignas': 'on', 'REMOVE_ITEMS': 'Apply'}
+        >>> view = MemberViewPersons(pov, request)
+        >>> view.filter = lambda l: l
+        >>> view.update()
+
+    and add Albert, who came in late and has to work after-hours:
+
+        >>> request = TestRequest()
+        >>> request.form = {'add_item.alga': 'on', 'ADD_ITEMS': 'Apply'}
+        >>> view = MemberViewPersons(pov, request)
+        >>> view.filter = lambda l: l
+        >>> view.update()
+
+    Mission accomplished:
+
+        >>> sorted([person.title for person in pov.members])
+        ['Albertas']
+
+    Click 'Done' when we are finished and we go back to the group view
+
+        >>> request = TestRequest()
+        >>> request.form = {'CANCEL': 'Cancel'}
+        >>> view = MemberViewPersons(pov, request)
+        >>> view.filter = lambda l: l
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/groups/pov'
+
+    TODO: check resource view
+
+    """
+
+
+def doctest_GroupView():
+    r"""Test for GroupView
+
+    Let's create a view for a group:
+
+        >>> from schooltool.group.browser.group import GroupView
+        >>> from schooltool.group.group import Group
+        >>> group = Group()
+        >>> request = TestRequest()
+        >>> view = GroupView(group, request)
+
+    Let's relate some objects to our group:
+
+        >>> from schooltool.person.person import Person
+        >>> group.members.add(Person(title='First'))
+        >>> group.members.add(Person(title='Last'))
+        >>> group.members.add(Person(title='Intermediate'))
+
+    A person list from that view should be sorted by title.
+
+        >>> titles = [person.title for person in view.getPersons()]
+        >>> titles.sort()
+        >>> titles
+        ['First', 'Intermediate', 'Last']
+
+    """
+
+
+def doctest_GroupAddView():
+    r"""Test for GroupAddView
+
+    Adding views in Zope 3 are somewhat unobvious.  The context of an adding
+    view is a view named '+' and providing IAdding.
+
+        >>> class AddingStub:
+        ...     pass
+        >>> context = AddingStub()
+
+    The container to which items will actually be added is accessible as the
+    `context` attribute
+
+        >>> from schooltool.group.group import GroupContainer
+        >>> container = GroupContainer()
+        >>> context.context = container
+
+    ZCML configuration adds some attributes to GroupAddView, namely `schema`,
+    'fieldNames', and `_factory`.
+
+        >>> from schooltool.group.browser.group import GroupAddView
+        >>> from schooltool.group.interfaces import IGroup
+        >>> from schooltool.group.group import Group
+        >>> class GroupAddViewForTesting(GroupAddView):
+        ...     schema = IGroup
+        ...     fieldNames = ('title', 'description')
+        ...     _factory = Group
+
+    We can now finally create the view:
+
+        >>> request = TestRequest()
+        >>> view = GroupAddViewForTesting(context, request)
+
+    The `nextURL` method tells Zope 3 where you should be redirected after
+    successfully adding a group.  We will pretend that `container` is located
+    at the root so that zapi.absoluteURL(container) returns 'http://127.0.0.1'.
+
+        >>> directlyProvides(container, IContainmentRoot)
+        >>> view.nextURL()
+        'http://127.0.0.1'
+
+    We can cancel an action if we want to:
+
+        >>> request = TestRequest()
+        >>> request.form = {'CANCEL': 'Cancel'}
+        >>> view = GroupAddViewForTesting(context, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    If 'CANCEL' is not present in the request, the view calls inherited
+    'update'.  We will use a trick and set update_status to some value to
+    short-circuit AddView.update().
+
+        >>> request = TestRequest()
+        >>> request.form = {'field.title': 'a_group',
+        ...                 'UPDATE_SUBMIT': 'Add'}
+        >>> view = GroupAddViewForTesting(context, request)
+        >>> view.update_status = 'Just checking'
+        >>> view.update()
+        'Just checking'
+
+    """
+
+
+def doctest_GroupEditView():
+    r"""Test for GroupEditView
+
+    Let's create a view for editing a group:
+
+        >>> from schooltool.group.browser.group import GroupEditView
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.group.interfaces import IGroup
+        >>> group = Group()
+        >>> directlyProvides(group, IContainmentRoot)
+        >>> request = TestRequest()
+
+        >>> class TestGroupEditView(GroupEditView):
+        ...     schema = IGroup
+        ...     fieldNames = ('title', 'description')
+        ...     _factory = Group
+
+        >>> view = TestGroupEditView(group, request)
+
+    We should not get redirected if we did not click on apply button:
+
+        >>> request = TestRequest()
+        >>> view = TestGroupEditView(group, request)
+        >>> view.update()
+        ''
+        >>> request.response.getStatus()
+        599
+
+    After changing name of the group you should get redirected to the group
+    list:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u'new_title'}
+        >>> view = TestGroupEditView(group, request)
+        >>> view.update()
+        u'Updated on ${date_time}'
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+        >>> group.title
+        u'new_title'
+
+    Even if the title has not changed you should get redirected to the group
+    list:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u'new_title'}
+        >>> view = TestGroupEditView(group, request)
+        >>> view.update()
+        ''
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+        >>> group.title
+        u'new_title'
+
+    We should not get redirected if there were errors:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u''}
+        >>> view = TestGroupEditView(group, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> request.response.getStatus()
+        599
+
+        >>> group.title
+        u'new_title'
+
+    We can cancel an action if we want to:
+
+        >>> request = TestRequest()
+        >>> request.form = {'CANCEL': 'Cancel'}
+        >>> view = TestGroupEditView(group, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    """
+
+def doctest_GroupCSVImporter():
+    r"""Tests for GroupCSVImporter.
+
+    Create a group container and an importer
+
+        >>> from schooltool.group.browser.csvimport import GroupCSVImporter
+        >>> from schooltool.group.group import GroupContainer
+        >>> container = GroupContainer()
+        >>> importer = GroupCSVImporter(container, None)
+
+    Import some sample data
+
+        >>> csvdata='''Group 1, Group 1 Description
+        ... Group2
+        ... Group3, Group 3 Description, Some extra data'''
+        >>> importer.importFromCSV(csvdata)
+        True
+
+    Check that the groups exist
+
+        >>> [group for group in container]
+        [u'group-1', u'group2', u'group3']
+
+    Check that descriptions were imported properly
+
+        >>> [group.description for group in container.values()]
+        ['Group 1 Description', '', 'Group 3 Description']
+
+    """
+
+def doctest_GroupCSVImportView():
+    r"""Tests for GroupCSVImportView
+
+    We'll create a group csv import view
+
+        >>> from schooltool.group.browser.csvimport import \
+        ...     GroupCSVImportView
+        >>> from schooltool.group.group import GroupContainer
+        >>> from zope.publisher.browser import TestRequest
+        >>> container = GroupContainer()
+        >>> request = TestRequest()
+
+    Now we'll try a text import.  Note that the description is not required
+
+        >>> request.form = {
+        ...     'csvtext' : 'A Group, The best Group\nAnother Group',
+        ...     'charset' : 'UTF-8',
+        ...     'UPDATE_SUBMIT': 1}
+        >>> view = GroupCSVImportView(container, request)
+        >>> view.update()
+        >>> [group for group in container]
+        [u'a-group', u'another-group']
+
+    If no data is provided, we naturally get an error
+
+        >>> request.form = {'charset' : 'UTF-8', 'UPDATE_SUBMIT': 1}
+        >>> view.update()
+        >>> view.errors
+        [u'No data provided']
+
+    We also get an error if a line starts with a comma (no title)
+
+        >>> request.form = {'csvtext' : ", No title provided here",
+        ...                 'charset' : 'UTF-8',
+        ...                 'UPDATE_SUBMIT': 1}
+        >>> view = GroupCSVImportView(container, request)
+        >>> view.update()
+        >>> view.errors
+        [u'Failed to import CSV text', u'Titles may not be empty']
+
+    """
+
+def doctest_GroupsViewlet():
+    r"""Test for GroupsViewlet
+
+    Let's create a viewlet for a person's groups:
+
+        >>> from schooltool.group.browser.group import GroupsViewlet
+        >>> from schooltool.person.person import Person
+
+        >>> school = setup.setUpSchoolToolSite()
+        >>> persons = school['persons']
+        >>> persons['student'] = student = Person("Student")
+
+    We want to display the generic groups a person is part of that aren't
+    sections so we have a filter in the view:
+
+        >>> from schooltool.group.group import Group
+        >>> tenth_grade = Group(title="Tenth Grade")
+        >>> tenth_grade.members.add(student)
+        >>> team = Group(title="Sports Team")
+        >>> team.members.add(student)
+        >>> student_view = GroupsViewlet(student, TestRequest())
+        >>> [group.title for group in student_view.memberOf()]
+        ['Tenth Grade', 'Sports Team']
+    """
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=doctest.ELLIPSIS|
+                                                   doctest.REPORT_NDIFF))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/browser/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <include file="security.zcml" />
+  <include package=".help" />
+
+  <interface
+      interface=".interfaces.IGroupContainer"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".group.GroupContainer">
+    <allow interface="zope.app.container.interfaces.ISimpleReadContainer" />
+    <require permission="schooltool.view"
+             attributes="keys values items __iter__ __len__" />
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer" />
+  </class>
+
+  <interface
+      interface=".interfaces.IGroup"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".group.Group">
+    <implements interface="schooltool.app.interfaces.IHaveCalendar" />
+
+    <allow attributes="__cmp__" />
+    <require permission="schooltool.view"
+             attributes="title description groups members leaders" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.IGroup" />
+  </class>
+
+  <adapter
+      for=".interfaces.IGroupContainer"
+      factory="schooltool.app.app.SimpleNameChooser"
+      provides="zope.app.container.interfaces.INameChooser" />
+
+  <!-- Application hook -->
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".group.addGroupContainerToApplication"
+      />
+
+  <!-- Catalog set up -->
+  <subscriber
+      for="schooltool.app.interfaces.ICatalogSetUpEvent"
+      handler=".group.catalogSetUpSubscriber"
+      />
+
+  <adapter
+      for=".interfaces.IGroupContainer"
+      factory=".group.getGroupContainerCatalog"
+      provides="zope.app.catalog.interfaces.ICatalog" />
+
+  <include package=".browser" />
+  <include package=".rest" />
+
+  <!-- sample data -->
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+
+    <utility
+        factory=".sampledata.SampleGroups"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="groups"
+        />
+
+  </configure>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/group.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/group.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/group.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,165 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Group objects
+
+$Id: group.py 6841 2007-04-12 14:57:56Z ignas $
+"""
+__docformat__ = 'restructuredtext'
+from persistent import Persistent
+
+from zope.interface import implements
+from zope.component import adapts
+from zope.component import getAdapter
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.dependable.interfaces import IDependable
+from zope.app.container import btree
+from zope.app.container.contained import Contained
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.catalog import Catalog
+from zope.component import getUtility
+
+from zc.catalog.catalogindex import ValueIndex
+
+from schooltool.app.interfaces import ICalendarParentCrowd
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.membership import GroupMemberCrowd
+from schooltool.app.membership import URIMembership, URIMember, URIGroup
+from schooltool.app.relationships import URIInstruction
+from schooltool.app.relationships import URISection
+from schooltool.app.security import ConfigurableCrowd
+from schooltool.app.security import LeaderCrowd
+from schooltool.group import interfaces
+from schooltool.person.interfaces import IPerson
+from schooltool.relationship import RelationshipProperty
+from schooltool.relationship.relationship import getRelatedObjects
+from schooltool.securitypolicy.crowds import Crowd
+from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+from schooltool.securitypolicy.interfaces import ICrowd
+from schooltool.group.interfaces import IGroup
+from schooltool.utility.utility import UtilitySetUp
+
+
+GROUP_CATALOG_KEY = 'schooltool.group'
+
+
+class GroupContainer(btree.BTreeContainer):
+    """Container of groups."""
+
+    implements(interfaces.IGroupContainer, IAttributeAnnotatable)
+
+
+from schooltool.app.app import Asset
+class Group(Persistent, Contained, Asset):
+    """Group."""
+
+    implements(interfaces.IGroup, interfaces.IGroupContained,
+               IAttributeAnnotatable)
+
+    members = RelationshipProperty(URIMembership, URIGroup, URIMember)
+
+    def __init__(self, title=None, description=None):
+        self.title = title
+        self.description = description
+
+
+def addGroupContainerToApplication(event):
+    """Subscriber that adds a top-level groups container and a few groups."""
+    app = event.object
+    app['groups'] = GroupContainer()
+    default_groups =  [
+        ("manager",        "Site Managers",         "Manager Group."),
+        ("students",       "Students",              "Students."),
+        ("teachers",       "Teachers",              "Teachers."),
+        ("clerks",         "Clerks",                "Clerks."),
+        ("administrators", "School Administrators", "School Administrators."),
+    ]
+    for id, title, description in default_groups:
+        group = app['groups'][id] = Group(title, description)
+        IDependable(group).addDependent('')
+
+
+class GroupContainerViewersCrowd(ConfigurableCrowd):
+    setting_key = 'everyone_can_view_group_list'
+
+
+class GroupViewersCrowd(ConfigurableCrowd):
+    setting_key = 'everyone_can_view_group_info'
+
+
+class GroupInstructorsCrowd(Crowd):
+    implements(ICrowd)
+    adapts(interfaces.IGroup)
+
+    def contains(self, principal):
+        person = IPerson(principal, None)
+        if not person:
+            return False
+        person_sections = getRelatedObjects(person, URISection,
+                                            rel_type=URIInstruction)
+        group = self.context
+        for section in person_sections:
+            if group in section.members:
+                return True
+        return False
+
+
+class GroupCalendarViewersCrowd(Crowd):
+    implements(ICalendarParentCrowd)
+    adapts(interfaces.IGroup)
+
+    def contains(self, principal):
+        """Return the value of the related setting (True or False)."""
+        app = ISchoolToolApplication(None)
+        customizations = IAccessControlCustomisations(app)
+        setting = customizations.get('everyone_can_view_group_calendar')
+
+        return (setting
+                or GroupMemberCrowd(self.context).contains(principal)
+                or LeaderCrowd(self.context).contains(principal))
+
+
+class GroupCalendarEditorsCrowd(Crowd):
+    implements(ICalendarParentCrowd)
+    adapts(interfaces.IGroup)
+
+    def contains(self, principal):
+        """Return the value of the related setting (True or False)."""
+        app = ISchoolToolApplication(None)
+        customizations = IAccessControlCustomisations(app)
+        setting = customizations.get('members_can_edit_group_calendar')
+        if setting and GroupMemberCrowd(self.context).contains(principal):
+            return True
+
+        # Fall back to schooltool.edit for IGroup
+        crowd = getAdapter(self.context, ICrowd, name='schooltool.edit')
+        return crowd.contains(principal)
+
+
+def catalogSetUp(catalog):
+    catalog['__name__'] = ValueIndex('__name__', IGroup)
+    catalog['title'] = ValueIndex('title', IGroup)
+
+
+catalogSetUpSubscriber = UtilitySetUp(
+    Catalog, ICatalog, GROUP_CATALOG_KEY, setUp=catalogSetUp)
+
+
+def getGroupContainerCatalog(container):
+    return getUtility(ICatalog, GROUP_CATALOG_KEY)


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/group.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/help/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/help/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/help/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/help/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/help/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,17 @@
+<configure
+  xmlns:zcml="http://namespaces.zope.org/zcml"
+  xmlns:browser="http://namespaces.zope.org/browser"
+  xmlns:help="http://namespaces.zope.org/help"
+  zcml:condition="have context-help"
+  i18n_domain="schooltool">
+
+    <help:register
+        id="group"
+        title="Group Container - Contents"
+        doc_path="group_container.pt"
+        for="schooltool.group.interfaces.IGroupContainer"
+        view="index.html"
+        class="zope.app.onlinehelp.onlinehelptopic.ZPTOnlineHelpTopic"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/help/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/help/group_container.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/help/group_container.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/help/group_container.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" metal:use-macro="view/@@schooltool_macros/onlinehelp/page">
+      <head>
+      <title metal:fill-slot="title" i18n:translate="">Person Container</title>
+</head>
+<body metal:fill-slot="body" tal:omit-tag="">
+
+<p>Use this page to keep track of <b>groups</b> of Persons.</p>
+
+<p><b>Groups</b> that have been added are not part of the essential
+groups (<b>Teachers</b>, <b>Students</b>, <b>Site Managers</b>, <b>School
+Administrators</b>, or <b>Clerks</b>).  They can be selected by the checkbox
+next to them and removed by pressing the <b>Delete</b> button at the bottom
+of the page.</p>
+
+<p>To look for for a group, use the search box to the left of the <b>Find
+Now</b> button to look through the entire list of groups for the search
+criterion.</p>
+
+<p>The <b>Clear</b> button empties the search box of current entries.</p>
+
+<p>To view the persons in a certain group, click on the name of the group.</p>
+
+<p>To sort the list, click on the <b>Title</b> header to change the order of
+groups from descending to ascending order, and vice versa.</p>
+
+<p>Separate <q>batches</q> of the Group list can be accessed through the
+<b>Next 10</b> (and <b>Previous</b>) and links in the blue bar.</p>
+
+<p>A <b>Show All</b> button is also there to show all of the groups on a
+single page.</p>
+
+</body>
+</html>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/help/group_container.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/help/group_container.stx
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/help/group_container.stx	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/help/group_container.stx	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2 @@
+This screen gives a list of the different available groups in the system.
+

Added: schooltool/branches/upstream/current/src/schooltool/group/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,68 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Group interfaces
+
+$Id: interfaces.py 6461 2006-10-31 16:18:54Z ignas $
+"""
+
+import zope.interface
+import zope.schema
+from zope.app import container
+from zope.app.container.interfaces import IContainer, IContained
+from zope.app.container import constraints
+
+from schooltool import SchoolToolMessage as _
+
+class IGroupMember(zope.interface.Interface):
+    """An object that knows the groups it is a member of."""
+
+    groups = zope.interface.Attribute("""Groups (see IRelationshipProperty)""")
+
+
+class IBaseGroup(zope.interface.Interface):
+    """Group."""
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        description=_("Title of the group."))
+
+    description = zope.schema.Text(
+        title=_("Description"),
+        required=False,
+        description=_("Description of the group."))
+
+    members = zope.interface.Attribute(
+        """Members of the group (see IRelationshipProperty)""")
+
+
+class IGroup(IBaseGroup):
+    """Group."""
+
+
+class IGroupContainer(IContainer):
+    """Container of groups."""
+
+    container.constraints.contains(IGroup)
+
+
+class IGroupContained(IGroup, IContained):
+    """Group contained in an IGroupContainer."""
+
+    container.constraints.containers(IGroupContainer)


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <view
+      for="..interfaces.IGroupContainer"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IGroup"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.IGroupContainer"
+      provides="zope.filerepresentation.interfaces.IFileFactory"
+      factory=".group.GroupFileFactory"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.IGroup"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".group.GroupFile"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IGroupContainer"
+      name="GET"
+      factory=".group.GroupContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IGroupContainer"
+      name="POST"
+      factory=".group.GroupContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IGroup"
+      name="GET"
+      factory=".group.GroupView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/rest/group.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/rest/group.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/rest/group.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,23 @@
+<group xmlns="http://schooltool.org/ns/model/0.1"
+       xmlns:xlink="http://www.w3.org/1999/xlink"
+       xmlns:tal="http://xml.zope.org/namespaces/tal"
+       xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+       i18n:domain="schooltool">
+  <title tal:content="context/title" />
+  <description tal:content="context/description" />
+  <relationships xlink:type="simple" xlink:title="Relationships"
+      i18n:attributes="xlink:title Relationships"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/relationships" />
+  <acl xlink:type="simple" xlink:title="ACL"
+      i18n:attributes="xlink:title ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/acl" />
+  <calendar xlink:type="simple" xlink:title="Calendar"
+      i18n:attributes="xlink:title Private_calendar"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar" />
+  <relationships xlink:type="simple" xlink:title="Calendar subscriptions"
+      i18n:attributes="xlink:title Calendar_relationships"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar/relationships" />
+  <acl xlink:type="simple" xlink:title="Calendar ACL"
+      i18n:attributes="xlink:title Calendar_ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar/acl" />
+</group>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/rest/group.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/rest/group.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/rest/group.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/rest/group.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,89 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for Groups
+
+$Id: group.py 6047 2006-05-11 18:31:03Z mg $
+"""
+from zope.component import adapts
+
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.app import ApplicationObjectFile
+from schooltool.app.rest.app import ApplicationObjectFileFactory
+from schooltool.app.rest.app import GenericContainerView
+
+from schooltool.group.group import Group
+from schooltool.group.interfaces import IGroupContainer, IGroup
+
+
+class GroupFileFactory(ApplicationObjectFileFactory):
+    """Adapter that adapts GroupContainer to FileFactory"""
+
+    adapts(IGroupContainer)
+
+    schema = '''<?xml version="1.0" encoding="UTF-8"?>
+        <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                 ns="http://schooltool.org/ns/model/0.1"
+                 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+          <start>
+            <element name="object">
+              <attribute name="title">
+                <text/>
+              </attribute>
+              <optional>
+                <attribute name="description">
+                  <text/>
+                </attribute>
+              </optional>
+            </element>
+          </start>
+        </grammar>
+        '''
+
+    factory = Group
+
+    def parseDoc(self, doc):
+        kwargs = {}
+        node = doc.query('/m:object')[0]
+        kwargs['title'] = node['title']
+        kwargs['description'] = node.get('description')
+        return kwargs
+
+
+class GroupFile(ApplicationObjectFile):
+    """Adapter that adapts IGroup to IWriteFile"""
+
+    adapts(IGroup)
+
+    def modify(self, title=None, description=None):
+        """Modify underlying schema."""
+        self.context.title = title
+        self.context.description = description
+
+
+class GroupContainerView(GenericContainerView):
+    """RESTive view of a group container."""
+
+
+class GroupView(View):
+    """RESTive view for groups"""
+
+    template = Template("group.pt",
+                        content_type="text/xml; charset=UTF-8")
+    factory = GroupFile


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/rest/group.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/rest/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/rest/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/rest/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,183 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for groups.
+
+$Id: tests.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+
+from schooltool.app.rest.testing import ApplicationObjectViewTestMixin
+from schooltool.app.rest.testing import ContainerViewTestMixin
+from schooltool.app.rest.testing import FileFactoriesSetUp
+from schooltool.group.group import Group, GroupContainer
+from schooltool.group.rest.group import GroupView, GroupFile
+from schooltool.group.rest.group import GroupContainerView
+from schooltool.group.rest.group import GroupFileFactory
+
+
+class TestGroupFileFactory(unittest.TestCase):
+
+    def setUp(self):
+        self.groupContainer = GroupContainer()
+        self.factory = GroupFileFactory(self.groupContainer)
+
+    def test_title(self):
+        group = self.factory("new_group", None,
+                     '''<object xmlns="http://schooltool.org/ns/model/0.1"
+                                title="New Group"/>''')
+
+        self.assertEquals(group.title, "New Group")
+
+    def test_description(self):
+        group = self.factory("new_group", None,
+                     '''<object xmlns="http://schooltool.org/ns/model/0.1"
+                                title="New Group"
+                                description="Boo"/>''')
+
+        self.assertEquals(group.title, "New Group")
+        self.assertEquals(group.description, "Boo")
+
+
+class TestGroupContainerView(ContainerViewTestMixin,
+                             unittest.TestCase):
+    """Test for GroupContainerView"""
+
+    def setUp(self):
+        ContainerViewTestMixin.setUp(self)
+        self.groupContainer = self.app['groups']
+
+    def test_render(self):
+        view = GroupContainerView(self.groupContainer,
+                                  TestRequest())
+        result = view.GET()
+        response = view.request.response
+
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result, """
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <name>groups</name>
+              <items>
+                <item xlink:href="http://127.0.0.1/groups/root"
+                      xlink:type="simple" xlink:title="Root group"/>
+              </items>
+              <acl xlink:href="http://127.0.0.1/groups/acl" xlink:title="ACL"
+                   xlink:type="simple"/>
+            </container>
+            """)
+
+
+class TestGroupFile(FileFactoriesSetUp, unittest.TestCase):
+    """A test for IGroup IWriteFile adapter"""
+
+    def testWrite(self):
+        gc = GroupContainer()
+        group = Group("Lillies")
+        gc['group1'] = group
+
+        file = GroupFile(group)
+        file.write('''<object xmlns="http://schooltool.org/ns/model/0.1"
+                              title="New Group"
+                              description="Boo"/>''')
+
+        self.assertEquals(group.title, "New Group")
+        self.assertEquals(group.description, "Boo")
+
+
+class TestGroupView(ApplicationObjectViewTestMixin, unittest.TestCase):
+    """A test for the RESTive view of a group."""
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+
+        self.testObject = self.app['groups']['root']
+
+    def makeTestView(self, object, request):
+        return GroupView(object, request)
+
+    def testGET(self):
+
+        result, response = self.get()
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result,
+            """<group xmlns="http://schooltool.org/ns/model/0.1"
+                      xmlns:xlink="http://www.w3.org/1999/xlink">
+                   <title>Root group</title>
+                   <description/>
+                   <relationships xlink:href="http://127.0.0.1/groups/root/relationships"
+                                  xlink:title="Relationships" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/groups/root/acl" xlink:title="ACL"
+                        xlink:type="simple"/>
+                   <calendar xlink:href="http://127.0.0.1/groups/root/calendar"
+                             xlink:title="Calendar" xlink:type="simple"/>
+                   <relationships
+                                  xlink:href="http://127.0.0.1/groups/root/calendar/relationships"
+                                  xlink:title="Calendar subscriptions" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/groups/root/calendar/acl"
+                        xlink:title="Calendar ACL" xlink:type="simple"/>
+               </group>""")
+
+    def testGETDescription(self):
+
+        self.testObject.description = "Foo"
+
+        result, response = self.get()
+
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result,
+            """<group xmlns="http://schooltool.org/ns/model/0.1"
+                      xmlns:xlink="http://www.w3.org/1999/xlink">
+                   <title>Root group</title>
+                   <description>Foo</description>
+                   <relationships xlink:href="http://127.0.0.1/groups/root/relationships"
+                                  xlink:title="Relationships" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/groups/root/acl" xlink:title="ACL"
+                        xlink:type="simple"/>
+                   <calendar xlink:href="http://127.0.0.1/groups/root/calendar"
+                             xlink:title="Calendar" xlink:type="simple"/>
+                   <relationships
+                                  xlink:href="http://127.0.0.1/groups/root/calendar/relationships"
+                                  xlink:title="Calendar subscriptions" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/groups/root/calendar/acl"
+                        xlink:title="Calendar ACL" xlink:type="simple"/>
+               </group>""")
+
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTests([unittest.makeSuite(test) for test in
+                    (TestGroupContainerView,
+                     TestGroupFileFactory,
+                     TestGroupFile,
+                     TestGroupView)])
+
+    suite.addTest(doctest.DocTestSuite(optionflags=doctest.ELLIPSIS|
+                                                   doctest.REPORT_NDIFF))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/rest/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,104 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Group sample data generation
+
+$Id: sampledata.py 5669 2006-01-20 19:58:16Z mg $
+"""
+
+import random
+from datetime import datetime, timedelta
+
+from pytz import utc
+from zope.interface import implements
+from zope.security.proxy import removeSecurityProxy
+
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.calendar.recurrent import DailyRecurrenceRule
+from schooltool.calendar.recurrent import WeeklyRecurrenceRule
+from schooltool.calendar.recurrent import MonthlyRecurrenceRule
+from schooltool.group.group import Group
+from schooltool.app.cal import CalendarEvent
+from schooltool.app.interfaces import ISchoolToolCalendar
+
+
+class SampleGroups(object):
+    """Sample data generation plugin that creates groups.
+
+    It also adds existing persons as members to the groups, and creates
+    group-wide calendar events.
+    """
+
+    implements(ISampleDataPlugin)
+
+    name = 'groups'
+    dependencies = ('students', 'terms')
+
+    group_titles = ('Marching band', 'Swing chorus', 'Chess club',
+                    'Dungeons and Dragons club', 'Jazz dance',
+                    'Newspaper', 'Yearbook', 'Basketball',
+                    'Swimming', 'Gymnastics', 'Drama',
+                    'Computer club', 'Hip-Hop', 'Greenpeace',
+                    'Sewing', 'Scouts', 'Cart racing',
+                    'ST radio', 'Cheerleading', 'Aikido')
+    n_members_in_group = 20
+    n_groups = property(lambda self: len(self.group_titles))
+
+    def generate(self, app, seed=None):
+        self.random = random.Random(seed)
+        n_members = self.n_groups * self.n_members_in_group
+
+        student_ids = [id for id in app['persons'].keys()
+                       if id.startswith('student')]
+        assert len(student_ids) >= n_members
+        member_ids = self.random.sample(student_ids, n_members)
+        member_iter = iter(member_ids)
+
+        groups = app['groups']
+        for i, title in enumerate(self.group_titles):
+            group = groups['group%02d' % i] = Group(title=title)
+
+            # Members
+            for count in range(self.n_members_in_group):
+                member_id = member_iter.next()
+                student = removeSecurityProxy(app['persons'][member_id])
+                group.members.add(student)
+
+            # Add meeting event
+            recurrenceRule = self.random.choice((DailyRecurrenceRule,
+                                                 WeeklyRecurrenceRule,
+                                                 MonthlyRecurrenceRule))
+            terms = removeSecurityProxy(app['terms'].values())
+            term = self.random.choice(terms)
+            eventDate = term.first
+            recurrence = recurrenceRule(until=term.last)
+            meeting = CalendarEvent(
+                datetime(eventDate.year, eventDate.month, eventDate.day,
+                         15, 00, tzinfo=utc),
+                timedelta(hours=2), 'Meeting',
+                recurrence=recurrence)
+            dates = recurrence.apply(meeting, term.first, term.last)
+            exceptions = []
+            for recurrDate in dates:
+                if not term.isSchoolday(recurrDate):
+                    exceptions.append(recurrDate)
+            meeting.recurrence = recurrence.replace(exceptions=exceptions)
+            calendar = ISchoolToolCalendar(group)
+            calendar.addEvent(meeting)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/security.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/security.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/security.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<configure xmlns="http://schooltool.org/securitypolicy"
+           xmlns:zope="http://namespaces.zope.org/zope">
+
+  <setting
+      key="everyone_can_view_group_list"
+      text="Everyone can view group lists."
+      default="False" />
+
+  <setting
+      key="everyone_can_view_group_info"
+      text="Everyone can view group information."
+      default="False" />
+
+  <setting
+      key="everyone_can_view_group_calendar"
+      text="Everyone can view group calendars."
+      default="False" />
+
+  <setting
+      key="members_can_edit_group_calendar"
+      text="Group members can edit group calendars."
+      default="False" />
+
+  <crowd
+      name="group_viewers"
+      factory=".group.GroupViewersCrowd" />
+
+  <crowd
+      name="group_instructors"
+      factory=".group.GroupInstructorsCrowd" />
+
+  <crowd
+      name="group_list_viewers"
+      factory=".group.GroupContainerViewersCrowd" />
+
+  <allow
+      interface="schooltool.group.interfaces.IGroupContainer"
+      crowds="administration group_list_viewers"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.group.interfaces.IGroupContainer"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <allow
+      interface="schooltool.group.interfaces.IGroup"
+      crowds="administration leaders group_viewers group_instructors"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.group.interfaces.IGroup"
+      crowds="administration leaders"
+      permission="schooltool.edit" />
+
+  <zope:adapter
+      factory=".group.GroupCalendarViewersCrowd"
+      provides="schooltool.app.interfaces.ICalendarParentCrowd"
+      name="schooltool.view" />
+
+  <zope:adapter
+      factory=".group.GroupCalendarEditorsCrowd"
+      provides="schooltool.app.interfaces.ICalendarParentCrowd"
+      name="schooltool.edit" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/security.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/tests/test_group.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/tests/test_group.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/tests/test_group.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,261 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for groups
+
+$Id: test_group.py 6428 2006-10-16 10:46:50Z vidas $
+"""
+
+import unittest
+
+from zope.interface import directlyProvides
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+from zope.app.container.contained import ObjectAddedEvent
+from zope.traversing.interfaces import IContainmentRoot
+from zope.interface import implements
+
+from schooltool.testing.util import run_unit_tests
+from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IAsset
+
+
+def doctest_GroupContainer():
+    """Tests for GroupContainer
+
+        >>> from schooltool.group.interfaces import IGroupContainer
+        >>> from schooltool.group.group import GroupContainer
+        >>> c = GroupContainer()
+        >>> verifyObject(IGroupContainer, c)
+        True
+
+    Let's make sure it acts like a proper container should act
+
+        >>> from zope.app.container.tests.test_btree import TestBTreeContainer
+        >>> class Test(TestBTreeContainer):
+        ...    def makeTestObject(self):
+        ...        return GroupContainer()
+        >>> run_unit_tests(Test)
+
+    """
+
+
+def doctest_Group():
+    r"""Tests for Group
+
+        >>> from schooltool.group.interfaces import IGroupContained
+        >>> from schooltool.group.group import Group
+        >>> group = Group()
+        >>> verifyObject(IGroupContained, group)
+        True
+
+    Groups can have titles and descriptions too
+
+        >>> illuminati = Group(title='Illuminati', description='Secret Group')
+        >>> illuminati.title
+        'Illuminati'
+        >>> illuminati.description
+        'Secret Group'
+
+    """
+
+
+def doctest_addGroupContainerToApplication():
+    """Tests for addGroupContainerToApplication
+
+    This test needs annotations, dependencies and traversal
+
+        >>> setup.placelessSetUp()
+        >>> setup.setUpAnnotations()
+        >>> setup.setUpDependable()
+        >>> setup.setUpTraversal()
+
+    addGroupContainerToApplication is a subscriber for IObjectAddedEvent.
+
+        >>> from schooltool.group.group import addGroupContainerToApplication
+        >>> from schooltool.app.app import SchoolToolApplication
+        >>> app = SchoolToolApplication()
+        >>> event = ObjectAddedEvent(app)
+
+    we want app to have a location
+
+        >>> directlyProvides(app, IContainmentRoot)
+
+    When you call the subscriber
+
+        >>> addGroupContainerToApplication(event)
+
+    it adds a container for groups
+
+        >>> app['groups']
+        <schooltool.group.group.GroupContainer object at ...>
+
+    and a few built-in groups
+
+        >>> for name, group in sorted(app['groups'].items()):
+        ...     print '%-15s %-25s %s' % (name, group.title, group.description)
+        administrators  School Administrators     School Administrators.
+        clerks          Clerks                    Clerks.
+        manager         Site Managers             Manager Group.
+        students        Students                  Students.
+        teachers        Teachers                  Teachers.
+
+    These new groups are required for the application to function properly.  To
+    express that requirement we add explicit dependencies:
+
+        >>> from zope.app.dependable.interfaces import IDependable
+        >>> for group in app['groups'].values():
+        ...     assert IDependable(group).dependents() == (u'/groups/',)
+
+    Clean up
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_GroupInstructorsCrowd():
+    """Tests for GroupInstructorsCrowd.
+
+        >>> from schooltool.group.group import GroupInstructorsCrowd
+        >>> from schooltool.person.interfaces import IPerson
+        >>> from schooltool.relationship.interfaces import IRelationshipLinks
+        >>> class SectionStub(object):
+        ...     members = ['good_group']
+        >>> section = SectionStub()
+        >>> class PersonLinksStub(object): 
+        ...     def getTargetsByRole(self, role, rel_type):
+        ...         print 'Relation: %s of type %s' % (role, rel_type)
+        ...         return [section] # person is instructor of the 'section'
+        >>> class PersonStub(object):
+        ...     def __conform__(self, it):
+        ...         if it is IRelationshipLinks:
+        ...             return PersonLinksStub()
+        >>> class PrincipalStub(object):
+        ...     def __conform__(self, it):
+        ...         if it is IPerson:
+        ...             return PersonStub()
+        >>> principal = PrincipalStub()
+        >>> gic = GroupInstructorsCrowd('bad_group')
+        >>> gic.contains(principal)
+        Relation: <URIObject Section> of type <URIObject Instruction>
+        False
+        >>> gic = GroupInstructorsCrowd('good_group')
+        >>> gic.contains(principal)
+        Relation: <URIObject Section> of type <URIObject Instruction>
+        True
+    """
+
+
+def doctest_GroupCalendarViewersCrowd():
+    """Tests for ConfigurableCrowd.
+
+    Some setup:
+
+        >>> setup.placelessSetUp()
+
+        >>> setting = True
+        >>> class CustomisationsStub(object):
+        ...     implements(IAccessControlCustomisations)
+        ...     def get(self, key):
+        ...         print 'Getting %s' % key
+        ...         return setting
+
+        >>> class AppStub(object):
+        ...     implements(ISchoolToolApplication)
+        ...     def __conform__(self, iface):
+        ...         if iface == IAccessControlCustomisations:
+        ...             return CustomisationsStub()
+
+        >>> from zope.component import provideAdapter
+        >>> provideAdapter(lambda context: AppStub(),
+        ...                adapts=[None],
+        ...                provides=ISchoolToolApplication)
+
+        >>> from schooltool.group.group import GroupCalendarViewersCrowd
+
+    Off we go:
+
+        >>> group_val = True
+        >>> leader_val = False
+        >>> class GroupStub(object):
+        ...     implements(IAsset)
+        ...     class members(object):
+        ...         def __contains__(self, item):
+        ...             print "Checking for membership of %s in a group" % item
+        ...             return group_val
+        ...     members = members()
+        ...     class leaders(object):
+        ...         def __contains__(self, item):
+        ...             print "Checking for leadership of %s in a group" % item
+        ...             return leader_val
+        ...     leaders = leaders()
+
+        >>> crowd = GroupCalendarViewersCrowd(GroupStub())
+        >>> crowd.contains("Principal")
+        Getting everyone_can_view_group_calendar
+        True
+
+    If setting is set to False, we should still check for membership:
+
+        >>> from schooltool.person.interfaces import IPerson
+        >>> class PrincipalStub(object):
+        ...     def __init__(self, name):
+        ...         self.name = name
+        ...     def __conform__(self, iface):
+        ...         if iface == IPerson: return "IPerson(%s)" % self.name
+
+        >>> setting = False
+        >>> crowd.contains(PrincipalStub("Principal"))
+        Getting everyone_can_view_group_calendar
+        Checking for membership of IPerson(Principal) in a group
+        True
+
+    If membership fails, we check leadership:
+
+        >>> group_val = False
+        >>> crowd.contains(PrincipalStub("Principal"))
+        Getting everyone_can_view_group_calendar
+        Checking for membership of IPerson(Principal) in a group
+        Checking for leadership of IPerson(Principal) in a group
+        False
+
+        >>> leader_val = True
+        >>> crowd.contains(PrincipalStub("Principal"))
+        Getting everyone_can_view_group_calendar
+        Checking for membership of IPerson(Principal) in a group
+        Checking for leadership of IPerson(Principal) in a group
+        True
+
+    Clean up
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/tests/test_group.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/group/tests/test_sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/group/tests/test_sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/group/tests/test_sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,143 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.person.sampledata
+
+$Id: test_sampledata.py 6054 2006-05-12 18:02:01Z faassen $
+"""
+
+import unittest
+from datetime import datetime
+
+from pytz import utc
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup
+
+from schooltool.testing import setup as stsetup
+from schooltool.relationship.tests import setUpRelationships
+from schooltool.app.cal import getCalendar
+
+
+# Eek, st.group depends on st.term because of this import
+from schooltool.term.term import getTermForDate
+
+
+def setUp(test):
+    setup.placefulSetUp()
+    stsetup.setUpCalendaring()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def doctest_SampleGroups():
+    """A sample data plugin that generates groups and events for groups
+
+        >>> from schooltool.group.sampledata import SampleGroups
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleGroups()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+        >>> plugin.dependencies
+        ('students', 'terms')
+
+    Prepare students.
+
+        >>> setUpRelationships()
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> from schooltool.demographics.sampledata import SampleStudents
+        >>> from schooltool.term.sampledata import SampleTerms
+        >>> studentsPlugin = SampleStudents()
+        >>> studentsPlugin.generate(app, 42)
+        >>> termsPlugin = SampleTerms()
+        >>> termsPlugin.generate(app, 42)
+
+    This plugin creates n_groups groups with n_members_in_group members each.
+
+        >>> old_len = len(app['groups'])
+
+        >>> plugin.generate(app, 42)
+
+        >>> assert len(app['groups']) - old_len == plugin.n_groups
+
+        >>> result = []
+        >>> for i in range(plugin.n_groups):
+        ...     result.append(app['groups']['group%02d' % i].title)
+        >>> result.sort()
+        >>> for i in range(5):
+        ...     print result[i]
+        Aikido
+        Basketball
+        Cart racing
+        Cheerleading
+        Chess club
+
+    Every group has n_members_in_group student members.
+
+        >>> for i in range(plugin.n_groups):
+        ...     n_members = len(app['groups']['group%02d' % i].members)
+        ...     assert n_members == plugin.n_members_in_group
+
+    No student is in more than one group.
+
+        >>> student_ids = [id for id in app['persons'].keys()
+        ...                if id.startswith('student')]
+        >>> for student_id in student_ids:
+        ...     assert len(app['persons'][student_id].groups) <= 1
+
+    Each group has meeting during 15:00-17:00 as recuring event.
+    All meetings happen on schooldays.
+
+        >>> for i in range(plugin.n_groups):
+        ...     calendar = getCalendar(app['groups']['group%02d' % i])
+        ...     assert len(calendar) == 1
+        ...     start = list(calendar)[0].dtstart.date()
+        ...     term = getTermForDate(start)
+        ...     first = datetime(term.first.year,
+        ...                      term.first.month,
+        ...                      term.first.day,
+        ...                      tzinfo=utc)
+        ...     last = datetime(term.last.year,
+        ...                     term.last.month,
+        ...                     term.last.day,
+        ...                     tzinfo=utc)
+        ...     for event in calendar:
+        ...         assert event.dtstart.strftime('%H:%M:%S') == '15:00:00'
+        ...         assert str(event.duration) == '2:00:00'
+        ...         assert event.recurrence is not None
+        ...     allDates = [ev.dtstart.date()
+        ...                 for ev in calendar.expand(first, last)]
+        ...     for eventDate in allDates:
+        ...         assert term.isSchoolday(eventDate)
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS),
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/group/tests/test_sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,113 @@
+=============================
+Context-Sensitive Help System
+=============================
+
+This package provides a context-sensitive help system for SchoolTool. It is
+heavily based on the Zope 3 help system, but makes some different policy
+decisions.
+
+The first object the user will interact with is the help link. The help link
+is a content provider that inserts a link with the text "Help" in the tools
+bar of the standard SchoolTool O-wrap.
+
+  >>> import zope.interface
+  >>> class IPerson(zope.interface.Interface):
+  ...    pass
+
+  >>> class Person(object):
+  ...     zope.interface.implements(IPerson)
+  >>> person = Person()
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+  >>> from zope.publisher.browser import BrowserView
+  >>> class View(BrowserView):
+  ...     __name__ = u'index.html'
+  >>> view = View(person, request)
+
+  >>> from zope.app.testing import setup
+  >>> setup.setUpTraversal()
+
+The help link is instantiated with the typical content provider API:
+
+  >>> from schooltool.help import browser
+  >>> helplink = browser.HelpLink(person, request, view)
+
+We can now render the link:
+
+  >>> helplink.update()
+  >>> helplink.render()
+  u''
+
+We get an empty string. This is because there is no help topic registered for
+this view yet. The help link is only shown, if a contextual help is really
+available. Let's now register a help topic for the view:
+
+  >>> import os, tempfile
+  >>> helpfile = tempfile.mktemp('.txt')
+  >>> open(helpfile, 'w').write('''
+  ... The person's index view shows the default info about the person.
+  ... ''')
+
+  >>> from zope.app.onlinehelp import globalhelp
+  >>> globalhelp.registerHelpTopic(
+  ...     '', u'person', u'Person Overview', helpfile, IPerson, u'index.html')
+
+Now the help link should produce some output:
+
+  >>> helplink.update()
+  >>> print helplink.render()
+  |
+  <a id="tools-help"
+     href="javascript:popUp('http://127.0.0.1/++help++/@@contexthelp.html')"
+     title="Context Help">Help</a>
+  <BLANKLINE>
+
+Once the link is provided, it needs to end somewhere. This package also
+reimplements the ``contexthelp.html`` view. As you can see, it is a view on
+the ``++help++`` namespace. This namespace is always available, and it can
+either be added after the view name or the context object directly. In the
+latter case, the the context help should look up the default view and use it
+to find the help topic.
+
+The first step is to setup the help topic views ...
+
+  >>> class SimpleOnlineHelpTopicView(BrowserView):
+  ...     def __call__(self):
+  ...         return self.context.source
+
+  >>> import zope.component
+  >>> from zope.app.onlinehelp.interfaces import IOnlineHelpTopic
+  >>> zope.component.provideAdapter(
+  ...     SimpleOnlineHelpTopicView, (IOnlineHelpTopic, TestRequest),
+  ...     zope.interface.Interface, name=u'index.html')
+
+and to register our view:
+
+  >>> zope.component.provideAdapter(
+  ...     View, (IPerson, TestRequest), zope.interface.Interface,
+  ...     name=u'index.html')
+
+Then we create the onlinehelp namespace and create the context help from our
+view:
+
+  >>> from zope.app.onlinehelp import helpNamespace
+  >>> helpSystem = helpNamespace(view).traverse('', None)
+
+  >>> contextHelp = browser.ContextHelpView(helpSystem, request)
+  >>> contextHelp.getContextualTopicView()
+  u"\nThe person's index view shows the default info about the person.\n"
+
+Also, if the help namespace is looked up on the person, we should get the same
+result, since the 'index.html' view is the default view:
+
+  >>> from zope.component.interfaces import IDefaultViewName
+  >>> zope.component.provideAdapter(
+  ...     'index.html', (IPerson, TestRequest), IDefaultViewName)
+
+  >>> helpSystem = helpNamespace(person).traverse('', None)
+
+  >>> contextHelp = browser.ContextHelpView(helpSystem, request)
+  >>> contextHelp.getContextualTopicView()
+  u"\nThe person's index view shows the default info about the person.\n"


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,92 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Context-Help related views.
+
+$Id: browser.py 6498 2006-11-29 11:09:41Z jinty $
+"""
+
+__docformat__ = 'reStructuredText'
+
+import zope.interface
+from zope import contentprovider
+from zope.app import onlinehelp
+from zope.app import zapi
+from zope.app.publisher import browser
+from zope.app.pagetemplate import ViewPageTemplateFile
+from zope.publisher.browser import BrowserView
+from zope.publisher.interfaces.browser import IBrowserView
+
+class ContextHelpView(BrowserView):
+
+    def __init__(self, context, request):
+        super(ContextHelpView, self).__init__(context, request)
+        self.topic = None
+
+    def getContextualTopicView(self):
+        """Retrieve and render the source of a context help topic """
+        topic = self.contextHelpTopic
+        view = zapi.getMultiAdapter((topic, self.request), name='index.html')
+        return view()
+
+    @property
+    def contextHelpTopic(self):
+        """Retrieve a help topic based on the context of the help namespace."""
+        if self.topic is not None:
+            return self.topic
+
+        help_context = self.context.context
+        self.topic = None
+        if IBrowserView.providedBy(help_context):
+            name = zapi.getName(help_context)
+            help_context = zapi.getParent(help_context)
+        else:
+            name = browser.queryDefaultViewName(help_context, self.request)
+            if name is None:
+                return self.topic
+
+        self.topic = onlinehelp.getTopicFor(help_context, name)
+
+        return self.topic
+
+
+class HelpLink(object):
+    """Help Link Content Provider"""
+
+    zope.interface.implements(contentprovider.interfaces.IContentProvider)
+
+    template = ViewPageTemplateFile('helplink.pt')
+
+    def __init__(self, context, request, view):
+        self.__parent__ = view
+        self.context, self.request = context, request
+        self.show = False
+        self.title = 'Context Help' # XXX mg: i18n?
+
+    def update(self):
+        help = onlinehelp.helpNamespace(
+            self.__parent__, self.request).traverse('', None)
+        helpView = ContextHelpView(help, self.request)
+        if helpView.contextHelpTopic is not None:
+            self.show = True
+
+    def render(self):
+        if self.show:
+            return self.template()
+        return u''


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,66 @@
+<configure
+    xmlns="http://namespaces.zope.org/browser"
+    xmlns:zope="http://namespaces.zope.org/zope"
+    xmlns:security="http://schooltool.org/securitypolicy"
+    i18n_domain="schooltool">
+
+  <zope:adapter
+      for="zope.interface.Interface
+           schooltool.skin.ISchoolToolLayer
+           zope.interface.Interface"
+      provides="zope.contentprovider.interfaces.IContentProvider"
+      name="schooltool.Help"
+      factory=".browser.HelpLink"
+      permission="zope.Public"
+      />
+
+  <resource
+      name="help.css"
+      file="help.css"
+      />
+
+  <!-- generic contextual topic view -->
+  <page
+      name="contexthelp.html"
+      for="zope.app.onlinehelp.interfaces.IOnlineHelp"
+      class=".browser.ContextHelpView"
+      permission="zope.View"
+      attribute="getContextualTopicView"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <!-- simply topic view -->
+  <page
+      name="index.html"
+      for="zope.app.onlinehelp.interfaces.IOnlineHelpTopic"
+      class="zope.app.onlinehelp.browser.OnlineHelpTopicView"
+      template="helptopic.pt"
+      permission="zope.View"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      xmlns:apidoc="http://namespaces.zope.org/apidoc"
+      zcml:condition="have apidoc">
+
+    <apidoc:bookchapter
+        id="contexthelp"
+        title="Contextual Help"
+        parent="schooltool"
+        doc_path="README.txt" />
+
+  </configure>
+
+  <!-- Online help security -->
+  <security:allow
+           interface="zope.app.onlinehelp.interfaces.IOnlineHelp"
+           crowds="anonymous"
+           permission="schooltool.view" />
+
+  <security:allow
+            interface="zope.app.onlinehelp.interfaces.IOnlineHelp"
+            crowds="anonymous"
+            permission="schooltool.edit" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool.help" file="meta.zcml" />
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.help" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,43 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.help.
+
+$Id: ftests.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+import os
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+help_functional_layer = ZCMLLayer(filename,
+                                  __name__,
+                                  'help_functional_layer')
+
+def test_suite():
+    return collect_ftests(filenames=['integration.txt', 'help.txt'],
+                          layer=help_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/help-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/help-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/help-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.help" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/help-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/help-meta.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/help-meta.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/help-meta.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.help" file="meta.zcml" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/help-meta.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/help.css
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/help.css	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/help.css	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+BODY {
+    font-family: Verdana, Helvetica, Arial, Sans-Serif;
+    background: #fff;
+    color: #000;
+    min-width: 600px;
+}
+
+table.header {
+    width: 100%;
+    background: #990000 url(++resource++toolbar-background.png) top left repeat-x;
+}
+
+td.title {
+    color: white;
+    font-size: 85%;
+    font-weight: bold;
+}
+
+td.close {
+    text-align: right;
+    padding-right: 4px;
+}
+
+div.content {
+    padding: 0.7em;
+}
+
+.headline {
+    background: #990000;
+}
+
+UL{
+    padding-left:3px;
+    font-size:11px;
+}

Added: schooltool/branches/upstream/current/src/schooltool/help/help.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/help.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/help.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,39 @@
+===============
+Contextual Help
+===============
+
+The contextual help provides help screens for particular views. Let's first
+log in however.
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.open('http://localhost/')
+    >>> manager.getLink('Log In').click()
+    >>> manager.getControl('Username').value = 'manager'
+    >>> manager.getControl('Password').value = 'schooltool'
+    >>> manager.getControl('Log in').click()
+
+Now we are the calendar. A you can see there is no help link here, since there
+is no help for this link:
+
+    # I know this is a brittle test, but I do not want to overdo the test
+    # setup here.
+    >>> 'Context Help' in manager.contents
+    False
+
+But when we go to the person container, for example, we should be able to see
+the help:
+
+    >>> manager.getLink('persons').click()
+    >>> 'Context Help' in manager.contents
+    True
+
+In reality, you would now click on the link and a new window should open with
+the content. Since our test-browser does not support Javascript, we have to do
+this manually:
+
+    >>> manager.open('http://localhost/persons/++help++/contexthelp.html')
+
+    >>> print manager.contents
+    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+    ...<p>Use this page to browse and find individual persons.</p>...


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/help.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/helplink.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/helplink.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/helplink.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,8 @@
+|
+<a id="tools-help" href="#"
+   tal:define="url string:'${request/URL}/++help++/@@contexthelp.html'"
+   tal:attributes="href python:'javascript:popUp('+ url + ')';
+                   title view/title"
+   i18n:translate=""
+   i18n:domain="schooltool"
+   >Help</a>


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/helplink.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/helptopic.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/helptopic.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/helptopic.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
+      i18n:domain="schooltool"
+      metal:use-macro="view/@@schooltool_macros/onlinehelp/page">
+  <head>
+          <title metal:fill-slot="title"
+                 i18n:translate=""
+                 tal:content="context/title">Topic Title</title>
+</head>
+<body metal:fill-slot="body" tal:omit-tag="">
+    <table class="header" width="100%">
+      <tr>
+        <td class="title" tal:content="context/title" i18n:translate="">
+          Topic Title
+        </td>
+        <td class="close">
+          <a href="javascript:window.close()">
+            <img alt="[x]" tal:attributes="src context/++resource++delete.png" />
+          </a>
+        </td>
+      </tr>
+    </table>
+    <div class="content" tal:content="structure view/topicContent">
+      Content of Help Topic goes here.
+    </div>
+</body>
+</html>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/helptopic.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/integration.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/integration.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/integration.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,31 @@
+Functional doctest for Online Help
+==================================
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+
+There are links to the online help if it is available:
+
+    >>> manager.open('http://localhost/')
+    >>> manager.getLink('Persons').click()
+    >>> manager.getLink('Help').url
+    "javascript:popUp('http://localhost/persons/@@index.html/++help++/@@contexthelp.html')"
+
+We can look at it:
+
+    >>> manager.open('http://localhost/persons/@@index.html/++help++/@@contexthelp.html')
+    >>> print manager.contents
+    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+    ...
+    <p>Use this page to browse and find individual persons.</p>
+    ...
+
+Even Zope3 help is available if you know the url:
+
+    >>> manager.open('http://localhost/++help++/ui')
+
+Images are displayed properly as well:
+
+    >>> manager.open('http://localhost/++help++/ui/mgmt-main-1.png')


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/integration.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/meta.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/meta.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/meta.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,6 @@
+<configure
+    xmlns:meta="http://namespaces.zope.org/meta">
+
+  <meta:provides feature="context-help" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/meta.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/help/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/help/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/help/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,45 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Level-related Tests
+
+$Id: tests.py 5627 2006-01-13 19:39:59Z mg $
+"""
+
+__docformat__ = 'restructuredtext'
+
+import unittest
+
+from zope.testing import doctest
+from zope.app.testing.placelesssetup import setUp, tearDown
+
+# Some imports to make tests work
+import zope.contentprovider.interfaces
+
+
+def test_suite():
+    optionflags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
+    return unittest.TestSuite((
+        doctest.DocFileSuite('README.txt',
+                             setUp=setUp, tearDown=tearDown,
+                             optionflags=optionflags),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/help/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,595 @@
+========================
+Student Level Management
+========================
+
+Students, a special kind of ``Person``, during their academic career in a
+school will progress through a number of levels (or grades or standings) until
+they graduate. This package provides the basic level-support for
+SchoolTool.
+
+    >>> import schooltool.level.level
+    >>> from schooltool import level
+
+
+Level Management
+----------------
+
+The first task of any school manager is to setup the levels for the
+school. So, given a schooltool application
+
+    >>> from schooltool.testing import setup
+    >>> st = setup.createSchoolToolApplication()
+
+with a manager group, which is setup during database instantiation,
+
+    >>> from schooltool.group.group import Group
+    >>> st['groups']['manager'] = Group(u'Manager', u'Manager Group.')
+
+we can inspect the defined levels:
+
+    >>> list(st['levels'].keys())
+    []
+
+As expected, this list is empty at the beginning. Let's now say that our
+school X has an US elementary and middle school. Let's start with the
+elementary school:
+
+    >>> st['levels']['level1'] = level.level.Level('1st Grade', isInitial=True)
+
+We also passed in the flag ``isInitial`` as true, since this is the first
+level a student completes in elementary school. Now let's repeat this step for
+the remaining levels:
+
+    >>> st['levels']['level2'] = level.level.Level('2nd Grade', isInitial=True)
+    >>> st['levels']['level1'].nextLevel = st['levels']['level2']
+
+    >>> st['levels']['level3'] = level.level.Level('3rd Grade')
+    >>> st['levels']['level2'].nextLevel = st['levels']['level3']
+
+    >>> st['levels']['level4'] = level.level.Level('4th Grade')
+    >>> st['levels']['level3'].nextLevel = st['levels']['level4']
+
+    >>> st['levels']['level5'] = level.level.Level('5th Grade')
+    >>> st['levels']['level4'].nextLevel = st['levels']['level5']
+
+    >>> st['levels']['level6'] = level.level.Level('6th Grade')
+    >>> st['levels']['level5'].nextLevel = st['levels']['level6']
+
+In the code above we also linked the levels together by assigning the
+``nextLevel`` attribute of each level. Level 6 does not have any next level,
+because the student graduates from elementary school at this time. Since it is
+a bit tedious to setup levels in this order, it is better to setup the levels
+from the last to the first. We will do that for the middle school:
+
+    >>> st['levels']['level8'] = level.level.Level('8th Grade')
+    >>> st['levels']['level7'] = level.level.Level(
+    ...     '7th Grade', isInitial=True, nextLevel=st['levels']['level8'])
+
+As you can see the level constructor can also accept a ``nextLevel`` argument
+that can be used to immediately specify the next level. Once the levels are
+setup, one can validate the level graphs:
+
+    >>> st['levels'].validate()
+
+If the function simply returns, no issues were found, which is the case here.
+
+
+Validating Level Graphs
+-----------------------
+
+Let's quickly explore what happens, if the validation method finds some
+problems. In those cases errors will be raised.
+
+The first error the method will catch is a looping level graph. In those cases
+following the levels will result in a loop, so that a student can never
+graduate:
+
+    >>> levels = level.level.LevelContainer()
+
+    >>> levels['level2'] = level.level.Level('2nd Grade')
+    >>> levels['level1'] = level.level.Level(
+    ...     '1st Grade', isInitial=True, nextLevel=levels['level2'])
+
+So far so good, ...
+
+    >>> levels.validate()
+
+... but now we add the fatal connection:
+
+    >>> levels['level2'].nextLevel = levels['level1']
+    >>> levels.validate()
+    Traceback (most recent call last):
+    ...
+    LevelLoopError: Loop-Closing Level: level2
+
+The duplicated level is also stored in the error as ``duplicate``.
+
+The second type of error occurs, if a level is not connected to a graph.
+
+    >>> levels = level.level.LevelContainer()
+
+    >>> levels['level2'] = level.level.Level('2nd Grade')
+    >>> levels['level1'] = level.level.Level(
+    ...     '1st Grade', isInitial=True, nextLevel=levels['level2'])
+
+We now add third and fourth levels that are not an initial levels and are not
+next levels either:
+
+    >>> levels['level3'] = level.level.Level('3rd Grade')
+    >>> levels['level5'] = level.level.Level('5th Grade')
+
+    >>> levels.validate()
+    Traceback (most recent call last):
+    ...
+    DisconnectedLevelsError: level3, level5
+
+The disconnected levels are accessible from the ``levels`` attribute of the
+exception.
+
+
+The Level Vocabulary
+--------------------
+
+The module also provides a level vocabulary. This allows us to provide UIs
+that let you select one or more levels. For the vocabulary to work, we have to
+register a schooltool application object as the current site:
+
+    >>> from zope.app.testing import setup
+    >>> sm = setup.createSiteManager(st, setsite=True)
+
+Now we can create
+
+    >>> vocab = level.level.LevelVocabulary()
+
+and use the vocabulary:
+
+    >>> st['levels']['level3'] in vocab
+    True
+
+    >>> len(vocab)
+    8
+
+    >>> term = vocab.getTerm(st['levels']['level3'])
+    >>> term.value
+    <Level '3rd Grade'>
+    >>> term.title
+    '3rd Grade'
+    >>> term.token
+    u'level3'
+    >>> vocab.getTerm(None)
+    Traceback (most recent call last):
+    ...
+    LookupError: None
+
+    >>> term = vocab.getTermByToken(u'level3')
+    >>> term.value
+    <Level '3rd Grade'>
+    >>> term.title
+    '3rd Grade'
+    >>> term.token
+    u'level3'
+    >>> vocab.getTermByToken('empty')
+    Traceback (most recent call last):
+    ...
+    LookupError: empty
+
+    >>> pprint(list(iter(vocab)))
+    [<LevelTerm token='level1' title='1st Grade'>,
+     <LevelTerm token='level2' title='2nd Grade'>,
+     <LevelTerm token='level3' title='3rd Grade'>,
+     <LevelTerm token='level4' title='4th Grade'>,
+     <LevelTerm token='level5' title='5th Grade'>,
+     <LevelTerm token='level6' title='6th Grade'>,
+     <LevelTerm token='level7' title='7th Grade'>,
+     <LevelTerm token='level8' title='8th Grade'>]
+
+
+Student Promotion Workflow
+--------------------------
+
+There are three outcomes for a student from a level:
+
+  - Passed: In that case the student will progress to the next level. If there
+            is no next level, the student will graduate.
+
+  - Failed: The student will have to repeat the level. (This is a bit
+            oversimplified, but will suffice for now. In many schools a level
+            cannot be repeated indefinitely and in colleges the concept of
+            failing a level does not exist at all.)
+
+  - Withdrawn: In some cases students leave the school for variety of reasons:
+               relocation, drop-out, transfer.
+
+Thus, the resulting workflow for completing a single level would look as
+follows::
+
+                                           +----------+     +----------+
+                            +------------> |   Pass   | --> | Graduate | --> E
+                            |              +----------+     +----------+
+                            V
+        +--------+     +----------+        +----------+
+  S --> | Enroll | --> | Complete | <----> |   Fail   |
+        +--------+     +----------+        +----------+
+                            |
+                            |              +----------+
+                            +------------> | Withdraw | --> E
+                                           +----------+
+
+The Process Definition
+~~~~~~~~~~~~~~~~~~~~~~
+
+This workflow is described by the file `promotion.xpdl` and can be loaded into
+a process definition as follows:
+
+   >>> from zope.wfmc import xpdl
+   >>> import os
+   >>> package = xpdl.read(open(os.path.join(this_directory,
+   ...                                       'promotion.xpdl')))
+
+The package only defines one process definition, our permission process:
+
+   >>> pd = package['promotion']
+
+Let's now inspect the the process definition some more to ensure it is
+correct. First let's make sure that all activities are there:
+
+    >>> pprint(pd.activities) #doctest:+ELLIPSIS
+    {'complete': <ActivityDefinition u'Complete Level'>,
+     'enroll': <ActivityDefinition u'Enroll'>,
+     'fail': <ActivityDefinition u'Fail'>,
+     'graduate': <ActivityDefinition u'Graduate'>,
+     'pass': <ActivityDefinition u'Pass'>,
+     'withdraw': <ActivityDefinition u'Withdraw'>}
+
+Let's now examine every activity to ensure that all applications are correctly
+defined:
+
+    >>> pprint([(id, showApplications(act, pd))
+    ...         for id, act in pd.activities.items()])
+    [('enroll',
+      [<Application u'Write Record': (student, level) --> ()>,
+       <Application u'Select Initial Level': () --> (level)>,
+       <Application u'Update Status': (student) --> ()>]),
+     ('complete',
+      [<Application u'Set Level Outcome': () --> (outcome)>]),
+     ('graduate',
+      [<Application u'Update Status': (student) --> ()>]),
+     ('withdraw',
+      [<Application u'Update Status': (student) --> ()>,
+       <Application u'Write Record': (student, level) --> ()>]),
+     ('pass',
+      [<Application u'Write Record': (student, level) --> ()>,
+       <Application u'Progress to Next Level': (level) --> (level)>]),
+     ('fail',
+      [<Application u'Write Record': (student, level) --> ()>])]
+
+Next we have a look at the transitions:
+
+    >>> pprint(pd.transitions)
+    [TransitionDefinition(from=u'enroll', to=u'complete'),
+     TransitionDefinition(from=u'complete', to=u'pass'),
+     TransitionDefinition(from=u'complete', to=u'fail'),
+     TransitionDefinition(from=u'complete', to=u'withdraw'),
+     TransitionDefinition(from=u'pass', to=u'graduate'),
+     TransitionDefinition(from=u'pass', to=u'complete'),
+     TransitionDefinition(from=u'fail', to=u'complete')]
+
+Note that the order of some of those transitions is important, since
+transitions are checked in the order they are listed.
+
+Finally, let's make sure that the participants are available as well:
+
+    >>> pd.participants
+    {'manager': Participant(u'Manager')}
+
+
+Integrating the workflow into SchoolTool
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Now that we have loaded and verified the process definition, we have to hook
+it into schooltool. This is done via the integration, which will provide
+actual implementations of the participants and applications (known as work
+items). Here we choose the adapter integration, which will look up
+participants and work items via the adapter registry:
+
+    >>> from zope.wfmc.adapter import integration
+    >>> pd.integration = integration
+
+Note that until now, we have not needed any SchoolTool-specific code, which
+means that in theory the process definition can be used by various
+systems. With the registration of the adapters we now hook it up specifically
+for SchoolTool:
+
+    >>> import zope.component
+    >>> import zope.wfmc.interfaces
+    >>> from schooltool.level import promotion
+
+    >>> zope.component.provideAdapter(promotion.Manager,
+    ...                               provides=zope.wfmc.interfaces.IParticipant,
+    ...                               name='promotion.manager')
+
+    >>> zope.component.provideAdapter(promotion.ProgressToNextLevel,
+    ...                               name='promotion.progressToNextLevel')
+    >>> zope.component.provideAdapter(promotion.SelectInitialLevel,
+    ...                               provides=zope.wfmc.interfaces.IWorkItem,
+    ...                               name='promotion.selectInitialLevel')
+    >>> zope.component.provideAdapter(promotion.SetLevelOutcome,
+    ...                               provides=zope.wfmc.interfaces.IWorkItem,
+    ...                               name='promotion.setLevelOutcome')
+    >>> zope.component.provideAdapter(promotion.UpdateStatus,
+    ...                               name='promotion.updateStatus')
+    >>> zope.component.provideAdapter(promotion.WriteRecord,
+    ...                               name='promotion.writeRecord')
+
+We also need to set up an adapter to retrieve current work items for the
+manager group
+
+    >>> from schooltool.group.interfaces import IGroup
+    >>> from schooltool.level import interfaces
+    >>> zope.component.provideAdapter(promotion.getManagerWorkItems,
+    ...                               adapts=(IGroup,),
+    ...                               provides=interfaces.IManagerWorkItems)
+
+and one adapter to access and manage the academic record of the student:
+
+    >>> from schooltool.level import record
+    >>> zope.component.provideAdapter(record.AcademicRecord)
+
+
+Testing the Workflow Process
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We are almost ready now to run through the academic career of a student. The
+only task left is to
+
+  o get the `manager` group, which will complete all the work items:
+
+    >>> manager = st['groups']['manager']
+
+  o create a student which attends the school:
+
+    >>> from schooltool.person import person
+    >>> st['persons']['student'] = person.Person('student', 'Mr. Student')
+    >>> student = st['persons']['student']
+
+  o register an event listener, so that we can see the flow through the process:
+
+    >>> def log_workflow(event):
+    ...     print event
+
+    >>> import zope.event
+    >>> zope.event.subscribers.append(log_workflow)
+
+  o register the process definition as a utility:
+
+    >>> zope.component.provideUtility(pd, name='promotion')
+
+Now we can create a process from our process definition by simply calling it:
+
+    >>> proc = pd()
+
+You then start the process by calling the method ``start()``. The arguments to
+this method are the values of the formal input parameters of the process
+definition:
+
+    # Arguments: student, level, outcome
+    >>> proc.start(student, None, None)
+    ProcessStarted(Process(u'promotion'))
+    Transition(None, Activity(u'promotion.enroll'))
+    ActivityStarted(Activity(u'promotion.enroll'))
+    WorkItemFinished(u'writeRecord')
+    WorkItemFinished(u'updateStatus')
+
+If we now look at the student's academic record, we will see that the student
+is now marked as enrolled and the academic history shows an entry as well:
+
+    >>> rec = level.interfaces.IAcademicRecord(student)
+    >>> rec.status
+    'Enrolled'
+    >>> rec.history #doctest:+ELLIPSIS
+    [HistoricalRecord('Enrolled' at ...)]
+
+The manager group should also have some work items:
+
+    >>> work = level.interfaces.IManagerWorkItems(manager)
+    >>> work.values() #doctest:+ELLIPSIS
+    [<schooltool.level.promotion.SelectInitialLevel object at ...>]
+
+We can now select the work item and pass in the initial level. The student will
+start at the first grade:
+
+    >>> item = list(work.values())[-1]
+    >>> item.finish(st['levels']['level1'])
+    WorkItemFinished(u'selectInitialLevel')
+    ActivityFinished(Activity(u'promotion.enroll'))
+    Transition(Activity(u'promotion.enroll'), Activity(u'promotion.complete'))
+    ActivityStarted(Activity(u'promotion.complete'))
+
+Now the student is completing the first class.
+
+    >>> proc.workflowRelevantData.level
+    <Level '1st Grade'>
+
+S/he passes the class easily:
+
+    >>> list(work.values()) #doctest:+ELLIPSIS
+    [<schooltool.level.promotion.SetLevelOutcome object at ...>]
+
+    >>> item = list(work.values())[-1]
+    >>> item.finish('pass')
+    WorkItemFinished(u'setLevelOutcome')
+    ActivityFinished(Activity(u'promotion.complete'))
+    Transition(Activity(u'promotion.complete'), Activity(u'promotion.pass'))
+    ActivityStarted(Activity(u'promotion.pass'))
+    WorkItemFinished(u'writeRecord')
+    WorkItemFinished(u'progressToNextLevel')
+    ActivityFinished(Activity(u'promotion.pass'))
+    Transition(Activity(u'promotion.pass'), Activity(u'promotion.complete'))
+    ActivityStarted(Activity(u'promotion.complete'))
+
+As we can see, the workflow went to the `Pass` activity and completed several
+workitems. We have a new entry in the history
+
+    >>> rec.history[-1] #doctest:+ELLIPSIS
+    HistoricalRecord('Passed' at ...)
+
+    >>> rec.history[-1].description
+    u'Passed level "1st Grade"'
+
+and the student is now in the second grade:
+
+    >>> proc.workflowRelevantData.level
+    <Level '2nd Grade'>
+
+In second grade, however, s/he has troubles and fails.
+
+    >>> list(work.values()) #doctest:+ELLIPSIS
+    [<schooltool.level.promotion.SetLevelOutcome object at ...>]
+
+    >>> item = list(work.values())[-1]
+    >>> item.finish('fail')
+    WorkItemFinished(u'setLevelOutcome')
+    ActivityFinished(Activity(u'promotion.complete'))
+    Transition(Activity(u'promotion.complete'), Activity(u'promotion.fail'))
+    ActivityStarted(Activity(u'promotion.fail'))
+    WorkItemFinished(u'writeRecord')
+    ActivityFinished(Activity(u'promotion.fail'))
+    Transition(Activity(u'promotion.fail'), Activity(u'promotion.complete'))
+    ActivityStarted(Activity(u'promotion.complete'))
+
+Thus, the record is not as positive:
+
+    >>> rec.history[-1] #doctest:+ELLIPSIS
+    HistoricalRecord('Failed' at ...)
+
+    >>> rec.history[-1].description
+    u'Failed level "2nd Grade"'
+
+    >>> proc.workflowRelevantData.level
+    <Level '2nd Grade'>
+
+But after that she is fine again until s/he graduates elementary school:
+
+    >>> list(work.values())[-1].finish('pass') #doctest:+ELLIPSIS
+    WorkItemFinished(u'setLevelOutcome')
+    ...
+    ActivityStarted(Activity(u'promotion.complete'))
+
+    >>> list(work.values())[-1].finish('pass') #doctest:+ELLIPSIS
+    WorkItemFinished(u'setLevelOutcome')
+    ...
+    ActivityStarted(Activity(u'promotion.complete'))
+
+    >>> list(work.values())[-1].finish('pass') #doctest:+ELLIPSIS
+    WorkItemFinished(u'setLevelOutcome')
+    ...
+    ActivityStarted(Activity(u'promotion.complete'))
+
+    >>> list(work.values())[-1].finish('pass') #doctest:+ELLIPSIS
+    WorkItemFinished(u'setLevelOutcome')
+    ...
+    ActivityStarted(Activity(u'promotion.complete'))
+
+    >>> list(work.values())[-1].finish('pass')
+    WorkItemFinished(u'setLevelOutcome')
+    ActivityFinished(Activity(u'promotion.complete'))
+    Transition(Activity(u'promotion.complete'), Activity(u'promotion.pass'))
+    ActivityStarted(Activity(u'promotion.pass'))
+    WorkItemFinished(u'writeRecord')
+    WorkItemFinished(u'progressToNextLevel')
+    ActivityFinished(Activity(u'promotion.pass'))
+    Transition(Activity(u'promotion.pass'), Activity(u'promotion.graduate'))
+    ActivityStarted(Activity(u'promotion.graduate'))
+    WorkItemFinished(u'updateStatus')
+    ActivityFinished(Activity(u'promotion.graduate'))
+    ProcessFinished(Process(u'promotion'))
+
+As you can see above, after the student passed the final level in elementary
+school, s/he graduated:
+
+    >>> rec.status
+    'Graduated'
+
+This also completed the process. Now our student enters middle school, which
+requires a new process:
+
+    >>> proc.start(student, None, None)
+    ProcessStarted(Process(u'promotion'))
+    Transition(None, Activity(u'promotion.enroll'))
+    ActivityStarted(Activity(u'promotion.enroll'))
+    WorkItemFinished(u'writeRecord')
+    WorkItemFinished(u'updateStatus')
+
+    >>> item = list(work.values())[-1]
+    >>> item.finish(st['levels']['level7'])
+    WorkItemFinished(u'selectInitialLevel')
+    ActivityFinished(Activity(u'promotion.enroll'))
+    Transition(Activity(u'promotion.enroll'), Activity(u'promotion.complete'))
+    ActivityStarted(Activity(u'promotion.complete'))
+
+However, after a few months the family is moving and the student withdraws
+from the school:
+
+    >>> list(work.values())[-1].finish('withdraw')
+    WorkItemFinished(u'setLevelOutcome')
+    ActivityFinished(Activity(u'promotion.complete'))
+    Transition(Activity(u'promotion.complete'), Activity(u'promotion.withdraw'))
+    ActivityStarted(Activity(u'promotion.withdraw'))
+    WorkItemFinished(u'updateStatus')
+    WorkItemFinished(u'writeRecord')
+    ActivityFinished(Activity(u'promotion.withdraw'))
+    ProcessFinished(Process(u'promotion'))
+
+    >>> rec.status
+    'Withdrawn'
+
+    >>> rec.history[-1] #doctest:+ELLIPSIS
+    HistoricalRecord('Withdrawn' at ...)
+
+    >>> rec.history[-1].description
+    u'Withdrew before or during level "7th Grade"'
+
+    >>> rec.history[-1].user
+    '<unknown>'
+
+Cleanup:
+
+    >>> zope.event.subscribers.pop() #doctest: +ELLIPSIS
+    <function log_workflow at ...>
+
+
+Process Storage Management
+--------------------------
+
+Now we know how the promotion workflow functions, but where is it stored? A
+subscriber to the ``IProcessStarted`` event stores the process usign the
+academic record API. Using a stub implementation for the workflow process and
+the event,
+
+    >>> student = person.Person('student', 'Mr. Student')
+
+    >>> class Process(object):
+    ...     process_definition_identifier = 'schooltool.promotion'
+    ...     student = None
+    ...     def __getattr__(self, name):
+    ...         return self
+    >>> process = Process()
+    >>> process.student = student
+
+    >>> class Event(object):
+    ...     pass
+    >>> event = Event()
+    >>> event.process = process
+
+we can assign the process to a student:
+
+    >>> promotion.addProcessToStudent(event)
+    >>> interfaces.IAcademicRecord(student).levelProcess is process
+    True
+
+The process is removed from the student using a ``IProcessFinished`` event
+subscriber:
+
+    >>> promotion.removeProcessFromStudent(event)
+    >>> interfaces.IAcademicRecord(student).levelProcess is None
+    True


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+# Make a package.
+
+def registerTestSetup():
+    from schooltool.testing import registry
+
+    def addLevelContainer(app):
+        from schooltool.level import level
+        app['levels'] = level.LevelContainer()
+
+    registry.register('ApplicationContainers', addLevelContainer)
+
+registerTestSetup()
+del registerTestSetup
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,412 @@
+=====================================================
+Level Management and Academic Workflow via the Web UI
+=====================================================
+
+This document presents the management of levels and the academic career of a
+student via a promotion workflow from the perspective of the Web UI.
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> browser = Browser()
+    >>> browser.addHeader('Authorization', 'Basic manager:schooltool')
+
+    >>> browser.handleErrors = False
+    >>> browser.open('http://localhost/')
+
+
+Level Management
+----------------
+
+First we create a couple of levels.
+
+    >>> browser.open('http://localhost/levels')
+
+    >>> browser.getLink('New Level').click()
+    >>> browser.getControl('Title').value = u'1st Grade'
+    >>> browser.getControl('Initial Level').selected = True
+    >>> browser.getControl(name='add_input_name').value = u'level1'
+    >>> browser.getControl('Add').click()
+
+    >>> '1st Grade' in browser.contents
+    True
+
+    >>> browser.getLink('New Level').click()
+    >>> browser.getControl('Title').value = u'2nd Grade'
+    >>> browser.getControl('Initial Level').selected = False
+    >>> browser.getControl(name='add_input_name').value = u'level2'
+    >>> browser.getControl('Add').click()
+
+    >>> '2nd Grade' in browser.contents
+    True
+
+Since we did not connect the two levels, validation should fail:
+
+    >>> browser.getLink('Validate Levels').click()
+    >>> browser.getControl('Validate').click()
+
+    >>> "One or more disconnected levels detected." in browser.contents
+    True
+    >>> "2nd Grade" in browser.contents
+    True
+
+If we connect `level1` to `level2` and also `level2` to `level1`, we get a
+loop validation error:
+
+    >>> browser.getLink('Levels').click()
+    >>> browser.getLink('1st Grade').click()
+    >>> browser.getLink('Edit Info').click()
+    >>> browser.getControl('Next Level').value = ['level2']
+    >>> browser.getControl('Apply').click()
+
+    >>> browser.getLink('Levels').click()
+    >>> browser.getLink('2nd Grade').click()
+    >>> browser.getLink('Edit Info').click()
+    >>> browser.getControl('Next Level').value = ['level1']
+    >>> browser.getControl('Apply').click()
+
+    >>> browser.getLink('Levels').click()
+    >>> browser.getLink('Validate Levels').click()
+    >>> browser.getControl('Validate').click()
+
+    >>> "A Level Loop Error was detected." in browser.contents
+    True
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    Simply do not specify level
+    <em>1st Grade</em>
+    ...
+
+Okay, so let's do what the error tells us and remove the link in `level2` to
+`level1`:
+
+    >>> browser.getLink('Levels').click()
+    >>> browser.getLink('1st Grade').click()
+    >>> browser.getLink('Edit Info').click()
+    >>> browser.getControl('Previous Level').value = []
+    >>> browser.getControl('Apply').click()
+
+    >>> browser.getLink('Levels').click()
+    >>> browser.getLink('Validate Levels').click()
+    >>> browser.getControl('Validate').click()
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    No errors were detected.
+    ...
+
+
+The Academic Career of a Student
+--------------------------------
+
+Before we can do anything, we have to create a student:
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Stephan Richter', 'srichter', 'foobar')
+
+Now we go to the manager group, and walk the student through the academic
+career:
+
+    >>> browser.getLink('Groups').click()
+    >>> browser.getLink('Manager', url="groups/manager").click()
+    >>> browser.getLink('Student Management').click()
+
+We now select the student which we want to enroll in the school.
+
+    >>> form = browser.getForm(name='enroll')
+    >>> form.getControl(name='ids:list').value = ['srichter']
+    >>> form.submit('Enroll')
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">Students successfully enrolled.</div>
+    ...
+    <option value="level1">1st Grade</option>
+    <option value="level2">2nd Grade</option>
+    ...
+
+Now that the student is enrolled, we can initialize him at a particular
+level. Our student will enter the first grade:
+
+    >>> form = browser.getForm(name='initialize')
+    >>> ctrl = form.getControl(name='ids:list')
+    >>> id = ctrl.options[0]
+    >>> ctrl.value = [id]
+    >>> form.getControl(name=id+'.level').value = ['level1']
+    >>> form.submit('Apply')
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">Student processes successfully updated.</div>
+    ...
+    <div class="value">
+    <select id="...outcome" name="...outcome" size="1" >
+    <option selected="selected" value="pass">pass</option>
+    <option value="fail">fail</option>
+    <option value="withdraw">withdraw</option>
+    </select>
+    </div>
+    ...
+
+The student passes the first grade
+
+    >>> form = browser.getForm(name='outcome')
+    >>> ctrl = form.getControl(name='ids:list')
+    >>> id = ctrl.options[0]
+    >>> ctrl.value = [id]
+    >>> browser.getControl(name=id+'.outcome').value = ['pass']
+    >>> form.submit('Apply')
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">Student processes successfully updated.</div>
+    ...
+    <span>2nd Grade</span>
+    ...
+
+but fails the second grade the first time around:
+
+    >>> form = browser.getForm(name='outcome')
+    >>> ctrl = browser.getControl(name='ids:list', index=1)
+    >>> id = ctrl.options[0]
+    >>> ctrl.value = [id]
+    >>> browser.getControl(name=id+'.outcome').value = ['fail']
+    >>> form.submit('Apply')
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">Student processes successfully updated.</div>
+    ...
+    <span>2nd Grade</span>
+    ...
+
+If you forget to select the student, you get a nice notice:
+
+    >>> form = browser.getForm(name='outcome')
+    >>> ctrl = form.getControl(name='ids:list')
+    >>> id = ctrl.options[0]
+    >>> browser.getControl(name=id+'.outcome').value = ['fail']
+    >>> form.submit('Apply')
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">No students were selected.</div>
+    ...
+
+Now we finally pass the student, so he will graduate; that means he will
+appear at the top of the list again:
+
+    >>> form = browser.getForm(name='outcome')
+    >>> ctrl = form.getControl(name='ids:list')
+    >>> id = ctrl.options[0]
+    >>> ctrl.value = [id]
+    >>> browser.getControl(name=id+'.outcome').value = ['pass']
+    >>> form.submit('Apply')
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">Student processes successfully updated.</div>
+    ...
+    <tr>
+      <td>
+        <input type="checkbox" name="ids:list"
+               value="srichter" />
+      </td>
+      <td>
+        <span>Stephan Richter</span>
+        (<span>srichter</span>)
+      </td>
+    </tr>
+    ...
+
+That's it. We have successfully moved through a student's academic career.
+
+
+And a second time ...
+---------------------
+
+Let's now do this again in a student-specific UI. To make the walkthrough
+cleaner, we create a new student first:
+
+    >>> addPerson('Tom Hoffman', 'tom', 'foobar')
+
+Now we enter the new student and look at his academic career:
+
+    >>> browser.open('http://localhost/persons')
+    >>> browser.getLink('Tom Hoffman').click()
+    >>> browser.getLink('Academic Record').click()
+
+In the academic record you see the status of the student, the workflow and the
+academic history:
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <h1>
+      Academic Record for <em>Tom Hoffman</em>
+    </h1>
+    ...
+    <h3>Status</h3>
+    ...
+    <h3>Workflow</h3>
+    ...
+    value="Initialize"
+    ...
+    <h3>History</h3>
+    <ul style="list-style: disc">
+    </ul>
+    ...
+
+We can see that there is currently no workflow and the history is empty. Let's
+now create the workflow:
+
+    >>> browser.getControl('Initialize').click()
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">The Level Process was successfully initialized.</div>
+    ...
+    <h5>Select Initial Level</h5>
+    ...
+    <h3>History</h3>
+    <ul style="list-style: disc">
+      <li>
+        <em>Enrolled</em>
+        <div style="font-size: smaller">
+           on <span>...</span>
+           by <span>sb.person.manager</span>
+        </div>
+        <p>Enrolled at school</p>
+      </li>
+    </ul>
+    ...
+
+You see that we can now specify the initial level of the student and a history
+entry was added signalizing the beginning of the student's academic
+career. Let's now select the initial level:
+
+    >>> id = browser.getControl(name='workitemId').value
+    >>> browser.getControl(name=id+'.level').value = ['level1']
+    >>> browser.getControl('Finish').click()
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">Work Item successfully finished.</div>
+    ...
+    <h5>Set Level Outcome</h5>
+    ...
+    <p>Current Level: 1st Grade</p>
+    ...
+
+Now let's fail the student in the first grade:
+
+    >>> id = browser.getControl(name='workitemId').value
+    >>> browser.getControl(name=id+'.outcome').value = ['fail']
+    >>> browser.getControl('Finish').click()
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <div id="message">Work Item successfully finished.</div>
+    ...
+    <h5>Set Level Outcome</h5>
+    ...
+    <h3>History</h3>
+    <ul style="list-style: disc">
+    ...
+      <li>
+        <em>Failed</em>
+        <div style="font-size: smaller">
+           on <span>...</span>
+           by <span>sb.person.manager</span>
+        </div>
+        <p>Failed level "1st Grade"</p>
+      </li>
+    </ul>
+    ...
+
+After the first grade, the student withdraws from the school:
+
+    >>> id = browser.getControl(name='workitemId').value
+    >>> browser.getControl(name=id+'.outcome').value = ['withdraw']
+    >>> browser.getControl('Finish').click()
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <h3>Workflow</h3>
+    <div id="message">Work Item successfully finished.</div>
+    ...
+    value="Initialize"
+    ...
+    <h3>History</h3>
+    <ul style="list-style: disc">
+    ...
+      <li>
+        <em>Withdrawn</em>
+        <div style="font-size: smaller">
+           on <span>...</span>
+           by <span>sb.person.manager</span>
+        </div>
+        <p>Withdrew before or during level "1st Grade"</p>
+      </li>
+    </ul>
+    ...
+
+As you can see, the withdrawing from the school also removed the process.
+
+To get the correct status, we first have to reload:
+
+    >>> browser.reload()
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <h3>Status</h3>
+    ...
+    <option selected="selected" value="Withdrawn">Withdrawn</option>
+    ...
+
+One very powerful feature of the academic record screen is the removal of a
+workflow:
+
+    >>> browser.getControl('Initialize').click()
+    >>> browser.getControl('Remove').click()
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <h3>Workflow</h3>
+    <div id="message">The Level Process was successfully removed.</div>
+    ...
+    value="Initialize"
+    ...
+
+We just need to make sure that all the workitems got deleted as well:
+
+    >>> browser.getLink('Groups').click()
+    >>> browser.getLink('Manager', url='groups/manager').click()
+    >>> browser.getLink('Student Management').click()
+
+    >>> print browser.contents
+    <BLANKLINE>
+    ...
+    <h3>Initialize Students</h3>
+    ...
+    <table width="100%">
+      <tr>
+        <th width="5%">&nbsp;</th>
+        <th width="45%">Student Name (username)</th>
+        <th width="50%">Inital Level</th>
+      </tr>
+    </table>
+    ...
+
+That's all.


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,182 @@
+<configure
+    xmlns="http://namespaces.zope.org/browser"
+    xmlns:zope="http://namespaces.zope.org/zope"
+    i18n_domain="schooltool">
+
+  <!-- Level Container Views -->
+
+  <configure package="schooltool.skin">
+
+    <page
+        name="index.html"
+        for="schooltool.level.interfaces.ILevelContainer"
+        class="schooltool.level.browser.level.LevelContainerView"
+        permission="schooltool.view"
+        menu="zmi_views" title="View"
+        />
+
+    <navigationViewlet
+      name="levels"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.TopLevelContainerNavigationViewlet"
+      permission="schooltool.view"
+      link="levels"
+      title="Levels"
+      order="90"
+      />
+
+    <navigationViewlet
+      name="validate-levels"
+      for="schooltool.level.interfaces.ILevelContainer"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.edit"
+      link="@@validate.html"
+      title="Validate Levels"
+      order="50"
+      />
+
+    <navigationViewlet
+      name="new-level"
+      for="schooltool.level.interfaces.ILevelContainer"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.edit"
+      link="+/addSchoolToolLevel.html"
+      title="New Level"
+      order="30"
+      />
+
+    <navigationViewlet
+      name="edit-level-info"
+      for="schooltool.level.interfaces.ILevel"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.edit"
+      link="@@edit.html"
+      title="Edit Info"
+      order="10"
+      />
+  </configure>
+
+  <containerViews
+      for="..interfaces.ILevelContainer"
+      contents="schooltool.view"
+      add="schooltool.edit"
+      />
+
+  <page
+      name="validate.html"
+      for="..interfaces.ILevelContainer"
+      class=".level.LevelValidationView"
+      template="level_validation.pt"
+      permission="schooltool.view"
+      />
+
+  <!-- Level Graph Validation Error Views -->
+
+  <page
+      name="info"
+      for="..interfaces.ILevelLoopError"
+      template="levellooperror_info.pt"
+      permission="zope.View"
+      />
+
+  <page
+      name="info"
+      for="..interfaces.IDisconnectedLevelsError"
+      template="disconnectedlevelerror_info.pt"
+      permission="zope.View"
+      />
+
+  <!-- Level Views -->
+
+  <zope:adapter
+      factory=".level.EditLevelAdapter" />
+
+  <configure package="schooltool.skin">
+
+    <addform
+        label="Add a Level"
+        name="addSchoolToolLevel.html"
+        schema="schooltool.level.browser.level.IEditLevelSchema"
+        fields="title isInitial previousLevel nextLevel"
+        arguments="title"
+        content_factory="schooltool.level.level.Level"
+        permission="schooltool.edit"
+        template="templates/simple_add.pt"
+        class="schooltool.level.browser.level.LevelAddView"
+        />
+
+    <editform
+        label="Edit Level"
+        name="edit.html"
+        schema="schooltool.level.browser.level.IEditLevelSchema"
+        for="schooltool.level.interfaces.ILevel"
+        fields="title isInitial previousLevel nextLevel"
+        template="templates/simple_edit.pt"
+        class="schooltool.level.browser.level.LevelEditView"
+        permission="schooltool.edit"
+        />
+
+  </configure>
+
+  <page
+      name="index.html"
+      for="..interfaces.ILevel"
+      template="level.pt"
+      permission="schooltool.view"
+      menu="zmi_views" title="View"
+      />
+
+  <!-- Promotion Views -->
+
+  <page
+      name="promotion.html"
+      for="schooltool.group.interfaces.IGroup"
+      template="promotion.pt"
+      class=".promotion.PromotionWorkItemsView"
+      permission="schooltool.edit"
+      menu="schooltool_actions" title="Student Management"
+      />
+
+  <zope:view
+      for="..promotion.SelectInitialLevel"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      provides=".promotion.IFinishSchemaWorkitem"
+      factory=".promotion.SchemaWorkItemView"
+      permission="schooltool.view"
+      />
+
+  <zope:view
+      for="..promotion.SetLevelOutcome"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      provides=".promotion.IFinishSchemaWorkitem"
+      factory=".promotion.SetLevelOutcomeView"
+      permission="schooltool.view"
+      />
+
+  <!-- Academic Record Views -->
+
+  <page
+      name="academicRecord.html"
+      for="schooltool.person.interfaces.IPerson"
+      template="record.pt"
+      class=".record.AcademicRecordView"
+      permission="schooltool.view"
+      menu="schooltool_actions" title="Academic Record"
+      />
+
+  <zope:adapter
+      for="schooltool.level.interfaces.ILevelContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory="schooltool.table.table.FilterWidget" />
+
+  <zope:adapter
+      for="schooltool.level.interfaces.ILevelContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory="schooltool.table.table.SchoolToolTableFormatter " />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/disconnectedlevelerror_info.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/disconnectedlevelerror_info.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/disconnectedlevelerror_info.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+<div id="message"
+     i18n:domain="schooltool">
+  <h1 i18n:translate="">One or more disconnected levels detected.</h1>
+
+  <h5 i18n:translate="">Details</h5>
+  <p>
+    One or more disconnected levels have been detected:
+  </p>
+  <ul style="list-style: circle">
+    <li tal:repeat="level context/levels">
+      <a href=""
+          tal:attributes="href string: ${level/@@absolute_url}/@@edit.html">
+        <em tal:replace="level/title">Level X</em> 
+        (<span tal:replace="level/zope:name" />)
+      </a>
+    </li>
+  </ul>
+  <br />
+
+  <h5 i18n:translate="">Explanation</h5>
+  <p i18n:translate="">
+    Disconnected levels will simply never be used, since they are not
+    connected to a graph. This does not affect the integrity of the level
+    graphs, but it is not desirable.
+  </p>
+
+  <h5 i18n:translate="">Solution</h5>
+  <p i18n:translate="">
+    You can either <a href="@@index.html">remove</a> those levels or connect 
+    them to an existing graph.    
+  </p>
+
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/disconnectedlevelerror_info.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,34 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.level.
+
+$Id: ftests.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.level.ftesting import level_functional_layer
+
+def test_suite():
+    return collect_ftests(filenames=['README.txt'],
+                          layer=level_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/level.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/level.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/level.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,44 @@
+<metal:block use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+
+  <metal:slot fill-slot="title">
+    <span tal:replace="context/title">Level X</span>
+  </metal:slot>
+
+  <metal:block fill-slot="content-header">
+    <h1 tal:content="context/title" />
+  </metal:block>
+
+  <metal:block metal:fill-slot="body">
+
+    <div class="info-block">
+
+      <p tal:condition="context/isInitial" i18n:translate="">
+        This is an initial level.
+      </p>
+
+      <p>
+        Next Level:
+        <span tal:condition="not: context/nextLevel"
+              i18n:translate="">None</span>
+
+        <a href=""
+           tal:attributes="href context/nextLevel/@@absolute_url"
+           tal:condition="context/nextLevel"
+           tal:content="context/nextLevel/title">
+           Level Next
+        </a>
+
+      </p>
+
+      <br />
+
+      <a class="modify" href="@@edit.html" title="Edit Info"
+         i18n:attributes="title" i18n:translate="">
+         Edit Info
+      </a>
+
+    </div>
+
+  </metal:block>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/level.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/level.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/level.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/level.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,116 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Level views.
+
+$Id: level.py 6602 2007-01-26 13:17:25Z ignas $
+"""
+import zope.component
+import zope.interface
+import zope.schema
+from zope.security import proxy
+from zope.app import zapi
+from zope.app.form.browser import add
+from zope.publisher import browser
+
+from schooltool.level import interfaces
+from schooltool import SchoolToolMessage as _
+from schooltool.app.browser import app
+from schooltool.skin.containers import TableContainerView
+
+
+class LevelContainerView(TableContainerView):
+    """A Level Container view."""
+
+    __used_for__ = interfaces.ILevelContainer
+
+    index_title = _("Level index")
+
+
+class LevelValidationView(browser.BrowserView):
+    """Validate the level graphs."""
+
+    def validate(self):
+        if 'VALIDATE' in self.request:
+            try:
+                self.context.validate()
+            except interfaces.LevelValidationError, error:
+                return zapi.getMultiAdapter((error, self.request), name="info")
+
+
+class IEditLevelSchema(interfaces.ILevel):
+
+    previousLevel = zope.schema.Choice(
+        title=_("Previous Level"),
+        description=_("The previous level in the school. If None, then "
+                      "there is no previous level."),
+        vocabulary="Levels",
+        required=False,
+        default=None)
+
+
+class EditLevelAdapter(object):
+    """Adapter to allow us display the previous level as an option."""
+
+    zope.interface.implements(IEditLevelSchema)
+    zope.component.adapts(interfaces.ILevel)
+
+    def __init__(self, context):
+        # Make sure we are not using setattr to set the context
+        self.__dict__['context'] = context
+
+    def __getattr__(self, name):
+        return getattr(self.context, name)
+
+    def __setattr__(self, name, value):
+        if name is 'previousLevel':
+            prevLevel = self.getPreviousLevel()
+            if prevLevel is not None:
+                prevLevel.nextLevel = None
+            if value is not None:
+                value.nextLevel = proxy.removeSecurityProxy(self.context)
+        else:
+            setattr(self.context, name, value)
+
+    def getPreviousLevel(self):
+        parent = zapi.getParent(self.context)
+        for level in parent.values():
+            if level.nextLevel == self.context:
+                return level
+
+    previousLevel = property(getPreviousLevel)
+
+
+class LevelAddView(add.AddView):
+    """A view for adding Levels."""
+
+    def nextURL(self):
+        return zapi.absoluteURL(self.context.context, self.request)
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(self.nextURL())
+        else:
+            return add.AddView.update(self)
+
+
+class LevelEditView(app.BaseEditView):
+    """View for editing Levels."""
+
+    __used_for__ = interfaces.ILevel


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/level.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/level.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/level.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/level.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,250 @@
+===========
+Level Views
+===========
+
+This file contains the documentation and tests of the browser view classes
+provided by this package.
+
+
+Level Validation View
+---------------------
+
+The validation view ensures that created level graph is consistent. When the
+validation button is pressed, the level container will validate the
+layout. Let's create a stub implementation of the level container first:
+
+  >>> class LevelContainer(object):
+  ...      invalidError = None
+  ...
+  ...      def validate(self):
+  ...          if self.invalidError is not None:
+  ...              raise self.invalidError
+  >>> container = LevelContainer()
+
+Now we create a request that asks for the validation to occur:
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest(environ={'VALIDATE': True})
+
+After instantiating the view, we should now be able to validate the level
+graph:
+
+  >>> from schooltool.level.browser import level
+  >>> view = level.LevelValidationView(container, request)
+  >>> view.validate()
+
+Now, when a validation error occurs, the view looks up a view for the error
+that will provide an explanation:
+
+  >>> class ValidationErrorView(object):
+  ...
+  ...     def __init__(self, context, request):
+  ...         pass
+
+  >>> import zope.component
+  >>> import zope.interface
+  >>> from schooltool.level import interfaces
+  >>> zope.component.provideAdapter(
+  ...     ValidationErrorView,
+  ...     (interfaces.ILevelValidationError, TestRequest),
+  ...     zope.interface.Interface,
+  ...     name='info')
+
+So if the validation process causes a validation error
+
+  >>> container.invalidError = interfaces.LevelValidationError()
+
+we should get the validation error view:
+
+  >>> view.validate()
+  <ValidationErrorView object at ...>
+
+
+Edit Level Adapter
+------------------
+
+This adapter is used to edit a level; why can we not use the level directly?
+Well, users often do not want to just specify the next level in the graph, but
+also the previous one. In the data structure, however, we really one need to
+link to the next level. The adapter provides the functionality to also store
+the previous level.
+
+First, we need to create a level container with some levels though:
+
+  >>> from schooltool.level.level import LevelContainer, Level
+  >>> levels = LevelContainer()
+  >>> levels['grade1'] = Level('1st Grade')
+  >>> levels['grade2'] = Level('2nd Grade')
+
+Now we can instantiate the adapter for the second grade:
+
+  >>> editGrade2 = level.EditLevelAdapter(levels['grade2'])
+
+As we can see, initially there is no previous level:
+
+  >>> editGrade2.previousLevel
+
+But once, we set it, it is available:
+
+  >>> editGrade2.previousLevel = levels['grade1']
+  >>> editGrade2.previousLevel
+  <Level '1st Grade'>
+
+Of course, the second grade is now the first grade's next level:
+
+  >>> levels['grade1'].nextLevel
+  <Level '2nd Grade'>
+
+
+Level Add View
+--------------
+
+In order to have a valid add setup, we have to create an ``IAdding`` object,
+which corresponds to the '+' in the URL:
+
+  >>> class Adding(object):
+  ...     pass
+  >>> adding = Adding()
+
+We now have to create the level container, which is the context of adding:
+
+  >>> from schooltool.level.level import LevelContainer
+  >>> levelContainer = LevelContainer()
+  >>> adding.context = levelContainer
+
+When the add view is registered, ZCML adds some attributes -- `schema`,
+'fieldNames', and `_factory` -- and creates a new subclass:
+
+  >>> from schooltool.level.interfaces import ILevel
+  >>> class LevelAddView(level.LevelAddView):
+  ...     schema = ILevel
+  ...     fieldNames = ('title',)
+  ...     _factory = Level
+
+Now we can instantiate the view:
+
+  >>> request = TestRequest()
+  >>> view = LevelAddView(adding, request)
+
+The ``nextURL()`` method tells Zope 3 where you should be redirected after
+successfully adding a level.  We will pretend that ``container`` is located at
+the root so that ``zapi.absoluteURL(container)`` returns 'http://127.0.0.1'.
+
+  >>> from zope.traversing.interfaces import IContainmentRoot
+  >>> zope.interface.directlyProvides(levelContainer, IContainmentRoot)
+  >>> view.nextURL()
+  'http://127.0.0.1'
+
+We can cancel an action if we want to:
+
+  >>> request = TestRequest(environ={'CANCEL': 'Cancel'})
+  >>> view = LevelAddView(adding, request)
+  >>> view.update()
+  >>> request.response.getStatus()
+  302
+  >>> request.response.getHeader('Location')
+  'http://127.0.0.1'
+
+If 'CANCEL' is not present in the request, the view calls inherited
+'update'.  We will use a trick and set update_status to some value to
+short-circuit AddView.update().
+
+  >>> request = TestRequest()
+  >>> request.form = {'field.title': 'grade1',
+  ...                 'UPDATE_SUBMIT': 'Add'}
+  >>> view = LevelAddView(adding, request)
+  >>> view.update_status = 'Just checking'
+  >>> view.update()
+  'Just checking'
+
+
+Level Edit View
+---------------
+
+For the edit view to work we need to setup the level vocabulary as well:
+
+  >>> from schooltool.level.level import LevelVocabulary
+  >>> from zope.schema import vocabulary
+  >>> vocabulary._clear()
+  >>> registry = vocabulary.getVocabularyRegistry()
+  >>> registry.register('Levels', LevelVocabulary)
+
+The edit view really works with the edit level adapter we introduced above; so
+let's just reuse it:
+
+  >>> levels.__name__ = 'levels'
+  >>> zope.interface.directlyProvides(levels, IContainmentRoot)
+
+  >>> request = TestRequest()
+  >>> class LevelEditView(level.LevelEditView):
+  ...     schema = level.IEditLevelSchema
+  ...     fieldNames = ('title', 'isInitial', 'nextLevel', 'previousLevel')
+
+  >>> view = LevelEditView(editGrade2, request)
+
+We should not get redirected if we did not click on apply button:
+
+  >>> request = TestRequest()
+  >>> view = LevelEditView(editGrade2, request)
+  >>> view.update()
+  ''
+  >>> request.response.getStatus()
+  599
+
+After changing title of the level you should get redirected to the level
+overview:
+
+  >>> request = TestRequest()
+  >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+  ...                 'field.title': u'Second Grade'}
+  >>> view = LevelEditView(editGrade2, request)
+  >>> view.update()
+  u'Updated on ${date_time}'
+  >>> request.response.getStatus()
+  302
+  >>> request.response.getHeader('Location')
+    'http://127.0.0.1/levels/grade2'
+
+  >>> editGrade2.title
+  u'Second Grade'
+
+Even if the title has not changed you should get redirected to the level
+overview:
+
+    >>> request = TestRequest()
+    >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+    ...                 'field.title': u'Second Grade'}
+    >>> view = LevelEditView(editGrade2, request)
+    >>> view.update()
+    ''
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('Location')
+    'http://127.0.0.1/levels/grade2'
+
+    >>> editGrade2.title
+    u'Second Grade'
+
+We should not get redirected if there were errors:
+
+    >>> request = TestRequest()
+    >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+    ...                 'field.title': u''}
+    >>> view = LevelEditView(editGrade2, request)
+    >>> view.update()
+    u'An error occurred.'
+    >>> request.response.getStatus()
+    599
+
+    >>> editGrade2.title
+    u'Second Grade'
+
+We can cancel an action if we want to:
+
+    >>> request = TestRequest(environ={'CANCEL': 'Cancel'})
+    >>> view = LevelEditView(editGrade2, request)
+    >>> view.update()
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('Location')
+    'http://127.0.0.1/levels/grade2'


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/level.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/level_validation.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/level_validation.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/level_validation.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,47 @@
+<metal:block use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+
+  <metal:slot fill-slot="title">
+    <span i18n:translate="">Level Validation</span>
+  </metal:slot>
+
+  <metal:block fill-slot="content-header">
+    <h1 i18n:translate="">Level Validation</h1>
+  </metal:block>
+
+  <metal:block metal:fill-slot="body">
+
+    <div class="info-block" tal:define="error view/validate">
+
+      <div i18n:translate="">
+        The validation function examines the level graphs defined for this
+        school and reports errors. It detects two types of errors:
+
+        <ol>
+          <li>Loops in Graphs</li>
+          <li>Disconnected Levels</li>
+        </ol>
+
+      </div>
+
+      <div tal:condition="error" tal:replace="structure error">
+        Error Info
+      </div>
+
+      <div id="message" 
+           tal:condition="python: not error and request.has_key('VALIDATE')">
+        No errors were detected.
+      </div>
+
+      <form method="post" action="">
+        <div class="controls">
+          <input type="submit" name="VALIDATE" 
+                 class="button-ok" value="Validate"
+                 i18n:attributes="value validate-button;" />
+        </div>
+      </form>
+
+    </div>
+
+  </metal:block>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/level_validation.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/levellooperror_info.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/levellooperror_info.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/levellooperror_info.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+<div id="message" tal:define="level context/level"
+     i18n:domain="schooltool">
+  <h1 i18n:translate="">A Level Loop Error was detected.</h1>
+
+  <h5 i18n:translate="">Details</h5>
+  <p i18n:translate="">
+    The loop was closed with level
+    <a href=""
+       tal:attributes="href string: ${level/@@absolute_url}/@@edit.html">
+      <em tal:content="level/title"
+          i18n:name="level_title">Level X</em>
+    </a>
+    (<span tal:replace="level/zope:name"
+        i18n:name="level_id">levelx</span>).
+  </p>
+
+  <h5 i18n:translate="">Explanation</h5>
+  <p i18n:translate="">
+    Level graphs can only be linear. If a level graph is a loop, then
+    students will not be able to graduate, since there is never a final level
+    that leads to graduation.
+  </p>
+
+  <h5 i18n:translate="">Solution</h5>
+  <p i18n:translate="">
+    Simply do not specify level
+    <em tal:content="level/nextLevel/title"
+        i18n:name="next_level_title">Level X</em>
+    (<span tal:replace="level/nextLevel/zope:name" i18n:name="next_level_id">
+       levelx
+     </span>)
+    as the next level of 
+    <a href=""
+       tal:attributes="href string: ${level/@@absolute_url}/@@edit.html">
+      <em tal:content="level/title"
+          i18n:name="level_title">Level X</em>
+    </a>
+    (<span tal:replace="level/zope:name"
+        i18n:name="level_id">levelx</span>).
+  </p>
+
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/levellooperror_info.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,137 @@
+<metal:block use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+
+  <metal:slot fill-slot="title">
+    <span tal:replace="context/title" i18n:translate="">
+      Student Management
+    </span>
+  </metal:slot>
+
+  <metal:block fill-slot="content-header">
+    <h1 i18n:translate="">Student Management</h1>
+  </metal:block>
+
+  <metal:block metal:fill-slot="body">
+
+    <div id="message" i18n:translate=""
+         tal:define="message view/update"
+         tal:content="message" tal:condition="message">
+      Status Message
+    </div>
+
+    <h3 i18n:translate="">Enroll Students</h3>
+
+    <form tal:attributes="action request/URL" method="post"
+          enctype="multipart/form-data" name="enroll">
+
+      <table>
+        <tr>
+          <th>&nbsp;</th>
+          <th i18n:translate="">Student Name (username)</th>
+        </tr>
+        <tr tal:repeat="student view/students">
+          <td>
+            <input type="checkbox" name="ids:list" value=""
+                   tal:attributes="value student/name" />
+          </td>
+          <td>
+            <span tal:content="student/title">Student Name</span>
+            (<span tal:content="student/username">username</span>)
+          </td>
+        </tr>
+      </table>
+
+      <div class="controls">
+        <input type="submit" class="button-ok" name="ENROLL_SUBMIT"
+               value="Enroll" title="Shortcut: Alt-E" accesskey="E"
+               i18n:attributes="value enroll-button; accesskey" />
+      </div>
+    </form>
+
+
+    <h3 i18n:translate="">Initialize Students</h3>
+
+    <form tal:attributes="action request/URL" method="post"
+          enctype="multipart/form-data" name="initialize">
+
+      <table width="100%">
+        <tr>
+          <th width="5%">&nbsp;</th>
+          <th width="45%" i18n:translate="">Student Name (username)</th>
+          <th width="50%" i18n:translate="">Inital Level</th>
+        </tr>
+        <tr tal:repeat="item view/initialLevelItems">
+          <td>
+            <input type="checkbox" name="ids:list" value=""
+                   tal:attributes="value item/id" />
+          </td>
+          <td>
+            <a href="" tal:attributes="href item/student/@@absolute_url">
+              <span tal:content="item/student/title">Student Name</span>
+              (<span tal:content="item/student/username">username</span>)
+            </a>
+          </td>
+          <td>
+            <div tal:repeat="widget item/item_view/widgets"
+                 tal:content="structure widget">
+              <input />
+            </div>
+          </td>
+
+        </tr>
+      </table>
+
+      <div class="controls">
+        <input type="submit" class="button-ok" name="WORKFLOW_SUBMIT"
+               value="Apply" title="Shortcut: Alt-I" accesskey="I"
+               i18n:attributes="value apply-button; accesskey" />
+      </div>
+    </form>
+
+
+    <h3 i18n:translate="">Level Outcome</h3>
+
+    <form tal:attributes="action request/URL" method="post"
+          enctype="multipart/form-data" name="outcome">
+
+      <table>
+        <tr>
+          <th>&nbsp;</th>
+          <th i18n:translate="">Student Name (username)</th>
+          <th i18n:translate="">Current Level</th>
+          <th i18n:translate="">Outcome</th>
+        </tr>
+        <tr tal:repeat="item view/outcomeItems">
+          <td>
+            <input type="checkbox" name="ids:list" value=""
+                   tal:attributes="value item/id" />
+          </td>
+          <td>
+            <a href="" tal:attributes="href item/student/@@absolute_url">
+              <span tal:content="item/student/title">Student Name</span>
+              (<span tal:content="item/student/username">username</span>)
+            </a>
+          </td>
+          <td>
+            <span tal:content="item/level/title">Level X</span>
+          </td>
+          <td>
+            <div tal:repeat="widget item/item_view/widgets"
+                 tal:content="structure widget">
+              <input />
+            </div>
+          </td>
+
+        </tr>
+      </table>
+
+      <div class="controls">
+        <input type="submit" class="button-ok" name="WORKFLOW_SUBMIT"
+               value="Apply" title="Shortcut: Alt-O" accesskey="O"
+               i18n:attributes="value apply-button; accesskey" />
+      </div>
+    </form>
+
+
+  </metal:block>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,132 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Promotion Workflow Views
+
+$Id: promotion.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+import zope.interface
+import zope.schema
+from zope.app import zapi
+from zope.publisher import browser
+from zope.app import form
+
+from schooltool.app import app
+from schooltool import SchoolToolMessage as _
+from schooltool.level import interfaces, promotion
+
+
+class IFinishSchemaWorkitem(zope.interface.Interface):
+    """A view that can finish a workflow item by getting the needed data from
+       the request."""
+
+
+class SchemaWorkItemView(browser.BrowserView):
+    """Generic work item view based on the work item's schema"""
+
+    def __init__(self, workitem, request):
+        super(SchemaWorkItemView, self).__init__(workitem, request)
+        form.utility.setUpEditWidgets(self, workitem.schema,
+                                      prefix=workitem.__name__)
+
+    def widgets(self):
+        return [
+            getattr(self, name+'_widget')
+            for name in zope.schema.getFieldNamesInOrder(self.context.schema)]
+
+    def finish(self):
+        """Complete the workitem."""
+        kwargs = form.utility.getWidgetsData(self, self.context.schema)
+        self.context.finish(**kwargs)
+        return _('Work Item successfully finished.')
+
+
+class SetLevelOutcomeView(SchemaWorkItemView):
+
+    def extra(self):
+        wfrd = self.context.participant.activity.process.workflowRelevantData
+        text = _('Current Level: $level', mapping={'level': wfrd.level.title})
+        return text
+
+
+class PromotionWorkItemsView(browser.BrowserView):
+    """Managament view for promoting students efficiently."""
+
+    def students(self):
+        """Return PT-friendly list of student infos"""
+        # TODO: Once we decided on categorization, this lookup could be more
+        #       efficient by looking up all members of the students group.
+        return [
+            {'name': id, 'title': person.title, 'username': person.username}
+            for id, person in app.getSchoolToolApplication()['persons'].items()
+            if interfaces.IAcademicRecord(person).levelProcess == None]
+
+    def initialLevelItems(self):
+        """Return PT-friendly list of students who need to be initialized"""
+        manager = app.getSchoolToolApplication()['groups']['manager']
+        for id, item in interfaces.IManagerWorkItems(manager).items():
+            if zapi.isinstance(item, promotion.SelectInitialLevel):
+                wfData = item.participant.activity.process.workflowRelevantData
+                yield {'id': id,
+                       'student': wfData.student,
+                       'item_view': SchemaWorkItemView(item, self.request)}
+
+    def outcomeItems(self):
+        """Return PT-friendly list of students who need to be promoted"""
+        manager = app.getSchoolToolApplication()['groups']['manager']
+        for id, item in interfaces.IManagerWorkItems(manager).items():
+            if zapi.isinstance(item, promotion.SetLevelOutcome):
+                wfData = item.participant.activity.process.workflowRelevantData
+                yield {'id': id,
+                       'level': wfData.level,
+                       'student': wfData.student,
+                       'item_view': SchemaWorkItemView(item, self.request)}
+
+    def update(self):
+        """Update the workflows."""
+        if 'ENROLL_SUBMIT' in self.request:
+            persons = app.getSchoolToolApplication()['persons']
+            pd = zapi.getUtility(zope.wfmc.interfaces.IProcessDefinition,
+                                 name='schooltool.promotion')
+
+            if 'ids' not in self.request:
+                return _('No students were selected.')
+
+            for id in self.request['ids']:
+                student = persons[id]
+                process = pd()
+                process.start(student, None, None)
+
+            return _('Students successfully enrolled.')
+
+
+        elif 'WORKFLOW_SUBMIT' in self.request:
+            manager = app.getSchoolToolApplication()['groups']['manager']
+
+            if 'ids' not in self.request:
+                return _('No students were selected.')
+
+            ids = self.request['ids']
+            items = interfaces.IManagerWorkItems(manager)
+            # Make a copy of the list by making it a tuple
+            for id, item in tuple(items.items()):
+                if id in ids:
+                    view = SchemaWorkItemView(item, self.request)
+                    view.finish()
+            return _('Student processes successfully updated.')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,184 @@
+===============
+Promotion Views
+===============
+
+This file gives you documents the Python API of the promotion browser views.
+
+
+Schema-based Work Item View
+---------------------------
+
+In order to complete a manual work item the user has to provide some
+information. This information is commonly described by a schema. This view
+uses the schema to collect the required data to complete the work item.
+
+This means, of course, that we need a schema and a work item first:
+
+  >>> import zope.interface
+  >>> import zope.schema
+
+  >>> class IWorkItemSchema(zope.interface.Interface):
+  ...     someValue = zope.schema.TextLine(title=u'Some Value')
+
+  >>> class WorkItem(object):
+  ...     __name__ = 'wi'
+  ...     schema = IWorkItemSchema
+  ...
+  ...     def finish(self, someValue=None):
+  ...         print u'Value: ' + someValue
+  >>> workitem = WorkItem()
+
+Now we can initialize the view, which will also setup the necessary widgets:
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+  >>> import zope.wfmc.interfaces
+  >>> import schooltool.level.browser.promotion
+
+  >>> from schooltool.level import browser
+  >>> view = browser.promotion.SchemaWorkItemView(workitem, request)
+
+  >>> view.someValue_widget
+  <zope.app.form.browser.textwidgets.TextWidget object at ...>
+
+Now we can get a list of all widgets:
+
+  >>> view.widgets()
+  [<zope.app.form.browser.textwidgets.TextWidget object at ...>]
+
+Once the form is filled out, we can finish the work item:
+
+  >>> request = TestRequest(form={'wi.someValue': 'value'})
+
+  >>> view = browser.promotion.SchemaWorkItemView(workitem, request)
+  >>> view.finish()
+  Value: value
+  u'Work Item successfully finished.'
+
+
+"Set Level Outcome" Work Item View
+----------------------------------
+
+This view is an extension of the above-mentioned schema-based work item
+view. It provides an additional method that tells the user what the current
+level of the student is. Finding the level's title is not a straight forward
+lookup, but requires a lot of the workflow system to be setup. Thus I'll
+provide here a simple stub that gives us the title:
+
+  >>> class LevelOutcomeWorkItem(WorkItem):
+  ...
+  ...     def __getattr__(self, name):
+  ...         if name != 'title':
+  ...              return self
+  ...         return '1st Grade'
+  >>> levelOutcome = LevelOutcomeWorkItem()
+
+Now we can instantiate the view and get the extra information:
+
+  >>> view = browser.promotion.SetLevelOutcomeView(levelOutcome, request)
+  >>> view.extra()
+  u'Current Level: $level'
+  >>> view.extra().mapping
+  {'level': '1st Grade'}
+
+
+Promotion Work Items View
+-------------------------
+
+This view is the main controller of the promotion workflow. It provides an
+overview of the state of all students and their possible next actions. Since
+this screen requires a lot of the environment to be present, we have to do a
+lot of setup.
+
+First we have to create a valid SchoolTool site:
+
+  >>> from schooltool.testing import setup
+  >>> st = setup.setUpSchoolToolSite()
+
+We then have to add students, groups and levels to it; I have done this in the
+test setup to not bore you with the details here:
+
+  >>> setUpStudents(st)
+  >>> setUpGroups(st)
+  >>> setUpLevels(st)
+
+We also have to register the promotion workflow and all the adapters that
+realize the application:
+
+  >>> setUpPromotionWorkflow()
+
+Now we can initialize the view using the manager group and a request:
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> manager = st['groups']['manager']
+
+  >>> view = browser.promotion.PromotionWorkItemsView(manager, request)
+
+Now we can ask the view to list all students that do not have a promotion
+workflow on them yet:
+
+  >>> pprint(view.students())
+  [{'name': u'crichter', 'title': 'Claudia Richter', 'username': 'crichter'},
+   {'name': u'srichter', 'title': 'Stephan Richter', 'username': 'srichter'},
+   {'name': u'thoffman', 'title': 'Tom Hoffman', 'username': 'thoffman'}]
+
+The way to enroll some students is to send a request:
+
+  >>> request = TestRequest(environ={'ids': ['crichter', 'srichter'],
+  ...                                'ENROLL_SUBMIT': True})
+  >>> view = browser.promotion.PromotionWorkItemsView(manager, request)
+  >>> view.update()
+  u'Students successfully enrolled.'
+
+  >>> pprint(view.students())
+  [{'name': u'thoffman', 'title': 'Tom Hoffman', 'username': 'thoffman'}]
+
+Note that if you do not select any students, an error message will be returned:
+
+  >>> request = TestRequest(environ={'ENROLL_SUBMIT': True})
+  >>> view = browser.promotion.PromotionWorkItemsView(manager, request)
+  >>> view.update()
+  u'No students were selected.'
+
+Okay, now that the students are enrolled, they should appear in the list of
+students that need their initial level set:
+
+  >>> pprint(list(view.initialLevelItems()))
+  [{'id': '...',
+    'item_view': <schooltool.level.browser.promotion.SchemaWorkItemView ...>,
+    'student': <schooltool.person.person.Person ...>},
+   {'id': '...',
+    'item_view': <schooltool.level.browser.promotion.SchemaWorkItemView ...>,
+    'student': <schooltool.person.person.Person ...>}]
+
+Now we would like to set the initial level for Claudia to the first
+grade. First we need to get her work item id:
+
+  >>> id = list(view.initialLevelItems())[0]['id']
+
+Now we can set the level on the student:
+
+  >>> request = TestRequest(form={'ids': [id],
+  ...                             id+'.level': 'level1',
+  ...                             'WORKFLOW_SUBMIT': True})
+  >>> view = browser.promotion.PromotionWorkItemsView(manager, request)
+  >>> view.update()
+  u'Student processes successfully updated.'
+
+Note again that if you do not select any students, an error message will be
+returned:
+
+  >>> request = TestRequest(environ={'WORKFLOW_SUBMIT': True})
+  >>> view = browser.promotion.PromotionWorkItemsView(manager, request)
+  >>> view.update()
+  u'No students were selected.'
+
+Of course, now Claudia is listed under the outcome items:
+
+  >>> pprint(list(view.outcomeItems()))
+  [{'id': '...',
+    'item_view': <schooltool.level.browser.promotion.SchemaWorkItemView ...>,
+    'level': <Level '1st Grade'>,
+    'student': <schooltool.person.person.Person object at ...>}]


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/promotion.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/record.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/record.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/record.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,122 @@
+<metal:block use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+
+  <metal:slot fill-slot="title">
+    <span tal:replace="context/title" i18n:translate="">Academic Record</span>
+  </metal:slot>
+
+  <metal:block fill-slot="content-header">
+    <h1 i18n:translate="">
+      Academic Record for <em tal:content="context/title" i18n:name="name" /> 
+    </h1>
+  </metal:block>
+
+  <metal:block metal:fill-slot="body">
+
+    <h3 i18n:translate="">Status</h3>
+    <form tal:attributes="action request/URL" method="post"
+          enctype="multipart/form-data" class="standalone">
+
+      <div id="message" i18n:translate=""
+           tal:define="message view/updateStatus"
+           tal:content="message" tal:condition="message">
+        Status Message
+      </div>
+
+      <fieldset>
+        <div metal:use-macro="context/@@form_macros/widget_rows" />
+  
+        <div class="controls">
+          <input type="submit" class="button-ok" name="UPDATE_SUBMIT" 
+                 value="Apply" title="Shortcut: Alt-S" accesskey="S"
+                 i18n:attributes="value submit-button; accesskey" />
+        </div>
+  
+      </fieldset>
+    </form>
+
+
+    <h3 i18n:translate="">Workflow</h3>
+    <div id="message" i18n:translate=""
+         tal:define="message view/updateProcess"
+         tal:content="message" tal:condition="message">
+      Status Message
+    </div>
+    <div tal:condition="view/record/levelProcess">
+
+      <p i18n:translate="">
+        Below you see the current promotion work items for the student.
+      </p>
+
+      <div tal:repeat="view view/workitems">
+        <form tal:attributes="action request/URL" method="post"
+              class="standalone">
+        
+          <input type="hidden" name="workitemId" value=""
+                 tal:attributes="value view/context/zope:name" />
+
+          <div class="row">
+            <h5 tal:content="view/context/schema/__doc__" />
+          </div>  
+
+          <p tal:condition="view/extra|nothing" tal:content="view/extra"
+             i18n:translate="">
+            Extra message.
+          </p>
+      
+          <fieldset>
+            <div metal:use-macro="context/@@form_macros/widget_rows" />
+          </fieldset>
+        
+          <div class="controls">
+            <input type="submit" class="button-ok" name="WORKITEM_SUBMIT" 
+                   value="Finish" title="Shortcut: Alt-R" accesskey="W"
+                   i18n:attributes="value remove-button; accesskey" />
+          </div>
+        
+        </form>
+      </div>
+
+      <p i18n:translate="">
+        You can also delete the process. All work items associated with this
+        process will be removed as well.
+      </p>
+
+      <form tal:attributes="action request/URL" method="post">
+          <div class="controls">
+            <input type="submit" class="button-ok" name="REMOVE_SUBMIT" 
+                   value="Remove" title="Shortcut: Alt-R" accesskey="W"
+                   i18n:attributes="value remove-button; accesskey" />
+          </div>
+      </form>
+    </div>
+    <div tal:condition="not: view/record/levelProcess">
+      <p i18n:translate="">
+        The student is currently not initialized in the school. By pressing
+        the button below, the student's school career will be initialized.
+      </p>
+      <form tal:attributes="action request/URL" method="post">
+          <div class="controls">
+            <input type="submit" class="button-ok" name="INITIALIZE_SUBMIT" 
+                   value="Initialize" title="Shortcut: Alt-W" accesskey="W"
+                   i18n:attributes="value initialize-button; accesskey" />
+          </div>
+      </form>
+    </div>
+
+
+    <h3 i18n:translate="">History</h3>
+    <ul style="list-style: disc">
+      <li tal:repeat="record view/history">
+        <em tal:content="record/title">Enrolled</em>
+        <div style="font-size: smaller" i18n:translate="">
+          on <span tal:content="record/timestamp" i18n:name="timestamp" />
+          by <span tal:content="record/user" i18n:name="user" />
+        </div>
+        <p tal:content="record/description">
+          Description of record.
+        </p>
+      </li>
+    </ul>
+  </metal:block>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/record.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/record.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/record.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/record.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,109 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Student Academic Record View
+
+$Id: record.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+import zope.security
+import zope.wfmc
+from zope.app import form
+from zope.app import zapi
+from zope.publisher import browser
+
+from schooltool.app import app
+from schooltool import SchoolToolMessage as _
+from schooltool.level import interfaces
+from schooltool.level.browser import promotion
+
+
+class AcademicRecordView(browser.BrowserView):
+    """Student's academic record."""
+
+    def __init__(self, context, request):
+        super(AcademicRecordView, self).__init__(context, request)
+        self.record = interfaces.IAcademicRecord(context)
+
+        # Create a status widget
+        form.utility.setUpWidget(self, 'status',
+                                 interfaces.IAcademicRecord['status'],
+                                 form.interfaces.IInputWidget,
+                                 value=self.record.status)
+        # The macros used require a list of widgets to be available.
+        self.widgets = (self.status_widget,)
+
+
+    def updateStatus(self):
+        """Update the status field in the academic record."""
+        if 'UPDATE_SUBMIT' in self.request:
+            self.record.status = self.status_widget.getInputValue()
+            return _('The status was successfully updated.')
+
+
+    def updateProcess(self):
+        """Update the workflow process."""
+        if 'INITIALIZE_SUBMIT' in self.request:
+            pd = zapi.getUtility(zope.wfmc.interfaces.IProcessDefinition,
+                                 name='schooltool.promotion')
+            process = pd()
+            process.start(zope.security.proxy.removeSecurityProxy(self.context),
+                          None, None)
+            self.record.levelProcess = process
+            return _('The Level Process was successfully initialized.')
+
+        elif 'REMOVE_SUBMIT' in self.request:
+            manager = app.getSchoolToolApplication()['groups']['manager']
+            process = self.record.levelProcess
+            items = interfaces.IManagerWorkItems(manager)
+            # Create a copy by converting items to a tuple
+            for item in tuple(items.values()):
+                if item.participant.activity.process == process:
+                    items.removeWorkItem(item)
+            self.record.levelProcess = None
+            return _('The Level Process was successfully removed.')
+
+        elif 'WORKITEM_SUBMIT' in self.request:
+            manager = app.getSchoolToolApplication()['groups']['manager']
+            for id, item in interfaces.IManagerWorkItems(manager).items():
+                if id in self.request['workitemId']:
+                    view = zapi.getMultiAdapter((item, self.request),
+                                                promotion.IFinishSchemaWorkitem)
+                    return view.finish()
+
+
+    def history(self):
+        """Return a PT-friendly history, with each entry being an info dict."""
+        formatter = self.request.locale.dates.getFormatter('dateTime', 'medium')
+        for record in self.record.history:
+            yield {'title': record.title,
+                   'description': record.description,
+                   'user': record.user,
+                   'timestamp': formatter.format(record.timestamp)}
+
+
+    def workitems(self):
+        """Get workitems for this student"""
+        manager = app.getSchoolToolApplication()['groups']['manager']
+        return [
+            zapi.getMultiAdapter(
+                (item, self.request), promotion.IFinishSchemaWorkitem)
+            for item in interfaces.IManagerWorkItems(manager).values()
+            if (item.participant.activity.process.workflowRelevantData.student
+                == self.context)]
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/record.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/record.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/record.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/record.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,109 @@
+=====================
+Academic Record Views
+=====================
+
+The package contains only one view, the academic record of a single
+student. The code is somewhat involved, since viewing and modifying the record
+of a single student is not that common, so that the code has been optimized
+for the manager-group specific views.
+
+Unfortunately, we have to set up the entire workflow machinery and SchoolTool
+application to demonstrate the functionality of the view:
+
+  >>> from schooltool.testing import setup
+  >>> st = setup.setUpSchoolToolSite()
+
+  >>> setUpStudents(st)
+  >>> setUpGroups(st)
+  >>> setUpLevels(st)
+
+  >>> setUpPromotionWorkflow()
+
+Now, using the student Stephan, we can initialize the view:
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+  >>> from schooltool.level.browser import record
+  >>> view = record.AcademicRecordView(st['persons']['srichter'], request)
+
+Since the view provides a lot of functionality, the view has several methods.
+
+
+Updating the Status
+-------------------
+
+While the status of the student is commonly controlled by the workflow, you
+can also set the status of the student manually:
+
+  >>> view.record.status
+
+  >>> request = TestRequest(form={'field.status': 'Graduated',
+  ...                             'UPDATE_SUBMIT': True})
+  >>> view = record.AcademicRecordView(st['persons']['srichter'], request)
+  >>> view.updateStatus()
+  u'The status was successfully updated.'
+
+  >>> view.record.status
+  u'Graduated'
+
+
+Updating the Process
+--------------------
+
+We can also control the complete workflow from this view. The first step is to
+initialize the process:
+
+  >>> request = TestRequest(form={'INITIALIZE_SUBMIT': True})
+  >>> view = record.AcademicRecordView(st['persons']['srichter'], request)
+  >>> view.updateProcess()
+  u'The Level Process was successfully initialized.'
+  >>> view.record.levelProcess
+  Process('schooltool.promotion')
+
+You can also see the workitems that have to be completed for the student:
+
+  >>> view.workitems()
+  [<schooltool.level.browser.promotion.SchemaWorkItemView object at ...>]
+
+Actually, we need the id of this workflow item, so let's grab it:
+
+  >>> id = view.workitems()[0].context.__name__
+
+Now we can promote the student to the next level:
+
+  >>> request = TestRequest(form={'workitemId': id,
+  ...                             id+'.level': 'level1',
+  ...                             'WORKITEM_SUBMIT': True})
+  >>> view = record.AcademicRecordView(st['persons']['srichter'], request)
+  >>> view.updateProcess()
+  u'Work Item successfully finished.'
+
+Finally, you can also remove the process prematurely. The tricky part here is
+that the not only the process needs to be deleted, but also the workitems in
+the manager:
+
+  >>> view.workitems()
+  [<schooltool.level.browser.promotion.SetLevelOutcomeView object at ...>]
+
+  >>> id = view.workitems()[0].context.__name__
+  >>> request = TestRequest(form={'workitemId': id,
+  ...                             'REMOVE_SUBMIT': True})
+  >>> view = record.AcademicRecordView(st['persons']['srichter'], request)
+  >>> view.updateProcess()
+  u'The Level Process was successfully removed.'
+
+  >>> view.workitems()
+  []
+
+
+Viewing History
+---------------
+
+Now that we have had some actions, you can also look at the history:
+
+  >>> pprint(list(view.history()))
+  [{'description': u'Enrolled at school',
+    'timestamp': u'...',
+    'title': u'Enrolled',
+    'user': '<unknown>'}]


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/record.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/browser/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/browser/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/browser/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,71 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Level-related Browser View Tests
+
+$Id: tests.py 5669 2006-01-20 19:58:16Z mg $
+"""
+import unittest
+
+from zope.testing import doctest, doctestunit
+
+from schooltool.app.browser.testing import setUp, tearDown
+from schooltool.group import group
+from schooltool.person import person
+from schooltool.level import testing
+
+def setUpStudents(app):
+    app['persons']['srichter'] = person.Person('srichter', 'Stephan Richter')
+    app['persons']['thoffman'] = person.Person('thoffman', 'Tom Hoffman')
+    app['persons']['crichter'] = person.Person('crichter', 'Claudia Richter')
+
+
+def setUpGroups(app):
+    app['groups']['manager'] = group.Group('manager', 'School Manager')
+
+
+def test_suite():
+    return unittest.TestSuite((
+        doctest.DocFileSuite(
+            'level.txt',
+            setUp=setUp, tearDown=tearDown,
+            globs={'pprint': doctestunit.pprint},
+            optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
+        doctest.DocFileSuite(
+            'promotion.txt',
+            setUp=setUp, tearDown=tearDown,
+            globs={'pprint': doctestunit.pprint,
+                   'setUpLevels': testing.setUpLevels,
+                   'setUpGroups': setUpGroups,
+                   'setUpStudents': setUpStudents,
+                   'setUpPromotionWorkflow': testing.setUpPromotionWorkflow},
+            optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
+        doctest.DocFileSuite(
+            'record.txt',
+            setUp=setUp, tearDown=tearDown,
+            globs={'pprint': doctestunit.pprint,
+                   'setUpLevels': testing.setUpLevels,
+                   'setUpGroups': setUpGroups,
+                   'setUpStudents': setUpStudents,
+                   'setUpPromotionWorkflow': testing.setUpPromotionWorkflow},
+            optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/browser/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,185 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:security="http://schooltool.org/securitypolicy"
+    xmlns:wfmc="http://namespaces.zope.org/wfmc"
+    >
+
+  <!-- Process Definition for Promotion workflow -->
+  <wfmc:xpdl
+      file="promotion.xpdl"
+      process="promotion"
+      id="schooltool.promotion"
+      integration="zope.wfmc.adapter.integration"
+      />
+
+  <!-- Participant: Manager -->
+  <adapter
+     for="zope.wfmc.interfaces.IActivity"
+     provides="zope.wfmc.interfaces.IParticipant"
+     factory=".promotion.Manager"
+     name=".manager"
+     />
+
+  <!-- Promotion Workflow subscribers -->
+  <subscriber
+      for="zope.wfmc.interfaces.IProcessStarted"
+      handler=".promotion.addProcessToStudent"
+      />
+
+  <subscriber
+      for="zope.wfmc.interfaces.IProcessFinished"
+      handler=".promotion.removeProcessFromStudent"
+      />
+
+  <!-- Workflow Applications -->
+  <!-- Note: The names start with a dot, because they are defined in the
+             pacakge not the process. We might want to change that later. -->
+
+  <!-- Progress to Next Level (level : input/output)  -->
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".promotion.ProgressToNextLevel"
+      name=".progressToNextLevel"
+      />
+
+  <!-- Select Initial Level (level : output)  -->
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".promotion.SelectInitialLevel"
+      name=".selectInitialLevel"
+      />
+
+  <!-- Set Level Outcome (outcome : output)  -->
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".promotion.SetLevelOutcome"
+      name=".setLevelOutcome"
+      />
+
+  <!-- Update Status (student : input)  -->
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".promotion.UpdateStatus"
+      name=".updateStatus"
+      />
+
+  <!-- Write Record (student : input, level: input)  -->
+  <adapter
+      for="zope.wfmc.interfaces.IParticipant"
+      provides="zope.wfmc.interfaces.IWorkItem"
+      factory=".promotion.WriteRecord"
+      name=".writeRecord"
+      />
+
+  <!-- Group to Work Items List Adapater -->
+  <adapter
+      for="schooltool.group.interfaces.IGroup"
+      provides=".interfaces.IManagerWorkItems"
+      factory=".promotion.getManagerWorkItems"
+      />
+
+
+  <!-- Application objects -->
+
+  <interface
+      interface=".interfaces.ILevelContainer"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".level.LevelContainer">
+    <implements
+        interface="zope.annotation.interfaces.IAttributeAnnotatable" />
+    <allow interface="zope.app.container.interfaces.ISimpleReadContainer" />
+    <require permission="schooltool.view"
+             attributes="keys values items __iter__ __len__ validate" />
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer" />
+  </class>
+
+  <interface
+      interface=".interfaces.ILevel"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".level.Level">
+    <implements
+        interface="zope.annotation.interfaces.IAttributeAnnotatable" />
+    <require permission="schooltool.view"
+             interface=".interfaces.ILevel" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.ILevel" />
+  </class>
+
+  <!-- Application hook -->
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".level.addLevelContainerToApplication"
+      />
+
+
+  <!-- Level vocabulary -->
+  <utility
+      provides="zope.schema.interfaces.IVocabularyFactory"
+      component="schooltool.level.level.LevelVocabulary"
+      name="Levels"
+      />
+
+  <!-- Academic Record Adapter -->
+  <class class=".record.History">
+    <allow interface="zope.interface.common.sequence.IReadSequence" />
+    <require permission="schooltool.edit"
+             interface="zope.interface.common.sequence.IWriteSequence"
+             attributes="addRecord" />
+  </class>
+
+  <class class=".record.HistoricalRecord">
+    <require permission="schooltool.view"
+             interface=".interfaces.IHistoricalRecord" />
+  </class>
+
+  <class class=".record.AcademicRecord">
+    <require permission="schooltool.view"
+             interface=".interfaces.IAcademicRecord" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.IAcademicRecord" />
+  </class>
+
+  <adapter
+      for="schooltool.person.interfaces.IPerson"
+      provides=".interfaces.IAcademicRecord"
+      factory=".record.AcademicRecord"
+      trusted="true"
+      locate="true"
+      />
+
+  <!-- sample data -->
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+
+    <utility
+        factory=".sampledata.SampleLevels"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="levels"
+        />
+
+  </configure>
+
+  <!-- Views -->
+  <include package=".browser" />
+  <include package=".rest" />
+
+  <security:allow
+      interface="schooltool.level.level.LevelContainer"
+      crowds="administration everybody"
+      permission="schooltool.view" />
+  <security:allow
+      interface="schooltool.level.level.LevelContainer"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/ftesting.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/ftesting.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/ftesting.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional Testing Utilities for levels
+
+$Id: ftesting.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+import os
+
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+level_functional_layer = ZCMLLayer(filename,
+                                   __name__,
+                                   'level_functional_layer')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/ftesting.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,12 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.level" />
+
+</configure>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,187 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+School Level and Related Interfaces
+
+$Id: interfaces.py 5669 2006-01-20 19:58:16Z mg $
+"""
+import zope.interface
+import zope.interface.common.mapping
+import zope.schema
+import zope.app.container.constraints
+from zope.app import container
+from zope.app import zapi
+
+from schooltool import SchoolToolMessage as _
+
+
+class ILevelValidationError(zope.interface.Interface):
+    """An error that can be created during level validation."""
+
+class LevelValidationError(Exception):
+    zope.interface.implements(ILevelValidationError)
+
+
+class ILevelLoopError(ILevelValidationError):
+    """A loop was detected in the level graph."""
+
+    level = zope.interface.Attribute("This is the level that points back "
+                                     "to a level that was found in the graph "
+                                     "before.")
+
+class LevelLoopError(LevelValidationError):
+    zope.interface.implements(ILevelLoopError)
+
+    def __init__(self, level):
+        LevelValidationError.__init__(
+            self, 'Loop-Closing Level: ' + zapi.getName(level))
+        self.level = level
+
+class IDisconnectedLevelsError(ILevelValidationError):
+    """A loop was detected in the level graph."""
+
+    levels = zope.interface.Attribute(
+        "A list of levels not properly connected.")
+
+class DisconnectedLevelsError(LevelValidationError):
+    zope.interface.implements(IDisconnectedLevelsError)
+
+    def __init__(self, levels):
+        LevelValidationError.__init__(
+            self, ', '.join([zapi.getName(level) for level in levels]))
+        self.levels = levels
+
+
+class ILevel(zope.interface.Interface):
+    """A grade level in a school."""
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        description=_("Title of the level."),
+        required=True)
+
+    isInitial = zope.schema.Bool(
+        title=_("Is Initial Level"),
+        description=_("Is this level an initial level for the school."),
+        required=True,
+        default=False)
+
+    nextLevel = zope.schema.Choice(
+        title=_("Next Level"),
+        description=_("The next level in the school. If None, then there is "
+                      "no following level."),
+        vocabulary="Levels",
+        required=False,
+        default=None)
+
+
+class ILevelContainer(container.interfaces.IContainer):
+    """Container of Levels."""
+
+    container.constraints.contains(ILevel)
+
+    def validate(self):
+        """Validate the level graphs.
+
+        This method checks for two different types of errors:
+
+        (1) Make sure that there is not a loop in in any of the level graphs,
+            since it would prohibit students from graduating. If a loop is
+            found, an ``ILevelLoopError`` is raised.
+
+        (2) Ensure that all levels are connected in a graph. If a level is not
+            connected, then it is not used at all, which is doubtly the intend
+            of the manager. If disconnected levels are found, an
+            ``DiscoonectedLevelsError`` will be raised.
+
+        Both of those errors extend ``LevelValidationError`` so that other
+        code can safely catch them.
+        """
+
+
+class ILevelContained(container.interfaces.IContained):
+    """Cou contained in an ICourseContainer."""
+
+    container.constraints.containers(ILevelContainer)
+
+
+class IHistoricalRecord(zope.interface.Interface):
+    """A histroical record in the academic record history.
+
+    This is a generic interfaces that must be fulfilled for an object to be in
+    the history. However, particular record obejcts might implement an
+    extended version of this interface or other interface."""
+
+    timestamp = zope.schema.Datetime(
+        title=_("Time Stamp"),
+        description=_("The date and time the record was created."),
+        required=True)
+
+    user = zope.schema.Id(
+        title=_("User"),
+        description=_("The principal id of the user making the record."),
+        required=True)
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        description=_("Title of the record."),
+        required=True)
+
+    description = zope.schema.Text(
+        title=_("Description"),
+        description=_("A detailed description of the record."),
+        required=False)
+
+
+class IAcademicRecord(zope.interface.Interface):
+    """An academic record of a student.
+
+    This interface will commonly be implemented as an adapter from
+    ``IPerson``.
+    """
+
+    history = zope.schema.List(
+        title=_("Academic History"),
+        description=_("The academic history of a student."),
+        value_type=zope.schema.Object(schema=IHistoricalRecord),
+        required=True)
+
+    status = zope.schema.Choice(
+        title=_("Status"),
+        description=_("The current standing of the student in the school."),
+        # TODO: This should become a managed vocabulary later.
+        values=[_('Enrolled'), _('Graduated'), _('Withdrawn')],
+        required=True,
+        default=_('Enrolled'))
+
+    levelProcess = zope.schema.Field(
+        title=_("Level Process"),
+        description=_("The workflow process of the level the student is "
+                      "currently completing."),
+        required=False)
+
+
+class IManagerWorkItems(zope.interface.common.mapping.IFullMapping):
+    """Provides access to the manager group's work items."""
+
+    def addWorkItem(item):
+        """Add a work item to the manager group."""
+
+    def removeWorkItem(item):
+        """Delete a work item from the manager group."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/level-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/level-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/level-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.level" />
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/level-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/level.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/level.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/level.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,133 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+School Level Implementation
+
+$Id: level.py 5982 2006-04-27 14:25:47Z faassen $
+"""
+import persistent
+import sets
+import zope.interface
+import zope.schema
+from zope.app import zapi
+from zope.app.container import contained, btree
+from zope.interface import classProvides
+from zope.schema.interfaces import IVocabularyFactory
+
+from schooltool.app import app
+from schooltool.level import interfaces
+
+class LevelContainer(btree.BTreeContainer):
+    """Container of Level."""
+
+    zope.interface.implements(interfaces.ILevelContainer)
+
+    def validate(self):
+        """See schooltool.level.interfaces.ILevelContainer"""
+        allseen = sets.Set()
+
+        # Make sure that there are no loops in the level graphs.
+        for initial in [level for level in self.values()
+                        if level.isInitial]:
+            current = initial
+            visited = [current]
+            while current is not None:
+                if current.nextLevel in visited:
+                    raise interfaces.LevelLoopError(current)
+                visited.append(current)
+                current = current.nextLevel
+
+            allseen.update(visited)
+
+        # Make sure that all levels are connected in a graph.
+        disconnected = [level for level in self.values()
+                        if level not in allseen]
+        if disconnected:
+            raise interfaces.DisconnectedLevelsError(disconnected)
+
+
+def addLevelContainerToApplication(event):
+    event.object['levels'] = LevelContainer()
+
+
+class Level(persistent.Persistent, contained.Contained):
+    """A simple implementation of a school level."""
+
+    zope.interface.implements(interfaces.ILevel, interfaces.ILevelContained)
+
+    def __init__(self, title, isInitial=False, nextLevel=None):
+        self.title = title
+        self.isInitial = isInitial
+        self.nextLevel = nextLevel
+
+    def __repr__(self):
+        return "<Level '%s'>" %self.title
+
+
+class LevelTerm(object):
+
+    zope.interface.implements(zope.schema.interfaces.ITitledTokenizedTerm)
+
+    def __init__(self, level):
+        self.value = level
+        self.token = zapi.getName(level)
+        self.title = level.title
+
+    def __repr__(self):
+        return "<LevelTerm token='%s' title='%s'>" %(self.token, self.title)
+
+
+class LevelVocabulary(object):
+    """This vocabulary provides a list of all available levels.
+
+    The location must be set, so that the schooltool application can be found.
+    """
+    zope.interface.implements(zope.schema.interfaces.IVocabularyTokenized)
+    classProvides(IVocabularyFactory)
+
+    def __init__(self, context=None):
+        pass
+
+    def __contains__(self, value):
+        """See zope.schema.interfaces.IBaseVocabulary"""
+        return value in app.getSchoolToolApplication()['levels'].values()
+
+    def getTerm(self, value):
+        """See zope.schema.interfaces.IBaseVocabulary"""
+        if value not in self:
+            raise LookupError(value)
+        return LevelTerm(value)
+
+    def getTermByToken(self, token):
+        """See zope.schema.interfaces.IVocabularyTokenized"""
+        try:
+            return LevelTerm(app.getSchoolToolApplication()['levels'][token])
+        except KeyError:
+            raise LookupError(token)
+
+    def __iter__(self):
+        """See zope.schema.interfaces.IIterableVocabulary"""
+        return iter(
+            [self.getTerm(level)
+             for level in app.getSchoolToolApplication()['levels'].values()]
+            )
+
+    def __len__(self):
+        """See zope.schema.interfaces.IIterableVocabulary"""
+        return len(app.getSchoolToolApplication()['levels'])


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/level.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/promotion.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/promotion.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/promotion.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,238 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Student Promotion Process Implementation
+
+$Id: promotion.py 5983 2006-04-27 14:32:40Z faassen $
+"""
+
+import persistent
+
+import zope.interface
+import zope.schema
+import zope.wfmc
+from zope import location
+from zope.annotation.interfaces import IAnnotations
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app import app
+from schooltool.level import interfaces, record
+
+
+WorkItemsKey = 'schooltool.workflows.promotion.workitems'
+
+class ManagerWorkItems(persistent.dict.PersistentDict):
+    zope.interface.implements(interfaces.IManagerWorkItems)
+
+    counter = 0
+
+    def __init__(self, context):
+        super(ManagerWorkItems, self).__init__()
+        self.context = context
+
+    def addWorkItem(self, item):
+        """Add a work item to the manager group."""
+        id = str(self.counter)
+        self.counter += 1
+        location.location.locate(item, self.context, id)
+        self[id] = item
+
+    def removeWorkItem(self, item):
+        del self[item.__name__]
+
+
+def getManagerWorkItems(manager):
+    annotations = IAnnotations(manager)
+    return annotations.setdefault(WorkItemsKey, ManagerWorkItems(manager))
+
+class Manager(persistent.Persistent):
+    zope.component.adapts(zope.wfmc.interfaces.IActivity)
+    zope.interface.implements(zope.wfmc.interfaces.IParticipant)
+
+    def __init__(self, activity):
+        self.activity = activity
+        manager = app.getSchoolToolApplication()['groups']['manager']
+        self.workItems = interfaces.IManagerWorkItems(manager)
+
+
+class ProgressToNextLevel(object):
+    """Progress the student to the next level.
+
+    Type: Automatic; no user interaction required.
+    """
+    zope.component.adapts(zope.wfmc.interfaces.IParticipant)
+    zope.interface.implements(zope.wfmc.interfaces.IWorkItem)
+
+    def __init__(self, participant):
+        self.participant = participant
+
+    def start(self, level):
+        self.finish(level.nextLevel)
+
+    def finish(self, level):
+        self.participant.activity.workItemFinished(self, level)
+
+
+class ISelectInitialLevelSchema(zope.interface.Interface):
+    """Select Initial Level"""
+
+    level = zope.schema.Choice(
+        title=_("Level"),
+        description=_("The initial level of the student in the school."),
+        vocabulary="Levels",
+        required=True)
+
+
+class SelectInitialLevel(persistent.Persistent, location.location.Location):
+    """Select the inital level of the student.
+
+    Type: Manual; the manager must select the initial level.
+    """
+    zope.component.adapts(zope.wfmc.interfaces.IParticipant)
+    zope.interface.implements(zope.wfmc.interfaces.IWorkItem)
+
+    schema = ISelectInitialLevelSchema
+
+    def __init__(self, participant):
+        self.participant = participant
+        self.participant.workItems.addWorkItem(self)
+
+    def start(self):
+        pass
+
+    def finish(self, level):
+        self.participant.workItems.removeWorkItem(self)
+        self.participant.activity.workItemFinished(self, level)
+
+
+class ISetLevelOutcomeSchema(zope.interface.Interface):
+    """Set Level Outcome"""
+
+    outcome = zope.schema.Choice(
+        title=_("Outcome"),
+        description=_("Outcome of the level."),
+        values=[_('pass'), _('fail'), _('withdraw')],
+        required=True,
+        default=_('pass'))
+
+
+class SetLevelOutcome(persistent.Persistent, location.location.Location):
+    """Set the level outcome of the current level.
+
+    The student can either: 'pass', 'fail', 'withdraw'
+
+    Type: Manual; the manager must select the initial level.
+    """
+    zope.component.adapts(zope.wfmc.interfaces.IParticipant)
+    zope.interface.implements(zope.wfmc.interfaces.IWorkItem)
+
+    schema = ISetLevelOutcomeSchema
+
+    def __init__(self, participant):
+        self.participant = participant
+        self.participant.workItems.addWorkItem(self)
+
+    def start(self):
+        pass
+
+    def finish(self, outcome):
+        self.participant.workItems.removeWorkItem(self)
+        self.participant.activity.workItemFinished(self, outcome)
+
+
+class UpdateStatus(object):
+    """Update the student's status.
+
+    The student's status is being updated depending on the activity.
+
+    Type: Automatic; no user interaction required.
+    """
+    zope.component.adapts(zope.wfmc.interfaces.IParticipant)
+    zope.interface.implements(zope.wfmc.interfaces.IWorkItem)
+
+    def __init__(self, participant):
+        self.participant = participant
+
+    def start(self, student):
+        rec = interfaces.IAcademicRecord(student)
+        act_id = self.participant.activity.definition.id
+        if act_id == 'enroll':
+            rec.status = 'Enrolled'
+
+        elif act_id == 'graduate':
+            rec.status = 'Graduated'
+
+        elif act_id == 'withdraw':
+            rec.status = 'Withdrawn'
+
+        self.finish()
+
+    def finish(self):
+        self.participant.activity.workItemFinished(self)
+
+
+class WriteRecord(object):
+    """Make a record entry into the student's academic history.
+
+    The record added depends on the current activity.
+
+    Type: Automatic; no user interaction required.
+    """
+    zope.component.adapts(zope.wfmc.interfaces.IParticipant)
+    zope.interface.implements(zope.wfmc.interfaces.IWorkItem)
+
+    def __init__(self, participant):
+        self.participant = participant
+
+    def start(self, student, level):
+        rec = interfaces.IAcademicRecord(student)
+        act_id = self.participant.activity.definition.id
+        if act_id == 'enroll':
+            rec.history.addRecord(record.HistoricalRecord(
+                u'Enrolled', u'Enrolled at school'))
+
+        elif act_id == 'pass':
+            rec.history.addRecord(record.HistoricalRecord(
+                u'Passed', u'Passed level "%s"' %level.title))
+
+        elif act_id == 'fail':
+            rec.history.addRecord(record.HistoricalRecord(
+                u'Failed', u'Failed level "%s"' %level.title))
+
+        elif act_id == 'withdraw':
+            rec.history.addRecord(record.HistoricalRecord(
+                u'Withdrawn',
+                u'Withdrew before or during level "%s"' %level.title))
+
+        self.finish()
+
+    def finish(self):
+        self.participant.activity.workItemFinished(self)
+
+
+def addProcessToStudent(event):
+    if event.process.process_definition_identifier == 'schooltool.promotion':
+        student = event.process.workflowRelevantData.student
+        interfaces.IAcademicRecord(student).levelProcess = event.process
+
+
+def removeProcessFromStudent(event):
+    if event.process.process_definition_identifier == 'schooltool.promotion':
+        student = event.process.workflowRelevantData.student
+        interfaces.IAcademicRecord(student).levelProcess = None


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/promotion.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/promotion.xpdl
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/promotion.xpdl	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/promotion.xpdl	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,357 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Package Id="promotion" Name="Level Promotion" xmlns="http://www.wfmc.org/2002/XPDL1.0" xmlns:xpdl="http://www.wfmc.org/2002/XPDL1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.wfmc.org/2002/XPDL1.0 http://wfmc.org/standards/docs/TC-1025_schema_10_xpdl.xsd">
+    <PackageHeader>
+        <XPDLVersion>1.0</XPDLVersion>
+        <Vendor>Together</Vendor>
+        <Created>2005-07-21 13:02:08</Created>
+    </PackageHeader>
+    <RedefinableHeader PublicationStatus="UNDER_TEST"/>
+    <ConformanceClass GraphConformance="NON_BLOCKED"/>
+    <Participants>
+        <Participant Id="manager" Name="Manager">
+            <ParticipantType Type="ROLE"/>
+        </Participant>
+    </Participants>
+    <Applications>
+        <Application Id="writeRecord" Name="Write Record">
+            <Description>This application is responsible for creating a historical record of the activity and store it in the academic history of the student.</Description>
+            <FormalParameters>
+                <FormalParameter Id="student" Mode="IN">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                    <Description>The student for which we want to write a record entry.</Description>
+                </FormalParameter>
+                <FormalParameter Id="level" Mode="IN">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                    <Description>The level the student is currently in.</Description>
+                </FormalParameter>
+            </FormalParameters>
+        </Application>
+        <Application Id="updateStatus" Name="Update Status">
+            <Description>Update the status of the student in the academic records.</Description>
+            <FormalParameters>
+                <FormalParameter Id="student" Mode="IN">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                    <Description>The student, whose status we want to update.</Description>
+                </FormalParameter>
+            </FormalParameters>
+        </Application>
+        <Application Id="progressToNextLevel" Name="Progress to Next Level">
+            <Description>When a level is passed, this application will progress the student to the next level or allow him to graduate.</Description>
+            <FormalParameters>
+                <FormalParameter Id="level" Mode="INOUT">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                    <Description>The level the student will be next in. In case the student is graduating, this value can be a NULL (or equivalent).</Description>
+                </FormalParameter>
+            </FormalParameters>
+        </Application>
+        <Application Id="selectInitialLevel" Name="Select Initial Level">
+            <Description>Select the initial level for the student.</Description>
+            <FormalParameters>
+                <FormalParameter Id="level" Mode="OUT">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                    <Description>The level at which the student enters the school. This is commonly one of the initial levels the school defined, but can also be any other level, in case the student transferred.</Description>
+                </FormalParameter>
+            </FormalParameters>
+        </Application>
+        <Application Id="setLevelOutcome" Name="Set Level Outcome">
+            <Description>Set the the level outcome. This application should set the the `lastOutcome` variable in the workflow-relevant data to 'pass', 'fail', or 'withdraw'.</Description>
+            <FormalParameters>
+                <FormalParameter Id="outcome" Mode="OUT">
+                    <DataType>
+                        <BasicType Type="STRING"/>
+                    </DataType>
+                    <Description>Outcome of the level completion. Can be either 'pass', 'fail' or 'withdraw'.</Description>
+                </FormalParameter>
+            </FormalParameters>
+        </Application>
+    </Applications>
+    <DataFields>
+        <DataField Id="outcome" IsArray="FALSE" Name="Outcome">
+            <DataType>
+                <BasicType Type="STRING"/>
+            </DataType>
+            <Description>This value describes the outcome of the level completion activity. Based on this value the next activity will be chosen.</Description>
+        </DataField>
+        <DataField Id="level" IsArray="FALSE" Name="Level">
+            <DataType>
+                <BasicType Type="REFERENCE"/>
+            </DataType>
+            <Description>The level the sudent is currently enrolled in.</Description>
+        </DataField>
+        <DataField Id="student" IsArray="FALSE" Name="Student">
+            <DataType>
+                <BasicType Type="REFERENCE"/>
+            </DataType>
+            <Description>The student of which this process describes the academic career.</Description>
+        </DataField>
+    </DataFields>
+    <WorkflowProcesses>
+        <WorkflowProcess AccessLevel="PUBLIC" Id="promotion" Name="Promotion">
+            <ProcessHeader DurationUnit="D">
+                <Created>2005-07-21 13:14:30</Created>
+            </ProcessHeader>
+            <RedefinableHeader PublicationStatus="UNDER_TEST"/>
+            <FormalParameters>
+                <FormalParameter Id="student" Mode="IN">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                    <Description>Student for which the promotion workflow is executed.</Description>
+                </FormalParameter>
+                <FormalParameter Id="level" Mode="IN">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                </FormalParameter>
+                <FormalParameter Id="outcome" Mode="IN">
+                    <DataType>
+                        <BasicType Type="REFERENCE"/>
+                    </DataType>
+                </FormalParameter>
+            </FormalParameters>
+            <Activities>
+                <Activity Id="pass" Name="Pass">
+                    <Description>The student passes the class.</Description>
+                    <Implementation>
+                        <Tool Id="writeRecord" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>student</ActualParameter>
+                                <ActualParameter>level</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                        <Tool Id="progressToNextLevel" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>level</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>manager</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <TransitionRestrictions>
+                        <TransitionRestriction>
+                            <Split Type="XOR">
+                                <TransitionRefs>
+                                    <TransitionRef Id="pass_to_graduate"/>
+                                    <TransitionRef Id="pass_to_complete"/>
+                                </TransitionRefs>
+                            </Split>
+                        </TransitionRestriction>
+                    </TransitionRestrictions>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="ParticipantID" Value="manager"/>
+                        <ExtendedAttribute Name="XOffset" Value="250"/>
+                        <ExtendedAttribute Name="YOffset" Value="180"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="fail" Name="Fail">
+                    <Description>The syudent fails the level.</Description>
+                    <Implementation>
+                        <Tool Id="writeRecord" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>student</ActualParameter>
+                                <ActualParameter>level</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>manager</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="ParticipantID" Value="manager"/>
+                        <ExtendedAttribute Name="XOffset" Value="440"/>
+                        <ExtendedAttribute Name="YOffset" Value="180"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="withdraw" Name="Withdraw">
+                    <Description>The student withdraws from the level.</Description>
+                    <Implementation>
+                        <Tool Id="updateStatus" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>student</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                        <Tool Id="writeRecord" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>student</ActualParameter>
+                                <ActualParameter>level</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>manager</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="ParticipantID" Value="manager"/>
+                        <ExtendedAttribute Name="XOffset" Value="620"/>
+                        <ExtendedAttribute Name="YOffset" Value="180"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="enroll" Name="Enroll">
+                    <Implementation>
+                        <Tool Id="writeRecord" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>student</ActualParameter>
+                                <ActualParameter>level</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                        <Tool Id="selectInitialLevel" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>level</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                        <Tool Id="updateStatus" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>student</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>manager</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="ParticipantID" Value="manager"/>
+                        <ExtendedAttribute Name="XOffset" Value="190"/>
+                        <ExtendedAttribute Name="YOffset" Value="280"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="graduate" Name="Graduate">
+                    <Implementation>
+                        <Tool Id="updateStatus" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>student</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>manager</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="ParticipantID" Value="manager"/>
+                        <ExtendedAttribute Name="XOffset" Value="250"/>
+                        <ExtendedAttribute Name="YOffset" Value="80"/>
+                    </ExtendedAttributes>
+                </Activity>
+                <Activity Id="complete" Name="Complete Level">
+                    <Description>The student completes a level.</Description>
+                    <Implementation>
+                        <Tool Id="setLevelOutcome" Type="APPLICATION">
+                            <ActualParameters>
+                                <ActualParameter>outcome</ActualParameter>
+                            </ActualParameters>
+                        </Tool>
+                    </Implementation>
+                    <Performer>manager</Performer>
+                    <StartMode>
+                        <Automatic/>
+                    </StartMode>
+                    <FinishMode>
+                        <Automatic/>
+                    </FinishMode>
+                    <TransitionRestrictions>
+                        <TransitionRestriction>
+                            <Join Type="XOR"/>
+                            <Split Type="XOR">
+                                <TransitionRefs>
+                                    <TransitionRef Id="complete_to_fail"/>
+                                    <TransitionRef Id="complete_to_pass"/>
+                                    <TransitionRef Id="complete_to_withdraw"/>
+                                </TransitionRefs>
+                            </Split>
+                        </TransitionRestriction>
+                    </TransitionRestrictions>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="ParticipantID" Value="manager"/>
+                        <ExtendedAttribute Name="XOffset" Value="440"/>
+                        <ExtendedAttribute Name="YOffset" Value="280"/>
+                    </ExtendedAttributes>
+                </Activity>
+            </Activities>
+            <Transitions>
+                <Transition From="enroll" Id="enroll_to_complete" Name="Enroll -&gt; Complete" To="complete">
+                    <Condition Type="CONDITION">level is not None</Condition>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="complete" Id="complete_to_pass" Name="Complete -&gt; Pass" To="pass">
+                    <Condition Type="CONDITION">outcome == 'pass'</Condition>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="complete" Id="complete_to_fail" Name="Complete -&gt; Fail" To="fail">
+                    <Condition Type="CONDITION">outcome == 'fail'</Condition>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="complete" Id="complete_to_withdraw" Name="Complete -&gt; Withdraw" To="withdraw">
+                    <Condition Type="CONDITION">outcome == 'withdraw'</Condition>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="pass" Id="pass_to_graduate" Name="Pass -&gt; Graduate" To="graduate">
+                    <Condition Type="CONDITION">level is None</Condition>
+                    <Description>If there are no more levels to complete, then the student should gradaute.</Description>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="pass" Id="pass_to_complete" Name="Pass -&gt; Complete" To="complete">
+                    <Description>Student starts a new level.</Description>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
+                    </ExtendedAttributes>
+                </Transition>
+                <Transition From="fail" Id="fail_to_complete" Name="Fail -&gt; Complete" To="complete">
+                    <Description>Student must repeat the level because s/he failed.</Description>
+                    <ExtendedAttributes>
+                        <ExtendedAttribute Name="RoutingType" Value="NOROUTING"/>
+                    </ExtendedAttributes>
+                </Transition>
+            </Transitions>
+            <ExtendedAttributes>
+                <ExtendedAttribute Name="StartOfWorkflow" Value="manager;enroll;110;280;NOROUTING"/>
+                <ExtendedAttribute Name="EndOfWorkflow" Value="manager;withdraw;640;80;NOROUTING"/>
+                <ExtendedAttribute Name="EndOfWorkflow" Value="manager;graduate;270;1;NOROUTING"/>
+                <ExtendedAttribute Name="ParticipantVisualOrder" Value="manager;"/>
+            </ExtendedAttributes>
+        </WorkflowProcess>
+    </WorkflowProcesses>
+    <ExtendedAttributes>
+        <ExtendedAttribute Name="MadeBy" Value="JaWE"/>
+        <ExtendedAttribute Name="Version" Value="1.4.2"/>
+    </ExtendedAttributes>
+</Package>

Added: schooltool/branches/upstream/current/src/schooltool/level/record.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/record.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/record.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,103 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Academic Record Implementation
+
+$Id: record.py 5982 2006-04-27 14:25:47Z faassen $
+"""
+import datetime
+import persistent
+import zope.component
+import zope.interface
+import zope.security
+from zope.annotation.interfaces import IAnnotations
+
+from schooltool import person
+from schooltool.level import interfaces
+
+
+AcademicRecordKey = "schooltool.AcademicRecord"
+
+
+class History(persistent.list.PersistentList):
+    """Academic History of a Student"""
+
+    __parent__ = None
+
+    def addRecord(self, record):
+        record.__parent__ = self
+        self.append(record)
+
+
+class HistoricalRecord(persistent.Persistent):
+    """A simple historical record."""
+    zope.interface.implements(interfaces.IHistoricalRecord)
+
+    __parent__ = None
+
+    def __init__(self, title, description=u''):
+        self.timestamp = datetime.datetime.utcnow()
+        inter = zope.security.management.getInteraction()
+        if inter.participations:
+            self.user = inter.participations[0].principal.id
+        else:
+            self.user = '<unknown>'
+        self.title = title
+        self.description = description
+
+    def __repr__(self):
+        return "HistoricalRecord('%s' at %s)" %(
+            self.title, self.timestamp.strftime('%Y/%m/%d %H:%M'))
+
+
+class RecordProperty(object):
+    """A property of the academic record."""
+
+    def __init__(self, name, default=None):
+        self.__name = name
+        self.__default = None
+
+    def __get__(self, inst, class_):
+        return inst.record.get(self.__name, self.__default)
+
+    def __set__(self, inst, value):
+        inst.record[self.__name] = value
+
+
+class AcademicRecord(object):
+    zope.component.adapts(person.interfaces.IPerson)
+    zope.interface.implements(interfaces.IAcademicRecord)
+
+    history = RecordProperty('history')
+    status = RecordProperty('status')
+    levelProcess = RecordProperty('levelProcess')
+
+    def __init__(self, student):
+        annotations = IAnnotations(student)
+        self.context = student
+        self.record = annotations.get(AcademicRecordKey)
+
+        # Initialize the record, since it does not exist yet.
+        if self.record is None:
+            annotations[AcademicRecordKey] = persistent.dict.PersistentDict()
+            self.record = annotations.get(AcademicRecordKey)
+            self.history = History()
+            self.history.__parent__ = self.context
+            self.status = None
+            self.levelProcess = None


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/record.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,330 @@
+Functional tests for SchoolTool Level RESTive views
+===================================================
+
+Level Managament
+----------------
+
+Initially, we have no levels.
+
+    >>> print rest("""
+    ... GET /levels/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>levels</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/levels/acl"/>
+    </container>
+    <BLANKLINE>
+
+Let's now create two levels:
+
+    >>> print rest("""
+    ... PUT /levels/level2 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1"
+    ...         title="2nd Grade" isInitial="false" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> level2 = getRootFolder()['levels']['level2']
+    >>> level2
+    <Level '2nd Grade'>
+
+    >>> print rest("""
+    ... PUT /levels/level1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1"
+    ...         title="1st Grade" isInitial="true" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> level1 = getRootFolder()['levels']['level1']
+    >>> level1
+    <Level '1st Grade'>
+
+By default levels get their nextLevel set to None:
+
+    >>> level1.nextLevel is None
+    True
+
+    >>> print rest("""
+    ... GET /levels/level1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <level xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>1st Grade</title>
+      <isInitial>true</isInitial>
+      <nextLevel></nextLevel>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/levels/level1/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/levels/level1/acl"/>
+    </level>
+    <BLANKLINE>
+
+Though we can set it to one of levels we have:
+
+    >>> print rest("""
+    ... PUT /levels/level1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1"
+    ...         title="1st Grade" isInitial="true" nextLevel="level2" />
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+    >>> level1.nextLevel is level2
+    True
+
+Let's see how it looks now:
+
+    >>> print rest("""
+    ... GET /levels/level1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <level xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>1st Grade</title>
+      <isInitial>true</isInitial>
+      <nextLevel>level2</nextLevel>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/levels/level1/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/levels/level1/acl"/>
+    </level>
+    <BLANKLINE>
+
+
+Academic Record of a Student
+----------------------------
+
+We first have to create a student for which we observe the academic record:
+
+    >>> print rest("""
+    ... PUT /persons/stephan HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Stephan"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+
+Let's first look at the academic status. You can simply get it and put it:
+
+    >>> print rest("""
+    ... GET /persons/stephan/academicStatus HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Content-Type: text/plain
+    Set-Cookie: ...
+    <BLANKLINE>
+
+    >>> print rest("""
+    ... POST /persons/stephan/academicStatus HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... Enrolled
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+    >>> print rest("""
+    ... GET /persons/stephan/academicStatus HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 8
+    Content-Type: text/plain
+    Set-Cookie: ...
+    <BLANKLINE>
+    Enrolled
+
+
+Now let's create a promotion workflow. At the beginning there is nothing:
+
+    >>> print rest("""
+    ... GET /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+You can create one by putting it there.
+
+    >>> print rest("""
+    ... PUT /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+XXX mg: WTF?  I PUT the same thing I GOT and it suddenly changes into a
+        completely different thing?  That's not REST!
+
+If we now look at the promotion again, we will see that it now returns a
+workflow item.
+
+    >>> print rest("""
+    ... GET /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 55
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <setinitiallevel>
+      <initialLevel/>
+    </setinitiallevel>
+    <BLANKLINE>
+
+Now we set the initial level:
+
+    >>> print rest("""
+    ... POST /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1"
+    ...         initialLevel="level1" />
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Set-Cookie: ...
+    <BLANKLINE>
+    Initial Level selected.
+
+We can see that the next action must be setting the outcome of the first
+grade:
+
+    >>> print rest("""
+    ... GET /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <setleveloutcome>
+      <level>level1</level>
+      <outcome/>
+    </setleveloutcome>
+    <BLANKLINE>
+
+    >>> print rest("""
+    ... POST /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1"
+    ...         outcome="pass" />
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Set-Cookie: ...
+    <BLANKLINE>
+    Outcome submitted.
+
+Also pass the second grade:
+
+    >>> print rest("""
+    ... GET /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <setleveloutcome>
+      <level>level2</level>
+      <outcome/>
+    </setleveloutcome>
+    <BLANKLINE>
+
+    >>> print rest("""
+    ... POST /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1"
+    ...         outcome="pass" />
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Set-Cookie: ...
+    <BLANKLINE>
+    Outcome submitted.
+
+Now the promotion process is done and the promotion obejct is empty again:
+
+    >>> print rest("""
+    ... GET /persons/stephan/promotion HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Content-Type: text/plain
+    Set-Cookie: ...
+    <BLANKLINE>
+
+Now that the workflow is done, we can look at the academic history of the
+student:
+
+    >>> print rest("""
+    ... GET /persons/stephan/academicHistory HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <history>
+      <entry>
+        <title>Enrolled</title>
+        <description>Enrolled at school</description>
+        <timestamp>...</timestamp>
+      </entry>
+      <entry>
+        <title>Passed</title>
+        <description>Passed level "1st Grade"</description>
+        <timestamp>...</timestamp>
+      </entry>
+      <entry>
+        <title>Passed</title>
+        <description>Passed level "2nd Grade"</description>
+        <timestamp>...</timestamp>
+      </entry>
+    </history>
+    <BLANKLINE>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,183 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    i18n_domain="schooltool">
+
+  <!-- Level Managament -->
+
+  <view
+      for="..interfaces.ILevelContainer"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ILevelContainer"
+      name="POST"
+      factory=".level.LevelContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.ILevelContainer"
+      provides="zope.filerepresentation.interfaces.IFileFactory"
+      factory=".level.LevelFileFactory"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.ILevel"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".level.LevelFile"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ILevelContainer"
+      name="GET"
+      factory=".level.LevelContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ILevel"
+      name="GET"
+      factory=".level.LevelView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ILevel"
+      name="POST"
+      factory=".level.LevelView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <!-- Academic Record Management -->
+
+  <class class=".record.AcademicStatus">
+    <allow attributes="getStatus setStatus" />
+  </class>
+
+  <adapter factory=".record.AcademicStatus" />
+
+  <subscriber
+      for="schooltool.person.interfaces.IPerson
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".record.AcademicStatusTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".record.AcademicStatus"
+      name="PUT"
+      factory=".record.AcademicStatusView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".record.AcademicStatus"
+      name="POST"
+      factory=".record.AcademicStatusView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".record.AcademicStatus"
+      name="GET"
+      factory=".record.AcademicStatusView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <class class=".record.AcademicHistory">
+    <allow attributes="record" />
+  </class>
+
+  <adapter factory=".record.AcademicHistory" />
+
+  <subscriber
+      for="schooltool.person.interfaces.IPerson
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".record.AcademicHistoryTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".record.AcademicHistory"
+      name="GET"
+      factory=".record.AcademicHistoryView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="schooltool.person.interfaces.IPerson
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".record.PromotionHTTPTraverser"
+      permission="zope.Public"
+      />
+
+  <class class=".record.AcademicProcessCreator">
+    <allow attributes="create" />
+  </class>
+
+  <view
+      for=".record.AcademicProcessCreator"
+      name="GET"
+      factory=".record.AcademicProcessCreatorView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".record.AcademicProcessCreator"
+      name="PUT"
+      factory=".record.AcademicProcessCreatorView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..promotion.SelectInitialLevel"
+      name="GET"
+      factory=".record.SelectInitialLevelView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..promotion.SelectInitialLevel"
+      name="POST"
+      factory=".record.SelectInitialLevelView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..promotion.SetLevelOutcome"
+      name="GET"
+      factory=".record.SetLevelOutcomeView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..promotion.SetLevelOutcome"
+      name="POST"
+      factory=".record.SetLevelOutcomeView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.level.
+
+$Id: ftests.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.level.ftesting import level_functional_layer
+
+def test_suite():
+    return collect_ftests(layer=level_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/history.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/history.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/history.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,10 @@
+<history
+    xmlns:tal="http://xml.zope.org/namespaces/tal"
+    xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+    i18n:domain="schooltool">
+  <entry tal:repeat="entry view/history">
+    <title tal:content="entry/title" />
+    <description tal:content="entry/description" />
+    <timestamp tal:content="entry/timestamp" />
+  </entry>
+</history>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/history.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/level.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/level.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/level.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<level xmlns:xlink="http://www.w3.org/1999/xlink"
+            xmlns:tal="http://xml.zope.org/namespaces/tal"
+            xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+            i18n:domain="schooltool">
+  <title tal:content="context/title" />
+  <isInitial tal:content="view/isInitial" />
+  <nextLevel tal:content="python: context.nextLevel
+                                  and path('context/nextLevel/zope:name')" />
+  <relationships xlink:type="simple" xlink:title="Relationships"
+                 i18n:attributes="xlink:title Relationships"
+                 tal:attributes="xlink:href string:${context/@@absolute_url}/relationships" />
+  <acl xlink:type="simple" xlink:title="ACL"
+      i18n:attributes="xlink:title ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/acl" />
+</level>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/level.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/level.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/level.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/level.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,99 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+REST interface for level objects
+
+$Id: level.py 5669 2006-01-20 19:58:16Z mg $
+"""
+import zope.component
+from schooltool.app import app, rest
+
+from schooltool.level import interfaces, level
+
+
+class LevelFileFactory(rest.app.ApplicationObjectFileFactory):
+    """Adapter that adapts LevelContainer to FileFactory."""
+
+    zope.component.adapts(interfaces.ILevelContainer)
+
+    schema = '''<?xml version="1.0" encoding="UTF-8"?>
+        <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                 ns="http://schooltool.org/ns/model/0.1"
+                 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+          <start>
+            <element name="object">
+              <attribute name="title">
+                <text/>
+              </attribute>
+              <attribute name="isInitial">
+                <data type="boolean" />
+              </attribute>
+              <optional>
+                <attribute name="nextLevel">
+                  <text/>
+                </attribute>
+              </optional>
+            </element>
+          </start>
+        </grammar>
+        '''
+
+    factory = level.Level
+
+    def parseDoc(self, doc):
+        kwargs = {}
+        levels = app.getSchoolToolApplication()['levels']
+        node = doc.query('/m:object')[0]
+        kwargs['title'] = node['title']
+        kwargs['isInitial'] = node.get('isInitial').lower() == u'true'
+        levelid = node.get('nextLevel')
+        try:
+            kwargs['nextLevel'] = levelid and levels[levelid] or None
+        except KeyError:
+            raise rest.errors.RestError("No such level.")
+        return kwargs
+
+
+class LevelContainerView(rest.app.GenericContainerView):
+    """RESTive view of a level container."""
+
+
+class LevelFile(rest.app.ApplicationObjectFile):
+    """Adapter that adapts ILevel to IWriteFile"""
+
+    zope.component.adapts(interfaces.ILevel)
+
+    def modify(self, title=None, isInitial=False, nextLevel=None):
+        """Modifies underlying schema."""
+        self.context.title = title
+        self.context.isInitial = isInitial
+        self.context.nextLevel = nextLevel
+
+
+class LevelView(rest.View):
+    """RESTive view for levels."""
+
+    template = rest.Template("level.pt",
+                             content_type="text/xml; charset=UTF-8")
+    factory = LevelFile
+
+    def isInitial(self):
+        if self.context.isInitial:
+            return u'true'
+        return u'false'


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/level.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/record.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/record.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/record.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,250 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+REST interface for academic records
+
+$Id: record.py 5773 2006-02-23 17:20:41Z faassen $
+"""
+
+import zope.component
+import zope.interface
+import zope.security
+import zope.wfmc
+from zope.app import zapi
+
+from schooltool.app import app, rest
+from schooltool.level import interfaces
+from schooltool.traverser import traverser
+from schooltool.xmlparsing import XMLDocument
+
+
+class PromotionHTTPTraverser(traverser.NameTraverserPlugin):
+
+    traversalName = 'promotion'
+
+    def _traverse(self, request, name):
+        record = interfaces.IAcademicRecord(self.context)
+        if record.levelProcess is None:
+            return AcademicProcessCreator(record)
+        manager = app.getSchoolToolApplication()['groups']['manager']
+        return [
+            item
+            for item in interfaces.IManagerWorkItems(manager).values()
+            if (item.participant.activity.process.workflowRelevantData.student
+                == self.context)][0]
+
+
+class IAcademicStatus(zope.interface.Interface):
+    """Academic status of a student."""
+
+    def getStatus():
+        """Return academic status of student."""
+
+    def setStatus(status):
+        """Set academic status of student."""
+
+
+class AcademicStatus(object):
+
+    zope.component.adapts(interfaces.IAcademicRecord)
+    zope.interface.implements(IAcademicStatus)
+
+    def __init__(self, record):
+        self.record = record
+
+    def getStatus(self):
+        return self.record.status
+
+    def setStatus(self, status):
+        self.record.status = status
+
+
+class AcademicStatusTraverser(traverser.NameTraverserPlugin):
+
+    traversalName = 'academicStatus'
+    component = AcademicStatus # A bit of a lie, since this does not have to
+                               # be true
+
+    def _traverse(self, request, name):
+        record = interfaces.IAcademicRecord(self.context)
+        return IAcademicStatus(record)
+
+
+class AcademicStatusView(rest.View):
+
+    def PUT(self):
+        for name in self.request:
+            if name.startswith('HTTP_CONTENT_'):
+                # Unimplemented content header
+                self.request.response.setStatus(501)
+                return ''
+
+        body = self.request.bodyStream
+        status = body.read().split("\n")[0]
+        self.context.setStatus(status)
+        self.request.response.setStatus("200")
+        return ''
+
+    POST = PUT
+
+    def GET(self):
+        self.request.response.setHeader('Content-Type', "text/plain")
+        self.request.response.setStatus(200)
+        return self.context.getStatus() or ''
+
+
+class IAcademicHistory(zope.interface.Interface):
+    """Academic history of a student."""
+
+class AcademicHistory(object):
+
+    zope.component.adapts(interfaces.IAcademicRecord)
+    zope.interface.implements(IAcademicHistory)
+
+    def __init__(self, record):
+        self.record = record
+
+class AcademicHistoryTraverser(traverser.NameTraverserPlugin):
+
+    traversalName = 'academicHistory'
+    component = AcademicHistory # A bit of a lie, since this does not have to
+                                # be true
+
+    def _traverse(self, request, name):
+        record = interfaces.IAcademicRecord(self.context)
+        return IAcademicHistory(record)
+
+
+class AcademicHistoryView(rest.View):
+
+    template = rest.Template("history.pt",
+                             content_type="text/xml; charset=UTF-8")
+
+    def history(self):
+        formatter = self.request.locale.dates.getFormatter('dateTime', 'medium')
+        for record in self.context.record.history:
+            yield {'title': record.title,
+                   'description': record.description,
+                   'timestamp': formatter.format(record.timestamp)}
+
+
+class AcademicProcessCreator(object):
+
+    def __init__(self, record):
+        self.record = record
+
+    def create(self):
+        pd = zapi.getUtility(zope.wfmc.interfaces.IProcessDefinition,
+                             name='schooltool.promotion')
+        process = pd()
+        process.start(
+            zope.security.proxy.removeSecurityProxy(self.record).context,
+            None, None)
+        self.record.levelProcess = process
+
+
+class AcademicProcessCreatorView(rest.View):
+
+    def PUT(self):
+        self.context.create()
+        self.request.response.setStatus(200)
+        return ''
+
+
+    def GET(self):
+        self.request.response.setHeader('Content-Type', "text/plain")
+        self.request.response.setStatus(200)
+        return ''
+
+
+class SelectInitialLevelView(rest.View):
+
+    template = rest.Template("selectinitiallevel.pt",
+                             content_type="text/xml; charset=UTF-8")
+
+    schema = '''<?xml version="1.0" encoding="UTF-8"?>
+    <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         ns="http://schooltool.org/ns/model/0.1"
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+      <start>
+        <element name="object">
+          <attribute name="initialLevel">
+            <text/>
+          </attribute>
+        </element>
+      </start>
+    </grammar>'''
+
+    def POST(self):
+        # XXX not unit tested -- uncomment the following line for proof
+        #raise NotImplementedError
+        body = self.request.bodyStream.read()
+        doc = XMLDocument(body, self.schema)
+        doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+        node = doc.query('/m:object')[0]
+        levels = app.getSchoolToolApplication()['levels']
+        try:
+            level = levels[node['initialLevel']]
+        except KeyError:
+            raise rest.errors.RestError("No such level.")
+        else:
+            zope.security.proxy.removeSecurityProxy(self.context).finish(level)
+
+        return "Initial Level selected."
+
+
+class SetLevelOutcomeView(rest.View):
+
+    template = rest.Template("setleveloutcome.pt",
+                             content_type="text/xml; charset=UTF-8")
+
+    schema = '''<?xml version="1.0" encoding="UTF-8"?>
+    <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         ns="http://schooltool.org/ns/model/0.1"
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+      <start>
+        <element name="object">
+          <attribute name="outcome">
+            <text/>
+          </attribute>
+          <optional>
+            <attribute name="level">
+              <text/>
+            </attribute>
+          </optional>
+        </element>
+      </start>
+    </grammar>'''
+
+    def level(self):
+        process = zope.security.proxy.removeSecurityProxy(
+            self.context).participant.activity.process
+        return zapi.getName(process.workflowRelevantData.level)
+
+    def POST(self):
+        body = self.request.bodyStream.read()
+        doc = XMLDocument(body, self.schema)
+        doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+        node = doc.query('/m:object')[0]
+        zope.security.proxy.removeSecurityProxy(self.context).finish(
+            node['outcome'])
+
+        return "Outcome submitted."


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/record.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/selectinitiallevel.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/selectinitiallevel.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/selectinitiallevel.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,6 @@
+<setinitiallevel 
+    xmlns:tal="http://xml.zope.org/namespaces/tal"
+    xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+    i18n:domain="schooltool">
+  <initialLevel />
+</setinitiallevel>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/selectinitiallevel.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/setleveloutcome.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/setleveloutcome.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/setleveloutcome.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,7 @@
+<setleveloutcome 
+    xmlns:tal="http://xml.zope.org/namespaces/tal"
+    xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+    i18n:domain="schooltool">
+  <level tal:content="view/level" />
+  <outcome />
+</setleveloutcome>


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/setleveloutcome.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_level.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_level.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_level.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,198 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for level REST views.
+
+$Id: test_level.py 6047 2006-05-11 18:31:03Z mg $
+"""
+import unittest
+
+import zope.interface
+from zope.traversing.interfaces import IPathAdapter
+from zope.app.pagetemplate import talesapi
+from zope.publisher.browser import TestRequest
+from zope.app.component.testing import PlacefulSetup
+from zope.filerepresentation.interfaces import IFileFactory
+from zope.app.testing import ztapi
+
+from schooltool.app.rest import testing
+import schooltool.level.rest.level
+from schooltool.level import interfaces, level, rest
+from schooltool.testing import setup
+
+class TestLevelContainerView(testing.ContainerViewTestMixin, unittest.TestCase):
+    """Test for LevelContainerView"""
+
+    def setUp(self):
+        testing.ContainerViewTestMixin.setUp(self)
+        ztapi.provideAdapter(interfaces.ILevelContainer, IFileFactory,
+                             rest.level.LevelFileFactory)
+
+        self.level = self.app['levels']['level1'] = level.Level("1st Grade")
+        self.levelContainer = self.app['levels']
+
+    def test_render(self):
+        view = rest.level.LevelContainerView(self.levelContainer, TestRequest())
+        result = view.GET()
+        response = view.request.response
+
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result, """
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <name>levels</name>
+              <items>
+                <item xlink:href="http://127.0.0.1/levels/level1"
+                      xlink:title="1st Grade"
+                      xlink:type="simple"/>
+              </items>
+              <acl xlink:href="http://127.0.0.1/levels/acl" xlink:title="ACL"
+                   xlink:type="simple"/>
+            </container>
+            """)
+
+class TestLevelFileFactory(PlacefulSetup, unittest.TestCase):
+
+    def setUp(self):
+        super(TestLevelFileFactory, self).setUp()
+        self.app = setup.setUpSchoolToolSite()
+        self.factory = rest.level.LevelFileFactory(self.app['levels'])
+
+    def test_attributes(self):
+        level2 = self.factory(
+            "level2", None,
+            '''<object xmlns="http://schooltool.org/ns/model/0.1"
+                       title="Grade 2" isInitial="false"/>''')
+
+        self.assertEquals(level2.title, "Grade 2")
+        self.assertEquals(level2.isInitial, False)
+        self.assertEquals(level2.nextLevel, None)
+
+        self.app['levels']['level2'] = level2
+
+        level1 = self.factory(
+            "level1", None,
+            '''<object xmlns="http://schooltool.org/ns/model/0.1"
+                       title="Grade 1" isInitial="true"
+                       nextLevel="level2"/>''')
+
+        self.assertEquals(level1.title, "Grade 1")
+        self.assertEquals(level1.isInitial, True)
+        self.assertEquals(level1.nextLevel, level2)
+
+
+class TestLevelFile(testing.FileFactoriesSetUp, PlacefulSetup,
+                    unittest.TestCase):
+    """A test for IPerson IWriteFile adapter"""
+
+    def setUp(self):
+        super(TestLevelFile, self).setUp()
+        self.app = setup.setUpSchoolToolSite()
+        ztapi.provideAdapter(interfaces.ILevelContainer, IFileFactory,
+                             rest.level.LevelFileFactory)
+
+
+    def testWrite(self):
+        levels = level.LevelContainer()
+        level1 = level.Level("1st Grade")
+        levels['level1'] = level1
+
+        file = rest.level.LevelFile(level1)
+        file.write('''<object xmlns="http://schooltool.org/ns/model/0.1"
+                              title="First Grade" isInitial="true"/>''')
+
+        self.assertEquals(level1.title, "First Grade")
+
+
+class TestLevelView(testing.ApplicationObjectViewTestMixin, unittest.TestCase):
+    """A test for the RESTive view of a group."""
+
+    def setUp(self):
+        testing.ApplicationObjectViewTestMixin.setUp(self)
+        level2 = level.Level("2nd Grade")
+        self.testObject = self.app['levels']['level2'] = level2
+        level1 = level.Level("1st Grade", True, level2)
+        self.app['levels']['level1'] = level1
+
+        # Sigh, register the zope:name path adapter
+        ztapi.provideAdapter(
+            zope.interface.Interface, IPathAdapter, talesapi.ZopeTalesAPI,
+            name="zope")
+
+    def makeTestView(self, object, request):
+        return rest.level.LevelView(object, request)
+
+    def testGET(self):
+
+        result, response = self.get()
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result, '''
+            <level xmlns:xlink="http://www.w3.org/1999/xlink">
+              <title>2nd Grade</title>
+              <isInitial>
+                false
+              </isInitial>
+              <nextLevel/>
+              <relationships
+                  xlink:href="http://127.0.0.1/levels/level2/relationships"
+                  xlink:title="Relationships" xlink:type="simple"/>
+              <acl xlink:href="http://127.0.0.1/levels/level2/acl"
+                   xlink:title="ACL" xlink:type="simple"/>
+            </level>''')
+
+    def testGETNextLevel(self):
+
+        self.testObject = self.app['levels']['level1']
+        result, response = self.get()
+
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result, '''
+            <level xmlns:xlink="http://www.w3.org/1999/xlink">
+              <title>1st Grade</title>
+              <isInitial>
+                true
+              </isInitial>
+              <nextLevel>
+                level2
+              </nextLevel>
+              <relationships
+                  xlink:href="http://127.0.0.1/levels/level1/relationships"
+                  xlink:title="Relationships" xlink:type="simple"/>
+              <acl xlink:href="http://127.0.0.1/levels/level1/acl"
+                   xlink:title="ACL" xlink:type="simple"/>
+            </level>''')
+
+
+
+
+def test_suite():
+    suite = unittest.TestSuite((
+        unittest.makeSuite(TestLevelContainerView),
+        unittest.makeSuite(TestLevelFileFactory),
+        unittest.makeSuite(TestLevelFile),
+        unittest.makeSuite(TestLevelView),
+        ))
+
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_level.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_record.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_record.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_record.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,343 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for level REST views.
+
+$Id: test_record.py 6047 2006-05-11 18:31:03Z mg $
+"""
+import datetime
+import unittest
+import cStringIO
+
+import zope.interface
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.component.testing import PlacefulSetup
+from zope.location.interfaces import ILocation
+
+from schooltool.app.rest.testing import ApplicationObjectViewTestMixin
+from schooltool.app.rest.errors import RestError
+from schooltool.group.group import Group
+from schooltool.person.person import Person
+from schooltool.testing import setup
+
+import schooltool.level.rest.record
+from schooltool.level import record, rest, testing, level
+
+
+def testAcademicStatus():
+    """Test academic status adapter.
+
+    First we have to create a record stub:
+
+      >>> class AcademicRecord(object):
+      ...     status = None
+
+    Now we can create the adapter that will access the status:
+
+      >>> record = AcademicRecord()
+      >>> status = rest.record.AcademicStatus(record)
+
+    Initially there is no status:
+
+      >>> status.getStatus()
+
+    Once, we set the status, it will be available:
+
+      >>> status.setStatus(u'some value')
+      >>> status.getStatus()
+      u'some value'
+      >>> record.status
+      u'some value'
+    """
+
+def testAcademicHistory():
+    """Test for academic history adapter.
+
+    First we have to create a record stub:
+
+      >>> class AcademicRecord(object):
+      ...     pass
+
+    Now we can create the adapter:
+
+      >>> record = AcademicRecord()
+      >>> history = rest.record.AcademicHistory(record)
+
+    That's it.
+    """
+
+def testAcademicProcessCreator():
+    """Test for academic process creator adapter.
+
+    First we have to create a record stub:
+
+      >>> class AcademicRecord(object):
+      ...     context = None
+      ...     levelProcess = None
+
+    Next let's ensure we have a full-blown setup:
+
+      >>> from zope.app.testing.setup import placefulSetUp
+      >>> placefulSetUp()
+      >>> app = setup.setUpSchoolToolSite()
+      >>> app['groups']['manager'] = Group('manager', 'School Manager')
+
+    Then we need to make sure that persons can be annotated:
+
+      >>> zope.interface.classImplements(Person, IAttributeAnnotatable)
+
+    Now we can create the adapter:
+
+      >>> record = AcademicRecord()
+      >>> record.context = Person('srichter', 'Stephan Richter')
+      >>> creator = rest.record.AcademicProcessCreator(record)
+
+    Once we setup the promotion workflow code, then we can attach a new
+    process instance:
+
+      >>> testing.setUpPromotionWorkflow()
+      >>> creator.create()
+
+      >>> record.levelProcess
+      Process('schooltool.promotion')
+
+    Cleanup:
+
+      >>> from zope.app.testing.setup import placefulTearDown
+      >>> placefulTearDown()
+    """
+
+
+class TestAcademicStatusView(ApplicationObjectViewTestMixin, unittest.TestCase):
+    """A test for the RESTive view of teh academic status."""
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+
+        class AcademicRecord(object):
+            status = 'Initial Status'
+
+        self.testObject = rest.record.AcademicStatus(AcademicRecord())
+
+    def makeTestView(self, object, request):
+        return rest.record.AcademicStatusView(object, request)
+
+    def testGET(self):
+        result, response = self.get()
+        self.assertEquals(response.getHeader('content-type'), "text/plain")
+        self.assertEquals(result, 'Initial Status')
+
+    def testPOST(self):
+        request = TestRequest(cStringIO.StringIO('new status'))
+        view = self.makeTestView(self.testObject, request)
+        view.POST()
+        self.assertEqual(self.testObject.getStatus(), 'new status')
+
+        request = TestRequest(cStringIO.StringIO('new status'),
+                              environ={'HTTP_CONTENT_SOMETHING': True})
+        view = self.makeTestView(self.testObject, request)
+        view.POST()
+        self.assertEqual(request.response.getStatus(), 501)
+
+
+class TestAcademicHistoryView(ApplicationObjectViewTestMixin,
+                              unittest.TestCase):
+    """A test for the RESTive view of the academic history."""
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+
+        entry1 = record.HistoricalRecord('Entry 1', 'This is entry 1.')
+        entry1.timestamp = datetime.datetime(2005, 01, 25, 3, 0, 0)
+        entry2 = record.HistoricalRecord('Entry 2', 'This is entry 2.')
+        entry2.timestamp = datetime.datetime(2005, 01, 25, 4, 0, 0)
+
+        class AcademicRecord(object):
+            history = [entry1, entry2]
+
+        self.testObject = rest.record.AcademicHistory(AcademicRecord())
+
+    def makeTestView(self, object, request):
+        return rest.record.AcademicHistoryView(object, request)
+
+    def testHistory(self):
+        request = TestRequest()
+        view = self.makeTestView(self.testObject, request)
+        self.assertEqual(
+            list(view.history()),
+            [{'timestamp': u'2005 1 25  03:00:00 ',
+              'description': 'This is entry 1.',
+              'title': 'Entry 1'},
+             {'timestamp': u'2005 1 25  04:00:00 ',
+              'description': 'This is entry 2.',
+              'title': 'Entry 2'}])
+
+    def testGET(self):
+        result, response = self.get()
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(
+            result, '''
+            <history>
+              <entry>
+                <title>Entry 1</title>
+                <description>This is entry 1.</description>
+                <timestamp>2005 1 25  03:00:00</timestamp>
+              </entry>
+              <entry>
+                <title>Entry 2</title>
+                <description>This is entry 2.</description>
+                <timestamp>2005 1 25  04:00:00</timestamp>
+              </entry>
+            </history>''')
+
+
+class TestAcademicProcessCreatorView(ApplicationObjectViewTestMixin,
+                                     PlacefulSetup, unittest.TestCase):
+    """A test for the RESTive view of the academic process creation."""
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+        testing.setUpPromotionWorkflow()
+
+        zope.interface.classImplements(Person, IAttributeAnnotatable)
+
+        app = setup.setUpSchoolToolSite()
+        app['groups']['manager'] = Group('manager', 'School Manager')
+
+
+        class AcademicRecord(object):
+            context = Person('srichter', 'Stephan Richter')
+            levelProcess = None
+
+        self.testObject = rest.record.AcademicProcessCreator(AcademicRecord())
+
+    def makeTestView(self, object, request):
+        return rest.record.AcademicProcessCreatorView(object, request)
+
+    def testGET(self):
+        result, response = self.get()
+        self.assertEqual(response.getHeader('content-type'), "text/plain")
+        self.assertEqual(response.getStatus(), 200)
+
+    def testPUT(self):
+        request = TestRequest()
+        view = self.makeTestView(self.testObject, request)
+        view.PUT()
+        self.assertEqual(request.response.getStatus(), 200)
+        self.assert_(self.testObject.record.levelProcess is not None)
+
+
+class TestSelectInitialLevelView(ApplicationObjectViewTestMixin, PlacefulSetup,
+                                 unittest.TestCase):
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+
+        app = setup.setUpSchoolToolSite()
+        app['levels']['level1'] = level.Level('level1', '1st Grade')
+        self.level1 = app['levels']['level1']
+
+        class WorkItem(object):
+            level = None
+            def finish(self, level):
+                self.level = level
+
+        self.testObject = WorkItem()
+
+    def makeTestView(self, object, request):
+        return rest.record.SelectInitialLevelView(object, request)
+
+    def testPOST(self):
+        request = TestRequest(
+            cStringIO.StringIO('''
+                <object xmlns="http://schooltool.org/ns/model/0.1"
+                        initialLevel="level1" />'''))
+        view = self.makeTestView(self.testObject, request)
+        view.POST()
+        self.assertEqual(self.testObject.level, self.level1)
+
+        request = TestRequest(
+            cStringIO.StringIO('''
+                <object xmlns="http://schooltool.org/ns/model/0.1"
+                        initialLevel="level2" />'''))
+        view = self.makeTestView(self.testObject, request)
+        self.assertRaises(RestError, view.POST)
+
+
+class TestSetLevelOutcomeView(ApplicationObjectViewTestMixin, PlacefulSetup,
+                              unittest.TestCase):
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+
+        app = setup.setUpSchoolToolSite()
+        app['levels']['level1'] = level.Level('level1', '1st Grade')
+        self.level1 = app['levels']['level1']
+
+        class WorkItem(object):
+            zope.interface.implements(ILocation)
+            __name__ = 'level1'
+            outcome = None
+            def __getattr__(self, name):
+                return self
+            def finish(self, outcome):
+                self.outcome = outcome
+
+        self.testObject = WorkItem()
+
+    def makeTestView(self, object, request):
+        return rest.record.SetLevelOutcomeView(object, request)
+
+    def testLevel(self):
+        request = TestRequest()
+        view = self.makeTestView(self.testObject, request)
+        self.assertEqual(view.level(), 'level1')
+
+    def testPOST(self):
+        request = TestRequest(
+            cStringIO.StringIO('''
+                <object xmlns="http://schooltool.org/ns/model/0.1"
+                        outcome="pass" />'''))
+        view = self.makeTestView(self.testObject, request)
+        self.assertEqual(view.POST(), "Outcome submitted.")
+        self.assertEqual(self.testObject.outcome, 'pass')
+
+
+def test_suite():
+    suite = unittest.TestSuite((
+        unittest.makeSuite(TestAcademicStatusView),
+        unittest.makeSuite(TestAcademicHistoryView),
+        unittest.makeSuite(TestAcademicProcessCreatorView),
+        unittest.makeSuite(TestSelectInitialLevelView),
+        unittest.makeSuite(TestSetLevelOutcomeView),
+        ))
+    suite.addTest(doctest.DocTestSuite(
+        optionflags=doctest.ELLIPSIS|
+                    doctest.REPORT_NDIFF|
+                    doctest.REPORT_ONLY_FIRST_FAILURE)
+        )
+
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/rest/tests/test_record.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,70 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetable sample data generation
+
+$Id: sampledata.py 5459 2005-12-15 17:28:45Z mg $
+"""
+
+import random
+
+from zope.app import zapi
+from zope.interface import implements
+from zope.wfmc.interfaces import IProcessDefinition
+from zope.security.proxy import removeSecurityProxy
+
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.level.level import Level
+from schooltool.level.interfaces import IManagerWorkItems, IAcademicRecord
+from schooltool.level.promotion import SelectInitialLevel
+
+
+class SampleLevels(object):
+
+    implements(ISampleDataPlugin)
+
+    name = 'levels'
+    dependencies = ('students', )
+
+    def generate(self, app, seed=None):
+        self.random = random.Random()
+        self.random.seed(str(seed) + self.name)
+        levels = removeSecurityProxy(app['levels'])
+        levels['12th-grade'] = Level('12th grade')
+        levels['11th-grade'] = Level('11th grade',
+                                     nextLevel=levels['12th-grade'])
+        levels['10th-grade'] = Level('10th grade',
+                                     nextLevel=levels['11th-grade'])
+        levels['9th-grade'] = Level('9th grade', isInitial=True,
+                                    nextLevel=levels['10th-grade'])
+
+        pd = zapi.getUtility(IProcessDefinition, 'schooltool.promotion')
+
+        for personid in app['persons']:
+            if personid.startswith('student'):
+                person = removeSecurityProxy(app['persons'][personid])
+                process = pd()
+                process.start(person, None, None)
+                IAcademicRecord(person).levelProcess = process
+
+        work = IManagerWorkItems(removeSecurityProxy(app['groups']['manager']))
+        for item in tuple(work.values()):
+            if isinstance(item, SelectInitialLevel):
+                level = self.random.choice(levels.values())
+                item.finish(level)


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/testing.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/testing.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/testing.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,96 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Testing helper functions for this package
+
+$Id: testing.py 5669 2006-01-20 19:58:16Z mg $
+"""
+
+import os
+
+import zope.wfmc.interfaces
+import zope.component
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.schema import vocabulary
+from zope.wfmc import xpdl, adapter
+
+from schooltool.group.interfaces import IGroup
+import schooltool.level.level
+import schooltool.level.browser.promotion
+from schooltool.level import interfaces, level, promotion, record, browser
+
+
+def setUpPromotionWorkflow():
+    xpdl_dir = os.path.dirname(__file__)
+
+    package = xpdl.read(open(os.path.join(xpdl_dir, 'promotion.xpdl')))
+    pd = package['promotion']
+    pd.id = 'schooltool.promotion'
+    pd.integration = adapter.integration
+    zope.component.provideUtility(pd, name='schooltool.promotion')
+
+    zope.component.provideAdapter(promotion.Manager,
+                                  provides=zope.wfmc.interfaces.IParticipant,
+                                  name='.manager')
+    zope.component.provideAdapter(promotion.ProgressToNextLevel,
+                                  name='.progressToNextLevel')
+    zope.component.provideAdapter(promotion.SelectInitialLevel,
+                                  provides=zope.wfmc.interfaces.IWorkItem,
+                                  name='.selectInitialLevel')
+    zope.component.provideAdapter(promotion.SetLevelOutcome,
+                                  provides=zope.wfmc.interfaces.IWorkItem,
+                                  name='.setLevelOutcome')
+    zope.component.provideAdapter(promotion.UpdateStatus,
+                                  name='.updateStatus')
+    zope.component.provideAdapter(promotion.WriteRecord,
+                                  name='.writeRecord')
+
+    zope.component.provideAdapter(promotion.getManagerWorkItems,
+                                  adapts=(IGroup,),
+                                  provides=interfaces.IManagerWorkItems)
+    zope.component.provideAdapter(record.AcademicRecord)
+
+    zope.component.provideHandler(promotion.addProcessToStudent,
+                                  (zope.wfmc.interfaces.IProcessStarted,))
+
+    zope.component.provideHandler(promotion.removeProcessFromStudent,
+                                  (zope.wfmc.interfaces.IProcessFinished,))
+
+    zope.component.provideAdapter(
+        browser.promotion.SchemaWorkItemView,
+        adapts=(promotion.SelectInitialLevel, IBrowserRequest),
+        provides=browser.promotion.IFinishSchemaWorkitem)
+
+    zope.component.provideAdapter(
+        browser.promotion.SetLevelOutcomeView,
+        adapts=(promotion.SetLevelOutcome, IBrowserRequest),
+        provides=browser.promotion.IFinishSchemaWorkitem)
+
+    registry = vocabulary.getVocabularyRegistry()
+    registry.register('Levels', level.LevelVocabulary)
+
+
+def setUpLevels(app):
+    app['levels']['level1'] = level.Level('1st Grade', isInitial=True)
+
+    app['levels']['level2'] = level.Level('2nd Grade')
+    app['levels']['level1'].nextLevel = app['levels']['level2']
+
+    app['levels']['level3'] = level.Level('3rd Grade')
+    app['levels']['level2'].nextLevel = app['levels']['level3']


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/testing.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/tests/test_level.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/tests/test_level.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/tests/test_level.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,55 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Level-related Tests
+
+$Id: test_level.py 5669 2006-01-20 19:58:16Z mg $
+"""
+
+import os
+import unittest
+
+from zope.testing import doctest, doctestunit
+from zope.app.testing import setup
+
+
+def setUp(test):
+    test.globs['this_directory'] = os.path.join(os.path.dirname(__file__), '..')
+    setup.placefulSetUp()
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def showApplications(activity, pd):
+    return [pd.applications[id]
+            for (id, other, other) in activity.applications]
+
+
+def test_suite():
+    return unittest.TestSuite((
+        doctest.DocFileSuite('../README.txt',
+                             setUp=setUp, tearDown=tearDown,
+                             globs={'pprint': doctestunit.pprint,
+                                    'showApplications': showApplications},
+                             optionflags=doctest.NORMALIZE_WHITESPACE),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/tests/test_level.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/level/tests/test_sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/level/tests/test_sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/level/tests/test_sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,145 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.level.sampledata
+
+$Id: test_sampledata.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+
+from schooltool.group.interfaces import IGroup
+from schooltool.level.interfaces import IManagerWorkItems
+from schooltool.testing import setup as stsetup
+
+
+def setUpLevels():
+    from zope.wfmc import xpdl
+    import os
+    package = xpdl.read(open(os.path.join(os.path.dirname(__file__),
+                                          '..', 'promotion.xpdl')))
+    pd = package['promotion']
+    pd.id = u'schooltool.promotion'
+
+    from zope.wfmc.interfaces import IProcessDefinition
+    ztapi.provideUtility(IProcessDefinition, pd, name='schooltool.promotion')
+
+    from zope.wfmc.adapter import integration
+    pd.integration = integration
+
+    import zope.component
+    import zope.wfmc.interfaces
+    from schooltool.level import promotion
+
+    zope.component.provideAdapter(promotion.Manager,
+                                  provides=zope.wfmc.interfaces.IParticipant,
+                                  name='.manager')
+
+    zope.component.provideAdapter(promotion.ProgressToNextLevel,
+                                  name='.progressToNextLevel')
+    zope.component.provideAdapter(promotion.SelectInitialLevel,
+                                  provides=zope.wfmc.interfaces.IWorkItem,
+                                  name='.selectInitialLevel')
+    zope.component.provideAdapter(promotion.SetLevelOutcome,
+                                  provides=zope.wfmc.interfaces.IWorkItem,
+                                  name='.setLevelOutcome')
+    zope.component.provideAdapter(promotion.UpdateStatus,
+                                  name='.updateStatus')
+    zope.component.provideAdapter(promotion.WriteRecord,
+                                  name='.writeRecord')
+    zope.component.provideAdapter(promotion.getManagerWorkItems,
+                                  adapts=(IGroup,),
+                                  provides=IManagerWorkItems)
+
+    from schooltool.level import record
+    zope.component.provideAdapter(record.AcademicRecord)
+
+
+def setUp(test):
+    setup.placefulSetUp()
+    setUpLevels()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def doctest_SampleLevels():
+    """A sample data plugin that generates levels
+
+        >>> from schooltool.level.sampledata import SampleLevels
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleLevels()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    This plugin depends on the 'students' plugin, because it assigns
+    students to levels:
+
+        >>> plugin.dependencies
+        ('students',)
+
+    We'll need the manager group in app, and some persons:
+
+        >>> from schooltool.group.group import Group
+        >>> from schooltool.person.person import Person
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> app['groups']['manager'] = Group('Manager')
+        >>> app['persons']['student000'] = Person('student000', 'John')
+        >>> app['persons']['student001'] = Person('student001', 'Joe')
+        >>> app['persons']['student002'] = Person('student002', 'Jo')
+
+    This plugin creates 4 levels:
+
+        >>> plugin.generate(app, 13)
+        >>> len(app['levels'])
+        4
+
+    The levels are consistent:
+
+        >>> app['levels'].validate()
+
+    Also, all the students get promotion workflows initialized, and
+    they get promoted to a random level:
+
+        >>> from schooltool.level.interfaces import IAcademicRecord
+        >>> from zope.security.proxy import removeSecurityProxy
+        >>> for i in range(3):
+        ...     person = app['persons']['student00' + str(i)]
+        ...     proc = IAcademicRecord(person).levelProcess
+        ...     print proc.workflowRelevantData.level
+        <Level '10th grade'>
+        <Level '11th grade'>
+        <Level '12th grade'>
+
+    """
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS),
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/level/tests/test_sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/locales/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/locales/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2330 @@
+# Afrikaans translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-09-27 13:04+0000\n"
+"Last-Translator: Jonathan Carter <jonathan at ubuntu.com>\n"
+"Language-Team: Afrikaans <af at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Persone"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 persoon"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} persone"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Gebruikersnaam of wagwoord is verkeerd"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Huidig"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Dinsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Woensdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Donderdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Din"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Woe"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Don"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Vry"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sat"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Son"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Tietel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Hele dag"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tyd"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Begin tyd in 24h formaat"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Week"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Maand"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Jaar"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Herhaal elke"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Reeks"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Telling"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Tot"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "verewig"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Herhaal tot"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5de"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "laaste weekdag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Laaste ${weekdag}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "'n Fout het voorgekom."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ongeldige tyd"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#, fuzzy
+msgid "Add"
+msgstr "Las by"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Bekyk kalender"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Tietel"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Groepe"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Tot"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Datum"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Hulpbronindeks"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Voeg nuwe hulpbron by"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Huidig"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Groepe"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "persoonindex"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "voeg 'n nuwe persoon by"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Wagwoord"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Hierdie gebruikersnaam is alreeds in gebruik!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sat"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notas"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Volle name"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Volle name"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Volle name"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (in JPEG formaat)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Wagwoord suksesvol verander!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Wagwoord suksesvol verander!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Wagwoord suksesvol verander!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Voorbeeld:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "groupsindeks"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Voeg nuwe groep by"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Hulpbronindeks"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Voeg nuwe hulpbron by"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Wagwoord suksesvol verander!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Wagwoord suksesvol verander!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Gebruiker"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Sat"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nuwe wagwoord"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Nuwe wagwoord"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Bekyk kalender"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Naam wat vertoon moet word"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Hulpbronindeks"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Voeg nuwe hulpbron by"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Hulpbronindeks"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Voeg nuwe hulpbron by"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "voeg 'n nuwe persoon by"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Voeg nuwe hulpbron by"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} persone"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Nota"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nuwe foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "'n Klein foto (omtrend 48x48 pixels in JPEG formaat)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Vee foto uit"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Merk om hierdie foto uit te vee"
+
+#~ msgid "Verify password"
+#~ msgstr "Bevestig wagwoord"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Wagwoorde stem nie ooreen nie."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Wagwoord stem nie ooreen nie!"
+
+#~ msgid "View"
+#~ msgstr "Bekyk"
+
+#, fuzzy
+#~ msgid "Edit"
+#~ msgstr "Redigeer"
+
+#~ msgid "Create new objects"
+#~ msgstr "Skep nuwe voorwerpe"
+
+#~ msgid "Add events"
+#~ msgstr "Voeg geleenthede by"
+
+#~ msgid "Control access"
+#~ msgstr "Kontrole toegang"
+
+#~ msgid "Manage membership"
+#~ msgstr "Bestuur lidmaadskap"
+
+#~ msgid "Public"
+#~ msgstr "Publiek"
+
+#~ msgid "Add note"
+#~ msgstr "Las nota by"
+
+#~ msgid "Add person"
+#~ msgstr "Las persoon by"
+
+#~ msgid "Future"
+#~ msgstr "Toekoms"
+
+#~ msgid "All"
+#~ msgstr "Alle"

Added: schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/af/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4893 @@
+# Afrikaans translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-07-03 18:47+0000\n"
+"Last-Translator: Phlippie F. Smit <smitpf at users.sourceforge.net>\n"
+"Language-Team: Afrikaans <af at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Persone"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 persoon"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} persone"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Gebruikersnaam of wagwoord is verkeerd"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Maart"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januarie"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februarie"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Junie"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mei"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Augustus"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Julie"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Die volgende dag"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Vandag"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Die vorige dag"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Desember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Maandag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Dinsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Woensdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Donderdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Sondag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Saterdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Vrydag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Maan"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Dins"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Woens"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Don"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Vry"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sat"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Son"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Heel dag"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tyd"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Begin tyd in 24h formaat"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Tydsduur"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tydsduur Tipe"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minute"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Ure"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dae"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Plek"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Beskrywing"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Herhalende"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Herhaal elke"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Week"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Maand"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Jaar"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Herhaal elke"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Reeks"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Tel"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Tot"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "vir ewig"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Aantal gebeurlikhede"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Herhaal tot"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Weeksdae"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Weeksdag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Maandeliks"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Datums om uit te sluit"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "selfde weeksdag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1ste"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4de"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3de"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2de"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5de"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "laaste weeksdag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Laaste ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "'n Fout het voorgekom."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ongeldige tyd"
+
+#: /src/schooltool/app/browser/cal.py:1935
+#, fuzzy
+msgid "End date is earlier than start date"
+msgstr "Eind-datum is vroeër as begin datum"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Ongeldige datum. Spesifiseer asseblief datums as JJJJ-MM-DD, een per lyn."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Voeg gebeurlikheid by"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Voeg by"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Wysig gebeurlikheid"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Opdateer"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Opgedateer op ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalender"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Volgende week"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Huidige week"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Vorige week"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Volgende maand"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Huidige maand"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Vorige maand"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Week ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Volgende jaar"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Huidige jaar"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Vorige jaar"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Aksies"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Besigtig"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Voeg gebeurlikheid by"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Wysig gebeurlikheid"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Plek"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigasie"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Aksies"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Geen data verskaf nie"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Kon nie data omskakel na Unikode nie (verkeerde karakterstel?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV leêr suksesvol ingevoer."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Gefaal om CSV leêr in te voer"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV teks suksesvol ingevoer."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Invoer van CSV teks was onsuksesvol"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Geen karakterstel gespesifiseer nie"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Onbekende karakterstel"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Fout in CSV data, lyn ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Omskakeling na unikode was onsuksesvol in lyn ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Ry 2 is nie leeg nie"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+#, fuzzy
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr "Misvormde lyn ${line_no} (dit moet 'n dag id en 'n peiode id bevat)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Onvolledige afdeling beskrywing op lyn ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Die eerste ry van die CSV leêr moet die termyn ID en die rooster skema ID "
+"bevat."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Die termyn ${term} bestaan nie."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Die rooster skema ${schema} bestaan nie."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Fout in rooster CSV data, lyn ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Dag ID's is nie gedefinieer in die gekose skema (${args}) nie."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Periodes is nie gedefinieer in die gekose dae (${args}) nie."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Persone nie gevind nie: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Kursusse nie gevind nie: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Afdelings nie gevind nie: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Ongeldige rekords: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Veranderinge gestoor."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "heel dag"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Plek: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Bespreekte hulpbron: %"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "herhalend"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+#, fuzzy
+msgid "overlaid from %s"
+msgstr "oorgelê vanaf %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Daaglikse kalender vir %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Weeklikse kalender vir %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Week %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Maandelikse kalender vir %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+#, fuzzy
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"PDF ondersteuning is ge-deaktiveer. Dit kan geaktiveer word deur jou "
+"bediener ondersteuning span."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Kalenders"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Beskrywing"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Môre se gebeurlikhede"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Drukker-vriendelike weergawe"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Besigtig daaglikse kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Daagliks"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Besigtig weeklikse kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Weekliks"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Besigtig maandelikse kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Besigtig jaarlikse kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Jaarliks"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Kalender vir ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Persoonlike kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Rooster kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "My Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalenders"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Meer..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Kyk na kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Weeklikse kalender vir %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+#, fuzzy
+msgid "delete-button"
+msgstr "kanselleer-knoppie"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "kanselleer-knoppie"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Voeg gebeurlikheid by"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Besonderhede"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Sat"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Wysig gebeurlikheid"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Bespreekte hulpbron: %"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "Bespreekte hulpbron: %"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Verander/verwyder gebeurlikhede"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "Besonderhede"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Bespreekte hulpbron: %"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Opdateer"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Vandag"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Week"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Maand"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Jaar"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Herhaal tot"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Tyd"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Kyk na kalender"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Herhaal elke"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Bespreekte hulpbron: %"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Sat"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "Plek: %s"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "Ure"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "herhalend"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Heel dag"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Bespreekte hulpbron: %"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "TKL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Persone"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minute"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "herhalend"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Sondag"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Vorige jaar"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+#, fuzzy
+msgid "Next"
+msgstr "Volgende week"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Plek"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Besigtig"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Wysig gebeurlikheid"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "Aksies"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+#, fuzzy
+msgid "Import Courses"
+msgstr "Invoer van Afdelings"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "Aksies"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+#, fuzzy
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Bespreekte hulpbron: %"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Aksies"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+#, fuzzy
+msgid "Current Size"
+msgstr "Huidige week"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Persone"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Maart"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Wysig"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Voer dit uit"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Daagliks"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Notas"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "kanselleer-knoppie"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+#, fuzzy
+msgid "add-button"
+msgstr "kanselleer-knoppie"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "kanselleer-knoppie"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Wysig gebeurlikheid"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "kanselleer-knoppie"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+#, fuzzy
+msgid "Import Groups"
+msgstr "Invoer van Afdelings"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Bestuur lidmaatskap"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "November"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "September"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Kyk na kalender"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Voeg gebeurlikheid by"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Wysig gebeurlikheid"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "Notas"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "kanselleer-knoppie"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Huidige week"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "kanselleer-knoppie"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "kanselleer-knoppie"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "kanselleer-knoppie"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Notas"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Notas"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Voeg gebeurlikheid by"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Datum"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+#, fuzzy
+msgid "Import Persons"
+msgstr "Invoer van Afdelings"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Voeg gebeurlikheid by"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Wysig gebeurlikheid"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "Minute"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "Invoer van Afdelings"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Kalender"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Datums om uit te sluit"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${month} ${year}"
+msgstr "${month}, ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+#, fuzzy
+msgid "Week ${week_number}"
+msgstr "Week ${week_no}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+#, fuzzy
+msgid "Save changes"
+msgstr "Veranderinge gestoor."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Vandag"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Die vorige dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "Heel dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Titel"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Datum"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Kyk na kalender"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Maandag"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Rooster kalender"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Rooster kalender"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Create new objects"
+#~ msgstr "Skep nuwe voorwerpe"
+
+#~ msgid "Add events"
+#~ msgstr "Voeg gebeurlikhede by"
+
+#~ msgid "Control access"
+#~ msgstr "Kontroleer toegang"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Ingetekende gebruikers"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "On-ingetekende gebruikers"

Added: schooltool/branches/upstream/current/src/schooltool/locales/am/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/am/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/am/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4763 @@
+# Amharic translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Amharic <am at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/an/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/an/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/an/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Aragonese translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Aragonese <an at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2425 @@
+# Arabic translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-12-17 01:22+0000\n"
+"Last-Translator: azizk <azizk03 at yahoo.com>\n"
+"Language-Team: Arabic <ar at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "أشخاص"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "شخص"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "أشخاص{number}$"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "اسم المستعمل او كلمة السر غير صحيح"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "السنة الحالية"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "مارس"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "يناير"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "فبراير"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "يونيو"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "مايو"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "أبريل"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "أغسطس"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "شتنبر"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "يوليه"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "اليوم المقبل"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "اليوم"
+
+#: /src/schooltool/app/browser/cal.py:1023
+#, fuzzy
+msgid "The previous day"
+msgstr "اليوم الماضي"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "أكتوبر"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "ديسمبر"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "نوفمبر"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "الاثنين"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "الثلاثاء"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "الأربعاء"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "الخميس"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "الآحد"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "السبت"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "الجمعة"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "الإثنين"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "الثلاثاء"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "الأربعاء"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "الخميس"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "الجمعة"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "السبت"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "الآحد"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "مهنة"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "طوال اليوم"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "تاريخ"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "الوقت"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "ابدء الوقت على نظام 24 ساعة"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "المهلة"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "نوع المهلة"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "دقائق"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "ساعات"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "أيام"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "موقع"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "وصف"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "متكرّر"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "يتكرّر كل"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "يوم"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "أسبوع"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "شهر"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "سنة"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "كرر كل"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "إطار"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "عدد"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "حتى"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "الى الأبد"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "عدد الأحداث"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "اعد حتى"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "أيام الأسبوع"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "يوم من أيام الأسبوع"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "شهري"
+
+#: /src/schooltool/app/browser/cal.py:1749
+#, fuzzy
+msgid "Exception dates"
+msgstr "بستثناء المواعيد"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "نفس يوم الأسبوع"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "الأول"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "الرابع"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "الثالث"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "الثاني"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "الخامس"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "اَخر يوم الأسبوع"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "{weekday}$ اُخر"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "حصل خطئ"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "وقت غير شرعي"
+
+#: /src/schooltool/app/browser/cal.py:1935
+#, fuzzy
+msgid "End date is earlier than start date"
+msgstr "تاريخ النهاية قبل تاريخ البداية"
+
+#: /src/schooltool/app/browser/cal.py:1944
+#, fuzzy
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "تاريخ غير مقبول. من فضلك ضع السنة ، الشهر و اليوم كل  واحد في سطر"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "أضف حدث"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "أضف"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "حرر الحدث"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "تحديث"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "{date_time}$ تحديث في"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "iCalendar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "الأسبوع المقبل"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "يأسبوع الحالي"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "الأسبوع الماضى"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "أشهر المقبل"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "أشهر الحالي"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "اشهر الماضي"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "أسيوع{week_no)$"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "السنة المقبلة"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "السنة الحالية"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "السنة الماضية"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "مهنة"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "مجومعة"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "المهلة"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "تاريخ"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "دليل الموارد"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "اضف موارد  جديد"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "أشهر الحالي"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "أشهر الحالي"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "إستراد الموارد"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "دليل اشخص"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "اضف شخص جديد"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "غير العضوية"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "اسم المستعمل"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "كلمة السر"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "أستعمل هذا الإسم من قبل"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "اشهر الماضي"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "حرر معلومات المجموعة"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "السبت"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "عدد الأحداث"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "الإسم الكامل"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "الإسم الكامل"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "الإسم الكامل"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "صورة"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "(in JPEG format) صورة"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "مذكرة جديدة"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "كلمة السر تغيرت بنجاح"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "كلمة السر تغيرت بنجاح"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "كلمة السر تغيرت بنجاح"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "المهلة"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "دليل  المجموعة"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "اضف مجموعة جديدة"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "دليل الموارد"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "اضف موارد  جديد"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "الأسبوع الماضى"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "كلمة السر تغيرت بنجاح"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "يأسبوع الحالي"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "كلمة السر تغيرت بنجاح"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "السبت"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "الأسبوع المقبل"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "كلمة السر جديدة"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "كلمة السر جديدة"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "مشاهدة الجدول"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "الإسم الذى سينشر"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "دليل الموارد"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "اضف موارد  جديد"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "دليل الموارد"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "اضف موارد  جديد"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "صورة"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "غيرالتفاصيل"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "مذكرة جديدة"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "اضف شخص جديد"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "بستثناء المواعيد"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "تاريخ غير مقبول. من فضلك ضع السنة ، الشهر و اليوم كل  واحد في سطر"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "اضف موارد  جديد"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "أشخاص{number}$"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "نفس يوم الأسبوع"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "صورة جديدة"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "(about 48x48 pixels in JPEG format) صورة صغيرة"
+
+#~ msgid "Clear photo"
+#~ msgstr "امسح الصورة"
+
+#, fuzzy
+#~ msgid "Check this to clear the photo"
+#~ msgstr "أختر لمسح الصورة"
+
+#~ msgid "Verify password"
+#~ msgstr "تيقن من كلمة السر"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "كلمات السر غير متطابق"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "كلمات السر غير متطابق"
+
+#~ msgid "View"
+#~ msgstr "مشاهدة"
+
+#~ msgid "Edit"
+#~ msgstr "اتحرير"
+
+#~ msgid "Add events"
+#~ msgstr "أضف أحداث"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "عدل/احدف الأحداث"
+
+#~ msgid "Control access"
+#~ msgstr "مراقبة الدخول"
+
+#~ msgid "Manage membership"
+#~ msgstr "ادارة العضوية"
+
+#, fuzzy
+#~ msgid "Authenticated users"
+#~ msgstr "مستعمل موثق"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "مستعمل غير موثق"
+
+#~ msgid "Set Up Access"
+#~ msgstr "إنشاء عملية الدخول"
+
+#, fuzzy
+#~ msgid "Change Preferences"
+#~ msgstr "تغيير الأفضليات"
+
+#~ msgid "New Person"
+#~ msgstr "شخص جديد"
+
+#~ msgid "Import Persons"
+#~ msgstr "إستراد الأشخاص"
+
+#~ msgid "Add a Group"
+#~ msgstr "أضف مجموعة"
+
+#~ msgid "New Group"
+#~ msgstr "مجموعة جديدة"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "مجومعة   SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "أضف/أحدف الأعضاء"
+
+#~ msgid "Import Groups"
+#~ msgstr "ستورد الجموعات"
+
+#~ msgid "Add a Resource"
+#~ msgstr "أضف موارد"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "حرر معلومات الموارد"
+
+#~ msgid "New Resource"
+#~ msgstr "موارد جديدة"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "موارد (SchoolBell)"
+
+#~ msgid "A Resource"
+#~ msgstr "موارد"
+
+#~ msgid "Actions"
+#~ msgstr "إجراءات"
+
+#~ msgid "View Calendar"
+#~ msgstr "شاهد الجدول"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "الجدول (اليومي)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "(الجدول (اليومي,PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "الجدول (الأسبوعي)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "(الجدول (اليومي,PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "الجدول  (الشهري)"
+
+#, fuzzy
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "الجدول (الشهري PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "الجدول( السنوي)"
+
+#~ msgid "Free/Busy"
+#~ msgstr "حر/مشغول"
+
+#~ msgid "New Event"
+#~ msgstr "حدث جديد"
+
+#~ msgid "Open in iCal"
+#~ msgstr "فتح في iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "حرر الحدث"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ar/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4775 @@
+# Arabic translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:42+0000\n"
+"Last-Translator: bamuhrez <bamuhrez at gmail.com>\n"
+"Language-Team: Arabic <ar at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "فهرس الدروس"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "تحميل الاشخاص"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "إضافة فصل جديد"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+#, fuzzy
+msgid "Import Courses"
+msgstr "تحميل المجموعات"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "إضافة درس جديد"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+#, fuzzy
+msgid "New Course"
+msgstr "إضافة درس جديد"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "فهرس الدروس"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "إضافة درس جديد"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "هذا الدرس غير متوفر"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "تحتاج لرقم الدرس"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "قائمة الفصول"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "إضافة فصل جديد"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "قائمة الفصول"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "قائمة الفصول"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "إضافة فصل جديد"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "تحميل المجموعات"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "تحميل المجموعات"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "تحميل الاشخاص"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "إضافة درس جديد"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "تحميل الاشخاص"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "إضافة درس جديد"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/bn/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/bn/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/bn/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2241 @@
+# Bengali translation for schoolbell
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-04-25 06:41+0000\n"
+"Last-Translator: mak <makl10n at yahoo.com>\n"
+"Language-Team: Bengali <bn at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "সম্পূর্ন নাম"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "সম্পূর্ন নাম"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "সম্পূর্ন নাম"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3168 @@
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005    Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell Version 1.2.1\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-11-30 18:48+0000\n"
+"Last-Translator: Jordi Irazuzta <irazuzta at gmail.com>\n"
+"Language-Team: Schooltool Development Team <schooltool-dev at schooltool.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: setup.py\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Àlies"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Àlies per a aquest usuari"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Adreça electrònica 1"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Adreça electrònica 2"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telèfon 1"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Número de telèfon principal"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Telèfon 2"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Número de telèfon secundari"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Lloc web"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Lloc web o weblog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Adreça postal"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Usuaris"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 usuari"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} usuaris"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "El nom d'usuari o la contrasenya són incorrectes"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Any actual"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Importa grups"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "març"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "gener"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "febrer"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "juny"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "maig"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "agost"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "setembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "juliol"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Dia següent"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Avui"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Dia anterior"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "octubre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "desembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "novembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "dilluns"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "dimarts"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "dimecres"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "dijous"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "diumenge"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "dissabte"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "divendres"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "dl"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "dm"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "dc"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "dj"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "dv"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "ds"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "dg"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Títol"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Tot el dia"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Start time in 24h format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duració"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipus de durada"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuts"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Hores"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dies"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Lloc"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Descripció"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Periòdic"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Es repeteix cada"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dia"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Setmana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mes"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Any"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repeteix cada"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Rang"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Compte"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Fins a"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "sempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Nombre de tasques"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Repeteix fins"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Dies de la setmana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Dia de la setmana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Mensual"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Excepte les dates"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "mateixa setmana"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1r"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4t"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3r"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2n"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5è"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "últim dia de la setmana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Últim ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "S'ha produït un error."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "L'hora no és vàlida."
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "La data d'acabament és anterior a la d'inici"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "El format de la data no és vàlid, ha de ser de la forma AAAA-MM-DD."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Afegeix una tasca"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Afegeix"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Edita la tasca"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Actualitza"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Actualitzat el ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Calendaris"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Setmana següent"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Setmana actual"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Setmana anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month} de ${year}, setmana ${week}"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Mes següent"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mes actual"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mes anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month} de ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Setmana ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Any següent"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Any actual"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Any anterior"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "No heu introduït les dades necessàries."
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "No s'ha pogut convertir a Unicode."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "El fitxer CSV s'ha importat correctament."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "No s'ha pogut importar el fitxer CSV."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "El text CSV s'ha importat correctament."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "No s'ha pogut importar el text CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "No heu especificat cap joc de caràcters."
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Joc de caràcters desconegut"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Les dades CSV són errònies a la línia ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "La conversió cap a unicode ha fallat a la línia ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Les dades CSV són errònies a la línia ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Info de l'usuari: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Els canvis s'han desat correctament."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "Tot el dia"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Lloc: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Recursos reservats: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "periòdic"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "overlaid from %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendari diari de %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendari setmanal de %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Setmana %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendari mensual de %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "El suport per a PDF no està activat. Dirigiu-vos a l'administrador."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendari de %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Nom de l'organització que executa\n"
+"         aquest servidor. Això apareixerà al calendari públic,\n"
+"         al peu de les totes pàgines i al títol de la pàgina."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Calendari inicial"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Mostra el site-wide calendar a la pàgina principal."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Empleneu tots els camps obligatoris."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "L'entrada del formulari no és un fitxer"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "L'enter no és vàlid"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "El text no és vàlid"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Les dades textuals no són vàlides"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Les dades unicode no són vàlides"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Les dades en punt flotant no són vàlides"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "La data no és vàlida"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Passant a segon pla, pid del procés %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Executeu %s -h per accedir a l'ajuda"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s:el vostre sistema operatiu no soporta el mode daemon."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "S'està llegint la configuració des de %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Temps d'inicialització: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"No s'ha pogut inicialitzar la base de dades:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Pot ser que una altra instància %s l'estigui utilitzant?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Avís: No s'ha trobat la biblioteca reportlab.\n"
+"El suport per a PDF s'ha desactivat."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Avís: El directori de les fonts '%s' no existeix.\n"
+"El suport per a PDF s'ha desactivat."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Avís: Les fonts '%s' no s'han trobat.\n"
+"El suport per a PDF s'ha desactivat."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Ús: %s [opcions]\n"
+"Opcions:\n"
+"  -c, --config xxx       utilitza aquest fitxer de configuració\n"
+"  -h, --help             mostra aquest missatge d'ajuda\n"
+"  -d, --daemon           executa en segon pla\n"
+"  -r, --restore-manager  restaura la contrasenya per defecte de "
+"l'administrador\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Aquesta base de dades no sembla de l'schoolbell 1.0, avortant.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Aquesta base de dades no sembla de l'schoolbell 1.0, avortant.\n"
+"\n"
+"\n"
+"Si us plau executeu l'script d'actualització de la bas e de dades.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Títol"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Títol de la nota."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grup"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Duració"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Data"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Índex de recursos"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Afegeix un recurs"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "No heu intoduït les dades necessàries."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Els títols són obligatoris"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Importa grups"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Importa grups"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Mes actual"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Importa grups"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grups"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Importa grups"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Importa grups"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importa recursos"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Recursos disponibles"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Índex d'usuaris"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Afegeix un usuari"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Nom del recurs"
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Descripció del recurs"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Descripció del grup"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Lloc web"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Cancel·la"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Canvia la info (${user})"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Canvia la pertinença"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Canvia les preferències (${user})"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Canvia la informació de contacte (${user})"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Canvia la informació de contacte (${user})"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Informació del contacte"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nom d'usuari"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Contrasenya"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Aquest nom d'usuari ja existeix"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Aplica"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Telèfon 1"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Setmana anterior"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Informació de la tasca"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Àlies"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Comença"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "ds"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Fus horari"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Telèfon 2"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notes"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Següent"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Nombre de tasques"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "edita el nom"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "edita el nom"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "edita el nom"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Preferències"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nom i cognoms"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (en format JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nota nova"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "El text CSV s'ha importat correctament."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "La contrasenya s'ha actualitzat correctament!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "La contrasenya s'ha actualitzat correctament!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Exemple:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Afegeix un usuari"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Índex de grups"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Afegeix un grup"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Grups de ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Membres de ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Edita els membres"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Afegeix/Elimina membres"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Nom del grup"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Descripció del grup"
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Índex de recursos"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Afegeix un recurs"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Setmana anterior"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "El text CSV s'ha importat correctament."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "La contrasenya s'ha actualitzat correctament!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Setmana actual"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "La contrasenya s'ha actualitzat correctament!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Usuari"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Nom del recurs"
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Descripció del recurs"
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Comença"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Títol de la nota."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Setmana següent"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Títol de la nota."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Diari"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Títol de la nota."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Cos"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Cos de la nota."
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Privadesa"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "El nom d'usuari és obligatori"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "El nom i cognoms són obligatoris"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "El nom d'usuari ja existeix: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Contrasenya nova"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Canvia la contrasenya"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Fus horari"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Fus horari que voleu utilitzar"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Format de l'hora"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH::MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Format de la data"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAAA-DD-MM"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dia Mes, Any"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "La setmana comença en:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Començar la setmana en diumenge o dilluns"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Visualitzar calendaris"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nom que s'ha de mostrar"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Índex de recursos"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Afegeix un recurs"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Índex de recursos"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Afegeix un recurs"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Nom del recurs"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Descripció del recurs"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Lloc"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indiqueu si el recurs és un lloc, per exemple una aula."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "No heu intoduït les dades necessàries."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "No heu intoduït les dades necessàries."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "No heu intoduït les dades necessàries."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "El meu calendari"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Més..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendaris"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Benvinguts a SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navegació"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Nom d'usuari:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "edita el nom"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Canvia el nom d'usuari, fotografia o contrasenya"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Info de l'usuari: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Gestiona la pertinença d'aquests usuaris"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "edita els grups"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Aquesta base de dades no sembla de l'schoolbell 1.0, avortant.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Aquesta base de dades no sembla de l'schoolbell 1.0, avortant.\n"
+"\n"
+"\n"
+"Si us plau executeu l'script d'actualització de la bas e de dades.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "inici"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Els canvis s'han desat correctament."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Canvia els detalls"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nota nova"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "elements."
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Afegeix un usuari"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Comença"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Excepte les dates"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "El format de la data no és vàlid, ha de ser de la forma AAAA-MM-DD."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Afegeix un recurs"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} usuaris"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Cos de la nota."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "mateixa setmana"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "edita el nom"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Nota"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Joc de caràcters desconegut"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Foto nova"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Fotografia (aproximadament 48x48 pixels en format JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Esborra la foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Marqueu per eliminar la foto"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifiqueu-la"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Les contrasenyes no coincideixen."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Les contrasenyes no coincideixen"
+
+#~ msgid "View"
+#~ msgstr "Visualitzar"
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "Create new objects"
+#~ msgstr "Crear objectes"
+
+#~ msgid "Add events"
+#~ msgstr "Afegir tasques"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modificar/eliminar tasques"
+
+#~ msgid "Control access"
+#~ msgstr "Gestionar permisos"
+
+#~ msgid "Manage membership"
+#~ msgstr "Gestionar membres"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Usuaris autenticats"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Usuaris no autenticats"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Gestiona permisos"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Canvia les preferències"
+
+#~ msgid "New Person"
+#~ msgstr "Afegeix un usuari"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importa usuaris"
+
+#~ msgid "Add a Group"
+#~ msgstr "Afegeix un grup"
+
+#~ msgid "New Group"
+#~ msgstr "Afegeix un grup"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Edita la informació del grup"
+
+#~ msgid "A Group"
+#~ msgstr "Un grup"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Grup SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Afegeix/Elimina membres"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importa grups"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Afegeix un recurs"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Edita la informació del recurs"
+
+#~ msgid "New Resource"
+#~ msgstr "Afegeix un recurs"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Recurs SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Un recurs"
+
+#~ msgid "Actions"
+#~ msgstr "Accions"
+
+#~ msgid "View Calendar"
+#~ msgstr "Visualitza el calendari"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Calendari (Diari)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Visualització diaria"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Calendari (Setmanal)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Visualització setmanal"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Calendari (Mensual)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Visualització mensual"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Calendari (Anual)"
+
+#~ msgid "Atom View"
+#~ msgstr "Atom View"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Lliure/Ocupat"
+
+#~ msgid "New Event"
+#~ msgstr "Afegeix una tasca"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Obre'l en iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Edita la tasca"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Canvia les preferències (${user})"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Permet visualitzar noms, títols, fotos, llistes d'objectes i altra "
+#~ "informació."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Permet editar noms, títols, descripcions, fotos, etc."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Permet crear usuaris, grups i recursos nous."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Permet visualitzar calendaris d'usuaris, de grups i de recursos."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Permet afegir tasques noves als calendaris."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Permet editar i eliminar tasques dels calendaris."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Gestió dels permisos d'accés (${title})"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Permet accedir a aquest formulari."
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Permet afegir altres usuaris, grups i recursos als grups. Per afegir "
+#~ "objectes nous a un grup, només es necessiten permisos en aquest grup."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Permisos per a grups"
+
+#~ msgid "Access control"
+#~ msgstr "Gestió de permisos"
+
+#~ msgid "Set Access"
+#~ msgstr "Accepta"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Permisos per a usuaris"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Els permisos s'hereden de manera jeràrquica. Per exemple, si donem permís "
+#~ "a un usuari per visualitzar calendaris des d'<i>Usuaris > Gestió de "
+#~ "permisos</i>, aquest usuari podrà visualitzar tots els calendaris de tots "
+#~ "els usuaris. Si voleu que un usuari només accedeixi a un calendari "
+#~ "concret, li heu de donar permís des de l'objecte (usuari, grup o recurs) "
+#~ "concret."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "A continuació hi ha la llista amb els diferents permisos i el significat "
+#~ "corresponent."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Canvia les preferències (${user})"
+
+#~ msgid "General preferences"
+#~ msgstr "Canvia les preferències"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Edita les preferències de l'usuari"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Tasques per a"
+
+# Default: ""
+#  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#~ msgid "atom_description"
+#~ msgstr "atom_description"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_enabled"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_more_info"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Validar el meu Atom feed"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Valid Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Lloc"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Seleccioneu els calendaris adicionals per mostrar"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Manteniu premuda Ctrl o Shift per seleccionar múltiples calendaris,"
+
+#~ msgid "Public Calendar"
+#~ msgstr "Visualitzar calendaris"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "Visualització diaria"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Seleccioneu calendaris per visualitzar."
+
+#~ msgid "People"
+#~ msgstr "Persones"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "No podeu accedir al calendari de cap usuari."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "No podeu accedir al calendari de cap grup."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "No podeu accedir al calendari de cap recurs."
+
+#~ msgid "Showing"
+#~ msgstr "Es mostren"
+
+#~ msgid "of"
+#~ msgstr "de"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Esteu segurs de voler esborrar els elements seleccionats?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "No heu seleccionat cap element."
+
+#~ msgid "delete-button"
+#~ msgstr "Esborra"
+
+#~ msgid "Exception"
+#~ msgstr "Excepte les dates"
+
+#~ msgid "Traceback"
+#~ msgstr "retraça"
+
+#~ msgid "Server Error"
+#~ msgstr "S'ha produït un error."
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "S'ha produït un error intern. Potser heu trobat un error a l'SchoolBell. "
+#~ "Envieu un informe al <a href=\"http://issues.schooltool.org\">issue "
+#~ "tracker</a>."
+
+#~ msgid "All day event"
+#~ msgstr "${day_of_week}, ${date}"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Això és una tasca periòdica"
+
+#~ msgid "Ends"
+#~ msgstr "Acaba"
+
+#~ msgid "edit event"
+#~ msgstr "Edita la tasca"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Canvia els detalls de la tasca"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Recursos planificats"
+
+#~ msgid "edit resources"
+#~ msgstr "edita els recursos"
+
+#~ msgid "delete event"
+#~ msgstr "Afegeix una tasca"
+
+#~ msgid "Event details"
+#~ msgstr "Detalls de la tasca"
+
+#~ msgid "Book Resources"
+#~ msgstr "Reserva recursos"
+
+#~ msgid "Update form"
+#~ msgstr "Actualitza el formulari"
+
+#~ msgid "day"
+#~ msgstr "dia"
+
+#~ msgid "week"
+#~ msgstr "setmana"
+
+#~ msgid "month"
+#~ msgstr "mes"
+
+#~ msgid "year"
+#~ msgstr "any"
+
+#~ msgid "Weekly"
+#~ msgstr "Setmanal"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr ""
+#~ "Aquesta secció només apareix quan es selecciona una periodicitat setmanal."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr ""
+#~ "Aquesta secció només apareix quan es selecciona una periodicitat mensual."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Dia ${monthday} de cada mes"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} de cada mes"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "Dia ${monthday} de cada mes"
+
+#~ msgid "Repeat"
+#~ msgstr "Repeteix"
+
+#~ msgid "times"
+#~ msgstr "cops"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Repeteix sempre"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Reserva recursos"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Reserva de recursos per a ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Títol"
+
+#~ msgid "Starts:"
+#~ msgstr "Comença:"
+
+#~ msgid "Ends:"
+#~ msgstr "Acaba:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Això és una tasca periòdica"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Reserva de recursos"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Tasques en conflicte"
+
+#~ msgid "Book"
+#~ msgstr "Reserva"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "Les dades en format CSV <strong>han</strong> de contenir el títol del "
+#~ "grup i, <strong>opcionalment</strong>, una descripció. Qualsevol altra "
+#~ "informació s'ignorarà."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Segons l'exemple anterior es crearien tres grups: 'LUG', 'Chess Club' i "
+#~ "'Sports Club'. El primer i el tercer tindrien les descripcions 'Linux "
+#~ "Users Group' i 'After-school sports club', respectivament. El grup 'Chess "
+#~ "Club' no tindria descripció, i la informació extra del tercer grup, 'text "
+#~ "after a second comma', s'ignoraria."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Importa grups"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Importació de fitxers"
+
+#~ msgid "CSV File"
+#~ msgstr "Fitxer en format CSV"
+
+#~ msgid "Charset:"
+#~ msgstr "Joc de caràcters:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Occidental (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Occidental (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Occidental (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Altre (especifiqueu-lo)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Altre joc de caràcters: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Introducció de dades"
+
+#~ msgid "CSV Data"
+#~ msgstr "Les dades s'han d'introduir en format CSV."
+
+#~ msgid "Members"
+#~ msgstr "Membres"
+
+#~ msgid "edit members"
+#~ msgstr "Edita els membres"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Canvia els usuaris que són membres d'aquest grup."
+
+#~ msgid "Remove"
+#~ msgstr "Elimina"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "No teniu accés a aquesta pàgina. Feu click al botó enrera del vostre "
+#~ "navegador o accediu com a usuari amb privilegis suficients."
+
+#~ msgid "Please log in"
+#~ msgstr "Registreu-vos"
+
+#~ msgid "Login"
+#~ msgstr "Entrada"
+
+#~ msgid "User Information"
+#~ msgstr "Informació de l'usuari"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "La vostra sessió ha expirat."
+
+#~ msgid "There are none."
+#~ msgstr "No s'ha trobat cap coincidència."
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "Envia"
+
+#~ msgid "There are none to add."
+#~ msgstr "No hi ha res per a afegir."
+
+#~ msgid "Find Now"
+#~ msgstr "Cerca"
+
+#~ msgid "Clear"
+#~ msgstr "Neteja"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "Cancel·la"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Qui pot veure la nota?"
+
+#~ msgid "Private"
+#~ msgstr "Privada"
+
+#~ msgid "Public"
+#~ msgstr "Pública"
+
+#~ msgid "Add note"
+#~ msgstr "Afegeix una nota"
+
+#~ msgid "add-button"
+#~ msgstr "Afegeix"
+
+#~ msgid "Delete"
+#~ msgstr "Esborra"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Registreu-vos"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Potser no heu escrit correctament la URL"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "La pàgina que sol·liciteu no existeix"
+
+#~ msgid "Not Found"
+#~ msgstr "No s'han trobat els usuaris: ${args}."
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "La pàgina que sol·liciteu no està disponible"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "Les dades en format CSV <strong>han</strong> de contenir el nom d'usuari "
+#~ "(el que es mostra) i el nom complet (nom i cognoms). "
+#~ "<strong>Opcionalment</strong> podeu inclure la contrasenya."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "En l'exemple anterior es crearien tres usuaris, 'jjones', 'jbjones' i "
+#~ "'howard'. Dels tres, únicament 'jbjones' tindria contrasenya assignada i "
+#~ "per tant podria accedir al sistema. Les contrasenyes les heu d'enviar en "
+#~ "format de text pla."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Importa usuaris"
+
+#~ msgid "Details"
+#~ msgstr "Detalls"
+
+#~ msgid "edit details"
+#~ msgstr "Edita els detalls"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modifica els detalls de l'usuari"
+
+#~ msgid "Add person"
+#~ msgstr "Afegeix un usuari"
+
+#~ msgid "Add to groups"
+#~ msgstr "Assigna'l als grups"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "No podeu esborrar el vostre propi compte."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Edita la informació de contacte"
+
+#~ msgid "Edit person"
+#~ msgstr "Edita l'usuari"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Preferències del calendari"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Edita les preferències de l'usuari"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Esteu provant d'esborrar una tasca periòdica."
+
+#~ msgid "Current"
+#~ msgstr "Actual"
+
+#~ msgid "Future"
+#~ msgstr "Futur"
+
+#~ msgid "All"
+#~ msgstr "Tots"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "S'està esborrant la tasca periòdica ${event_title}"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "Les dades en format CSV <strong>han</strong> de contenir el títol del "
+#~ "recurs i, <strong>opcionalment</strong>, una descripció. Qualsevol altra "
+#~ "informació s'ignorarà."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Segons l'exemple anterior es crearien tres recursos: 'PRJ302', 'Main "
+#~ "Auditorium' i 'LC-805'. E primer i el tercer tindrien les descripcions "
+#~ "'Overhead Projector #302' i 'Laptop Computer #805', respectivament. El "
+#~ "recurs 'Main Auditorium' no tindria descripció, i la informació extra del "
+#~ "tercer recurs, 'text after a second comma', s'ignoraria."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Importa recursos"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "S'han trobat ${num_errors} errors d'entrada"
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identificador (opcional)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Versió per imprimir"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Visualització diaria"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Visualització setmanal"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Visualització mensual"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Visualització anual"
+
+#~ msgid "Yearly"
+#~ msgstr "Anual"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Calendari de ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Vés a..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Tasques de demà"
+
+#~ msgid "Log in"
+#~ msgstr "Entra"
+
+#~ msgid "User:"
+#~ msgstr "Usuari:"
+
+#~ msgid "Log Out"
+#~ msgstr "Surt"
+
+#~ msgid "Edit Info"
+#~ msgstr "Edita info"
+
+#~ msgid "Add Event"
+#~ msgstr "Afegeix una tasca"
+
+#~ msgid "Modify Event"
+#~ msgstr "Modifica la tasca"
+
+#~ msgid "Set up access"
+#~ msgstr "Estableix l'accés"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Usuaris no autenticats"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Usuari no autenticat"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Usuaris autenticats"
+
+#~ msgid "All Users"
+#~ msgstr "Tots els usuaris"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: avís: s'ignora l'opció de configuració '%s'"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "Assignatura de ${course} -- ${DYNAMIC_CONTENT}"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ca/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5205 @@
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005    Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolTool Version 0.11.1\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-07-10 16:45+0000\n"
+"Last-Translator: Jordi Irazuzta <irazuzta at gmail.com>\n"
+"Language-Team: Schooltool Development Team <schooltool-dev at schooltool.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: setup.py\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Àlies"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Àlies per a aquest usuari"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Adreça electrònica 1"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Adreça electrònica 2"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telèfon 1"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Número de telèfon principal"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Telèfon 2"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Número de telèfon secundari"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Lloc web"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Lloc web o weblog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Adreça postal"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Usuaris"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 usuari"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} usuaris"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "El nom d'usuari o la contrasenya són incorrectes"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "març"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "gener"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "febrer"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "juny"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "maig"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "agost"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "setembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "juliol"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Dia següent"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Avui"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Dia anterior"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "octubre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "desembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "novembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "dilluns"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "dimarts"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "dimecres"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "dijous"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "diumenge"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "dissabte"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "divendres"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "dl"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "dm"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "dc"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "dj"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "dv"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "ds"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "dg"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Títol"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Tot el dia"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Start time in 24h format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Durada"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipus de durada"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuts"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Hores"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dies"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Lloc"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Descripció"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Periòdic"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Es repeteix cada"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dia"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Setmana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Mes"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Any"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repeteix cada"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Rang"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Compte"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Fins a"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "sempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Nombre de tasques"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Repeteix fins"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Setmanal"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Dia de la setmana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Mensual"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Excepte les dates"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "mateixa setmana"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1r"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4t"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3r"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2n"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5è"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "últim dia de la setmana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Últim ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "S'ha produït un error"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "L'hora no és vàlida."
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "La data d'acabament és anterior a la de començament"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "El format de la data no és vàlid, ha de ser de la forma AAAA-MM-DD."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Afegeix una tasca"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Afegeix"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Edita la tasca"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Actualitza"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Actualitzat el ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Calendari"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Setmana següent"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Setmana actual"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Setmana anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month} de ${year}, setmana ${week}"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Mes següent"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mes actual"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mes anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month} de ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Setmana ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Any següent"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Any actual"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Any anterior"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Accions"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Calendari"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Calendari"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Calendari"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Calendari"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Visualitza"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Calendari"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Afegeix una tasca"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Edita la tasca"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Entra"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navegació"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Accions"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Calendari"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "No heu introduït les dades necessàries."
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "No s'ha pogut convertir a Unicode."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "El fitxer CSV s'ha importat correctament."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "No s'ha pogut importar el fitxer CSV."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "El text CSV s'ha importat correctament."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "No s'ha pogut importar el text CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "No heu especificat cap joc de caràcters."
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Joc de caràcters desconegut"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Les dades CSV són errònies a la línia ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "La conversió cap a unicode ha fallat a la línia ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "La 2a columna no està buida"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Descripció incompleta de la assignatura a la línia ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"La primera columna del fitxer CSV ha de contenir la id del trimestre i la id "
+"de l'horari."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "El trimestre ${term} no existeix."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "L'horari ${schema} no existeix"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Hi ha un error amb el format CSV de l'horari a línia ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "No s'han definit els ids dels dies als horaris seleccionats: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "No s'han definit hores de classe els dies seleccionats: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "No s'han trobat els usuaris: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "No s'han trobat els cursos: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "No s'han trobat les assignatures: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Els registres no són vàlids:  ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Els canvis s'han desat correctament."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "Tot el dia"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Lloc: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Recursos reservats: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "periòdic"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "overlaid from %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendari diari de %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendari setmanal de %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Setmana %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendari mensual de %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "El suport per a PDF no està activat. Dirigiu-vos a l'administrador."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Canvia les preferències"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Preferències del calendari"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Preferències del calendari"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Edita les preferències de l'usuari"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Edita les preferències de l'usuari"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Descripció"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Vés a..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Tasques de demà"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Versió per imprimir"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Visualització diària"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Diari"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Visualització setmanal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Setmanal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Visualització mensual"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Visualització anual"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Anual"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Calendari >> ${title} (${calendar_title})"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Cal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Calendari personal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Calendari d'horaris"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "El meu calendari"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendaris"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Més..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Calendari"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Visualitzar calendari"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Calendari setmanal de %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "Esborra"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "Cancel·la"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Elimina"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "No s'ha trobat cap coincidència."
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Cerca"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Neteja"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "No hi ha res per a afegir."
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Afegeix una tasca"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Detalls"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "ds"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Edita la tasca"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Canvia els professors d'aquesta assignatura"
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Recursos reservats: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "edita els grups"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Modificar/eliminar tasques"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Edita la informació de l'assignatura"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "Edita els detalls"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Actualitza"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Avui"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Setmana"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Mes"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Any"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Repeteix fins"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Visualitzar calendari"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Repeteix cada"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Recursos reservats: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Info de l'usuari: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Títol"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "ds"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Índex dels recursos"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "canvia el lloc"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Cursos"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Benvinguts a Schooltool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Edita la informació de l'assignatura"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Entra"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "periòdic"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Tot el dia"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Occidental (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Occidental (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Altre (especifiqueu-lo)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Altre joc de caràcters: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Introducció de dades"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "Les dades s'han d'introduir en format CSV."
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "Envia"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Importa assignatures"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Podeu crear el fitxer des d'un full de càlcul i exportar-lo en format CSV "
+"(Comma-Separated Values). L'estructura de les taules es descriu a "
+"continuació."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"La primera columna ha de contenir el nom del <strong>trimestre</strong> i "
+"<strong> l'esquema horari</strong> que s'utilitzarà. La segona columna ha "
+"d'estar buida. Després, podeu incloure les descripcions de les assignatures, "
+"separades per una línia en blanc."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+#, fuzzy
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+"La primera columna de cada descripció d'assignatura ha de contenir la "
+"identificació del <strong>curs</strong> i del <strong>professor</strong>. "
+"Després, en columnes diferents, la identificació del <strong>dia</strong>, "
+"de l'<strong>hora</strong> i, opcionalment, del <strong>lloc</strong> en què "
+"es fa la classe. La llista de descripció de les hores de classe s'acaba amb "
+"tres asteriscs ('***') a la primera columna. Seguidament, podeu introduir la "
+"identificació dels <strong>alumnes</strong>."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Importa assignatures"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Exemple:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\",\"room137\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\",\"room138\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\",\"room139\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"Segons l'exemple anterior es crearien dues assignatures: 'philosophy' i "
+"'literature'. La primera tindria d'alumnes 'johnny' i 'billy'. Pel que fa a "
+"l'horari, es farien tres hores de classe, dues el dilluns i una el dimarts. "
+"Una de les hores del dilluns i la del dimarts es farien a les aules "
+"'room137' i 'room138', respectivament. L'altra hora del dilluns no té cap "
+"lloc assignat.\n"
+"L'assignatura 'literature' funciona de manera similar."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Observeu que únicament utilitzem les identificacions dels objectes, i no els "
+"noms. Si una columna acaba amb cel·les buides (per exemple, <em>\"philosophy"
+"\",\"lorch\",\"\",\"\"</em>), aquestes s'ignoraran. Heu de separar les "
+"descripcions de les assignatures amb més d'una línia. De la llista "
+"d'alumnes, únicament se'n processa la primera columna, la resta s'ignora. "
+"Podeu importar les mateixes dades diversos cops sense cap problema."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Importació de fitxers"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "Fitxer en format CVS:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Joc de caràcters:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Occidental (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendari de %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Recursos reservats: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Nom de l'organització que executa\n"
+"         aquest servidor. Això apareixerà al calendari públic,\n"
+"         al peu de les totes pàgines i al títol de la pàgina."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Calendari inicial"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Mostra el site-wide calendar a la pàgina principal."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Empleneu tots els camps obligatoris."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "L'entrada del formulari no és un fitxer"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "L'enter no és vàlid"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "El text no és vàlid"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Les dades textuals no són vàlides"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Les dades unicode no són vàlides"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Les dades en punt flotant no són vàlides"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "La data no és vàlida"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Passant a segon pla, el pid del procés és %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Executeu %s -h per accedir a l'ajuda"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s:el vostre sistema operatiu no soporta el mode daemon."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "S'està llegint la configuració des de %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Temps d'inicialització: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"No s'ha pogut inicialitzar la base de dades:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Pot ser que una altra instància %s l'estigui utilitzant?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Avís: No s'ha trobat la biblioteca reportlab.\n"
+"El suport per a PDF s'ha desactivat."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Avís: El directori de les fonts '%s' no existeix.\n"
+"El suport per a PDF s'ha desactivat."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Avís: Les fonts '%s' no s'han trobat.\n"
+"El suport per a PDF s'ha desactivat."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Això no és una base de dades de l'Schooltool 0.10, avortant.\n"
+"\n"
+"Executeu l'script per a actualitzar la base de dades.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Benvingut al servidor Schooltool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Preferències del calendari"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Edita les preferències de l'usuari"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Usuaris"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Planificació horaria (${section})"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Llegenda:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuts"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "periòdic"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "diumenge"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "No hi ha res per a afegir."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "La data que heu introduït no pertany a aquest trimestre"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "No hi ha res per a afegir."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Planifica l'horari (${person})"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Any anterior"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Següent"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Lloc"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Afegeix una assignatura"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Visualitza"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Edita la tasca"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Afegeix una assignatura"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Edita la informació de l'assignatura"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importa cursos"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Afegeix un curs"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Afegeix un curs"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Índex de cursos"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Afegeix un curs"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "No heu intoduït les dades necessàries."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Els títols són obligatoris"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "El curs no existeix."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Es necessita una ID del curs."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Afegeix una assignatura a ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Professors"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Professors actuals"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Professors disponibles"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Alumnes"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grups"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Índex d'assignatures"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Afegeix una assignatura"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"Les dades en format CSV <strong>han</strong> de contenir el títol del curs "
+"i, <strong>opcionalment</strong>, una descripció. Qualsevol altra informació "
+"s'ignorarà."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 20th century, <em>text after a second comma</em>\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Segons l'exemple anterior es crearien tres cursos: 'Ancient History', 'US "
+"History' i 'World History'. El primer i el tercer tindrien les descripcions "
+"'Pre-history through 1000 A.D.' i '20th century', respectivament. El curs "
+"'US History' no tindria descripció, i la informació extra del tercer curs, "
+"'text after a second comma', s'ignoraria."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Importa cursos"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Assignatures"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "alumnes"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Assignatura de ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "edita el nom"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Canvia el nom o el lloc d'aquesta assignatura"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Canvia els professors d'aquesta assignatura"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Recursos reservats: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Canvia els professors d'aquesta assignatura"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "Edita els professors"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "Edita individualment"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Canvia el alumnes de l'assignatura individualment"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Canvia els alumnes de l'assignatura per grups"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "edita els grups"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Identificador (opcional)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Assignatura"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Mida actual"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "S'han trobat ${num_errors} errors d'entrada"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Nom del curs"
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Descripció del curs"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Etiqueta"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Codi"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "Id de l'assignatura."
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Descripció de l'assignatura."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Usuaris"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "març"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Lectiu"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Suspèn les classes"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Suspèn les classes"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Suspèn les classes"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Edita"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Cancel·la"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Nom d'usuari"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Contrasenya"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Aquest nom d'usuari ja existeix!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Aplica"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Diari"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "No s'ha trobat cap coincidència."
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "No s'ha trobat cap coincidència."
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nom i cognoms"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (en format JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Cursos"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "Esborra"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "Afegeix"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "Cancel·la"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Afegeix una assignatura"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Edita la tasca"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Alumnes"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "Esborra"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "${number}a hora"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importa grups"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Afegeix un grup"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Edita la informació de l'assignatura"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Gestionar membres"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grups"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grups"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"Les dades en format CSV <strong>han</strong> de contenir el títol del grup "
+"i, <strong>opcionalment</strong>, una descripció. Qualsevol altra informació "
+"s'ignorarà."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Segons l'exemple anterior es crearien tres grups: 'LUG', 'Chess Club' i "
+"'Sports Club'. El primer i el tercer tindrien les descripcions 'Linux Users "
+"Group' i 'After-school sports club', respectivament. El grup 'Chess Club' no "
+"tindria descripció, i la informació extra del tercer grup, 'text after a "
+"second comma', s'ignoraria."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Importa grups"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "novembre"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "edita el nom"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Canvia el nom o el lloc d'aquesta assignatura"
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Índex dels grups"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Afegeix un grup"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Nom del grup"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Descripció del grup"
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Calendari"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Afegeix una tasca"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Edita la tasca"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "cap"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "Afegeix"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Setmana actual"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Alumnes"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "Cancel·la"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "Afegeix"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "Cancel·la"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Afegeix un trimestre"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Títol de la nota."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Cos"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Cos de la nota."
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Privadesa"
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Privadesa"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Afegeix"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Data"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "El nom d'usuari és obligatori"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "El nom i cognoms són obligatoris"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "El nom d'usuari ja existeix: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importa usuaris"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"Les dades en format CSV <strong>han</strong> de contenir el nom d'usuari (el "
+"que es mostra) i el nom complet (nom i cognoms). <strong>Opcionalment</"
+"strong>, hi podeu incloure la contrasenya."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Segons l'exemple anterior es crearien tres usuaris: 'jjones', 'jbjones' i "
+"'howard'. Dels tres, únicament 'jbjones' tindria contrasenya assignada i per "
+"tant podria accedir al sistema. Les contrasenyes les heu d'enviar en format "
+"de text pla."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Importa usuaris"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Canvia les preferències (${user})"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Edita les preferències de l'usuari"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Fus horari"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Fus horari que voleu utilitzar"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Format de l'hora"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH::MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Format de la data"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAAA-DD-MM"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dia Mes, Any"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "La setmana comença en:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Començar la setmana en diumenge o dilluns"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Mostra les hores de classe"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Mostra les hores de classe en una vista diària"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nom que s'ha de mostrar"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Relacions"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Afegeix una tasca"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Edita la tasca"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Afegeix un trimestre"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Es mostren"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "de"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "elements."
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importa recursos"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Afegeix un recurs"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Edita la informació de l'assignatura"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Recursos"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Recursos"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"Les dades en format CSV <strong>han</strong> de contenir el títol del recurs "
+"i, <strong>opcionalment</strong>, una descripció. Qualsevol altra informació "
+"s'ignorarà."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Segons l'exemple anterior es crearien tres recursos: 'PRJ302', 'Main "
+"Auditorium' i 'LC-805'. E primer i el tercer tindrien les descripcions "
+"'Overhead Projector #302' i 'Laptop Computer #805', respectivament. El "
+"recurs 'Main Auditorium' no tindria descripció, i la informació extra del "
+"tercer recurs, 'text after a second comma', s'ignoraria."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "Importa recursos"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Índex dels recursos"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Afegeix un recurs"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Nom del recurs"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Descripció del recurs"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Lloc"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indiqueu si el recurs és un lloc, per exemple una aula."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Subscripcions"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Calendari ACL"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Aquesta base de dades no sembla de l'schoolbell 1.0, avortant.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Aquesta base de dades no sembla de l'schoolbell 1.0, avortant.\n"
+"\n"
+"\n"
+"Si us plau executeu l'script d'actualització de la bas e de dades.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "inici"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Excepte les dates"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Entra"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Usuari:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Surt"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Afegeix un trimestre"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Suspèn classes per emergència"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "La data de reemplaç que heu introduït no és vàlida"
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+"Les classes s'han suspès a causa d'una emergència. El dia de reemplaçament "
+"és $replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Data de reemplaçament de les classes del $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+"El format de la data que heu introduït no és vàlid. Utilitzeu el format AAAA-"
+"MM-DD."
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "La data que heu introduït no pertany a aquest trimestre"
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "La data que heu introduït correspón a un dia festiu."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"Heu suspés les classes del ${DYNAMIC_CONTENT}. Sel·leccioneu un dia de "
+"reemplaçament. La selecció consisteix en dies no lectius d'aquest trimestre "
+"posteriors a la suspensió i alguns dies després d'aquest trimestre."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Introduïu una data de reemplaçament."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Reemplaçament"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Escolliu una data de reemplaçament."
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Des d'aquí podeu suspendre les classes d'un dia i triar-ne un de "
+"reemplaçament."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr "Introduïu el dia que voleu suspendre les classes."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Suspèn les classes"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Canvia el trimestre: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Afegeix un trimestre"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Trimestres"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Afegeix un trimestre"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Data d'inici"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Data d'acabament"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} de ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Setmana ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Afegeix"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Desa els canvis"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Definiu les dates d'inici i d'acabament del trimestre. El rang de les dates "
+"és inclusiu (per exemple, del 2004-09-01 al 2004-12-31). Les dates han de "
+"seguir el format AAAA-MM-DD."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+"El rang de les dates és inclusiu (per exemple del 2004-09-01 al 2004-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Actualitza"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr "Especifiqueu els dies lectius i els dies festius."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr "Especifiqueu els dies lectius i els dies festius."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Llegenda:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Lectiu"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Festiu"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Cliqueu els dies festius de la setmana:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "Horari de ${object}"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "El format de la data no és vàlid. Utilitzeu el format AAAA-MM-DD."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "La data no pertany a cap trimestre."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Els valors marcats amb vermell no són vàlids."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Canvia l'horari d'un dia"
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Afegeix un horari"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Visualitza els horaris"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Planifica l'horari"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+"Utilizeu el format HH:MM per a l'hora de començar i d'acabar les classes."
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Especifiqueu-ne almenys una."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Horaris escolars"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Afegeix un esquema horari"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Seleccioneu un valor"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Dia ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "1a hora"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "${number}a hora"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Esquema horari ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Els dies de l'horari es corresponen amb els de la setmana (per exemple, el "
+"primer dia de l'horari és dilluns; el segon, dimarts, i així successivament)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Els dies de l'horari són sequencials i no es tenen en compte els festius."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"A continuació, definiu la durada de les classes dels dies de la setmana que "
+"faci falta. Utilitzeu un dels formats següents: <tt>HH:MM</tt> (indiqueu-ne "
+"la durada a la casella corresponent) o <tt>HH:MM-HH:MM</tt> (quan voleu "
+"especificar l'hora exacta d'inici i de final). No és necessari definir totes "
+"les hores de classe per a tots els dies de la setmana.\n"
+"Si la llista de classes no es correspon amb els canvis realitzats a la taula "
+"de dalt, cliqueu el botó d'actualitzar."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Escolliu un nom per a l'horari que voleu crear."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr "Algunes especificacions horàries eren incorrectes i s'han ignorat."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Finalment, assegureu-vos que la informació que heu introduït és correcta, ja "
+"que l'única manera de corregir-la és esborrar-la i refer-la."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Crea un esquema horari"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Primer, definiu els dies i les hores de l'horari."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Copia les hores de classe dels dies anteriors"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Suprimeix aquest dia"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Afegeix un dia"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Afegeix una hora"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Després, seleccioneu la manera d'ajustar les hores de classe al calendari."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"Nota: Si una assignatura apareix a més d'una casella i la voleu esborrar heu "
+"de posar <em>cap</em> a totes les caselles on apareix."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Horari"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Trimestre"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Esquema"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Planifica l'horari (${person})"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Seleccioneu"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Aquest formulari permet definir l'horari d'un usuari afegin-lo i esborrant-"
+"lo, de la manera adequada, de les seves assignatures i els respectiu horaris."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "com a part de"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "cap"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "S'ha produït un conflicte en la planificació."
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Desa"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr "No hi ha trimestres o horaris definits."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Escolliu una plantilla de planificació"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "Durant el(s) trimestre(s):"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Planificació horaria (${section})"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Utilitza l'horari:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Aquest formulari permet crear un horari setmanal de manera senzilla. "
+"Únicament heu d'omplir tantes caselles com hores de classe tingueu."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Si necessiteu un mètode d'introducció de dades més flexible, podeu utilitzar "
+"l'<a href=\"add.html\"> assistent de creació d'horaris</a> o el <a href="
+"\"complexadd.html\">formulari d'horaris complexos</a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+"&nbsp;&nbsp;&nbsp;&nbsp;Títol de l'hora (opcional)&nbsp;&nbsp;&nbsp;&nbsp;"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Hora de començament"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "&nbsp;&nbsp;&nbsp;&nbsp;Hora d'acabament&nbsp;&nbsp;&nbsp;&nbsp;"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Afegeix"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"Des d'aquí podeu ajustar les hores d'inici i acabament de "
+"${DYNAMIC_CONTENT}. Si voleu eliminar una hora, esborreu les hores d'inici i "
+"acabament."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Hora de classe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Comença&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Acaba&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Començarà"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Acabarà"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Modifica"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Des d'aquí podeu canviar l'horari d'un dia o cancel·lar-ne alguna classe."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr "Introduïu la data en què s'han de canviar les hores."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Canvia l'horari"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Continua"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Crea un esquema horari"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Horaris de ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Afegeix un esquema horari"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr "L'horari és setmanal o segueix una altra rotació?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Setmanal"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Altra rotació"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Introduïu els nom dels dies del cicle, un a cada línia."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Introduïu almenys un dia."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Assegureu-vos que els noms de les hores són únics."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr "Les classes comenecen i acaben a la mateixa hora cada dia?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "A la mateixa hora cada dia"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "En hores diferents"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Introduïu les hores d'inici i d'acabament de cada franja horària. Cada "
+"franja (HH:MM-HH:MM) s'ha d'escriure en una línia diferent."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "La franja horària $slot no és vàlida."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Introduïu almenys una franja horària."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Introduïu l'hora d'inici i d'acabament de cada franja horària de cada dia. "
+"Cada franja (HH:MM - HH:MM) ha d'anar a una línia."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Introduïu almenys una franja horària per a $day."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr "Les classes tenen nom o queden designades per l'hora en què es fan?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Tenen nom"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Designades per l'hora"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Introduïu en diferents línies els noms de les classes."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Especifiqueu-ne almenys $number."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Assegureu-vos que els noms de les hores són únics."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "La seqüència d'hores de classe és igual o diferent cada dia?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Igual"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Diferent"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Ordeneu les classes:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Introduïu totes les hores de classe"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Heu seleccionat les segënts hores més d'un cop: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Ordeneu les classes de cada dia:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period on day $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Id de dia desconegut: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Id d'hora desconegut: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Nom d'usuari:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Canvia el nom d'usuari, fotografia o contrasenya"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Gestiona la pertinença d'aquests usuaris"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importa assignatures"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "La línia ${line_no} té un format incorrecte (hauria de contenir un id del "
+#~ "dia, una id de l'hora de classe i opcionalment un id del lloc)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "No s'han trobat els llocs: ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modifica els detalls de l'usuari"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Assignatures assignades"
+
+#~ msgid "via group"
+#~ msgstr "via grup"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Preferències"
+
+#~ msgid "Person index"
+#~ msgstr "Índex d'usuaris"
+
+#~ msgid "Add a new person"
+#~ msgstr "Afegeix un usuari"
+
+#~ msgid "New photo"
+#~ msgstr "Foto nova"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Fotografia (aproximadament 48x48 pixels en format JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Esborra la foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Marqueu per eliminar la foto"
+
+#~ msgid "New password"
+#~ msgstr "Contrasenya nova"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifiqueu la contrasenya"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Les contrasenyes no coincideixen."
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "La contrasenya s'ha actualitzat correctament!"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Les contrasenyes no coincideixen!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Crear objectes"
+
+#~ msgid "Add events"
+#~ msgstr "Afegir tasques"
+
+#~ msgid "Control access"
+#~ msgstr "gestionar l'accés"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Usuaris autenticats"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Usuaris no autenticats"
+
+#~ msgid "An error occured."
+#~ msgstr "S'ha produït un error."
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Usuaris no autenticats"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Usuari no autenticat"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Usuaris autenticats"
+
+#~ msgid "All Users"
+#~ msgstr "Tots els usuaris"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: avís: s'ignora l'opció de configuració '%s'"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ús: %s [opcions]\n"
+#~ "Opcions:\n"
+#~ "  -c, --config xxx       utilitza aquest fitxer de configuració\n"
+#~ "  -h, --help             mostra aquest missatge d'ajuda\n"
+#~ "  -d, --daemon           executa en segon pla\n"
+#~ "  -r, --restore-manager  restaura la contrasenya per defecte de "
+#~ "l'administrador\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Benvingut al servidor Schooltool"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Això no és una base de dades de l'Schooltool 0.10, avortant.\n"

Added: schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3151 @@
+# translation of cs.po to
+# Czech translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cs\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-01-17 20:09+0000\n"
+"Last-Translator: Martin Sin <martin.sin at zshk.cz>\n"
+"Language-Team: <en at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"X-Generator: KBabel 1.10.2\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Přezdívka"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Krátká přezdívka pro tuto osobu."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Hlavní email"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Vedlejší email"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Hlavní telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Doporučené telefonní číslo"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Vedlejší telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Vedlejší telefonní číslo."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Webová stránka"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Webová stránka nebo weblog."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Poštovní adresa"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Lidé"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 osoba"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} osob"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Uživatelské jméno nebo heslo je nesprávné"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Tento rok"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Dostupné skupiny"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Březen"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Leden"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Únor"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Červen"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Květen"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Duben"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Srpen"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Září"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Červenec"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Další den"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Dnes"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Předchozí den"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Říjen"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Prosinec"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Listopad"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Pondělí"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Úterý"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Středa"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Čtvrtek"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Neděle"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Sobota"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Pátek"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Po"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Út"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "St"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Čt"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pá"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "So"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Ne"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Název"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Každý den"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Čas"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Používat 24 hodinový formát času"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Trvání"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Typ trvání"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuty"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Hodiny"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dny"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Umístění"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Popis"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Periodický"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Opakovat každý"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Den"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Týden"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Měsíc"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Rok"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Opakovat každý"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Rozsah"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Počet"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Dokud"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "stále"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Počet událostí"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Opakovat dokud"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Pracovní dny"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Pracovní den"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Měsíčně"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Kromě období"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "tentýž týden"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "poslední pracovní den"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Poslední ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Došlo k chybě."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Neplatný čas"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Koncové datum je dřívější než to počáteční"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Neplatné datum. Určete ho prosím ve tvaru YYYY-MM-DD, jedno na řádek."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Přidat událost"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Přidat"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Upravit událost"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Aktualizovat"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Aktualizováno dne ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalendáře"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Příští týden"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Tento týden"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Minulý týden"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Příští měsíc"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Tento měsíc"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Minulý měsíc"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Týden ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Příští rok"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Tento rok"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Minulý rok"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nebyla poskytnuta žádná data"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Nemohu převést data do Unicode (nesprávná znaková sada?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Soubor CSV byl úspěšně importován."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Chyba při importu CSV souboru"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV text byl úspěšně importován."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Chyba při importu textu CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Není zadána znaková sada"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Neznámá znaková sada"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Chyba v datech CSV, řádek ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konverze do unicode selhala na řádku ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Chyba v datech CSV, řádek ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Informace o uživateli: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Změny uloženy."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "celý den"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Umístění: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Zajištěné zdroje: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "opakující se"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "pokryté z %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Denní kalendář pro %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Týdenní kalendář pro %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Týden %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Měsíční kalendář pro %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "Podpora PDF je vypnuta. Může být povolena vašim administrátorem."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalendář pro %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Jméno školy nebo organizace používající\n"
+"tento server. Bude zobrazeno ve veřejném kalendáři,\n"
+"na konci každé stránky a v titulku stránky."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Kalendář hlavní stránky"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Zobrazit kalendář celého webu na hlavní stránce\n"
+"webu."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Chybí požadovaný vstup."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Formulářový vstup není souborem"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Neplatná celočíselná data"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Neplatná textová data"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Neplatná textová data"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Neplatná data unicode"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Neplatná data s pohyblivou desetinnou čárkou"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Neplatná data typu datum/čas"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Běžím na pozadí, pid daemona %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Pro nápovědu spusť  %s -h."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: daemonový mód není podporován vašim operačním systémem."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Čtu konfiguraci z %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "Správce %s"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Čas startu: %.3f s skutečně, z toho %.3f s CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Nemohu inicializovat databázi:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Možná ji používá instance %s?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Upozornění: nemohu nalézt knihovnu reportlab.\n"
+"Podpora PDF je vypnuta."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Upozornění: adresář s fonty: '%s' neexistuje.\n"
+"Podpora PDF je vypnuta."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Upozornění: písmo '%s' neexistuje.\n"
+"Podpora PDF je vypnuta."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Použití: %s [volby]\n"
+"Volby:\n"
+"  -c, --config xxx       použij tento konfigurační soubor místo výchozího\n"
+"  -h, --help             ukaž tuto nápovědu\n"
+"  -d, --daemon           spusť se na pozadí\n"
+"  -r, --restore-manager  obnov výchozí heslo uživatele manager\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"V konfiguračním souboru není určeno žádné úložiště dat.\n"
+"\n"
+"Pokud používáte výchozí konfigurační soubor, upravte ho prosím a\n"
+"odkomentujte jedno z úložišť ZODB.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Toto není databázový soubor SchoolBell 1.0, končím.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Toto není databázový soubor SchoolBell 1.0, končím.\n"
+"\n"
+"Spusťte prosím samostatný aktualizační skript databáze.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Název"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Název poznámky."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Skupina"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Trvání"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Datum"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Seznam zdrojů"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Přidat nový zdroj"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Nedostatek poskytnutých dat."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Názvy nemohou být prázdné"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Aktuální skupiny"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Dostupné skupiny"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Tento měsíc"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Dostupné skupiny"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Skupiny"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Aktuální skupiny"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Dostupné skupiny"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Zdroje"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importovat zdroje"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Zdroje k dispozici"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Seznam osob"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Přidat novou osobu"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Název zdroje."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Popis zdroje."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Popis skupiny."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Webová stránka"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Zrušit"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Změnit informace o ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Změnit členství"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Změnit nastavení pro ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Změnit kontaktní údaje pro ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Změnit kontaktní údaje pro ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Kontaktní informace"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Jméno uživatele"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Heslo"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Tento uživatel již existuje!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Použít"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Hlavní telefon"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Předchozí"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Informace o události"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Přezdívka"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Začíná"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "So"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Časové pásmo"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Vedlejší telefon"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Poznámky"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Další"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Počet událostí"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "upravit jméno"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "upravit jméno"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "upravit jméno"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Moje nastavení"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Celé jméno"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Fotografie"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Fotografie (formát JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nová poznámka"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV text byl úspěšně importován."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Heslo bylo úspěšně změněno!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Heslo bylo úspěšně změněno!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Například:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Informace o osobě"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Seznam skupin"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Přidat novou skupinu"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Skupiny ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Členové ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Aktuální členové"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Přidat členy"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Název skupiny."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Popis skupiny."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Seznam zdrojů"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Přidat nový zdroj"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Minulý týden"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV text byl úspěšně importován."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Heslo bylo úspěšně změněno!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Tento týden"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Heslo bylo úspěšně změněno!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Uživatel"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Název zdroje."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Popis zdroje."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Začíná"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Název poznámky."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Příští týden"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Název poznámky."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Denní"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Název poznámky."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Tělo"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Tělo poznámky."
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Soukromí"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "uživatelské jméno nesmí být prázdné"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "jméno nesmí být prázdné"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Duplikát uživatelského jména: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nové heslo"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Změnit heslo"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Časové pásmo"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Časové pásmo použité ve vašem kalendáři"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formát času"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formát data"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/RR"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "RRRR-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Den Měsíc, Rok"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Týden začíná v:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Začátek týdne v Neděli nebo Pondělí"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Kalendář"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Jméno, které se bude zobrazovat"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Seznam zdrojů"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Přidat nový zdroj"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Seznam zdrojů"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Přidat nový zdroj"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Název zdroje."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Popis zdroje."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Umístění."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Určuje umístění tohoto zdroje, např. třída."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Nedostatek poskytnutých dat."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Nedostatek poskytnutých dat."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Nedostatek poskytnutých dat."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Můj kalendář"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Více..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendáře"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Vítejte v SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigace"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Fotografie"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Uživatelské jméno:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "upravit jméno"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Změnit jméno tohoto uživatele, obrázek nebo heslo"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Informace o uživateli: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Spravovat členství tohoto uživatele"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "upravit skupiny"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Toto není databázový soubor SchoolBell 1.0, končím.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Toto není databázový soubor SchoolBell 1.0, končím.\n"
+"\n"
+"Spusťte prosím samostatný aktualizační skript databáze.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "nahoře"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Změny uloženy."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Změnit podrobnosti"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nová poznámka"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "položek"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Přidat novou osobu"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Začíná"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Kromě období"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Neplatné datum. Určete ho prosím ve tvaru YYYY-MM-DD, jedno na řádek."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Přidat nový zdroj"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} osob"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Tělo poznámky."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "tentýž týden"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "upravit jméno"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Poznámka"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Neznámá znaková sada"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nová fotografie"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Malý obrázek (okolo 48x48 pixelů formátu JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Odstranit fotografii"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Pro odstranění fotografie, zvolte tuto možnost"
+
+#~ msgid "Verify password"
+#~ msgstr "Ověření hesla"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Hesla si neodpovídají."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Hesla si neodpovídají!"
+
+#~ msgid "View"
+#~ msgstr "Pohled"
+
+#~ msgid "Edit"
+#~ msgstr "Upravit"
+
+#~ msgid "Create new objects"
+#~ msgstr "Vytvořit nové objekty"
+
+#~ msgid "Add events"
+#~ msgstr "Přidat událost"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Upravit/smazat události"
+
+#~ msgid "Control access"
+#~ msgstr "Kontrola přístupu"
+
+#~ msgid "Manage membership"
+#~ msgstr "Správa členství"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Ověření uživatelé"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Neověření uživatelé"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Nastavení přístupu"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Změnit nastavení"
+
+#~ msgid "New Person"
+#~ msgstr "Nová osoba"
+
+#~ msgid "Import Persons"
+#~ msgstr "Import osob"
+
+#~ msgid "Add a Group"
+#~ msgstr "Přidat skupinu"
+
+#~ msgid "New Group"
+#~ msgstr "Nová skupina"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Upravit informace o skupině"
+
+#~ msgid "A Group"
+#~ msgstr "Skupina"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Skupina SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Přidat/Odebrat členy"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importovat skupiny"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Přidat zdroj"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Upravit informace o zdroji"
+
+#~ msgid "New Resource"
+#~ msgstr "Nový zdroj"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Zdroj SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Zdroj"
+
+#~ msgid "Actions"
+#~ msgstr "Akce"
+
+#~ msgid "View Calendar"
+#~ msgstr "Kalendář"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalendář (Denní)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Kalendář (Denní, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalendář (Týdenní)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalendář (Týdenní, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalendář (Měsíční)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalendář (Měsíční PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalendář (Roční)"
+
+#~ msgid "Atom View"
+#~ msgstr "Podrobný pohled"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Volno/Obsazeno"
+
+#~ msgid "New Event"
+#~ msgstr "Nová událost"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Otevřít v iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Upravit událost"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Změnit nastavení místa"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Tato povolení umožňuje prohlížet jména, názvy, fotky, seznamy objektů a "
+#~ "další informace."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Umožňuje upravovat jména, názvy, popisy, fotky, atd."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Umožňuje uživateli vytváře nové osoby, skupiny a zdroje."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Umožňuje prohlížení kalendářů osob, skupin a zdrojů."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Umožňuje přidávání nových událostí do kalendářů."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Umožňuje úpravu a mazání událostí v kalendářích."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Zpřístupňuje kontrolu nad ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Umožňuje uživateli použít tento formulář (Řízení přísupu)"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Umožňuje uživateli přidávat osoby, skupiny a zdroje skupinám. Aby mohl "
+#~ "něco přidat skupině, potřebuje uživatel oprávnění ke skupině. Mějte na "
+#~ "paměti, že spojování skupin vede k bezpečnostním rizikům."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Oprávnění pro skupiny"
+
+#~ msgid "Access control"
+#~ msgstr "Řízení přístupu"
+
+#~ msgid "Set Access"
+#~ msgstr "Nastavení přístupu"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Oprávnění uživatelů"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Oprávnění jsou odvozena ze struktury omezení. Např. pokud nastavíte právo "
+#~ "ke kalendáři pro uživatele ze seznamu osob, tak bude moci sledovat "
+#~ "kalendáře všech osob. Pokud chcete, aby uživatel mohl přistupovat jen k "
+#~ "některým zdrojům, můžete nastavit oprávnění Kalendář pro určitého "
+#~ "uživatele tohoto zdroje."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr "Dále následuje seznam jmen oprávnění spolu s jejich významy."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Změnit nastavení stránky"
+
+#~ msgid "General preferences"
+#~ msgstr "Obecná nastavení"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Upravit nastavení stránky"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Události pro"
+
+#~ msgid "atom_description"
+#~ msgstr "popis"
+
+#~ msgid "atom_enabled"
+#~ msgstr "povolen"
+
+#~ msgid "atom_more_info"
+#~ msgstr "více informací"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Zkontrolovat zdroj Atom"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Ověřený Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Umístění: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Zvolit další kalendáře pro zobrazení"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Pro vybrání více kalendářů podržte Ctrl nebo Shift."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Veřejný kalendář"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "kalendář celého webu"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Zvolit kalendáře pro zobrazení"
+
+#~ msgid "People"
+#~ msgstr "Lidé"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Žádní lidé vám kalendáře nezpřístupnili."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Žádné skupiny vám kalendáře nezpřístupnili."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Žádné zdroje s kalendáři pro vás nejsou přístupné."
+
+#~ msgid "Showing"
+#~ msgstr "Vystavení"
+
+#~ msgid "of"
+#~ msgstr "z"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Určitě si přejete smazat zvolené položky?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Nevybrali jste žádné položky."
+
+#~ msgid "delete-button"
+#~ msgstr "smazat"
+
+#~ msgid "Exception"
+#~ msgstr "Výjimka"
+
+#~ msgid "Traceback"
+#~ msgstr "Traceback"
+
+#~ msgid "Server Error"
+#~ msgstr "Chyba serveru"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Došlo k vnitřní chybě serveru. To pravděpodobně znamená, že jste nalezli "
+#~ "chybu v programu SchoolBell. Ohlaste ji prosím na <a href=\"http://issues."
+#~ "schooltool.org\">této adrese</a>."
+
+#~ msgid "All day event"
+#~ msgstr "Celodenní událost"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Toto je opakovaná událost."
+
+#~ msgid "Ends"
+#~ msgstr "Končí"
+
+#~ msgid "edit event"
+#~ msgstr "upravit událost"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Změnit detaily této události"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Plánované zdroje"
+
+#~ msgid "edit resources"
+#~ msgstr "upravit zdroje"
+
+#~ msgid "delete event"
+#~ msgstr "smazat událost"
+
+#~ msgid "Event details"
+#~ msgstr "Podrobnosti o události"
+
+#~ msgid "Book Resources"
+#~ msgstr "Požadované zdroje"
+
+#~ msgid "Update form"
+#~ msgstr "Forma aktualizace"
+
+#~ msgid "day"
+#~ msgstr "den"
+
+#~ msgid "week"
+#~ msgstr "týden"
+
+#~ msgid "month"
+#~ msgstr "měsíc"
+
+#~ msgid "year"
+#~ msgstr "rok"
+
+#~ msgid "Weekly"
+#~ msgstr "Týdně"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr "Tato část se uplatňuje pouze pokud je vybráno týdenní opakování."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr "Tato část se uplatňuje pouze pokud je vybráno měsíční opakování."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "${monthday} den každý měsíc"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} týden každý měsíc"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "{DYNAMIC_CONTENT} každý měsíc"
+
+#~ msgid "Repeat"
+#~ msgstr "Opakovat"
+
+#~ msgid "times"
+#~ msgstr "krát"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Opakovat stále"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Rezervovat zdroje"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Zdroj knih pro ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Název:"
+
+#~ msgid "Starts:"
+#~ msgstr "Začíná:"
+
+#~ msgid "Ends:"
+#~ msgstr "Končí:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Toto je opakující se událost!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Zdroje knih"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Konfliktní události"
+
+#~ msgid "Book"
+#~ msgstr "Kniha"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "CSV data <strong>musí</strong> obsahovat název skupiny a <strong>mohou</"
+#~ "strong> obsahovat nepovinný popis skupiny. Jakékoliv další informace "
+#~ "budou zahozeny."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Kroužek šachu\n"
+#~ "Sportovní kroužek, Odpolední sportovní kroužek, <em>text po druhé čárce</"
+#~ "em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Výše uvedený příklad vytvoří 3 skupiny nazvané 'LUG', 'Kroužek šachu' a "
+#~ "'Sportovní kroužek'. První a poslední skupina bude mít popisky 'Linux "
+#~ "Users Group' resp. 'Odpolední sportovní kroužek'. 'Kroužek šachu' nebude "
+#~ "mít popisek žádný a text \"text po druhé čárce\" bude ignorován."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Nahrát skupiny schooltool ve formátu CSV"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Nahrát CSV soubor"
+
+#~ msgid "CSV File"
+#~ msgstr "Soubor CSV"
+
+#~ msgid "Charset:"
+#~ msgstr "Znaková sada:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Western (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Western (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Western (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Jiné (určete prosím)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Jiná znaková sada: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Vložit CSV data"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV data"
+
+#~ msgid "Members"
+#~ msgstr "Členové"
+
+#~ msgid "edit members"
+#~ msgstr "Upravit členy"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Upravit členy této skupiny."
+
+#~ msgid "Remove"
+#~ msgstr "Odstranit"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Nejste oprávněni přistupovat k této stránce. Pro návrat zpět, můžete ve "
+#~ "vašem prohlížeči kliknout na tlačítko zpět, nebo se zeptat oprávněného "
+#~ "uživatele pro přihlášení."
+
+#~ msgid "Please log in"
+#~ msgstr "Přihlaste se prosím"
+
+#~ msgid "Login"
+#~ msgstr "Přihlášení"
+
+#~ msgid "User Information"
+#~ msgstr "Uživatelské informace"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Vaše sezení vypršelo."
+
+#~ msgid "There are none."
+#~ msgstr "Prázdné."
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "odeslat"
+
+#~ msgid "There are none to add."
+#~ msgstr "Není koho přidat."
+
+#~ msgid "Find Now"
+#~ msgstr "Nalézt nyní"
+
+#~ msgid "Clear"
+#~ msgstr "Vyčistit"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "zrušit"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Kdo může vidět poznámku"
+
+#~ msgid "Private"
+#~ msgstr "Soukromá"
+
+#~ msgid "Public"
+#~ msgstr "Veřejná"
+
+#~ msgid "Add note"
+#~ msgstr "Přidat poznámku"
+
+#~ msgid "add-button"
+#~ msgstr "přidat"
+
+#~ msgid "Delete"
+#~ msgstr "Smazat"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Pamatujte prosím na následující:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Možná jste nesprávně zadali adresu"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Možná se pokoušíte přistoupit k neexistující stránce"
+
+#~ msgid "Not Found"
+#~ msgstr "Nenalezeno"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "Stránka, na kterou se pokoušíte dostat, je nedostupná"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "CSV data <strong>musí</strong> obsahovat uživatelské jméno a celé jméno. "
+#~ "Heslo <strong>může</strong> být volitelně přiloženo."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "Výše uvedený příklad vytvoří tři uživatele, 'jjones', 'jbjones' a "
+#~ "'howard'. Pouze 'jbjones' má nastaveno heslo ('r2m45J') a bude se tak "
+#~ "moci přihlásit do systému. Pamatujte, že heslo musí být zadáno v čistě "
+#~ "textové formě."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Nahrát osoby schooltool ve formátu CSV"
+
+#~ msgid "Details"
+#~ msgstr "Podrobnosti"
+
+#~ msgid "edit details"
+#~ msgstr "upravit podrobnosti"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Upravit osobní podrobnosti"
+
+#~ msgid "Add person"
+#~ msgstr "Přidat osobu"
+
+#~ msgid "Add to groups"
+#~ msgstr "Přidat ke skupinám"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Promiňte, ale není možné smazat vaše vlastní uživatelské konto."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Upravit kontaktní informace"
+
+#~ msgid "Edit person"
+#~ msgstr "Upravit osobu"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Nastavení kalendáře"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Upravit osobní nastavení"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Pokoušíte se smazat opakující se událost."
+
+#~ msgid "Current"
+#~ msgstr "Současné"
+
+#~ msgid "Future"
+#~ msgstr "Budoucí"
+
+#~ msgid "All"
+#~ msgstr "Vše"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Smazání opakující se události (${event_title})"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "CSV dat <strong>musí</strong> obsahovat název zdroje a <strong>mohou</"
+#~ "strong> obsahovat nepovinný popis zdroje. Jakákoliv další informace bude "
+#~ "zahozena."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Zpětný projektor #302\n"
+#~ "Hlavní posluchárna\n"
+#~ "LC-805, Přenosný počítač #805, <em>text za druhou čárkou</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Výše uvedený příklad vytvoří 3 zdroje pojmenované 'PRJ302', 'Hlavní "
+#~ "posluchárna' a 'LC-805'. První a poslední zdroj bude mít popisek 'Zpětný "
+#~ "projektor #302' resp. 'Přenosný počítač #805'. Zdroj \"Hlavní posluchárna"
+#~ "\" nemá žádný popisek a \"text za druhou čárkou\" ve třetí položce bude "
+#~ "ignorován."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Nahrát zdroje schooltool ve formátu CSV"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "Nalezeno ${num_errors} vstupních chyb."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identifikátor (volitelný)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Na serveru běží SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; je obchodní "
+#~ "značka The Shuttleworth Foundation. </p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Verze pro tisk"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Pohled na denní kalendář"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Pohled na týdenní kalendář"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Pohled na měsíční kalendář"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Pohled na roční kalendář"
+
+#~ msgid "Yearly"
+#~ msgstr "Každoročně"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Kalendář pro ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Skočit na ..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Zítřejší události"
+
+#~ msgid "Log in"
+#~ msgstr "přihlásit"
+
+#~ msgid "User:"
+#~ msgstr "Uživatel:"
+
+#~ msgid "Log Out"
+#~ msgstr "Odhlásit"
+
+#~ msgid "Edit Info"
+#~ msgstr "Upravit informace"
+
+#~ msgid "Add Event"
+#~ msgstr "Přidat událost"
+
+#~ msgid "Modify Event"
+#~ msgstr "Upravit událost"
+
+#~ msgid "Set up access"
+#~ msgstr "Nastavit přístup"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Neověření uživatelé"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Neověřený uživatel"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Ověření uživatelé"
+
+#~ msgid "All Users"
+#~ msgstr "Všichni uživatelé"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: upozornění: ignoruji konfigurační volbu '%s'"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/cs/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5199 @@
+# Czech translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# Miroslav Kure <kurem at debian.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:43+0000\n"
+"Last-Translator: Miroslav Kure <kurem at debian.cz>\n"
+"Language-Team: Czech <debian-l10n-czech at lists.debian.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Přezdívka"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Krátká přezdívka této osoby."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Hlavní email"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Další email"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Hlavní telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Doporučené telefonní číslo."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Další telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Další telefonní číslo."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Webová stránka"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Webová stránka nebo blog."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Poštovní adresa"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Osoby"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 osoba"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} osob"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Uživatelské jméno nebo heslo není správné"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Březen"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Leden"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Únor"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Červen"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Květen"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Duben"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Srpen"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Září"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Červenec"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Příští den"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Dnes"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Předchozí den"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Říjen"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Prosinec"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Listopad"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Pondělí"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Úterý"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Středa"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Čtvrtek"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Něděle"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Sobota"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Pátek"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Po"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Út"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "St"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Čt"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pá"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "So"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Ne"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Název"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Celý den"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Čas"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Počáteční čas ve 24 hodinovém formátu"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Trvání"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Typ trvání"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuty"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Hodiny"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dny"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Umístění"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Popis"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Opakující se"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Opakuje se každý"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Den"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Týden"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Měsíc"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Rok"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Opakovat všechny"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Rozsah"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Počet"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Do"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "navždy"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Počet událostí"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Opakovat do"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Pracovní dny"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Pracovní den"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Měsíčně"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Vyjma"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "stejný den v týdnu"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "poslední den v týdnu"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Poslední ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Neplatný čas"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Koncové datum je dřívější než počáteční"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Neplatné datum. Zadejte je prosím ve tvaru RRRR-MM-DD, jedno na řádek."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Přidat událost"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Přidat"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Upravit událost"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Aktualizovat"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Aktualizováno ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalendář"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Příští týden"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Tento týden"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Předchozí týden"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (${week}. týden)"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Příští měsíc"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Tento měsíc"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Předchozí měsíc"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "${week_no}. týden"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Příští rok"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Tento rok"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Předchozí rok"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Akce"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalendář"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalendář"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalendář"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalendář"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Zobrazit"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalendář"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Přidat událost"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Upravit událost"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Přihlásit se"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigace"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Akce"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalendář"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nebyla zadána žádná data"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Data nelze převést do Unicode (chybná znaková sada?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV soubor byl úspěšně importován."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Import CSV souboru selhal"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV text byl úspěšně importován."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Import CSV textu selhal"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Nebyla zadána žádná znaková sada"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Neznámá znaková sada"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Chyba v CSV datech, řádek ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Převod do unicode selhal na řádku ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "2. řádek není prázdný"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Neúplný popis sekce na řádku ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr "První řádek souboru CSV musí obsahovat id výrazu a id schéma rozvrhu."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Výraz ${term} neexistuje."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Schéma rozvrhu ${schema} neexistuje."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Chyba CSV dat rozvrhu, řádek ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Nedefinovaná id dne ve zvoleném schématu: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Nedefinovaná období ve zvolených dnech: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Nenalezených osob: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Nenalezených kurzů: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Nenalezené sekce: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Neplatných záznamů: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Změny uloženy."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "celý den"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Umístění: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Rezervované zdroje: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "opakující se"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "pokrytý %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Denní kalendář uživatele %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Týdenní kalendář uživatele %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "%d. týden (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Měsíční kalendář uživatele %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "Podpora PDF je zakázaná. Povolit ji může váš správce."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Změnit nastavení"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Nastavení kalendáře"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Nastavení kalendáře"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Upravit nastavení uživatele"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Upravit nastavení uživatele"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Popis"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Přeskočit na ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Zítřejší události"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Verze pro tisk"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Zobrazit denní kalendář"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Denně"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Zobrazit týdenní kalendář"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Týdně"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Zobrazit měsíční kalendář"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Zobrazit roční kalendář"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Ročně"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Kalendář uživatele ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Osobní kalendář"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Rozvrh"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Můj kalendář"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendáře"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Více..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalendář"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Zobrazit kalendář"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Týdenní kalendář uživatele %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "smazat"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "zrušit"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Odstranit"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Prázdné"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Najít"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Vyčistit"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Není koho přidat."
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Přidat událost"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Podrobnosti"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "So"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Upravit událost"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Změnit přednášející pro tuto sekci."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Rezervované zdroje: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "upravit skupiny"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Upravit/smazat události"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Editovat informace o sekci"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "upravit podrobnosti"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Zdroje"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Aktualizovat"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Dnes"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Týden"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Měsíc"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Rok"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Opakovat do"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Čas"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Zobrazit kalendář"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Opakovat všechny"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Rezervované zdroje: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Informace o osobě: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Název"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "So"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Seznam zdrojů"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "změnit umístění"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Kurzy"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Vítejte ve SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Editovat informace o sekci"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Přihlásit se"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "opakující se"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Celý den"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Západní (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Západní (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Jiné (prosím zadejte)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Jiná znaková sada: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Vstupní CSV data"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV data"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "odeslat"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Importovat rozvrh hodin"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"CSV soubor můžete vytvořit v tabulkovém programu a vyexportovat do formátu "
+"CSV (hodnoty jsou oddělené čárkami). Struktura tabulky je popsána níže."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"První řádek souboru musí obsahovat jméno <strong>pravidla</strong> a "
+"<strong>schéma rozvrhu</strong>, který bude použit pro nové rozvrhy. Druhý "
+"řádek může být prázdný, nebo mohou následovat různé texty popisující sekci. "
+"Ty jsou odděleny prázdným řádkem."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+#, fuzzy
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+"Každý první řádek popisující sekci obsahuje <strong>id kurzu</strong> a "
+"<strong>id instruktora</strong> nové sekce. Pak následuje několik řádků, z "
+"nichž každý obsahuje <strong>id dne</strong>, <strong>id období</strong> a "
+"volitelně také <strong>id umístění</strong>. Seznam popisující období je "
+"ukončen třemi hvězdičkami ('***') umístěnými do prvního sloupce. Po tomto "
+"končícím znaku může následovat libovolný počet <strong>id osob</srong>, "
+"zvolené osoby budou přidány do sekce jako studenti."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Nahrát do SchoolToolu rozvrhy hodin ve formátu CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Příklad:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-začátek\",\"tří denní\"\n"
+"\"\",\"\",\"\"\n"
+"\"filozofie\",\"martin\"\n"
+"\"Pondělí\",\"A\",\"učebna137\"\n"
+"\"Pondělí\",\"B\"\n"
+"\"Úterý\",\"C\",\"učebna138\"\n"
+"\"***\"\n"
+"\"honza\"\n"
+"\"pepa\"\n"
+"\"\"\n"
+"\"Literatura\",\"karel\"\n"
+"\"Středa\",\"B\"\n"
+"\"Středa\",\"C\",\"učebna139\"\n"
+"\"***\"\n"
+"\"Honza\"\n"
+"\"Petr\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"Výše uvedený příklad vytvoří dvě nové sekce, jednu pro lekci filozofie, "
+"druhé pro literaturu. Sekci pro výuku filozofie bude mít studenty s id "
+"'honza' a 'pepa'. Jejich rozvrh bude obsahovat tři aktivity, dvě v pondělí "
+"(jedna bude v místnosti s id 'učebna137' a jedna nemá místo konání určeno)."
+"Sekce literatura bude zpracována obdobným způsobem."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Pamatujte, že je v souboru možné používat pouze id objektů, ne jména. Pokud "
+"řádek končí prázdnými buňkami (např.: <em>\"filozofie\",\"martin\",\"\","
+"\"\"</em>), budou tyto buňky zahozeny. Popisné sekce můžete oddělit více jak "
+"jedním řádkem. V seznamu studentů je zpracován pouze první sloupec "
+"obsahující id osoby, ostatní sloupce jsou ignorovány. Stejná data můžete "
+"importovat vícekrát bez vedlejších účinků."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Nahrát CSV soubor"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV soubor"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Znaková sada:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Západní (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalendář uživatele %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Rezervované zdroje: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Jméno školy nebo organizace provozující tento\n"
+"            server.  Informace bude zobrazena ve veřejném kalendáři,\n"
+"            v titulku stránky a v patičkách všech stránek."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Kalendář na hlavní stránce"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Na hlavní stránce zobrazí kalendář."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Požadovaný vstup chybí"
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Vstupem formuláře není soubor"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Neplatná celočíselná data"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Neplatná textová data"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Neplatná textová data"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Neplatná unicodová data"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Neplatné desetinné číslo"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Neplatná časová data"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Přecházím na pozadí, daemon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Pro nápovědu spusťte %s -h."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: na vašem operačním systému není režim daemon podporován."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Načítám konfiguraci z %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Správce"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Doba spouštění: %.3f s. skutečných, %.3f s. CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Nemohu inicializovat databázi:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Možná jej používá jiná instance %s?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Varování: nemohu najít knihovnu reportlab.\n"
+"Vypínám podporu PDF."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Varování: adresář s písmy '%s' neexistuje.\n"
+"Vypínám podporu PDF."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Varování: písmo '%s' neexistuje.\n"
+"Vypínám podporu PDF."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"V konfiguračním souboru nebylo definováno žádné úložiště.\n"
+"\n"
+"Používáte-li výchozí konfigurační soubor, pokud možno jej ihned \n"
+"upravte a odpokentujte některou sekci se ZODB úložišti.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Toto není databázový soubor SchoolToolu verze 0.10, přerušuji.\n"
+"\n"
+"Spusťte samostatný skript pro převod databáze.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Vítejte na serveru SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Nastavení kalendáře"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Upravit nastavení uživatele"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Osoby"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Plánování pro ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Legenda:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuty"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "opakující se"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Něděle"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Není koho přidat."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "Datum, které jste zadali nepatří tomuto pravidlu."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Není koho přidat."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Plánování pro ${person}"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Předchozí rok"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Další"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Umístění"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Přidat sekci"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Zobrazit"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Upravit událost"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Přidat sekci"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Editovat informace o sekci"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importovat kurzy"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr "Přidat kurz"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Nový kurz"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Seznam kurzů"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Přidat nový kurz"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Poskytnuta nedostatečná data."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Názvy nemohou být prázdné"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Takový kurz neexistuje."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Potřebuje ID kurzu."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Přidat sekci do ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Přednášející"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Aktuální přednášející"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Dostupní přednášející"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Studenti"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Skupiny"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Zdroje"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Seznam sekcí"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Přidat novou sekci"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV data <strong>musí</strong> obsahovat název kurzu a <strong>mohou</"
+"strong> obsahovat volitelný popis kurzu. Všechny další informace budou "
+"zahozeny."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Dávná distorie, Od prehistorie po rok 1000 n.l.\n"
+"Historie Českých zemí\n"
+"Světová historie, Od roku 1000 n.l. do 20. století, text za druhou čárkou\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Předchozí příklad vytvoří tři kurzy nazvané 'Dávná historie', 'Historie "
+"Českých zemí' a 'Světová historie'. První a poslední kurz budou mít popisy "
+"'Od prehistorie po rok 1000 n.l.', resp. 'Od roku 1000 n.l. do 20. století'. "
+"Druhý kurz samozřejmě žádný popis nepotřebuje. Nadbytečný text 'text za "
+"druhou čárkou' ve třetím kurzu bude ignorován."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Nahrát do SchoolToolu kurzy ve formátu CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Sekce"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "studenti"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Sekce z ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "upravit jméno"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Změnit umístění nebo jméno této sekce."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Změnit přednášející pro tuto sekci."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Rezervované zdroje: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Změnit přednášející pro tuto sekci."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "upravit přednášející"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "upravit jednotlivě"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Postupně změní studenty v této sekci"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Změnit studenty této sekce po skupinách"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "upravit skupiny"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Identifikátor (volitelný)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Sekce"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Aktuální velikost"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Vstupních chyb: ${num_errors}."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Název kurzu."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Popis kurzu."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Popisek"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Identifikátor sekce, vytvořený učitelem\n"
+"            jména, kurzy a čas setkání."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Kód"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "ID kód sekce."
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Popis sekce."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Osoby"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Březen"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Školní den"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Havarijní den"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Havarijní den"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Havarijní den"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Upravit"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Zrušit"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Uživatelské jméno"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Heslo"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Toto uživatelské jméno se již používá!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Použít"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Denně"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Prázdné"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Prázdné"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Celé jméno"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (ve formátu JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Kurzy"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "smazat"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "přidat"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "zrušit"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Přidat sekci"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Upravit událost"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Studenti"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "smazat"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Fáze ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importovat skupiny"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Přidat novou skupinu"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Editovat informace o sekci"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Spravovat členství"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Skupiny"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Skupiny"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"CSV data <strong>musí</strong> obsahovat název skupiny a <strong>mohou</"
+"strong> obsahovat volitelný popis skupiny. Všechny další informace budou "
+"zahozeny."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"LUG, Sdružení uživatelů Linuxu\n"
+"Šachový kroužek\n"
+"Sportovní klub, Mimoškolní sportovní klub, <em>text za druhou čárkou</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Předchozí příklad vytvoří tři skupiny nazvané 'LUG', 'Šachový kroužek' a "
+"'Sportovní klub'. První a poslední skupina budou mít popisy 'Sdružení "
+"uživatelů Linuxu' resp. 'Mimoškolní sportovní klub'. 'Šachový kroužek' "
+"nebude mít žádný popis a nadbytečný text \"text za druhou čárkou\" u třetí "
+"skupiny bude ignorován."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Nahrát do SchoolToolu skupiny ve formátu CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Listopad"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "upravit jméno"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Změnit umístění nebo jméno této sekce."
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Seznam skupin"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Přidat novou skupinu"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Název skupiny."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Popis skupiny."
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Soukromý_kalendář"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Přidat událost"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Upravit událost"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "žádný"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "přidat"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Tento týden"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Studenti"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "zrušit"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "přidat"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "zrušit"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nové pravidlo"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Název poznámky."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Text"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Text poznámky."
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Soukromí"
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Soukromí"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Přidat pravidlo"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Datum"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "uživatelské jméno nemůže být prázdné"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "celé jméno nemůže být prázdné"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Duplicitní uživatelské jméno: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importovat osoby"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CSV data <strong>musí</strong> obsahovat uživatelské a celé jméno. Volitelně "
+"<strong>může</strong> být zadáno i heslo."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"vsklenar, Vladimír Sklenář\n"
+"mck, Miroslav Chicky Kuře, r2m45J\n"
+"novak, Novák\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Předchozí příklad vytvoří tři uživatele 'vsklenar', 'mck' a 'novak'. Jediný "
+"'mck' má heslo ('r2m45J') a tudíž se bude moci přihlásit do systému. "
+"Poznamenejme, že hesla musí být zasílána jako prostý text."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Nahrát do SchoolToolu uživatele ve formátu CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Změnit nastavení uživatele ${user}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Upravit nastavení uživatele"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Časové pásmo"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Časové pásmo používané pro zobrazení vašeho kalendáře"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formát času"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM dop/odp"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formát data"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/RR"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "RRRR-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Den Měsíc, Rok"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Týden začíná v:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Zobrazuje počátek týdne v neděli nebo v ponělí"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Zobrazit období"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Zobrazit jména období v denním pohledu"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Jméno, které se má zobrazovat"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Vztahy"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Přidat kurz"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Upravit událost"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Nové pravidlo"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Zobrazuji"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "z"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "položek"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importovat zdroje"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Přidat nový zdroj"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Editovat informace o sekci"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Zdroje"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Zdroje"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV data <strong>musí</strong> obsahovat název zdroje a <strong>mohou</"
+"strong> obsahovat volitelný popis zdroje. Všechny další informace budou "
+"zahozeny."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, Projektor č.302\n"
+"Hlavní posluchárna\n"
+"NB-805, Notebook č.805, <em>text za druhou čárkou</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Předchozí příklad vytvoří tři zdroje nazvané 'PRJ302', 'Hlavní posluchárna' "
+"a 'NB-805'. První a poslední zdroje budou mít popisy 'Projektor č.302' resp. "
+"'Notebook č.805'. Zdroj 'Hlavní posluchárna' nebud mít popis žádný. "
+"Nadbytečný text 'text za druhou čárkou' na třetím řádku bude ignorován."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "Nahrát do SchoolToolu zdroje ve formátu CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Seznam zdrojů"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Přidat nový zdroj"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Název zdroje."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Popis zdroje."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Umístění."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Určuje zda je tento zdroj umístění, například třída."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Kalenář"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Kalendář"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Toto není databázový soubor SchoolBellu verze 1.0, přerušuji.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Toto není databázový soubor SchoolBellu verze 1.0, přerušuji.\n"
+"\n"
+"Spusťte samostatný skript pro převod databáze.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "vrchol"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Vyjma"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Přihlásit se"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Uživatel:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Odhlásit se"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Nové pravidlo"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Mimořádné zrušení výuky"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "Zadané náhradní datum je neplatné."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr "Výuka mimořádně zrušena. Náhradní den $replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Náhradní den za zrušenou výuku $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "Zadané datum není platné. Použijte formát RRRR-MM-DD."
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "Datum, které jste zadali nepatří tomuto pravidlu."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "Zadané datum není školním dnem."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"Zvolili jste ${DYNAMIC_CONTENT} pro havarijní den. Nyní prosím zvolte "
+"náhradní den. Výběr níže se sestává z ne-školních dnů tohoto pravidla, "
+"následujících za havarijním dnem a různé dny mimo pravidlo."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Níže prosím zadejte datum náhrady."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Náhrada"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Zvolte náhradu za havarijní den."
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Tento formulář umožňuje označit den jako havarijní a do pravidla přidat "
+"náhradní den."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr "Níže prosím zadejte datum havarijního dne."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Havarijní den"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Změnit pravidlo: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Nové pravidlo"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Pravidla"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "přidat nové pravidlo"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Počáteční datum"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Koncové datum"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "${week_number}. týden"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Přidat pravidlo"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Uložit změny"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Nejprve prosím pojmenujte a určete časové období tohoto pravidla. Časové "
+"období je počítáno včetně (např. od 2004-09-01 do 2004-12-31). Datumy musíte "
+"určit ve formátu RRRR-MM-DD."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "Rozsah zahrnuje i krajní data (např. od 2004-09-01 do 2004-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Obnovit"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr "Dále prosím zadejte, které dny jsou školní a které jsou prázdninové."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr "Zadejte, které dny jsou školní a které jsou prázdninové."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Školní den"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Prázdniny"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Zvolit následující dny týdne:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "{object} rozvrh"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Neplatné datum. Použijte formát RRRR-MM-DD."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Toto datum nepatří žádnému pravidlu."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Některé hodnoty jsou neplatné. Tyto jsou zvýrazněny červeně."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Změnit rozvrh hodin pro jeden den"
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Nový rozvrh"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Zobrazit rozvrhy"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Pracovní plán"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Pro začátek a konec období použijte prosím formát HH:MM"
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Musíte určit alespoň jedno období."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Školní rozvrhy"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Přidat nové schéma"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Vyberte prosím hodnotu"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "${number}. den"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Fáze 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Fáze ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Schéma rozvrhu - ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Den v rozvrhu se vždy schoduje s dnem v týdnu (např. Pondělí je prvním "
+"použitým dnem, úterý druhým, a tak dál."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Dny v rozvrhu jsou použity postupně. Dny, které nejsou školními, jsou "
+"přeskočeny."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Za třetí, určete čas a trvání období připadajících na určité dny týdne. "
+"Použijte jeden z následujících formátů: <tt>HH:MM</tt> (také, v následujcím "
+"textovém políčku nezapomeňte určit dobu trvání) nebo <tt>HH:MM-HH:MM</tt> "
+"(když chcete určit čas ukončení explicitně, např. 9:30-10:15). Není nutné "
+"určit všechna období pro všechny dny v týdnu, jejich vynechání prostě "
+"způsobí , že období bude přeskočeno pokud připadne na tento den týdnu. Pokud "
+"není seznam období aktuální se změnami, které provedete v tabulce nahoře, "
+"použijte tlačítko Aktualizovat pro obnovu formuláře."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Zvolte prosím jméno rozvrhu, který chcete vytvořit."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr "Některé období bylo určeno chybně a tak bude vyřazeno."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Naposledy se ujistěte, zda jsou zadané informace správné, protože jedinou "
+"možnou cestou jak je opravit bude odstranění tohoto rozvrhu a jeho obnova."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Vytvořit schéma rozvrhu"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Nejprve prosím určete dny a období rozvrhu."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Zkopírovat období z předchozího dne"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Odstranit tento den"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Přidat den"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Přidat období"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Za druhé, vyberte způsob jakým budou dny rozvrhu uspořádána vzhledem ke "
+"kalendářním dnům."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"Pamatujte: pokud se sekce objeví ve více jak jedné rubrice, budou obě "
+"nastavené jako <em>volné</em> pro odstranění."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Rozvrh"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Pravidlo"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Schéma"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Plánování pro ${person}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Zvolte"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Tento formulář vám umožní nastavit rozvrh člověka jeho přidáním/odstraněním "
+"do/z sekcí majících třídy ve svých rozvrzích."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "jako část z"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "žádný"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "Konflikt v plánování."
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Uložit"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr "Nejsou zde definována žádná pravidla nebo rozvrhy."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Zvolte šablonu plánu"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "Pro pravidla:"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Plánování pro ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Používám rozvrh:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Takto jednoduše vytvoříte týdenní plán rozvrhu. Prostě vyplňte potřebný "
+"počet řádků daných období."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Potřebujete-li více flexibility, můžete použít <a href=\"add.html\">průvodce "
+"vytvoření rozvrhu</a>, nebo <a href=\"complexadd.html\">formulář umožňující "
+"celkové nastavení rozvrhu</a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Název období (volitelné)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Začátek období"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "Konec období"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Vytvořit"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"V níže uvedeném formuláři můžete nastavit začátek a konec období pro "
+"${DYNAMIC_CONTENT}. Potřebujete-li odstranit období z dne, pak jednoduše "
+"smažte čas začátku a ukončení."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Jméno periody"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Původní začátek"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Původní konec"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Nový začátek"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Nový konec"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Upravit"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Tento formulář vám umožňuje měnit začátek a konec pro období určitého data, "
+"nebo zrušit nějaká období najednou."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr "Zadejte prosím datum kdy se mají níže uvedené období změnit."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Vyberte den"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Pokračovat"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Vytvořit schéma rozvrhu"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Rozvrh pro ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Nové schéma rozvrhu"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr "Používá váš školní cyklus rozvrhu dny týdne, nebo rotační cyklus?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Dny v týdnu"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Rotační cyklus"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Zadejte jména dní cyklu, jedno na řádek."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Zadejte alespoň jeden název dne."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Ujistěte se, že názvy dnů jsou jedinečné."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr "Začíná a končí vyučování ve vaší škole každý den ve stejný čas?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Každý den ve stejný čas"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Různé časy"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Zadejte začátek a konec pro každé období, jedno období na řádek (HH:MM - HH:"
+"MM)."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Neplatný čas: $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Zadejte prosím alespoň jedno časové období."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Zadejte začátek a konec pro každé období každého dne, jedno období na řádek "
+"(HH:MM - HH:MM)."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Zadejte prosím alespoň jedno časové období pro $day."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr "Mají období jména nebo jsou jednoduše určena časem?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Mají jména"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Určena časem"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Zadejte jména období, jedno na řádek."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Zadejte prosím alespoň $number období."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Ujistěte se prosím, že jména obobí jsou jedinečná."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "Jsou tyto časové posloupnosti stejné každý den nebo jsou různé?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Stejné"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Různé"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Uspořádejte prosím období do správného pořadí:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Určete prosím všechny období."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Následující období byly vybrány více jak jednou: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Uspořádejte prosím období do správného pořadí pro každý den:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period dne $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Neznámé id dne: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Neznámé id období: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Uživatelské jméno:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Změnit jméno osoby, obrázek, nebo heslo"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Spravovat členství tohoto uživatele"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importovat sekce"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Zkomolený řádek ${line_no} (měl by pobsahovat id dne, id období a "
+#~ "volitelně id umístění)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Nenalezených umístění: ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Upravit podrobnosti o uživateli"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Vyučované sekce"
+
+#~ msgid "via group"
+#~ msgstr "skrz skupinu"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Na serveru běží SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; je obchodní "
+#~ "značka The Shuttleworth Foundation. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Moje předvolby"
+
+#~ msgid "Person index"
+#~ msgstr "Seznam osob"
+
+#~ msgid "Add a new person"
+#~ msgstr "Přidat novou osobu"
+
+#~ msgid "New photo"
+#~ msgstr "Nové foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Malý obrázek (48x48 pixelů ve formátu JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Vymazat foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Pro vymazání fotografie tuto položku zaškrtněte"
+
+#~ msgid "New password"
+#~ msgstr "Nové heslo"
+
+#~ msgid "Verify password"
+#~ msgstr "Ověřit heslo"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Hesla nesouhlasí."
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Heslo bylo úspěšně změněno!"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Hesla nesouhlasí!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Vytvořit nové objekty"
+
+#~ msgid "Add events"
+#~ msgstr "Přidat události"
+
+#~ msgid "Control access"
+#~ msgstr "Spravovat přístup"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Autentizovaní uživatelé"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Neautentizovaní uživatelé"
+
+#~ msgid "An error occured."
+#~ msgstr "Vyskytla se chyba."
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Neautentizovaní uživatelé"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Neautentizovaný uživatel"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Autentizovaní uživatelé"
+
+#~ msgid "All Users"
+#~ msgstr "Všichni uživatelé"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: varování: ignorovaná konfigurační volba '%s'"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Použití: %s [volby]\n"
+#~ "Volby:\n"
+#~ "  -c, --config xxx       místo výchozího konfiguračního souboru použije "
+#~ "tento\n"
+#~ "  -h, --help             zobrazí tuto nápovědu\n"
+#~ "  -d, --daemon           po startu přejde na pozadí\n"
+#~ "  -r, --restore-manager  obnoví účet správce s výchozím heslem\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Vítejte na serveru SchoolBell"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Toto není databázový soubor SchoolToolu verze 0.10, přerušuji.\n"
+
+#~ msgid "Nickname:"
+#~ msgstr "Přezdívka:"
+
+#~ msgid "Primary Email:"
+#~ msgstr "Hlavní email:"
+
+#~ msgid "Secondary Email:"
+#~ msgstr "Další email:"
+
+#~ msgid "Primary phone:"
+#~ msgstr "Hlavní telefon:"
+
+#~ msgid "Secondary phone:"
+#~ msgstr "Další telefon:"
+
+#~ msgid "Mailing address:"
+#~ msgstr "Poštovní adresa:"

Added: schooltool/branches/upstream/current/src/schooltool/locales/da/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/da/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/da/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3133 @@
+# Danish translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-11-22 11:54+0000\n"
+"Last-Translator: Dennis Frank Mogensen <dennis at planner4you.net>\n"
+"Language-Team: Danish <da at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Kaldenavn"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Et kort kaldenavn for denne person."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Primær e-mail"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Sekundær e-mail"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Primær telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Foretrukkent telefon nummer."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Sekundær telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Sekundært telefon nummer."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Hjemmeside"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Hjemmeside eller weblog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Post adresse"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personer"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 person"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personer"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Forkert brugernavn eller adgangskode"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Nuværende år"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Tilgængelige grupper"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Marts"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februar"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Maj"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Næste dag"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "I dag"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Forrige dag"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "December"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Mandag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Tirsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Søndag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Lørdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Fredag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Man"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Tir"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Ons"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Tor"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Fre"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Lør"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Søn"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Hele dagen"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Dato"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tidspunkt"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Start tidspunkt i 24 timers format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Varighed"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Varigheds type"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutter"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Timer"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dage"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Sted"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Gentagende"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Gentages hver"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Uge"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Måned"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "År"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Gentag hver"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Interval"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Antal"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Indtil"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "for evigt"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Antal begivenheder"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Gentag indtil"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Ugedage"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Ugedag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Månedligt"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Untagelses datoer"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "samme ugedag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "sidste ugedag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Sidste ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Der er opstået en fejl."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ugyldigt tidspunkt"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Slut dato er tidligere end start dato"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Ugyldig dato. Indtast dato i følgende format: ÅÅÅÅ-MM-DD (en dato per "
+"linje). Eksempel: 2005-05-21"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Tilføj begivenhed"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Tilføj"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Rediger begivenhed"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Opdater"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Opdateret d. ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalendere"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Næste uge"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Aktuel uge"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Forrige uge"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (uge ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Næste måned"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Nuværende måned"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Forrige måned"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Uge ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Næste år"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Nuværende år"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Forrige år"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Ingen data givet"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Kunne ikke konvertere data til unicode (forkert karaktersæt?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV fil importeret."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Der opstod en fejl under importering af CSV fil"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV tekst importeret."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Der opstod en fejl under importering af CSV tekst"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Intet karaktersæt specificeret"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Ukendt karaktersæt"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Fejl i CSV data, linje ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Fejl i konvertering til unicode, linje ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Fejl i CSV data, linje ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Person info: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Ændringer gemt."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "hele dagen"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Sted: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Reserverede ressourcer: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "gentagende"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "overlagt from %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Daglig kalender for %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Ugentlig kalender for %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Uge %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Månedlig kalender for %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Understøttelse af PDF er deaktiveret. Det kan aktiveres af systemets "
+"administrator."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalender for %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Navnet på skolen eller organisation der kører denne server.\n"
+"Dette vil blive vist på den offentlige kalender, i  bunden af alle sider, og "
+"i sidens titel."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Forside kalender"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Vis system kalender som forside af systemet."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Nødvendigt input mangler."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Formular input er ikke et fil objekt"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Ugyldigt heltals data"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Ugyldigt tekst data"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Ugyldigt tekst data"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Ugyldigt unicode data"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Ugyldigt decimaltals data"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Ugyldigt \"datotids\" data (datetime)"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Går i baggrunden, daemon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Kør %s -h for hjælp."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: daemon tilstand ikke understøttet på dit operativ system."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Læser konfiguration fra %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Opstarts tid: %.3f sek real, %.3f sek CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Kunne ikke initialisere databasen:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Måske bruger en anden %s instans den?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Advarsel: kan ikke finde \"reportlab\" biblioteket.\n"
+"PDF understøttelse deaktiveret."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Advarsel: skrifttype mappe '%s' eksisterer ikke.\n"
+"PDF understøttelse deaktiveret."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Advarsel: skrifttype '%s' eksisterer ikke.\n"
+"PDF understøttelse deaktiveret."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Brug: %s [tilvalg]\n"
+"Tilvalg:\n"
+"  -c, --config xxx brug denne konfigurations fil istedet for standard "
+"filen.\n"
+"  -h, --help vis denne hjælpe besked\n"
+"  -d, --daemon gå i baggrunden efter opstart\n"
+"  -r, --restore-manager gendan \"manager\" brugeren med standard password.\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Ingen lagring defineret i konfigurations filen.\n"
+"\n"
+"Hvis du bruger standard konfigurations filen skal du redigere den nu\n"
+"og fjerne kommentar tegnene fra en af ZODB lagrings sektionerne.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, afbryder.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, afbryder.\n"
+"\n"
+"Kør det selvstændige database opgraderings script.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titel"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Notatets titel."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Gruppe"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Varighed"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Dato"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Ressource indeks"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Tilføj ny ressource"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Utilstrækkeligt data givet."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Titler må ikke være tomme."
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Nuværende Grupper"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Tilgængelige grupper"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Nuværende måned"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Tilgængelige grupper"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupper"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Nuværende Grupper"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Tilgængelige grupper"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Resourcer"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importer ressourcer"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Tilgængelige resourcer"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Person indeks"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Tilføj ny person"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Resourcens titel."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Beskrivelse af resourcen."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Beskrivelse af gruppen."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Hjemmeside"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Afbryd"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Ændr info for ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Ændr medlemskab"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Ændr indstillinger for ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Ændr kontakt information for ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Ændr kontakt information for ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Kontakt oplysninger"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Brugernavn"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Adgangskode"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Dette brugernavn er allerede brugt!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Anvend"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Primær telefon"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Forrige"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Begivenheds information"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Kaldenavn"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Starter"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Lør"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Tidszone"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Sekundær telefon"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notater"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Næste"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Antal begivenheder"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "rediger navn"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "rediger navn"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "rediger navn"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Mine indstillinger"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Fuldt navn"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (i JPEG format)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nyt notat"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV tekst importeret."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Adgangskode ændret!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Adgangskode ændret!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Eksempel:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Person oplysninger"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Gruppe indeks"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Tilføj ny gruppe"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Grupper af ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Medlemmer af ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Nuværende medlemmer"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Tilføj medlemmer"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Gruppens titel."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Beskrivelse af gruppen."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Ressource indeks"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Tilføj ny ressource"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Forrige uge"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV tekst importeret."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Adgangskode ændret!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Aktuel uge"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Adgangskode ændret!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Bruger"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Resourcens titel."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Beskrivelse af resourcen."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Starter"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Notatets titel."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Næste uge"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Notatets titel."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Daglig"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Notatets titel."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Indhold"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Notatets indhold"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Privatliv"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "brugernavn må ikke være tomt"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "fuldt navn må ikke være tomt"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Brugernavn eksisterer flere gange: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Ny adgangskode"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Ændr kodeord"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Tidszone"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Tidszone der skal bruges ved visning af din kalender"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Tidsformat"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "TT:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH.MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datoformat"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/ÅÅ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "DD/MM-YYYY"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dag måned, år"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Ugen starter med:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Begynd visning af uger med Søndag eller Mandag"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Vis kalender"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Navn der skal vises"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Ressource indeks"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Tilføj ny ressource"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Ressource indeks"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Tilføj ny ressource"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Resourcens titel."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beskrivelse af resourcen."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Et sted."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Denne ressource er et sted, f.eks. et klasseværelse."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Utilstrækkeligt data givet."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Utilstrækkeligt data givet."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Utilstrækkeligt data givet."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Min kalender"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Mere..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendere"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Velkommen til SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigation"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Brugernavn:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "rediger navn"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Ændr denne persons navn, billede eller kodeord"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Person info: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Administrer denne persons medlemskaber"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "rediger grupper"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, afbryder.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, afbryder.\n"
+"\n"
+"Kør det selvstændige database opgraderings script.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "top"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Ændringer gemt."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Ændr detaljer"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nyt notat"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "elementer"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Tilføj ny person"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Starter"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Untagelses datoer"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+"Ugyldig dato. Indtast dato i følgende format: ÅÅÅÅ-MM-DD (en dato per "
+"linje). Eksempel: 2005-05-21"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Tilføj ny ressource"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} personer"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Notatets indhold"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "samme ugedag"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "rediger navn"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Notat"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Ukendt karaktersæt"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nyt foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Miniature billede (opløsning ca. 48x48 i JPEG format)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Ryd foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Afkryds for at rydde foto"
+
+#~ msgid "Verify password"
+#~ msgstr "Bekræft adgangskode"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Adgangskoderne er ikke ens."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Adgangskoderne er ikke ens!"
+
+#~ msgid "View"
+#~ msgstr "Vis"
+
+#~ msgid "Edit"
+#~ msgstr "Rediger"
+
+#~ msgid "Create new objects"
+#~ msgstr "Opret nye objekter"
+
+#~ msgid "Add events"
+#~ msgstr "Tilføj begivenhed"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Rediger/slet begivenheder"
+
+#~ msgid "Control access"
+#~ msgstr "Opsæt adgang"
+
+#~ msgid "Manage membership"
+#~ msgstr "Administrer medlemskab"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Godkendte brugere"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Ikke-godkendte brugere"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Opsæt adgang"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Ændr indstillinger"
+
+#~ msgid "New Person"
+#~ msgstr "Ny person"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importer personer"
+
+#~ msgid "Add a Group"
+#~ msgstr "Tilføj gruppe"
+
+#~ msgid "New Group"
+#~ msgstr "Ny gruppe"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Rediger gruppe information"
+
+#~ msgid "A Group"
+#~ msgstr "En gruppe"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell gruppe"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Tilføj/fjern medlemmer"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importer grupper"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Tilføj ressource"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Rediger ressource information"
+
+#~ msgid "New Resource"
+#~ msgstr "Ny ressource"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell ressource"
+
+#~ msgid "A Resource"
+#~ msgstr "En ressource"
+
+#~ msgid "Actions"
+#~ msgstr "Handlinger"
+
+#~ msgid "View Calendar"
+#~ msgstr "Vis kalender"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalender (dag)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Kalender (Daglig, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalender (uge)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalender (Ugentlig, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalender (måned)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalender (Månedlig, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalender (år)"
+
+#~ msgid "Atom View"
+#~ msgstr "Atom visning"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Ledig/optaget"
+
+#~ msgid "New Event"
+#~ msgstr "Ny begivenhed"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Åben i iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Rediger begivenhed"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Ændr system indstillinger"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Denne rettighed tillader visning af navne, titler, fotos, objekt lister, "
+#~ "og anden information."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Tillader at redigere navne, titler, beskrivelser, fotos, osv."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Lader brugeren oprette nye personer, grupper og ressourcer."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Tillader visning af person-, gruppe- og ressource-kalendere."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Tillader tilføjning af begivenheder til kalendere."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Tillader redigering og sletning af begivenheder i kalendere."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Adgangs kontrol for ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Tillader brugeren at bruge denne formular (adgangs kontrol)"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Tillader brugeren at tilføje personer, grupper og ressourcer til grupper. "
+#~ "For at tilføje noget til en gruppe, er det kun nødvendigt for brugeren at "
+#~ "have denne rettighed for gruppen. Husk at indmelde i gruppe har "
+#~ "sikkerheds implikationer."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Rettigheder for grupper"
+
+#~ msgid "Access control"
+#~ msgstr "Adgangs kontrol"
+
+#~ msgid "Set Access"
+#~ msgstr "Sæt Adgang"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Rettigheder for brugere"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Rettighederne er arvet fra hierakiet. For eksempel, hvis du har valgt en "
+#~ "\"vis kalender\" rettighed til person indekset for en bruger, vil denne "
+#~ "bruger have rettighed til at se alle personers kalendere. Hvis du kun vil "
+#~ "give brugeren rettighed til at se kalenderen for en bestemt ressource, "
+#~ "kan du vælge \"vis kalender\" rettigheden til ressourcen for brugeren."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr "Herunder er en liste af rettigheds navne og deres betydning."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Ændr system indstillinger"
+
+#~ msgid "General preferences"
+#~ msgstr "Generelle indstillinger"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Rediger system indstillinger"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Begivenheder for"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_beskrivelse"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_aktiveret"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_mere_info"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Gyldigt atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Sted: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Vælg individuelle kalendere til visning"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Hold Ctrl eller Shift nede for at vælge flere kalendere."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Offentlig kalender"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "system kalender"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Vælg kalendere til visning"
+
+#~ msgid "People"
+#~ msgstr "Personer"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Du har ikke adgang til nogen personers kalendere."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Du har ikke adgang til nogen gruppers kalendere."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Du har ikke adgang til nogen resourcers kalendere."
+
+#~ msgid "Showing"
+#~ msgstr "Viser"
+
+#~ msgid "of"
+#~ msgstr "af"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Er du sikker på at du vil slette de valgte punkter?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Du har ikke valgt nogen punkter."
+
+#~ msgid "delete-button"
+#~ msgstr "slet-knap"
+
+#~ msgid "Exception"
+#~ msgstr "Undtagelse"
+
+#~ msgid "Traceback"
+#~ msgstr "Tilbagesporing"
+
+#~ msgid "Server Error"
+#~ msgstr "Server Fejl"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Der er opstået en intern server fejl. Dette betyder højst sandsynligt at "
+#~ "du har fundet en fejl i SchoolBell. Du kan rapportere fejlen på <a href="
+#~ "\"http://issues.schooltool.org\">the issue tracker</a>."
+
+#~ msgid "All day event"
+#~ msgstr "Heldags begivenhed"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Dette er en gentagende begivenhed."
+
+#~ msgid "Ends"
+#~ msgstr "Slutter"
+
+#~ msgid "edit event"
+#~ msgstr "rediger begivenhed"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Ændr detaljer for denne begivenhed"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Planlagte resourcer"
+
+#~ msgid "edit resources"
+#~ msgstr "rediger resourcer"
+
+#~ msgid "delete event"
+#~ msgstr "Slet begivenhed"
+
+#~ msgid "Event details"
+#~ msgstr "Begivenheds detaljer"
+
+#~ msgid "Book Resources"
+#~ msgstr "Reserver resourcer"
+
+#~ msgid "Update form"
+#~ msgstr "Opdater formular"
+
+#~ msgid "day"
+#~ msgstr "dag"
+
+#~ msgid "week"
+#~ msgstr "uge"
+
+#~ msgid "month"
+#~ msgstr "måned"
+
+#~ msgid "year"
+#~ msgstr "år"
+
+#~ msgid "Weekly"
+#~ msgstr "Ugentlig"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr "Denne sektion er kun relevant når ugentlig gentagelse er valgt."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr "Denne sektion er kun relevant når månedlig gentagelse er valgt."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "d. ${monthday}. hver måned"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} hver måned"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} hved måned"
+
+#~ msgid "Repeat"
+#~ msgstr "Gentag"
+
+#~ msgid "times"
+#~ msgstr "gange"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Gentag for evigt"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Reserver resourcer"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Resource reservation for ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Titel:"
+
+#~ msgid "Starts:"
+#~ msgstr "Starter:"
+
+#~ msgid "Ends:"
+#~ msgstr "Slutter:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Dette er en gentagende begivenhed!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Resource reservation"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Konfliktskabende begivenheder"
+
+#~ msgid "Book"
+#~ msgstr "Reserver"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "CSV data <strong>skal</strong> inkludere en gruppe titel og <strong>må</"
+#~ "strong> inkludere en valgfri gruppe beskrivelse. Ekstra information vil "
+#~ "ikke blive brugt."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LUG, Linux Bruger Gruppe\n"
+#~ "Skak Klub\n"
+#~ "Sports Klub, Efter-skole sports klub, <em>tekst efter nr. 2 komma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Det ovenstående eksempel opretter 3 grupper med titlerne 'LUG', 'Skak "
+#~ "Klub', 'Sports Klub'. Den første og sidste gruppe vil have beskrivelserne "
+#~ "'Linux Bruger Gruppe' og 'Efter-skole sports klub'. Gruppen 'Skak Klub' "
+#~ "vil ikke have en beskrivelse, og \"tekst efter nr. 2 komma\" vil blive "
+#~ "ignoreret."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Upload schooltool grupper som CSV"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Upload CSL fil"
+
+#~ msgid "CSV File"
+#~ msgstr "CSV fil"
+
+#~ msgid "Charset:"
+#~ msgstr "Karaktersæt:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Vestlig (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Vestlig (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Vestlig (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Andet (specificér)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Andet karaktersæt: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Indtast CSV Data"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV Data"
+
+#~ msgid "Members"
+#~ msgstr "Medlemmer"
+
+#~ msgid "edit members"
+#~ msgstr "rediger medlemmer"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Ændr personerne som er medlem af denne gruppe."
+
+#~ msgid "Remove"
+#~ msgstr "Fjern"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Du har ikke rettighed til at får adgang til denne side. Du kan klikke på "
+#~ "din browsers \"tilbage\" knap for at gå tilbage, eller bede en bruger med "
+#~ "rettighed om at logge ind."
+
+#~ msgid "Please log in"
+#~ msgstr "Log ind"
+
+#~ msgid "Login"
+#~ msgstr "Brugernavn"
+
+#~ msgid "User Information"
+#~ msgstr "Bruger information"
+
+#, fuzzy
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Din session er udløbet."
+
+#~ msgid "There are none."
+#~ msgstr "Der er ingen."
+
+#~ msgid "submit-button"
+#~ msgstr "send-knap"
+
+#~ msgid "There are none to add."
+#~ msgstr "Der er ikke nogen at tilføje."
+
+#~ msgid "Find Now"
+#~ msgstr "Find nu"
+
+#~ msgid "Clear"
+#~ msgstr "Ryd"
+
+#, fuzzy
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "afbryd-knap"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Hvem kan se dette notat"
+
+#~ msgid "Private"
+#~ msgstr "Privat"
+
+#~ msgid "Public"
+#~ msgstr "Offentlig"
+
+#~ msgid "Add note"
+#~ msgstr "Tilføj notat"
+
+#~ msgid "add-button"
+#~ msgstr "tilfoej-knap"
+
+#~ msgid "Delete"
+#~ msgstr "Slet"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Bemærk venligst følgende:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Du har muligvis indtastet adressen forkert"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Du prøver muligvis at få adgang til en ikke eksisterende side"
+
+#~ msgid "Not Found"
+#~ msgstr "Ikke fundet"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "Siden du prøver at få adgang til er ikke tilgængelig"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "CSV data <strong>skal</strong> indeholde et brugernavn og at fuldt navn. "
+#~ "Et valgfrit kodeord <strong>kan</strong> også inkluderes."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "Det ovenstående eksempel vil oprette tre brugere, 'jjones', 'jbjones' og "
+#~ "'howard'. Af disse tre vil kun 'jbjones' have et kodeord ('r2m45J'), og "
+#~ "kun denne bruger vil kunne logge ind. Bemærk at kodeordene skal sendes "
+#~ "som ren tekst."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Upload schooltool personer som CSV"
+
+#~ msgid "Details"
+#~ msgstr "Detaljer"
+
+#~ msgid "edit details"
+#~ msgstr "rediger detaljer"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Rediger denne persons detaljer"
+
+#~ msgid "Add person"
+#~ msgstr "Tilføj person"
+
+#~ msgid "Add to groups"
+#~ msgstr "Tilføj til grupper"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Du kan ikke slette din egen bruger konto."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Rediger kontakt oplysninger"
+
+#~ msgid "Edit person"
+#~ msgstr "Rediger person"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Kalender indstillinger"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Rediger person indstillinger"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Du forsøger at slette en gentagende begivenhed."
+
+#~ msgid "Current"
+#~ msgstr "Nuværende"
+
+#~ msgid "Future"
+#~ msgstr "Fremtid"
+
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Sletter en gentagende begivenhed (${event_title})"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "CSV data <strong>skal</strong> indeholde en resource titel og <strong>må</"
+#~ "strong> indeholde en valgfri resource beskrivelse. Ekstra information vil "
+#~ "ikke blive brugt."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Hoved Auditorium\n"
+#~ "LC-805, Bærbar Computer #805, <em>tekst efter nr. 2 komma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Det ovenstående eksempel vil oprette 3 resourcer med titlerne 'PRJ302', "
+#~ "'Hoved Auditorium' og 'LC-805'. Den første og sidste resource vil have "
+#~ "beskrivelserne 'Overhead Projector #302' og 'Bærbar Computer #805'. "
+#~ "\"Hoved Auditorium\" resourcen vil ikke have nogen beskrivelse, og "
+#~ "\"tekst efter nr. 2 komma\" vil blive ignoreret."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Upload schooltool resourcer som CSV"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "Der er ${num_errors} fejl."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Indentifikation (valgfri)"
+
+#~ msgid "Printable version"
+#~ msgstr "Udskriftsvenlig version"
+
+#, fuzzy
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Vis daglig kalender"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Vis ugentlig kalender"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Vis månedlig kalender"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Vis årlig kalender"
+
+#~ msgid "Yearly"
+#~ msgstr "Årlig"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Kalender for ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Spring til ..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Begivenheder for imorgen"
+
+#~ msgid "Log in"
+#~ msgstr "Log ind"
+
+#~ msgid "User:"
+#~ msgstr "Bruger:"
+
+#~ msgid "Log Out"
+#~ msgstr "Log af"
+
+#~ msgid "Edit Info"
+#~ msgstr "Rediger info"
+
+#~ msgid "Add Event"
+#~ msgstr "Tilføj begivenhed"
+
+#~ msgid "Modify Event"
+#~ msgstr "Rediger begivenhed"
+
+#~ msgid "Set up access"
+#~ msgstr "Indstil adgang"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Ikke-godkendte brugere"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Ikke-godkent bruger"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Godkendte brugere"
+
+#~ msgid "All Users"
+#~ msgstr "Alle brugere"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: advarsel: ignorerer konfigurations indstilling '%s'"

Added: schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3152 @@
+# German translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-09-27 13:00+0000\n"
+"Last-Translator: Voyager <fischer.sebastian at gmail.com>\n"
+"Language-Team: German <de at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Spitzname"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Ein kurzer Spitzname für diese Person."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Erste eMail Adresse"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Zweite eMail Adresse"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Erstes Telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Empfohlene Telefonnummer"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Zweites Telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Zweite Telefonnummer"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Internetseite"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Internetseite oder Weblog."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Anschrift"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personen"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "eine Person"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} Personen"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Benutzername oder Passwort falsch."
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Dieses Jahr"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Verfügbare Gruppen"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "März"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februar"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Morgen"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Heute"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Gestern"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Dezember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Montag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Samstag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Freitag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Mo"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Di"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Mi"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Do"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Fr"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sa"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "So"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Den ganzen Tag"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Zeit"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Starzeit im 24-Stunden-Format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Dauer"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Art der Dauer"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuten"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Stunden"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Tage"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Ort"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Beschreibung"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Wiederkehrend"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Wiederholt sich alle/jeden"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Tag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Woche"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Monat"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Jahr"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Wiederholen jeden"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Bereich"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Anzahl"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "bis"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "für immer"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Anzahl der Ereignisse"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Wiederholen bis"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Wochentage"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Wochentag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "monatlich"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Ausnahme Termine"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "selber Wochentag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "erster"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "vierter"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "dritter"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "zweiter"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "fünfter"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "letzter Wochentag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Letzter ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Ein Fehler trat auf."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ungültige Zeit"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Enddatum ist vor dem Startdatum"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Ungültiges Datum.\n"
+"Format ist: JJJJ-MM-TT, eines pro Zeile"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Ereignis hinzufügen"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Update"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Updated am ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalender"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Nächste Woche"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Diese Woche"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Letzte Woche"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month} ${year} (Woche ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Nächster Monat"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Dieser Monat"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Letzter Monat"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Woche ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Nächstes Jahr"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Dieses Jahr"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Letztes Jahr"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Keine Daten angegeben"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Konnte Daten nicht nach Unicode umwandeln (falscher Zeichensatz?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV Datei erfolgreich importiert"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Konnte CSV Datei nicht importieren"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV Text erfolgreich importiert"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Konnte CSV Text nicht importieren"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Kein Zeichenset angegeben"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Unbekannter Zeichensatz"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Fehler in der CSV-Datei, Zeile ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Umwandlung in unicode schlug in Zeile ${line_no} fehl."
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Fehler in der CSV-Datei, Zeile ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Personen Info: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Änderungen gespeichert"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "jeden Tag"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Ort: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Reservierte Hilfsmittel: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "wiederkehrend"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "belegt von %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Täglicher Kalender für %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Wöchentlicher Kalender für %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Woche %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Monatlicher Kalender für %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"PDF ist nicht freigegeben, kann aber durch ihren Administrator "
+"freigeschaltet werden."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalender für %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Der Name für die Schule oder Organisation,\n"
+"            die diesen Server betreibt. Dieser wird im öffentlichen "
+"Kalender,\n"
+"            am Ende aller Seiten und im Seitentitel dargestellt."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Startseiten Kalender"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Erforderliche Eingabe fehlt."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Formular Eingabe ist kein Datei-Objekt"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Ungültige Zahl"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Ungültiger Text"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Ungültige Zeichen"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Ungültige Unicode-Daten"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Ungültiger Gleitkommawert"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Ungültiges Datums oder Zeit"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Backgroupn Modus gestartet, Deamon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Verwenden Sie %s -h für Hilfe."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: Hintergrund-Modus wird von ihrem Betriebssystem nicht unterstützt."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Konfiguration von %s einlesen"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Startzeit: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Datenbank konnte nicht initialisiert werden:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Wird es vielleicht von einer anderen %s Instanz verwendet?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Achtung: Die reportlab Bibliothek konnte nicht gefunden werden.\n"
+"PDF Unterstützung ist abgeschaltet."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Achtung: Zeichensatz-Verzeichnis '%s' existiert nicht.\n"
+"PDF Unterstützung ist abgeschaltet."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Achtung: Schriftsatz '%s' existiert nicht.\n"
+"PDF Unterstützung ist abgeschaltet."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Aufruf: %s [Optionen]\n"
+"Optionen:\n"
+"  -c, --config xxx verwendet diese Konfigurationsdatei statt der "
+"Standardkonfiguration\n"
+"  -h, --help zeigt diesen Hilfetext an\n"
+"  -d, --daemon Programm geht nach dem Start in den Hintergrund\n"
+"  -r, --restore-manager stellt die Manager Benutzerkennung mit dem "
+"Standardpasswort wieder her\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Es wurde kein Speicher in der Konfigurationsdatei festgelegt.\n"
+"\n"
+"Wenn Sie die Standardkonfigurationsdatei verwenden, dann editieren Sie diese "
+"jetzt und\n"
+"entfernen Sie die Kommentarzeichen bei einer der 'ZODB Storage' Abschnitte.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dies ist keine SchoolBell 1.0 Datenbank, abbruch.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Abgebrochen, Dies ist keine SchoolBell 1.0 Datenbank.\n"
+"\n"
+"Bitte führen Sie das Upgrade-Skript für die Datenbank aus.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titel"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Überschrift der Notiz."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Gruppe"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Dauer"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Datum"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Neue Quelle hinzufügen"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Nicht genügend Daten angegeben"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Titel dürfen nicht leer sein"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Derzeitige Gruppen"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Verfügbare Gruppen"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Dieser Monat"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Verfügbare Gruppen"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Gruppen"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Derzeitige Gruppen"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Verfügbare Gruppen"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Quellen"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Quellen importieren"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Vorhandene Quellen"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Personenverzeichnis"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Neue Person hinzufügen"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Name des Hilfsmittels."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Beschreibung des Hilfsmittels."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Beschreibung der Gruppe."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Internetseite"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Abrechen"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Informationen für ${user} verändern"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Mitgliedschaft ändern"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Einstellungen für ${user} ändern."
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Kontaktinformationen für ${user} ändern"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Kontaktinformationen für ${user} ändern"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Kontaktinformationen"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Benutzername"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Passwort"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Dieser Benutzername existiert bereits."
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Anwenden"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Erstes Telefon"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Voriger"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Ereignisinformationen"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Spitzname"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Anfang"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sa"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Zeitzone"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Zweites Telefon"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notizen"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Nächster"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Anzahl der Ereignisse"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Name ändern"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Name ändern"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "Name ändern"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Meine Einstellungen"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Name"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (im JPEG-Format)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Neue Notiz"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV Text erfolgreich importiert"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Passwort erfolgreich geändert."
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Passwort erfolgreich geändert."
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Beispiel:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Personen Information"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Gruppenverzeichnis"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Neue Gruppe hinzufügen"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Gruppen von ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Mitglieder von ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Derzeitige Mitglieder"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Mitglieder hinzufügen"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Name der Gruppe."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Beschreibung der Gruppe."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Neue Quelle hinzufügen"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Letzte Woche"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV Text erfolgreich importiert"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Passwort erfolgreich geändert."
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Diese Woche"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Passwort erfolgreich geändert."
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Benutzer"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Name des Hilfsmittels."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Beschreibung des Hilfsmittels."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Anfang"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Überschrift der Notiz."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Nächste Woche"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Überschrift der Notiz."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Täglich"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Überschrift der Notiz."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Textkörper"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Textkörper der Notiz"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Privatsphäre"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Benutzername muss angegeben werden"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Vollständiger Name muss angegeben werden"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Doppelter Benutzername: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Neues Passwort"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Passwort ändern"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Zeitzone"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Zeitzone für Ihren Kalender"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Zeitformat"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "SS:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "SS:MM vm/nm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datumsformat"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/TT/JJ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "JJJJ-MM-TT"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Tag Monat, Jahr"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Die Woche beginnt mit:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Wochenbeginn mit Sonntag oder Montag anzeigen"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Kalender anzeigen."
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Name, der angezeigt werden soll"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Neue Quelle hinzufügen"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Neue Quelle hinzufügen"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Name des Hilfsmittels."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beschreibung des Hilfsmittels."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Ein Ort."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Hinweis: diese Quelle ist ein Ort, beispielsweise ein Klassenzimmer."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Nicht genügend Daten angegeben"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Nicht genügend Daten angegeben"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Nicht genügend Daten angegeben"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Mein Kalender"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Mehr..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalender"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Willkommen bei SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigation"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Benutzername:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "Name ändern"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Name, Bild oder Passwort der Person ändern"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Personen Info: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Die Mitgliedschaft dieser Person verwalten"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "Gruppen editieren"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dies ist keine SchoolBell 1.0 Datenbank, abbruch.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Abgebrochen, Dies ist keine SchoolBell 1.0 Datenbank.\n"
+"\n"
+"Bitte führen Sie das Upgrade-Skript für die Datenbank aus.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "oben"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Änderungen gespeichert"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Details ändern"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Neue Notiz"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "Einträge"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Neue Person hinzufügen"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Anfang"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Ausnahme Termine"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+"Ungültiges Datum.\n"
+"Format ist: JJJJ-MM-TT, eines pro Zeile"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Neue Quelle hinzufügen"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} Personen"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Textkörper der Notiz"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "selber Wochentag"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "Name ändern"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Notiz"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Unbekannter Zeichensatz"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Neues Foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Ein kleines Foto (ungefähr 48x48 Pixel im JPEG-Format)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Foto löschen"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Klicken sie hier um das Foto zu löschen."
+
+#~ msgid "Verify password"
+#~ msgstr "Passwort wiederholen"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Passwörter stimmen nicht überein."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Passwörter stimmen nicht überein."
+
+#~ msgid "View"
+#~ msgstr "Ansicht"
+
+#~ msgid "Edit"
+#~ msgstr "Bearbeiten"
+
+#~ msgid "Create new objects"
+#~ msgstr "Neue Objekte anlegen"
+
+#~ msgid "Add events"
+#~ msgstr "Ereignisse hinzufügen"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Ereignisse bearbeiten/löschen"
+
+#~ msgid "Control access"
+#~ msgstr "Zugriffskontrolle"
+
+#~ msgid "Manage membership"
+#~ msgstr "Mitgliedschaft verwalten."
+
+#~ msgid "Authenticated users"
+#~ msgstr "Bestätigte Benutzer"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Unbestätigte Benutzer"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Zugang einrichten"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Einstellungen ändern"
+
+#~ msgid "New Person"
+#~ msgstr "Neue Person"
+
+#~ msgid "Import Persons"
+#~ msgstr "Personen importieren"
+
+#~ msgid "Add a Group"
+#~ msgstr "Gruppe hinzufügen"
+
+#~ msgid "New Group"
+#~ msgstr "Neue Gruppe"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Gruppeninformation bearbeiten"
+
+#~ msgid "A Group"
+#~ msgstr "Eine Gruppe"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell Gruppe"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Mitglieder hinzufügen/entfernen"
+
+#~ msgid "Import Groups"
+#~ msgstr "Gruppen importieren"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Quelle hinzufügen"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Quelleninformation bearbeiten"
+
+#~ msgid "New Resource"
+#~ msgstr "Neue Quelle"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell Quelle"
+
+#~ msgid "A Resource"
+#~ msgstr "Eine Quelle"
+
+#~ msgid "Actions"
+#~ msgstr "Aktionen"
+
+#~ msgid "View Calendar"
+#~ msgstr "Kalender anzeigen"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalender (Tagesübersicht)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Kalender (täglich, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalender (Wochenübersicht)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalender (Wochenübersicht, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalender (Monatsübersicht)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalender (Monatlich, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalender (Jahresübersicht)"
+
+#~ msgid "Atom View"
+#~ msgstr "Atom anzeigen"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Verfügbarkeit"
+
+#~ msgid "New Event"
+#~ msgstr "Neues Ereignis"
+
+#~ msgid "Open in iCal"
+#~ msgstr "In iCal öffnen"
+
+#~ msgid "Edit Event"
+#~ msgstr "Ereignis bearbeiten"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Ändere Seiteneinstellungen"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Diese Zulassung erlaubt es Namen, Überschriften, Fotos, Listen von "
+#~ "Objekten und andere Informationen anzusehen."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr ""
+#~ "Erlaubt ihnen Namen, Überschriften, Beschreibungen, Fotos, etc. zu "
+#~ "editieren."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Lässt den Benutzer neue Personen, Gruppen und Quellen anlegen"
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Erlaubt die Ansicht der Kalender von Personen, Gruppen und Quellen"
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Erlaubt das hinzufügen von neuen Ereignissen"
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Erlaubt das ändern und löschen von Ereignissen"
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Zugriffskontrolle für ${title}."
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr ""
+#~ "Erlaubt dem Benutzer das Verwenden des Formulars (Zugriffskontrolle)"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Erlaubt dem Benutzer das hinzufügen von Personen, Gruppen und "
+#~ "Hilfsmitteln zu Gruppen. Bevor der Benutzer einer Gruppe etwas hinzufügen "
+#~ "kann, benötigt der Benutzer diese Berechtigung für die Gruppe. Bitte "
+#~ "beachten sie, dass der Beitritt einer Gruppe Sicherheitsfragen nach sich "
+#~ "zieht."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Berechtigung für Gruppen"
+
+#~ msgid "Access control"
+#~ msgstr "Zugriffskontrolle"
+
+#~ msgid "Set Access"
+#~ msgstr "Zugang einrichten"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Berechtigung für Benutzer"
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "Nachfolgend ist eine Liste von Zulassungsnamen, mit ihren jeweiligen "
+#~ "Bedeutungen."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Seiteneinstellungen ändern"
+
+#~ msgid "General preferences"
+#~ msgstr "Allgemeine Einstellungen"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Seiteneinstellungen editieren"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Ereignisse für"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_description"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_enabled"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_more_info"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Meine Atom Einspeisung überprüfen"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Gültiges Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Ort: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Zusätzliche Kalender zum anzeigen auswählen"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr ""
+#~ "Drücken sie die  Ctrl- oder Umschalttaste, um mehrere Kalender "
+#~ "auszuwählen."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Öffentlicher Kalender"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Kalender die angezeigt werden sollen auswählen"
+
+#~ msgid "People"
+#~ msgstr "Personen"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Es gibt keine Personen mit Kalendern die ihnen zugänglich sind."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Es gibt keine Gruppen mit Kalendern die ihnen zugänglich sind."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Es gibt keine Hilfsmittel mit Kalendern die ihnen zugänglich sind."
+
+#~ msgid "Showing"
+#~ msgstr "Zeige"
+
+#~ msgid "of"
+#~ msgstr "von"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Sollen die ausgewählten Objekte wirklich gelöscht werden ?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Sie haben keine Objekte ausgewählt."
+
+#~ msgid "delete-button"
+#~ msgstr "Löschen"
+
+#~ msgid "Exception"
+#~ msgstr "Ausnahme"
+
+#~ msgid "Traceback"
+#~ msgstr "Zurückverfolgung"
+
+#~ msgid "Server Error"
+#~ msgstr "Server Fehler"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Es ist ein interner Server-Fehler aufgetreten. Dies bedeutet "
+#~ "höchstwahrscheinlich, dass sie einen Fehler (Bug) in SchoolBell gefunden "
+#~ "haben. Bitte melden sie diesen Fehler der <a href=\"http://issues."
+#~ "schooltool.org\">SchoolBell Problemverfolgung</a>."
+
+#~ msgid "All day event"
+#~ msgstr "Ganztägiges Ereignis"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Dies iste ein wiederkehrendes Ereignis."
+
+#~ msgid "Ends"
+#~ msgstr "Ende"
+
+#~ msgid "edit event"
+#~ msgstr "Ereignis ändern"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Die Details des Ereignises ändern"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Terminierte Quellen"
+
+#~ msgid "edit resources"
+#~ msgstr "Ereignis ändern"
+
+#~ msgid "delete event"
+#~ msgstr "Ereignis löschen"
+
+#~ msgid "Event details"
+#~ msgstr "Ereignis Details"
+
+#~ msgid "Book Resources"
+#~ msgstr "Hilfsmittel reservieren"
+
+#~ msgid "Update form"
+#~ msgstr "Schulklasse aktualisieren"
+
+#~ msgid "day"
+#~ msgstr "Tag"
+
+#~ msgid "week"
+#~ msgstr "Woche"
+
+#~ msgid "month"
+#~ msgstr "Monat"
+
+#~ msgid "year"
+#~ msgstr "Jahr"
+
+#~ msgid "Weekly"
+#~ msgstr "Wöchentlich"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr ""
+#~ "Dieser Abschnitt kommt erst zum Einsatz, wenn wöchentliches Wiederkehr "
+#~ "aktiviert ist."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr ""
+#~ "Dieser Abschnitt gilt nur, wenn wöchentliche Wiederholungen aktiviert "
+#~ "sind."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Tag ${monthday} in jedem Monat"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} in jedem Monat"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} in jedem Monat"
+
+#~ msgid "Repeat"
+#~ msgstr "Wiederholen"
+
+#~ msgid "times"
+#~ msgstr "Zeiten"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Unendlich wiederholen"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Hilfsmittel reservieren"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Hilfsmittel Reservierung für ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Überschrift:"
+
+#~ msgid "Starts:"
+#~ msgstr "Beginnt:"
+
+#~ msgid "Ends:"
+#~ msgstr "Endet:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Dies ist ein wiederkehrendes Ereignis !"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Hilfsmittel Reservierung"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Überschneidende Ereignisse"
+
+#~ msgid "Book"
+#~ msgstr "Buch"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "CSV Daten <strong>müssen</strong> eine Gruppennamen und <strong>können</"
+#~ "strong> eine optionale Gruppenbeschreibung beinhalten. Alle weiteren "
+#~ "Informationen werden verworfen."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Schachclub\n"
+#~ "Sportclub, Außerschulischer Sportclub, <em>text nach dem zweiten Komma</"
+#~ "em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Das obere Beispiel erstellt drei Gruppen mit den Namen 'LUG', 'Schach "
+#~ "Club' and 'Sport Club'.Die erste und die letzte Gruppe haben jeweils die "
+#~ "Beschreibungen 'Linux Users Group' und 'Nachmittags Sport Club'. Der "
+#~ "'Schach Club' wird keine Beschreibung erhalten und der Zusatz 'Text nach "
+#~ "dem zweiten Komma' der dritten Gruppe wird ignoriert werden."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Schooltool-Gruppen als CSV hochladen"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "CSV-Datei hochladen"
+
+#~ msgid "CSV File"
+#~ msgstr "CSV-Datei"
+
+#~ msgid "Charset:"
+#~ msgstr "Zeichensatz:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Westlich (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Westlich (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Westlich (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Andere (bitte angeben)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Anderer Zeichennsatz: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "CSV Daten eingeben"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV Daten"
+
+#~ msgid "Members"
+#~ msgstr "Mitglieder"
+
+#~ msgid "edit members"
+#~ msgstr "Mitglieder bearbeiten"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Personen ändern, die Mitglied dieser Gruppe sind."
+
+#~ msgid "Remove"
+#~ msgstr "Entfernen"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Sie sind nicht berechtigt auf diese Seite zuzugreifen. Verwenden Sie den "
+#~ "Zurück-Knopf in Ihrem Browser oder fragen Sie einen previligierteren "
+#~ "Benutzer, um sich anzumelden."
+
+#~ msgid "Please log in"
+#~ msgstr "Bitte melden sie sich an"
+
+#~ msgid "Login"
+#~ msgstr "Anmelden"
+
+#~ msgid "User Information"
+#~ msgstr "Benutzerinformationen"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Ihre Sitzung ist abgelaufen."
+
+#~ msgid "There are none."
+#~ msgstr "Es gibt keine"
+
+#~ msgid "submit-button"
+#~ msgstr "Abschicken"
+
+#~ msgid "There are none to add."
+#~ msgstr "Es gibt keine zum hinzufügen"
+
+#~ msgid "Find Now"
+#~ msgstr "Jetzt finden"
+
+#~ msgid "Clear"
+#~ msgstr "Löschen"
+
+#~ msgid "cancel-button"
+#~ msgstr "Abbrechen"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Wer darf diese Notiz sehen"
+
+#~ msgid "Private"
+#~ msgstr "Privat"
+
+#~ msgid "Public"
+#~ msgstr "Öffentlich"
+
+#~ msgid "Add note"
+#~ msgstr "Notiz hinzufügen"
+
+#~ msgid "add-button"
+#~ msgstr "Hinzufügen"
+
+#~ msgid "Delete"
+#~ msgstr "Löschen"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Bitte beachten sie folgendes:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Möglicherweise haben sie die URL falsch geschrieben"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Sie versuchen, eine nichtexistierende Seite aufzurufen"
+
+#~ msgid "Not Found"
+#~ msgstr "Nicht gefunden"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "Die Seite, die Sie versuchen aufzurufen, ist nicht verfügbar"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "CSV Daten <strong>müssen</strong> einen Benutzernamen und einen "
+#~ "vollständigen Namen (Vorname Nachname) beinhalten. Ein optionales "
+#~ "Passwort <strong>kann</strong> ebenfalls vorhanden sein."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "Das obere Beispiel erstellt drei Benutzer mit den Namen 'jjones', "
+#~ "'jbjones' und 'howard'. Von den dreien hat nur 'jbjones' ein Passwort "
+#~ "('r2m45J') und kann sich im System anmelden. Beachten sie bitte, dass das "
+#~ "Passwort als unformatierter Text übermittelt werden muss."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Schooltool Personen als CSV hochladen"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "edit details"
+#~ msgstr "Detailinformationen bearbeiten"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Detailinformationen von dieser Person bearbeiten"
+
+#~ msgid "Add person"
+#~ msgstr "Person hinzufügen"
+
+#~ msgid "Add to groups"
+#~ msgstr "Zu den Gruppen hinzufügen"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Entschuldigung, sie können nicht ihr eigenes Benutzerkonto löschen."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Kontaktinformationen bearbeiten"
+
+#~ msgid "Edit person"
+#~ msgstr "Person bearbeiten"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Kalendereinstellungen"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Personeneinstellungen bearbeiten"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Sie versuchen ein wiederkehrendes Ereignis zu löschen"
+
+#~ msgid "Current"
+#~ msgstr "Aktuell"
+
+#~ msgid "Future"
+#~ msgstr "Zukünftige"
+
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Ein wiederkehrendes Ereignis löschen (${event_title})"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "CSV Daten <strong>müssen</strong> eine Hilfsmittel-Überschrift haben und "
+#~ "<strong>können</strong> eine optionale Hilfsmittel-Beschreibung "
+#~ "beinhalten. Alle zusätzlichen Informationen werden verworfen."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Aula\n"
+#~ "LC-805, Laptop Computer #805, <em>Text nach dem zweiten Komma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Das obere Beispiel wird drei Hilfsmittel mit den Namen 'PRJ302', 'Aula' "
+#~ "und 'LC-805' erstellen. Das erste und das letzte Hilfsmittel haben "
+#~ "jeweils die Beschreibungen 'Tageslicht Projektor #302' und 'Laptop "
+#~ "Computer #805'. Die 'Aula' erhält keine Beschreibung und der \"Text nach "
+#~ "dem zweiten Komma\" des dritten Hilfsmittels wird ignoriert werden."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Schooltool Hilfsmittel als CSV hochladen"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "${num_errors} Eingabefehler traten auf"
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Kennung (optional)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server auf dem SchoolBell läuft <span>"
+#~ "${DYNAMIC_CONTENT}</span> &copy; The Shuttleworth Foundation 2003 - "
+#~ "<span>2005</span>:  Soziale Innovationen fördern. </p> <p> "
+#~ "SchoolTool&trade; is a Schutzmarke der Shuttleworth Foundation. </p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Druckbare Version"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Täglichen Kalender anzeigen"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Wöchentlichen Kalender anzeigen"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Monatlichen Kalender anzeigen"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Jährlichen Kalender anzeigen"
+
+#~ msgid "Yearly"
+#~ msgstr "Jährlich"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Kalender für ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Wechseln zu..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Morgige Ereignisse"
+
+#~ msgid "Log in"
+#~ msgstr "Anmelden"
+
+#~ msgid "User:"
+#~ msgstr "Benutzer:"
+
+#~ msgid "Log Out"
+#~ msgstr "Abmelden"
+
+#~ msgid "Edit Info"
+#~ msgstr "Info bearbeiten"
+
+#~ msgid "Add Event"
+#~ msgstr "Ereignis hinzufügen"
+
+#~ msgid "Modify Event"
+#~ msgstr "Ereignis beenden"
+
+#~ msgid "Set up access"
+#~ msgstr "Zugang einrichten"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Unbeglaubigter Benutzer"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Unbeglaubigter Benutzer"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Beglaubigter Benutzer"
+
+#~ msgid "All Users"
+#~ msgstr "Alle Benutzer"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: warnung: Option der Konfiguration '%s' ignoriert"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/de/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5246 @@
+# German translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-07-18 08:50+0000\n"
+"Last-Translator: turbo24prg <turbo24prg at web.de>\n"
+"Language-Team: German <de at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Benutzername"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Ein kurzer Benutzername dieser Person."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "E-Mail, primär"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Zweite Email"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Erste Telefonnummer"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Bevorzugte Telefonnummer."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Zweite Telefonnummer"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Zweite Telefonnummer."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Webseite"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Webseite oder Weblog."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "eMail Adresse"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personen"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "Eine Person"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} Personen"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Der Benutzername oder das Passwort ist falsch."
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "März"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februar"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Morgen"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Heute"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Gestern"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Dezember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Montag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Samstag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Freitag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Mon"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Die"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Mi"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Do"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Fr"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sa"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "So"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Überschrift"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Ganzer Tag"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Zeit"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Startzeit im 24-Stunden-Format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Dauer"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Art der Dauer"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuten"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Stunden"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Tage"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Standort"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Beschreibung"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Wiederkehrend"
+
+#: /src/schooltool/app/browser/cal.py:1698
+#, fuzzy
+msgid "Recurs every"
+msgstr "Wiederholt sich alle/jeden"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Tag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Woche"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Monat"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Jahr"
+
+#: /src/schooltool/app/browser/cal.py:1707
+#, fuzzy
+msgid "Repeat every"
+msgstr "Wiederhol jeden"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Bereich"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Anzahl"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "bis"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "endlos"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Anzahl der Ereignisse"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Wiederholen bis"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Wochentags"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Wochentag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "monatlich"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Nicht am:"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "selber Wochentag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+#, fuzzy
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "letzter Wochentag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Letzter ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Ein Fehler ist aufgetreten."
+
+#: /src/schooltool/app/browser/cal.py:1914
+#, fuzzy
+msgid "Invalid time"
+msgstr "Ungültige Zeit"
+
+#: /src/schooltool/app/browser/cal.py:1935
+#, fuzzy
+msgid "End date is earlier than start date"
+msgstr "Das Enddatum liegt zeitlich vor dem Anfangsdatum"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Ungültiges Datum.\r\n"
+"Format ist: JJJJ-MM-TT, eines pro Zeile"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Ereignis hinzufügen"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#, fuzzy
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+#, fuzzy
+msgid "Update"
+msgstr "Aktualisieren"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Aktualisiert am ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalender"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Nächste Woche"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Aktuelle Woche"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Letzte Woche"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month} ${year} (Woche ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Nächster Monat"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Aktueller Monat"
+
+#: /src/schooltool/app/browser/cal.py:908
+#, fuzzy
+msgid "Previous month"
+msgstr "Letzter Monat"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Woche ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Nächstes Jahr"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Aktuelles Jahr"
+
+#: /src/schooltool/app/browser/cal.py:956
+#, fuzzy
+msgid "Previous year"
+msgstr "Letztes Jahr"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Aktionen"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Ansicht"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Ereignis hinzufügen"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Einloggen"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigation"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Aktionen"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Keine Daten angegeben"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Konnte Daten nicht nach Unicode umwandeln (falsches charset?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV Datei erfolgreich importiert"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Konnte CSV Datei nicht importieren"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV Text erfolgreich importiert"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Konnte CSV Text nicht importieren"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Keinen Zeichensatz angegeben"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Unbekannter Zeichensatz"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Fehler in der CSV-Datei, Zeile ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Umwandlung in unicode schlug in Zeile ${line_no} fehl."
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Reihe 2 ist nicht leer"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Unvollständige Sektionsbeschreibung in Zeile ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Die erste Zeile der CSV Datei muss eine Schuljahresabschnitt-Id und eine "
+"Stundenplanübersicht-Id beinhalten."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Der Ausdruck ${term} existiert nicht."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Das Stundenplanschema ${scheme} existiert nicht."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Fehler in den CSV Stundenplandaten, Zeile ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Die Tag-Ids im ausgewählten Schema sind nicht definiert: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Die Zeiträume in den ausgewählten Tagen sind nicht definiert: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Personen nicht gefunden: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Kurse nicht gefunden: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Sektion nicht gefunden: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Ungültiger Eintrag: ${args}"
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Änderungen übernommen."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "Jeden Tag"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Standort: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Gebuchte Quellen: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "wiederkehrend"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "belegt von %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Tageskalender für %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Wochenkalender für %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Woche %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Monatskaleender für %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Die PDF-Unterstützung wurde deaktiviert. Ein Administrator kann sie wieder "
+"aktivieren."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Einstellungen ändern"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Kalender Einstellungen"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Kalender Einstellungen"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Personeneinstellungen bearbeiten"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Personeneinstellungen bearbeiten"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Beschreibung"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Gehe zu ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Morgige Veranstaltungen"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Druckversion"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Tageskalender ansehen"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Täglich"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Wochenkalender ansehen"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Monatskalender ansehen"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Jahreskalender ansehen"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Jährlich"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Kalender für ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Persönlicher Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Stundenplankalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Mein Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Weitere ..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Kalender ansehen"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Wochenkalender für %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "Löschen"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "Abbrechen"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Entfernen"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Keine vorhanden."
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Jetzt suchen"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Säubern"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Niemand zum hinzufügen."
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Ereignis hinzufügen"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Details"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Sa"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Lehrer für diesen Bereich ändern."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Gebuchte Quellen: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "Gruppen bearbeiten"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Termin bearbeiten/löschen"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Unterteilung bearbeiten"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "Details bearbeiten"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Quellen"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Aktualisieren"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Heute"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Woche"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Monat"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Jahr"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Wiederholen bis"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Zeit"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Kalender ansehen"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Wiederhol jeden"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Gebuchte Quellen: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Personeninfo: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Überschrift"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Sa"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "Standort ändern"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Kurse"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Willkommen im SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Unterteilung bearbeiten"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Einloggen"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "wiederkehrend"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Ganzer Tag"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Andere (bitte angeben)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Anderer Zeichensatz: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "CSV Daten eingeben"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV Daten"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "Abschicken"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Stundenpläne importieren"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Sie können eine CSV Datei in einer Tabellenkalkulation anlegen und diese im "
+"CSV Format (Comma-Seperated Values, durch Kommas getrennte Werte) "
+"exportieren. Die Struktur dieser Tabelle ist unten beschrieben."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"Die erste Reihe der Datei muß den Namen des <strong>term</strong> und des "
+"<strong>Stundenplan-Schemas</strong > enthalten, die für die neuen "
+"Stundenpläne verwendet werden.  Die zweite Reihe sollte leer sein.  Nach "
+"diesem können einige Abschnittbeschreibungen folgen. Sie werden durch eine "
+"leere Linie getrennt."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+#, fuzzy
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+"Die erste Reihe der Beschreibung einer Lerneinheit enthält den <strong>Kurs-"
+"Schlüssel</strong> sowie den <strong>Ausbilder-Schlüssel</strong> für die "
+"neue Lerneinheit. Danach folgen eine Anzahl Zeilen, die jeweils einen "
+"<strong>Tages-Schlüssel</strong>, einen <strong>Zeitblock-Schlüssel</strong> "
+"und optional einen <strong>Orts-Schlüssel</strong> enthalten. Die Liste der "
+"Zeiten wird in der ersten Spalte (der nächsten Zeile) durch drei Sterne "
+"('***') abgeschlossen. Nach diesem Abschlusszeichen kann eine beliebige "
+"Anzahl von <strong>Personen-Schlüssel</strong> folgen, die dieser "
+"Lerneinheit als Kursteilnehmer zugeordnet werden."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "SchoolTool Stundenpläne als CSV hochladen"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Beispiel:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"Herbst-2005\",\"Drei-Tage\"\n"
+"\"\",\"\",\"\"\n"
+"\"Philosophie\",\"lorch\"\n"
+"\"Montag\",\"A\",\"Raum 137\"\n"
+"\"Montag\",\"B\"\n"
+"\"Dienstag\",\"C\",\"Raum 138\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"Literatur\",\"guzman\"\n"
+"\"Mittwoch\",\"B\"\n"
+"\"Mittwoch\",\"C\",\"Raum 139\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"Das vorstehende Beispiel erzeugt zwei neue Lerneinheiten, eine im Fach "
+"Philosophie und eine im Fach Literatur. Die Lerneiheit im Fach Philosophie  "
+"hat die Personen mit den Schlüsseln 'johnny' und 'billy' als Kursteilnehmer "
+"und der Stundenplan enthält drei Zeiteinträge, zwei davon am Montag (eine "
+"davon findet am mit dem Schlüssel `room137` bezeichneten Ort statt, die "
+"andere hat keine Ortsangabe). Die Literatur Lerneinheit wird entsprechend "
+"verarbeitet."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Beachten Sie, dass in der Datei nur die Schlüssel der Objekte gespeicheret "
+"sind, nicht aber die Bezeichnungen. Wenn eine Zeile mit leeren Zellen endet "
+"(z.B. <em>\"Philosophie\",\"lorch\",\"\",\"\"</em>), werden diese Zellen "
+"übersprungen. Sie können die Beschreibungen der Lerneinheiten mit mehreren "
+"Leerzeilen voneinander trennen. In der Liste der Kursteilnehmer wird nur die "
+"erste Spalte mit dem Personen-Schlüssel verarbeitet, die anderen Spalten "
+"werden ignoriert. Sie können den gleichen Datenbestand ohne Nebeneffekte "
+"mehrere Male importieren."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "CSV-Datei hochladen"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV Datei"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Zeichensatz:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalender für %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Gebuchte Quellen: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Der Name für die Schule oder Organisation, die diesen\n"
+"Server betreibt. Dieser wird im öffentlichen Kalender,\n"
+"am Ende aller Seiten und im Seitentitel dargestellt."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Startseiten Kalender"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Erforderliche Eingabe fehlt."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Formular Eingabe ist kein Datei-Objekt"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Ungültige Ganzzahl"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Ungültige Textdaten"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Ungültige Zeichen"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Ungültige Unicode-Daten"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Ungültiger Gleitkommawert"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Ungültiges Datums oder Zeit"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Background Modus gestartet, Deamon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Verwenden Sie %s -h für Hilfe."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: Daemon Modus wird von ihrem Betriebssystem nicht unterstützt."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Konfiguration von %s einlesen"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Startzeit: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Datenbank konnte nicht initialisiert werden:↵\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Wird es vielleicht von einer anderen %s Instanz verwendet?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Achtung: Die reportlab Bibliothek konnte nicht gefunden werden.\n"
+"PDF Unterstützung ist abgeschaltet."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Achtung: Verzeichnis für Schriftarten '%s' existiert nicht.\n"
+"PDF Unterstützung ist abgeschaltet."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Achtung: Schriftart '%s' existiert nicht.\n"
+"PDF Unterstützung ist abgeschaltet."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Es wurde kein Speicher in der Konfigurationsdatei festgelegt.\n"
+"\n"
+"Wenn Sie die Standardkonfigurationsdatei verwenden,\n"
+"dann editieren Sie diese jetzt und entfernen Sie die\n"
+"Kommentarzeichen bei einer der 'ZODB Storage' Abschnitte.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Abgebrochen, dies ist keine SchoolToool 0.10 Datenbank.\n"
+"\n"
+"Bitte führen Sie das Upgrade-Skript für die Datenbank aus.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Willkommen auf dem SchoolTool-Server"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Kalender Einstellungen"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Personeneinstellungen bearbeiten"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Personen"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Planung für ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Legende:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuten"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "wiederkehrend"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Sonntag"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Niemand zum hinzufügen."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "Das eingegebene Datum liegt nicht in diesem Schulhalbjahr."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Niemand zum hinzufügen."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Planung für ${person}"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Letztes Jahr"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Weiter"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Standort"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Unterteilung hinzufügen"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Ansicht"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Unterteilung hinzufügen"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Unterteilung bearbeiten"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Kurse importieren"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Einen neuen Kurs hinzufügen"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Neuer Kurs"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Kursübersicht"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Einen neuen Kurs hinzufügen"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Nicht genügend Daten angegeben"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Die Titel müssen angegeben werden"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Dieser Kurs existiert nicht."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Eine Kurs-ID wird benötigt."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Eine Sektion zu ${course} hinzufügen"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Lehrer"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Derzeitige Lehrer"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Verfügbare Lehrer"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Studenten"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Gruppen"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Quellen"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Sektionsübersicht"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Eine neue Sektion anlegen"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"Die CSV Daten <strong>müssen</strong> einen Kursnamen beinhalten und "
+"<strong>können</strong> eine optionale Kursbeschreibung beinhalten. Jegliche "
+"andere Informationen werden verworfen."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Antike Geschichte, Vorgeschichte bis 1000 v. Chr.\n"
+"US Geschichte\n"
+"Weltgeschichte, 1000 v. Chr. bis zum 20. Jahrhundert, Text nach dem zweiten "
+"Komma\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Das obige Beispiel wird 3 Kurse mit den Namen 'Antike Geschichte', 'US "
+"Geschichte' und 'Weltgeschichte' erzeugen. Der erste und letzte Kurs haben "
+"die Beschreibung 'Vorgeschichte bis 1000 v. Chr.' bzw. '1000 v. Chr. bis zum "
+"20. Jahrhundert'. Der zweite Kurs hat keine Beschreibung und der zusätzliche "
+"\"Text nach dem zweiten Komma\" beim dritten Kurs wird ignoriert."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "SchoolTool Kurse als CSV hochladen"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Untergruppen"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "Studenten"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Sektion von ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "Namen ändern"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Den Standort oder Namen dieser Sektion verändern."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Lehrer für diesen Bereich ändern."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Gebuchte Quellen: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Lehrer für diesen Bereich ändern."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "Lehrer bearbeiten"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "Einzelpersonen bearbeiten"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Studenten in dieser Sektion einzeln bearbeiten"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+"Ändern Sie die Kursteilnehmer in diesem Abschnitt durch ihre "
+"Gruppenzugehörigkeit"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "Gruppen bearbeiten"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Bezeichner (optional)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Sektion"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Aktuelle Größe"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Es gab ${num_errors} Eingabefehler."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Name des Kurses."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Beschreibung des Kurses."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Beschriftung"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Ein Bezeichner für einen Abschnitt, gebildet von den\n"
+"            Ausbildernamen, Kursen und Sitzungszeit."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Programmcode"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "ID für diesen Bereich."
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Beschreibung der Sektion."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Personen"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "März"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Schultag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Ausfall-Tag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Ausfall-Tag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Ausfall-Tag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Abbruch"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Benutzername"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Passwort"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Dieser Benutzername wird bereits verwendet."
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Ausführen"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Täglich"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Keine vorhanden."
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Keine vorhanden."
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Vollständiger Name"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (im JPEG Format)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Kurse"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "Löschen"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "Hinzufügen"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "Abbrechen"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Unterteilung hinzufügen"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Studenten"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "Löschen"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Zeitraum ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Gruppen importieren"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Eine neue Gruppe hinzufügen"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Unterteilung bearbeiten"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Mitgliedschaft verwalten"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Gruppen"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Gruppen"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"CSV Daten <strong>müssen</strong> eine Gruppennamen und <strong>können</"
+"strong> eine optionale Gruppenbeschreibung beinhalten. Alle weiteren "
+"Informationen werden verworfen."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"LUG, Linux Users Group\n"
+"Schachclub\n"
+"Sportclub, Außerschulischer Sportclub, <em>text\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Das obere Beispiel erstellt drei Gruppen mit den Namen 'LUG', 'Schach Club' "
+"and 'Sport Club'.Die erste und die letzte Gruppe haben jeweils die "
+"Beschreibungen 'Linux Users Group' und 'Nachmittags Sport Club'. Der 'Schach "
+"Club' wird keine Beschreibung erhalten und der Zusatz 'Text nach dem zweiten "
+"Komma' der dritten Gruppe wird ignoriert werden."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "SchoolTool Gruppen als CSV hochladen"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "November"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "Namen ändern"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Den Standort oder Namen dieser Sektion verändern."
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Gruppen Übersicht"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Eine neue Gruppe hinzufügen"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Name der Gruppe."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Beschreibung der Gruppe."
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Privater Kalender"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Ereignis hinzufügen"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "keine"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "Hinzufügen"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Aktuelle Woche"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Studenten"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "Abbrechen"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "Hinzufügen"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "Abbrechen"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Neue Frist"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Name der Notiz."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Textkörper"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Textkörper der Notiz"
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Datenschutz"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Nein"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Datenschutz"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Schuljahresabschnitt hinzufügen"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Datum"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Benutzername muss angegeben werden"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Vollständiger Name muss angegeben werden"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Benutzername ${username} ist bereits vergeben."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Personen importieren"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CSV Daten <strong>müssen</strong> einen Benutzernamen und einen "
+"vollständigen Namen (Vorname Nachname) beinhalten. Ein optionales Passwort "
+"<strong>kann</strong> ebenfalls vorhanden sein."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"↵\n"
+"jjones, Jimmy Jones↵\n"
+"jbjones, Jim Bob Jones, r2m45J↵\n"
+"howard, Howard↵\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Das obere Beispiel erstellt drei Benutzer mit den Namen 'jjones', 'jbjones' "
+"und 'howard'. Von den dreien hat nur 'jbjones' ein Passwort ('r2m45J') und "
+"kann sich im System anmelden. Beachten sie bitte, dass das Passwort als "
+"unformatierter Text übermittelt werden muss."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "SchoolTool Personen als CSV hochladen"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Die Einstellungen für ${user} ändern."
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Personeneinstellungen bearbeiten"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Zeitzone"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Zeitzone für Ihren Kalender"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Zeitformat"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "SS:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "SS:MM vm/nm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datumsformat"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/TT/JJ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "JJJJ-MM-TT"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Tag, Monat, Jahr"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Woche beginnt am:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Wochen mit Montag oder Dienstag beginnen"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Zeige Zeitraum"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Zeige den Namen des Zeitraums in der Tagesansicht"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Name der angezeigt werden soll"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Beziehungen"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Ereignis hinzufügen"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Neue Frist"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Zeige"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "von"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "Elemente"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Ressourcen importieren"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Neue Quelle hinzufügen"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Unterteilung bearbeiten"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Quellen"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Quellen"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV Daten <strong>müssen</strong> einen Hilfsmittel-Titel haben und "
+"<strong>können</strong> eine optionale Hilfsmittel-Beschreibung beinhalten. "
+"Alle zusätzlichen Informationen werden verworfen."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, Overhead Projektor #302\n"
+"Aula\n"
+"LC-805, Laptop Computer #805, <em>Text nach einem zweiten Komma</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Das obere Beispiel wird drei Hilfsmittel mit den Namen 'PRJ302', 'Aula' und "
+"'LC-805' erstellen. Das erste und das letzte Hilfsmittel haben jeweils die "
+"Beschreibungen 'Tageslicht Projektor #302' und 'Laptop Computer #805'. Die "
+"'Aula' erhält keine Beschreibung und der \"Text nach dem zweiten Komma\" des "
+"dritten Hilfsmittels wird ignoriert werden."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "SchoolTool Quellen als CSV hochladen"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Neue Quelle hinzufügen"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Quellenname"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beschreibung der Quelle."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Ein Standort."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Hinweis: diese Quelle ist ein Ort, beispielsweise ein Klassenzimmer."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Kalender_Beziehungen"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Kalender_ACL"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"↵\n"
+"Dies ist keine SchoolBell 1.0 Datenbank, abbruch.↵\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Abgebrochen, dies ist keine SchoolBell 1.0 Datenbank.\n"
+"\n"
+"Bitte führen Sie das Upgrade-Skript für die Datenbank aus.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "oben"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Nicht am:"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Einloggen"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Benutzer:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Ausloggen"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Neues Schulhalbjahr"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Schultag wegen unerwarteten Ereignis streichen"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "Der eingegebene Ersatztermin ist ungültig."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+"Die Schule fällt aufgrund eines unerwarteten Ereignisses aus. Ersatztermin "
+"$replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Ersatztermin für den ausgefallenen Tag $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+"Das eingegebene Datum ist ungültig. Bitte verwenden Sie das Format JJJJ-MM-"
+"TT."
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "Das eingegebene Datum liegt nicht in diesem Schulhalbjahr."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "Das eingegebene Datum ist keiN Schultag."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"Sie haben ${DYNAMIC_CONTENT} als Ausfalltag ausgewählt. Wählen sie nun bitte "
+"den Ersatztag. Die nachfolgende Auswahl enthält freie Tage in diesem "
+"Schuljahresabschnitt und einige Tage in dem nächsten Schuljahresabschnitt."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Bitte unten das Ersatzdatum eingeben."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Ersatz"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Wählen sie einen Ersatz für den unplanmäßig ausgefallenen Tag"
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Diese Eingabemaske ermöglicht es ihnen ein Datum als Ausfalltag zu markieren "
+"und einen entsprechenden Ersatztag hinzuzufügen."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+"Bitte tragen sie im folgenden das Datum des ausserplanmäßigen Ereignisses "
+"ein."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Ausfall-Tag"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Frist verändern: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Neue Frist"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Bedingungen"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Neue Bedingung hinzufügen"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Anfangsdatum"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Enddatum"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Woche ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Schuljahresabschnitt hinzufügen"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Änderungen speichern"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Bitte benennen und bestimmen sie die Zeitspanne des Schuljahresabschnittes "
+"(z.B. 2004-09-01 bis 2004-12-31).\n"
+"Datumsangaben müssen in dem JJJJ-MM-TT Format eingegeben werden."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+"Bitte die komplette Zeitspanne eingeben (z.B. 2004-09-01 bis 2004-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Aktualisieren"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"Legen sie zweitens bitte fest, welche Tage Schultage sind und an welchen "
+"Tagen Ferien sind."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+"Bitte legen sie fest, welche Tage Schultage sind und an welchen Tagen Ferien "
+"sind."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Legende:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Schultag"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Ferien"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Zwischen den folgenden Tagen der Woche wechseln:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "Stundenplan von ${object}"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Ungültiges Datum. Bitte JJJJ-MM-TT als Format benutzen."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Dieses Datum gehört zu keinem Semester."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Einige Werte sind ungültig. Sie sind in rot hervorgehoben."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Stundenplan eines Tages ändern"
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Neuer Stundenplan"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Stundenpläne anzeigen"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Dienst"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Bitte verwenden Sie das SS:MM Format für Beginn und Ende des Zeitraums"
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Sie müssen mindestens ein Zeitraum angeben."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Schul Stundenpläne"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Neues Schema hinzufügen"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Bitte einen Wert auswählen"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Tag ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Zeitraum 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Zeitraum ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Stundenplan Schema ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Der tägliche Stundenplan muss immer mit einem Tag der Woche zusammnfallen (z."
+"B. am Montag wird der erste Stundenplan verwendet, am Dienstag der zweite, "
+"und so weiter)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Schultage werden aufeinanderfolgend dargestellt, ohne freie Tage dazwischen."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Bitte wählen sie einen Namen für die neue Stundenplanübersicht."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+"Einige Angaben zu den Unterrichtsstunden sind fehlerhaft und wurden daher "
+"verworfen."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Überprüfen sie abschließend bitte, ob die Angaben korrekt sind, denn die "
+"einzige Korrekturmöglichkeit besteht in dem Löschen und neuerlichem "
+"Erstellen der Stundenplanübersicht."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Stundenplan Schema anlegen"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Bitte legen Sie erst die Tage und Zeiträume des Stundenplans fest."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Zeiträume vom vorherigen Tag kopieren"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Diesen tag entfernen"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Tag hinzufügen"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Zeitraum hinzufügen"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Wählen sie zweitens, wie die Schultage mit den Kalendertagen verknüpft "
+"werden sollen."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"Beachten sie: wenn eine Sektion in mehreren Zeitfenstern erscheint, müssen "
+"alle mit <em>keine</em> gekennzeichnet sein, um sie zu entfernen."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Stundenplan"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Bedingung"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Schema"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Planung für ${person}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Wähle"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Diese Eingabemaske läßt Sie den Zeitplan einer Person erstellen, indem sie "
+"die Person nach und von Abschnitten, die Unterrichtsklassen in ihren "
+"Stundenplan haben, hinzufügt und entfernt."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "als Teil von"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "keine"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "Planungskonflikt."
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Speichern"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+"Es sind keine Schuljahresabschnitte oder Stundenplanübersichten festgelegt"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Wählen sie eine Zeitplan Vorlage"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "Für Schuljahresabschnitt(e):"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Planung für ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Benutze Stundenplan:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Dies ist eine einfache Möglichkeit ein Schema für den wöchentlichen "
+"Stundenplan zu erstellen. Tragen sie einfach eine ausreichende Anzahl von "
+"Zeilen für ihre Unterrichtsstunden ein."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Wenn sie mehr Flexibilität benötigen, können sie den <a href=\"add.html"
+"\">Stundenplan Assistenten</a> benutzen, oder die <a href=\"complexadd.html"
+"\">Eingabemaske für komplexe Stundenpläne</a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Überschrift für die Unterichtsstunde (optional)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Beginn der Ubterichtsstunde"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "Ende der Ubterichtsstunde"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Erzeugen"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"Sie können die Start- und Endzeit der Unterrichtsstunden für "
+"${DYNAMIC_CONTENT} in der nachfolgenden Eingabemaske einstellen. Um eine "
+"Unterrichtsstunde von einem Tag zu entfernen, löschen sie einfach die "
+"Anfangs- und Endzeiten der Unterrichtsstunde."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Titel des Zeitraums"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Ursprünglicher Anfang"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Ursprüngliches Ende"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Neuer Anfang"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Neues Ende"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Bearbeiten"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Diese Eingabemaske ermöglicht es ihnen, die Anfangs- und Endenzeiten für die "
+"Unterrichtsstunden für eine bestimmtes Datum zu ändern, oder um bestimmte "
+"Unterrichtsstunden gemeinsam zu annullieren."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+"Bitte geben sie das datum ein, ab wann die Unterrichststunden geändert "
+"werden müssen."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Einen speziellen Tag auswählen"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Fortfahren"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Stundenplan Schema anlegen"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Stundenpläne für ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Neues Stundenplanschema"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+"Werden in dem Zeitplanzyklus ihrer Schule Tage der Woche verwendet, oder "
+"verwenden sie einen rotierenden Zyklus?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Tage der Woche"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Rotierender Zyklus"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Geben sie die Namen der Tage des Zyklus ein, einen pro Zeile."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Bitte geben sie mindestens für einen Tag den Namen ein."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Bitte stellen sie sicher, dass die Namen einzigartig sind."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Beginnen und enden die Unterrichtsklassen, an jedem Tag, zur selben Zeit in "
+"ihrem Stundenpaln?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Gleiche Zeit jeden Tag"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Unterschiedliche Zeiten"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Geben sie Anfangs- und Endzeit für jedes Zeitfenster ein, ein Zeitfenster "
+"pro Zeile (HH:MM - HH:MM)."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Kein gültiges Zeitfenster: $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Geben sie mindestens ein Zeitfenster ein."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Bitte geben sie Anfangs- und Enszeit für jedes Zeitfenster eines Tages ein; "
+"ein Zeitfenster (HH:MM - HH:MM) pro Zeile."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Bitte geben sie für $day mindestens ein Zeitfenster ein."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+"Haben Unterrichtsstunden Namen, oder sind sie einfach durch die Zeit "
+"bezeichnet?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Hat Namen"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Bezeichnet durch die Zeit"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Bitte geben sie die Namen der Unterrichtsstunden ein, einen pro Zeile"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Bitte geben sie mindestens $number Unterrichtsstunden ein."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+"Bitte vergewissern sie sich, dass die Namen der Unterrichtsstunden einmalig "
+"sind."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+"Ist die Abfolge der Unterrichtsstunden an jedem Tag gleich oder "
+"unterschiedlich?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Gleich"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Unterschiedlich"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Bitte ordnen sie die Unterrichtsstunden:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Bitte geben sie alle Unterrichtsstunden an."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+"Die folgenden Unterrichtsstunden wurden mehr als einmal ausgewählt: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Bitte ordnen sie die Unterrichtsstunden für jeden Tag:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period am $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr "Ja"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr "Nein"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Unbekannte Tages-ID: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Unbekannte Zeitraum-ID: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Benutzername:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Name, Bild oder Passwort der Person ändern"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Mitgliedschaften dieser Person verwalten"
+
+#~ msgid "Import Sections"
+#~ msgstr "Unterteilungen importieren"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Fehler in Zeile ${line_no} (Eine Tag-Id, eine Unterrichtsstunde-Id und "
+#~ "optional eine Ort-Id muss enthalten sein)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Standort nicht gefunden: ${args}"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Personendetails bearbeiten"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Unterrichtsfach"
+
+#~ msgid "via group"
+#~ msgstr "über Gruppe"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server auf dem SchoolTool läuft <span>"
+#~ "${DYNAMIC_CONTENT}</span> &copy; The Shuttleworth Foundation 2003 - "
+#~ "<span>2005</span>: Soziale Innovationen unterstützen. </p> <p> "
+#~ "SchoolTool&trade; ist eine Schutzmarke der  Shuttleworth Foundation. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Meine Einstellungen"
+
+#~ msgid "Person index"
+#~ msgstr "Personenverzeichnis"
+
+#~ msgid "Add a new person"
+#~ msgstr "Neue Person hinzufügen"
+
+#~ msgid "New photo"
+#~ msgstr "Neues Foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Ein kleines Foto (ungefähr 48x48 Pixel im JPEG-Format)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Foto löschen"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Klicken sie hier um das Foto zu löschen."
+
+#~ msgid "New password"
+#~ msgstr "Neues Passwort"
+
+#~ msgid "Verify password"
+#~ msgstr "Passwort wiederholen:"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Die Passwörter stimmen nicht überein."
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Das Passwort wurde erfolgreich geändert."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Die Passwörter stimmen nicht überein!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Neue Objekte anlegen"
+
+#~ msgid "Add events"
+#~ msgstr "Neuen Termin hinzufügen"
+
+#~ msgid "Control access"
+#~ msgstr "Zugriffskontrolle"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Bestätigte Benutzer"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Unbestätigte Benutzer"
+
+#~ msgid "An error occured."
+#~ msgstr "Es ist ein Fehler aufgetreten"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Unbeglaubigte Benutzer"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Unbeglaubigter Benutzer"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Beglaubigte Benutzer"
+
+#~ msgid "All Users"
+#~ msgstr "Alle Benutzer"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: warnung: Option der Konfiguration '%s' ignoriert"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Aufruf: %s [Optionen]\n"
+#~ "Optionen:\n"
+#~ "  -c, --config xxx verwendet diese Konfigurationsdatei statt der "
+#~ "Standardkonfiguration \n"
+#~ "  -h, --help zeigt diesen Hilfetext an\n"
+#~ "  -d, --daemon Programm geht nach dem Start in den Hintergrund\n"
+#~ "  -r, --restore-manager stellt die Manager Benutzerkennung mit dem "
+#~ "Standardpasswort wieder her\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Willkommen auf dem SchoolBell Server"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Dies ist keine SchoolTool 0.10 Datenbank, Abbruch.\n"

Added: schooltool/branches/upstream/current/src/schooltool/locales/de_CH/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/de_CH/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/de_CH/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2341 @@
+# German (Switzerland) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-08-07 18:56+0000\n"
+"Last-Translator: RideOnGuzzi <markus.staldebandi at freesurf.ch>\n"
+"Language-Team: German (Switzerland) <de_CH at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+"X-Generator: Rosetta (http://launchpad.ubuntu.com/rosetta/)\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personen"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Benutzername oder Passwort ist falsch."
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "März"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februar"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Dezember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Montag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Samstag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Freitag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Mo"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Di"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Mi"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Do"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Fr"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sa"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "So"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Ganzt�g"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Zeit"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Dauer"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuten"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Stunden"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Tage"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Ort"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Beschreibung"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Wiederkehrend"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Wiederkehrend jeweils"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Tag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Woche"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Monat"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Jahr"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Wiederkehrend jeden"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Bereich"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Anzahl"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "bis"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "f�er"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Anzahl der Ereignisse"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Wiederholen bis"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Wochentage"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Wochentag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Monatlich"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "gleicher Wochentag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "erster"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "vierter"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "dritter"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "zweiter"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "fünfter"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "letzter Wochentag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Letzter $(weekday)"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Ein Fehler trat auf"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ungültige Zeit"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Ereignis hinzufügen"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalender anzeigen"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Daten können nicht in Unicode konvertiert werden (falscher Zeichensatz ?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Kein Zeichensatz definiert"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Unbekannter Zeichensatz"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Änderungen gespeichert."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titel"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Gruppen"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Dauer"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Datum"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Quelle hinzuf�"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Gruppen"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Ressourcen"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Ressourcen"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Personenverzeichnis"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Neue Person hinzufügen"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Benutzername"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Passwort"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Dieser Benutzername wird bereits verwendet !"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sa"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Noten"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Anzahl der Ereignisse"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "kompletter Name"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "kompletter Name"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "kompletter Name"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (im JPEG-Format)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Passwort ge�ert !"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Passwort ge�ert !"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Passwort ge�ert !"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Dauer"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Gruppenverzeichnis"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Neue Gruppe hinzuf�"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Quelle hinzuf�"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Passwort ge�ert !"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Passwort ge�ert !"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Benutzer"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Sa"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Ereignis bearbeiten"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Neues Passwort"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Neues Passwort"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Kalender anzeigen"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Name, der angezeigt werden soll"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Quelle hinzuf�"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Quellenverzeichnis"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Quelle hinzuf�"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Änderungen gespeichert."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Neue Person hinzufügen"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Quelle hinzuf�"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "gleicher Wochentag"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Unbekannter Zeichensatz"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Neues Foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Kleines Foto (ca. 48x48 Pixel im JPEG-Format"
+
+#~ msgid "Clear photo"
+#~ msgstr "Foto l�en"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Markieren um das Foto zu l�en"
+
+#~ msgid "Verify password"
+#~ msgstr "Passwort wiederholen"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Passw�r stimmen nicht �n."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Passw�r stimmen nicht �n !"
+
+#~ msgid "View"
+#~ msgstr "Ansicht"
+
+#~ msgid "Edit"
+#~ msgstr "Bearbeiten"
+
+#~ msgid "Create new objects"
+#~ msgstr "Neues Objekt anlegen."
+
+#~ msgid "Add events"
+#~ msgstr "Ereignis hinzuf�"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Ereignis bearbeiten/l�en"
+
+#~ msgid "Manage membership"
+#~ msgstr "Mitgliedschaft verwalten"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Authentifizierter Benutzer"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Benutzer nicht authentifiziert"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Zugang erstellen"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Im iCal Format öffnen"
+
+#~ msgid "Edit Event"
+#~ msgstr "Ereignis ändern"
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Benutzer kann Personen, Gruppen und Ressourcen erfassen."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Gestatet Kaldender von Personen, Gruppen und Ressourcen einzusehen."
+
+#~ msgid "Add/Remove Resources"
+#~ msgstr "Ressourcen hinzufügen/entfernen"

Added: schooltool/branches/upstream/current/src/schooltool/locales/de_DE/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/de_DE/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/de_DE/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# German (Germany) translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: German (Germany) <de_DE at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2500 @@
+# Greek, Modern (1453-) translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-06-27 12:42+0000\n"
+"Last-Translator: eriol <e.sarbanis at gmail.com>\n"
+"Language-Team: Greek, Modern (1453-) <el at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Άτομα"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 άτομο"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} άτομα"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Όνομα χρήστη ή κωδικός είναι λανθασμένος"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Τρέχον χρόνος"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Μάρτιος"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Ιανουάριος"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Δεβρουάριος"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Ιούνιος"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Μάιος"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Απρίλιος"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Αύγουστος"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Σεπτέμβριος"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Ιούλιος"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Η επόμενη ημέρα"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Σήμερα"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Η προηγούμενη μέρα"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Οκτώβριος"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Δεκέμβριος"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Νοέμβριος"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Δευτέρα"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Τρίτη"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Τετάρτη"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Πέμπτη"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Κυραική"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Σάββατο"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Παρασκευή"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Δευ"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Πεμ"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Τετ"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Τρι"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Παρ"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Σαβ"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Κυρ"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Τίτλος"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Ολόκληρη τη μέρα"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Ημερομηνία"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Ώρα"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Χρόνος εκκίνησης σε 24ωρη μορφή"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Διάρκεια"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Τύπος Διάρκειας"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Λεπτά"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Ώρες"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Ημέρες"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Τοποθεσία"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Περιγραφή"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Κατ' επανάληψη"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Επανάλαμβάνεται κάθε"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Ημέρα"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Εβδομάδα"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Μήνας"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Χρόνος"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Επανάληψη κάθε"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Εύρος"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Καταμέτρηση"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Μέχρι"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "για πάντα"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Αριθμός γεγονότων"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Επανάληψη μέχρι"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Καθημερινές"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Καθημερινή"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Μηνιαίως"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Ημερομηνίες εξαιρέσεων"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "ίδια ημέρα της εβδομάδας"
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "1st"
+msgstr "1ος/η"
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "4th"
+msgstr "4ος"
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "3rd"
+msgstr "3ος/η"
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "2nd"
+msgstr "2ος/η"
+
+#: /src/schooltool/app/browser/cal.py:1834
+#, fuzzy
+msgid "5th"
+msgstr "5ος/η"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "τελευταία ημέρα της εβδομάδας"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Τελευταία ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Προέκυψε σφάλμα."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Μη έγκυρος χρόνος"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Η τελική ημερομηνία είναι μικρότερη της αρχικής"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Μη έγκυρη ημερομηνία. Παρακαλώ καθορίστε ΧΧΧΧ-ΜΜ-ΗΗ, μία ανά γραμμή."
+
+#: /src/schooltool/app/browser/cal.py:1992
+#, fuzzy
+msgid "Add event"
+msgstr "Προσθήκη γεγονότως"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Προσθήκη"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Επεξεργασία γεγονότος"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Ενημέρωση"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Ενημερώθηκε στις ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Ημερολόγια"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Επόμενη εβδομάδα"
+
+#: /src/schooltool/app/browser/cal.py:846
+#, fuzzy
+msgid "Current week"
+msgstr "Τρέχουσα Εβδομάδα"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Προηγούμενη Εβδομάδα"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Επόμενος μήνας"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Τρέχον μήνας"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Προηγούμενος μήνας"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Εβδομάδα ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Επόμενος χρόνος"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Τρέχον χρόνος"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Προηγούμενος χρόνος"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Δεν δόθηκαν δεδομένα"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Αδυναμία μετατροπής δεδομένων σε Unicode (λάθος σύνολο χαρακτήρων;)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "αρχείο CSV εισήχθη επιτυχώς"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Αποτυχία εισαγωγής του αρχείου CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "κείμενο CSV εισήχθη επιτυχώς."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Αποτυχία εισαγωγής του κειμένου CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Δεν καθορίσθηκε κωδικοποίηση χαρακτήρων"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Άγνωστο σύνολο χαρακτήρων"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Σφάλμα στα δεδομένα CSV, γραμμή ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Αποτυχία μετατροπής σε unicode στη γραμμή ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Σφάλμα στα δεδομένα CSV, γραμμή ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Αλλαγές απθηκεύτηκαν"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "ολοήμερο"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Τοποθεσία: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Δεσμευμένοι πόροι: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "επαναλαμβανόμενο"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Ημερίσιο ημερολόγιο για %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Εβδομαδιαίο ημερολόγιο για %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Εβδομάδα %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Μηνιαίο ημερολόγιο για %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Η υποστήριξη για αρχεία PDF έχει απενεργοποιηθει. Μπορεί να ενεργοποιηθεί "
+"από τον διαχειριστή συστήματος."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Τίτλος"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Ομάδα"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Διάρκεια"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Ημερομηνία"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Κατάλογος πόρων"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Εισάγετε νέα πηγή"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Δόθηκαν ελλειπή δεδομένα."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Οι τίτλοι δεν είναι δυντόν να είναι κενοί"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Τρέχον μήνας"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Τρέχον μήνας"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Εισαγωγή πόρων"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Κατάλογος ατόμων"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Εισάγετε νέο άτομο"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Αλλαγή Λεπτομεριών"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#, fuzzy
+msgid "Username"
+msgstr "Όνομα Χρήστη"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Κωδικός"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Αυτό το όνομα χρήστη ήδη χρησιμοποιείται"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Προηγούμενος μήνας"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Εισαγωγή Πληροφοριών Ομάδας"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Σαβ"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Αριθμός γεγονότων"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Ονοματεπώνυμο"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Ονοματεπώνυμο"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+#, fuzzy
+msgid "Full name"
+msgstr "Ονοματεπώνυμο"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Φωτογραφία"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Φωτογραφία (σε μορφή JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Νέο Σημείωμα"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "κείμενο CSV εισήχθη επιτυχώς."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Ο κωδικός άλλαξε επιτυχώς"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Ο κωδικός άλλαξε επιτυχώς"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Διάρκεια"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Κατάλογος Ομάδας"
+
+#: /src/schooltool/group/browser/group.py:48
+#, fuzzy
+msgid "Add a new group"
+msgstr "Εισάγετε νέα ομάδα"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Κατάλογος πόρων"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Εισάγετε νέα πηγή"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Προηγούμενη Εβδομάδα"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "κείμενο CSV εισήχθη επιτυχώς."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Ο κωδικός άλλαξε επιτυχώς"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Τρέχουσα Εβδομάδα"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Ο κωδικός άλλαξε επιτυχώς"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Χρήστες"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Σαβ"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Επόμενη εβδομάδα"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Το όνομα χρήστη δεν μπορεί να είναι κενό"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Το πλήρες όνομα δεν μπορεί να είναι κενό"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Διπλό όνομα χρήστη: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Νέος Κωδικός"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Νέος Κωδικός"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Προβολή ημερολογίου"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Όνομα που θα εμφανίζεται"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Κατάλογος πόρων"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Εισάγετε νέα πηγή"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Κατάλογος πόρων"
+
+#: /src/schooltool/resource/browser/resource.py:40
+#, fuzzy
+msgid "Add a new resource"
+msgstr "Εισάγετε νέα πηγή"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Δόθηκαν ελλειπή δεδομένα."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Δόθηκαν ελλειπή δεδομένα."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Δόθηκαν ελλειπή δεδομένα."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Περισσότερα..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Ημερολόγια"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Φωτογραφία"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Αλλαγές απθηκεύτηκαν"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Αλλαγή Λεπτομεριών"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Νέο Σημείωμα"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Εισάγετε νέο άτομο"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Ημερομηνίες εξαιρέσεων"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Μη έγκυρη ημερομηνία. Παρακαλώ καθορίστε ΧΧΧΧ-ΜΜ-ΗΗ, μία ανά γραμμή."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Εισάγετε νέα πηγή"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} άτομα"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "ίδια ημέρα της εβδομάδας"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Άγνωστο σύνολο χαρακτήρων"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Νέα φωτογραδία"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Μικρή Φωτογραφία (περίπου 48x48 pixels σε μορφή JPEG)"
+
+#, fuzzy
+#~ msgid "Clear photo"
+#~ msgstr "Καθαρισμός φωτογραφίας"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Επιλέξτε εδώ για να διαγραφεί η φωτογραφία"
+
+#~ msgid "Verify password"
+#~ msgstr "Επιβεβαίωση κωδικού"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Κωδικοί δεν ταιριάζουν"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Οι κωδικοί δεν ταιράζουν"
+
+#~ msgid "View"
+#~ msgstr "Προβολή"
+
+#, fuzzy
+#~ msgid "Edit"
+#~ msgstr "Εισαγωγή"
+
+#~ msgid "Create new objects"
+#~ msgstr "Δημιουργία νέου αντικειμένου"
+
+#~ msgid "Add events"
+#~ msgstr "Εισαγωγή γεγονότως"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Αλλάγή/ διαγαφή γεγονότων"
+
+#~ msgid "Control access"
+#~ msgstr "Έλεγχος πρόσβασης"
+
+#~ msgid "Manage membership"
+#~ msgstr "Διαχείριση λογαριασμού"
+
+#, fuzzy
+#~ msgid "Authenticated users"
+#~ msgstr "Πιστοποιημένοι χρήστες"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Μη πιστοποιημένοι χρήστες"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Ρύθμιση Πρόσβασης"
+
+#, fuzzy
+#~ msgid "Change Preferences"
+#~ msgstr "Αλλαγή Προτιμήσεων"
+
+#~ msgid "New Person"
+#~ msgstr "Νέο Άτομο"
+
+#~ msgid "Import Persons"
+#~ msgstr "Εισαγωγή προσώπων"
+
+#, fuzzy
+#~ msgid "Add a Group"
+#~ msgstr "Εισαγωγή Ομάδας"
+
+#~ msgid "New Group"
+#~ msgstr "Νέα Ομάδα"
+
+#, fuzzy
+#~ msgid "A Group"
+#~ msgstr "Μια Ομάδα"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Ομάδα SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Προσθήκη/Διαγραφή Μελών"
+
+#~ msgid "Import Groups"
+#~ msgstr "Εισαγωγή ομάδων"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Προσθήκη πόρου"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Επεξεργασία πληροφοριών πόρων"
+
+#~ msgid "New Resource"
+#~ msgstr "Νέος Πόρος"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Πόρος SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Ένας πόρος"
+
+#~ msgid "Actions"
+#~ msgstr "Ενέργειες"
+
+#~ msgid "View Calendar"
+#~ msgstr "Προβολή Ημερολογίου"
+
+#, fuzzy
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Ημερολόγιο (Ημερίσιο)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Ημερολόγιο (Ημερίσιο,  PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Ημερολόγιο (Εβδομαδιαίο)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Ημερολόγιο (Εβδομαδιαίο, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Ημερολόγιο (Μηνιαίο)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Ημερολόγιο (Μηνιαίο,  PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Ημερολόγιο (Ετήσιο)"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Ελεύθερος/Απασχολημένος"
+
+#~ msgid "New Event"
+#~ msgstr "Νέο Γεγονός"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Άνοιγμα στο iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Επεξεργασία γεγονότος"
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Επιτρέπει την επεξεργασία ονομάτων, περιγραφών, εικόνων, κτλ."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Επιτρέπει στο χρήστη την δημιουργία νέων χρηστών, ομάδων και πόρων."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr ""
+#~ "Επιτρέπει την προβολή των ημερολογίων των χρηστών, των ομάδων και των "
+#~ "πόρων."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Επιτρέπει την προσθήκη γεγονότων στα ημερολόγια."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr ""
+#~ "Επιτρέπει την επεξεργασία και την διαγραφή γεγονότων απο τα ημερολόγια."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Διαχείριση πρόσβασης για ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr ""
+#~ "Επιτρέπει στο χρήστη να χρησιμοποιεί αυτή τη φόρμα (Διαχείριση πρόσβασης)"
+
+#~ msgid "Access control"
+#~ msgstr "Διαχείριση πρόσβασης"
+
+#~ msgid "Set Access"
+#~ msgstr "Ρύθμιση Πρόσβασης"
+
+#~ msgid "General preferences"
+#~ msgstr "Γενικές προτιμήσεις"
+
+#, fuzzy
+#~ msgid "Events for"
+#~ msgstr "Γεγονότα για"
+
+#~ msgid "atom_description"
+#~ msgstr "σ"
+
+#~ msgid "Public Calendar"
+#~ msgstr "Δημόσιο Ημερολόγιο"
+
+#~ msgid "People"
+#~ msgstr "Άτομα"

Added: schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/el/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5155 @@
+# translation of el-1.po to Greek
+# Greek, Modern (1453-) translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# Kostas Papadimas <pkst at gnome.org>, 2005.
+# Kostas Papadimas <pkst at gnome.org>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: el-1\n"
+"Report-Msgid-Bugs-To:\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-19 15:22+0000\n"
+"Last-Translator: Μενέλαος Μαγκλής <mmaglis at metacom.gr>\n"
+"Language-Team: Greek <team at gnome.gr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Ψευδώνυμο"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Ηλεκτρονική σελίδα"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Διεύθυνση ηλεκτρονικού ταχυδρομίου"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+#, fuzzy
+msgid "Persons"
+msgstr "Άτομα"
+
+#: /src/schooltool/app/browser/__init__.py:259
+#, fuzzy
+msgid "1 person"
+msgstr "1 άτομο"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+#, fuzzy
+msgid "${number} persons"
+msgstr "${number} άτομα"
+
+#: /src/schooltool/app/browser/app.py:231
+#, fuzzy
+msgid "Username or password is incorrect"
+msgstr "Όνομα χρήστη ή κωδικός πρόσβασης λανθασμένος"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Μάρτης"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Ιανουάριος"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Φεβρουάριος"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Ιούνιος"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Μάιος"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Απρίλιος"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Αύγουστος"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Σεπτέμβριος"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+#, fuzzy
+msgid "The next day"
+msgstr "Η επόμενη μέρα"
+
+#: /src/schooltool/app/browser/cal.py:1022
+#, fuzzy
+msgid "Today"
+msgstr "Σήμερα"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Δεκέμβριος"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Δευτέρα"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Τρίτη"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Τετάρτη"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Πέμπτη"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Κυριακή"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Σάββατο"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Παρασκευή"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Δευτ"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Τετ"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Τρι"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Παρ"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Σαβ"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Κυρ"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+#, fuzzy
+msgid "Title"
+msgstr "Τίτλος"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Ημαρομηνία"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Ώρα"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Λεπτά"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Ώρες"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Ημέρες"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Περιγραφή"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Ημέρα"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Εβδομάδα"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Μήνας"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Έτος"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Μέχρι"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "Για πάντα"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Μηνιαία"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1η"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4η"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3η"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2η"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5η"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Μη επιτρεπτός χρόνος"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+#, fuzzy
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Μη επιτρεπτός χρόνος. Παρακαλώ"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+#, fuzzy
+msgid "Update"
+msgstr "Ενημέρωση"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+#, fuzzy
+msgid "Updated on ${date_time}"
+msgstr "Ενημέρωση την ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Ημερολόγιο"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+#, fuzzy
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Επόμενη Εβδομάδα"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Τρέχουσα Εβδομάδα"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Προηγούμενη Εβδομάδα"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+#, fuzzy
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (Εβδομάδα ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Επόμενος μήνας"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Τρέχων Μήνας"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Προηγούμενος Μήνας"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Επόμενος χρόνος"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Τρέχον χρόνος"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Προηγούμενος χρόνος"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Ενέργειες"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr "Ημερολόγιο (Ημερήσιο)"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+#, fuzzy
+msgid "Calendar (Daily, PDF)"
+msgstr "Ημερολόγιο (Ημερήσιο)"
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Ημερολόγιο (Ημερήσιο)"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+#, fuzzy
+msgid "Calendar (Weekly, PDF)"
+msgstr "Ημερολόγιο (Ημερήσιο)"
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Ημερολόγιο (Ημερήσιο)"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+#, fuzzy
+msgid "Calendar (Monthly, PDF)"
+msgstr "Ημερολόγιο (Ημερήσιο)"
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Ημερολόγιο (Ημερήσιο)"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Προβολή"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Ημερολόγιο"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Προσθήκη γεγονότων"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Ένα άγνωστο άτομο"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Είσοδος"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Πλοήγηση"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Ενέργειες"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Ημερολόγιο"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+#, fuzzy
+msgid "No data provided"
+msgstr "<b>Δεδομένα ISP</b>"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+#, fuzzy
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "not μετατροπή Unicode."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Δεν καθορίσθηκε κωδικοποίηση χαρακτήρων"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Άγνωστο σύνολο χαρακτήρων"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Αποτυχία μετατροπής σε unicode στη γραμμή ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+#, fuzzy
+msgid "The timetable schema ${schema} does not exist."
+msgstr "not."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Σφάλμα in όχι"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+#, fuzzy
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Ημέρα not in."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+#, fuzzy
+msgid "Periods not defined in selected days: ${args}."
+msgstr "not in ημέρες."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Δεν βρέθηκαν οι: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Δεν βρέθηκαν μαθήματα: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Δεν βρέθηκαν ενότητες: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Μη έγκυρες εγγραφές: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Αποθήκευση αλλαγών"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Ημερήσιο Ημερολόγιο για %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Εβδομαδιαίο Ημερολόγιο για %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Μηνιαίο Ημερολόγιο για %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Αλλαγή προτιμήσεων"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Προτιμήσεις ημερολογίου"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Προτιμήσεις ημερολογίου"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Επεξεργασία προτιμήσεων"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Επεξεργασία προτιμήσεων"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Περιγραφή"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+#, fuzzy
+msgid "Jump To ..."
+msgstr "Μετάβαση σε..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Αυριανά γεγονότα"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Εκτυπώσιμη μορφή"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "προβολή ημερολογίου για μια ή περισσότερες ημέρες"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Ημερησίως"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Προβολή εβδομαδιαίου ημερολογίου"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Εβδομαδιαίως"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "προβολή ημερολογίου για μια ή περισσότερες ημέρες"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Προβολή ετήσιου ημερολογίου"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Ετησίως"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#, fuzzy
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Ημερολόγιο για ημερολόγιο"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Cal"
+msgstr "Ακύρωση"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Προσωπικό ημερολόγιο"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Ημερολόγιο"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Το ημερολόγιό μου"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Ημερολόγια"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Περισσότερα..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Ημερολόγιο"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Εμφάνιση ημερολογίου"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Εβδομαδιαίο Ημερολόγιο για %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+#, fuzzy
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "κουμπί-διαγραφής"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "Κουμπί ακύρωσης"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Μετακίνηση"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+#, fuzzy
+msgid "There are none."
+msgstr "Δεν υπάρχουν πλέον άλλες κινήσεις."
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Βρες"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Εκκαθάριση"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+#, fuzzy
+msgid "There are none to add."
+msgstr "Δεν υπάρχουν πλέον άλλες κινήσεις."
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Προσθήκη γεγονότων"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+#, fuzzy
+msgid "Details"
+msgstr "Ημερησίως"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Σαβ"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Προσθήκη γεγονότων"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Προσθήκη πόρου"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "επεξεργασία ομάδων"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Αλλαγή/Διαγραφή γεγονότων"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Επεξεργασία Πληροφοριών Τμήματος"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Πόροι"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Ενημέρωση"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Σήμερα"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Εβδομάδα"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Μήνας"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Έτος"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Ώρα"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Εμφάνιση ημερολογίου"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Για πάντα"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Πόροι"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Πληροφορίες ατόμου: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Τίτλος"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Σαβ"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Πόροι"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Μαθήματα"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Καλως ήρθατε στο SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Επεξεργασία Πληροφοριών Τμήματος"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Είσοδος"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "Τρέχον μέγεθος"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Δυτική (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Δυτική (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Άλλο (παρακαλώ καθορίστε)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Άλλο σύνολο χαρακτήρων: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Εισαγωγή CVS δεδομένων"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV δεδομένα"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#, fuzzy
+msgid "submit-button"
+msgstr "κουμπί-διαγραφής"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Ωρολόγιο πρόγραμμα"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+#, fuzzy
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr "Εσύ in a and in κόμμα."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Ανέβασε το πρόγραμμα ως CSV αρχείο"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Παράδειγμα:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Ανεβάστε το CSV αρχείο"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "Αρχείο CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Σύνολο Χαρακτήρων"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Δυτική  (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Ημερολόγιο για %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Πόροι"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"είναι not a αρχείο ο ο\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Καλώς ήλθατε στον εξυπηρετητή SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Προτιμήσεις ημερολογίου"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Επεξεργασία προτιμήσεων"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Άτομα"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Λεπτά"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr "Υποβολή"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Κυριακή"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Δεν υπάρχουν πλέον άλλες κινήσεις."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Δεν υπάρχουν πλέον άλλες κινήσεις."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Πρόσθεσε νέο άτομο"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Προηγούμενος χρόνος"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Επόμενο"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "_Χρήση ασφαλούς σύνδεσης:"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+#, fuzzy
+msgid "View"
+msgstr "Προβολή"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Επεξεργασία"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "_Χρήση ασφαλούς σύνδεσης:"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Επεξεργασία Πληροφοριών Τμήματος"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Εισαγωγή μαθημάτων"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr "Προσθήκη ενός μαθήματος"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Νέο Mάθημα"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Κατάλογος μαθημάτων"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Προσθήκη νέου μαθήματος"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Δεν υπάρχει τέτοιο μάθημα."
+
+#: /src/schooltool/course/browser/section.py:113
+#, fuzzy
+msgid "Need a course ID."
+msgstr "a ID."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+#, fuzzy
+msgid "Add a Section to ${course}"
+msgstr "Προσθήκη a"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+#, fuzzy
+msgid "Instructors"
+msgstr "Constructors"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Μαθητές"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Ομάδες"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Πόροι"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Προσθήκη νέας ενότητας"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Το παραπάνω παράδειγμα θα δημιουργήσει 3 μαθήματα με τίτλους: 'Ancient "
+"History', 'US History' και 'World History'. Το πρώτο και το τελευταίο μάθημα "
+"θα έχουν τις εξής περιγραφές: 'Pre-history through 1000 A.D.' και '1000 A.D. "
+"through the 20th century'. Το δεύτερο μάθημα δεν θα έχει περιγραφή, και το "
+"επιπλον \"text after a second comma\" κείμενο στο τρίτο μάθημα θα αγνοηθεί."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Ανεβάστε τα μαθήματα ως CSV αρχείο"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Ενότητες"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "Μαθητές"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "Επεξεργασία Ονόματος"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Πόροι"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+#, fuzzy
+msgid "edit instructors"
+msgstr "Constructors"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "edit individuals"
+msgstr "επεξεργασία"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "επεξεργασία ομάδων"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+#, fuzzy
+msgid "Identifier (optional)"
+msgstr "Object Identifier (%s)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Ενότητες"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Τρέχον μέγεθος"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Τίτλος μαθήματος"
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Μια περιγραφή της στήλης ορατή από τον χρήστη"
+
+#: /src/schooltool/course/interfaces.py:65
+#, fuzzy
+msgid "Label"
+msgstr "Ετικέτα"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr "Νέο άτομο"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Μάρτης"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+#, fuzzy
+msgid "Edit"
+msgstr "Επεξεργασία"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Ακύρωση"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Όνομα Χρήστη"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Κωδικός"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Το όνομα χρήστη που δώσατε χρησιμοποιείται ήδη"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Εφαρμογή"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Ημερησίως"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Δεν υπάρχουν πλέον άλλες κινήσεις."
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Δεν υπάρχουν πλέον άλλες κινήσεις."
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Πλήρες Όνομα"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Φωτογραφία"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Φωτογραφία (σε jpeg μορφή)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Μαθήματα"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "κουμπί-διαγραφής"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "κουμπί-προσθήκης"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "Κουμπί ακύρωσης"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "_Χρήση ασφαλούς σύνδεσης:"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Μαθητές"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "κουμπί-διαγραφής"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Περίοδος ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Εισαγωγή ομάδων"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr "Προσθήκη μιας ομάδας"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Επεξεργασία Πληροφοριών Τμήματος"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Αλλαγή προτιμήσεων"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Ομάδες"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Προσθήκη μιας ομάδας"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+#, fuzzy
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Το παραπάνω παράδειγμα θα δημιουργήσει 3 μαθήματα με τίτλους: 'Ancient "
+"History', 'US History' και 'World History'. Το πρώτο και το τελευταίο μάθημα "
+"θα έχουν τις εξής περιγραφές: 'Pre-history through 1000 A.D.' και '1000 A.D. "
+"through the 20th century'. Το δεύτερο μάθημα δεν θα έχει περιγραφή, και το "
+"επιπλον \"text after a second comma\" κείμενο στο τρίτο μάθημα θα αγνοηθεί."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Ανεβάστε τα άτομα σε CSV αρχείο"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Δεκέμβριος"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "Επεξεργασία Ονόματος"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Πρόσθεσε νέα ομάδα"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Όνομα ομάδας"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Περιγραφή ομάδας"
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Εμφάνιση ημερολογίου"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Προσθήκη γεγονότων"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "κουμπί-προσθήκης"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Τρέχουσα Εβδομάδα"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Μαθητές"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "Κουμπί ακύρωσης"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "κουμπί-προσθήκης"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "Κουμπί ακύρωσης"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "_Εισάγετε νέο κείμενο:"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Τίτλος σημείωσης"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Δημιουργία"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Προσθήκη term"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Ημαρομηνία"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Το όνομα χρήστη δεν μπορεί να μένει κενό"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Το πλήρες όνομα δεν μπορεί να μένει κενό"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Διπλό όνομα χρήστη: {username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Εισαγωγή προσώπων"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr "<strong></strong> a and a<strong></strong>."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+#, fuzzy
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"ο\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr "τρία and τρία a and Σημείωση in κείμενο."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Ανεβάστε τα άτομα σε CSV αρχείο"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Αλλαγή προτιμήσεων χρήστη"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Επεξεργασία προτιμήσεων"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Ζώνη Ώρας"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Μορφή ώρας"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "ΩΩ:ΛΛ"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "ΩΩ:ΛΛ πμ/μμ"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Μορφή ημερομηνίας"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "ΜΜ/ΗΗ/ΧΧ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "ΧΧΧΧ-ΜΜ-ΗΗ"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Ημέρα Μήνας, Χρόνος"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Η Εβδομάδα αρχίζει την"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Εμφάνιση περιόδων"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Προβολή ονομάτων περιόδων στη ημερήσια εμφάνιση"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Σχέσεις"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Προσθήκη πόρου"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "_Εισάγετε νέο κείμενο:"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "Λεπτά"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Εισαγωγή Πόρων"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr "Προσθήκη πόρου"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Επεξεργασία Πληροφοριών Τμήματος"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Πόροι"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Πόροι"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Το παραπάνω παράδειγμα θα δημιουργήσει 3 μαθήματα με τίτλους: 'Ancient "
+"History', 'US History' και 'World History'. Το πρώτο και το τελευταίο μάθημα "
+"θα έχουν τις εξής περιγραφές: 'Pre-history through 1000 A.D.' και '1000 A.D. "
+"through the 20th century'. Το δεύτερο μάθημα δεν θα έχει περιγραφή, και το "
+"επιπλον \"text after a second comma\" κείμενο στο τρίτο μάθημα θα αγνοηθεί."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "Ανεβάστε τα μαθήματα ως CSV αρχείο"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+#, fuzzy
+msgid "Calendar_relationships"
+msgstr "Σχέσεις"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Ημερολόγιο"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "επάνω"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Ενέργειες"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+#, fuzzy
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr "<p>&copy;<span></span></p><p>&trade; είναι a από</p>"
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Είσοδος"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Χρήστης:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Αποσύνδεση"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+#, fuzzy
+msgid "New Term"
+msgstr "Νέα τέρμινο"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+"Η ημερομηνία που δώσατε δεν είναι επιτρεπτή. Παρακαλώ χρησιμοποιείστε τη "
+"μορφή: ΧΧΧΧ-ΜΜ-ΗΗ."
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+#, fuzzy
+msgid "Please enter the replacement date below."
+msgstr "Εισάγετε τουλάχιστον $number περιόδους"
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+#, fuzzy
+msgid "Please enter the emergency date below."
+msgstr "Εισάγετε τουλάχιστον $number περιόδους"
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Περίοδος"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "_Εισάγετε νέο κείμενο:"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Προσθήκη νέας συνεδρίας"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Ημερομηνία έναρξης"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Τέλος"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${month} ${year}"
+msgstr "${month}, ${year} (Εβδομάδα ${week})"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Εβδομάδα ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+#, fuzzy
+msgid "Add term"
+msgstr "Προσθήκη term"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Αποθήκευση αλλαγών"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+#, fuzzy
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr "Πρώτη and τελεία από term είναι e in."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+#, fuzzy
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "είναι e."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Ανανέωση"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"Δεύτερον, παρακαλώ προσδιορίστε ποιές μέρες είναι μέρες σχολείου, και ποιές "
+"μέρες είναι διακοπές."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+"Παρακαλώ προσδιορίστε ποιές μέρες είναι μέρες σχολείου, και ποιές μέρες "
+"είναι διακοπές."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Αργία"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Εναλλαγή των ακόλουθων ημερών της εβδομάδας:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Μη επιτρεπτή ημερομηνία. Παρακαλώ χρησιμοποιείστε τη μορφή: ΧΧΧΧ-ΜΜ-ΗΗ"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Προβολή ωρολόγιων προγραμμάτων"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Προβολή ωρολόγιων προγραμμάτων"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Πρόγραμμα"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Παρακαλώ επιλέξτε μια τιμή"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Ημέρα ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Περίοδος 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Περίοδος ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+#, fuzzy
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr "ημέρα με ημέρα από e στο πρώτη ημέρα είναι στο δευτερόλεπτο and στο."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+#, fuzzy
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr "ημέρες ημέρες not ημέρες."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+#, fuzzy
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Αδυναμία αποθήκευσης τιμής στο κλειδί '%s', επειδή ο εξυπηρετητής ρυθμίσεων "
+"δεν έχει εγγράψιμες βάσεις δεδομένων. Υπάρχουν μερικές κοινές αιτίες για "
+"αυτό το πρόβλημα: 1) το αρχείο διαδρομής ρυθμίσεων %s/path δεν περιέχει "
+"βάσεις δεδομένων ή δε βρέθηκε 2) με κάποιο τρόπο δημιουργήθηκαν κατά λάθος "
+"δύο διεργασίες gconfd 3) δεν έχει ρυθμιστεί σωστά το λειτουργικό σας σύστημα "
+"και έτσι το κλείδωμα αρχείου NFS δε λειτουργεί στον αρχικό σας κατάλογο ή 4) "
+"το σύστημα πελάτης NFS κόλλησε και δεν ειδοποίησε τον εξυπηρετητή κατά την "
+"επανεκκίνηση ότι πρέπει να αποδεσμευτούν τα κλειδώματα αρχείων. Αν υπάρχουν "
+"δύο διεργασίες  gconfd (ή υπήρχαν δύο κατά την εκκίνηση της δεύτερης) "
+"αποσυνδεθείτε, τερματίστε όλα τα αντίγραφα του gconfd και συνδεθείτε ξανά. "
+"Αν έχετε παραμένοντα κλειδώματα αφαιρέστε το ~/.gconf*/*lock. Ίσως το "
+"πρόβλημα να βρίσκεται αν προσπαθήσατε να χρησιμοποιήσετε το  GConf από δύο "
+"μηχανές μαζί και έτσι το  ORBit έχει ακόμα τις προεπιλεγμένες ρυθμίσεις που "
+"δεν επιτρέπουν απομακρυσμένες συνδέσεις  CORBA  - βάλτε \"ORBIIOPIPv4=1\" "
+"στο /etc/orbitrc. Και όπως πάντα, ελέξτε το αρχείο καταγραφής  user.* για "
+"λεπτομέρειες προβλημάτων που συνάντησε το gconfd. Θα πρέπει να υπάρχει μόνο "
+"ένα gconfd ανά αρχικό κατάλογο χρήστη, και θα πρέπει να του ανήκει ένα "
+"αρχείο κλειδώματος ~/.gconfd και αρχεία κλειδώματος σε ανεξάτητες τοποθεσίες "
+"όπως ~/.gconf"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+#, fuzzy
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+"Η εφαρμογή '%s' (%s) επιθυμεί να δημιουργήσει ένα νέο keyring με το όνομα '%"
+"s'. Θα πρέπει να επιλέξετε τον κωδικό που θέλετε να χρησιμοποιήσετε για αυτό."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+#, fuzzy
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr "τελεία and."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+#, fuzzy
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr "in είναι απομάκρυνση and."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+#, fuzzy
+msgid "Create timetable schema"
+msgstr "Δημιουργία σχήματος ημερολογίου"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+#, fuzzy
+msgid "First, please define the days and periods of the timetable."
+msgstr "Πρώτη ημέρες and από."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Αντιγραφή ημέρα"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+#, fuzzy
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Απομάκρυνε αυτή τη μέρα"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Προσθήκη ημέρας"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Πρόσθεσε μια περίοδο"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+#, fuzzy
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr "Δευτερόλεπτο ημέρες με ημερολόγιο ημέρες."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Ωρολόγιο πρόγραμμα"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "Νέα τέρμινο"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+#, fuzzy
+msgid "Schema"
+msgstr "Νέο σχήμα"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Επιλογή"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Αποθήκευση"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+#, fuzzy
+msgid "There are no terms or timetable schemas defined."
+msgstr "Δημιουργία σχήματος ημερολογίου"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Προβολή ωρολόγιων προγραμμάτων"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Όνομα περιόδου"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+#, fuzzy
+msgid "Period start time"
+msgstr "Όνομα περιόδου"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "Όνομα περιόδου"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Δημιουργία"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Όνομα περιόδου"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+#, fuzzy
+msgid "New start"
+msgstr "_Εισάγετε νέο κείμενο:"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Νέο άτομο"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Δευτέρα"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Δημιουργία σχήματος ημερολογίου"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+#, fuzzy
+msgid "Timetables for ${object}"
+msgstr "για"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Νέο σχήμα ημερολογίου"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Ημέρες της εβδομάδας"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Εισάγεται τα ονόματα των περιόδων, ένα σε κάθε γραμμή"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Εισάγετε τουλάχιστον $number περιόδους"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Άγνωστος κωδικός ημέρας: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+#, fuzzy
+msgid "Unknown period id: %r"
+msgstr "Άγνωστος κωδικός περιόδου: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Όνομα Χρήστη"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Άλλαξε το όνομα, την εικόνα ή τον κωδικό αυτού του ατόμου"
+
+#~ msgid "Import Sections"
+#~ msgstr "Εισαγωγή Τμημάτων"
+
+#, fuzzy
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Το αρχείο ρυθμίσεων `%s' δε βρέθηκε: %s"
+
+#~ msgid "My Preferences"
+#~ msgstr "Οι προτιμήσεις μου"
+
+#~ msgid "New password"
+#~ msgstr "Νέος κωδικός"
+
+#~ msgid "Verify password"
+#~ msgstr "Επαλήθευση κωδικού"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Οι κωδικοί δεν είναι ίδιοι"
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Ο κωδικός άλλαξε επιτυχώς"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Οι κωδικοί δεν είναι ίδιοι"
+
+#, fuzzy
+#~ msgid "Create new objects"
+#~ msgstr "Δημιουργία νέων αντικειμένων"
+
+#, fuzzy
+#~ msgid "Control access"
+#~ msgstr "Έλεγχος πρόσβασης"
+
+#, fuzzy
+#~ msgid "Authenticated users"
+#~ msgstr "Πιστοποιημένοι χρήστες"
+
+#, fuzzy
+#~ msgid "Unauthenticated users"
+#~ msgstr "Μη πιστοποιημένοι χρήστες"
+
+#~ msgid "An error occured."
+#~ msgstr "Προέκυψε σφάλμα."
+
+#~ msgid "All Users"
+#~ msgstr "Όλοι οι χρήστες"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "είναι not a αρχείο ο\n"
+
+#, fuzzy
+#~ msgid "Import CSV"
+#~ msgstr "Εισα_γωγή Πιστοποιητικού"
+
+#, fuzzy
+#~ msgid ""
+#~ "The first row of the CSV file must contain the period id and the schema "
+#~ "of the timetable."
+#~ msgstr "πρώτη από αρχείο τελεία and από."
+
+#, fuzzy
+#~ msgid "The first cell on the period list row (${row_no}) should be empty."
+#~ msgstr "πρώτη στο τελεία λίστα όχι."
+
+#, fuzzy
+#~ msgid ""
+#~ "There are more records [${records}] (line ${line_no}) than periods "
+#~ "[${periods}]."
+#~ msgstr "όχι."
+
+#, fuzzy
+#~ msgid "timetable.csv imported successfully."
+#~ msgstr "Η λίστα ανάκτησης πιστοποιητικών έχει εισαχθεί επιτυχώς."
+
+#, fuzzy
+#~ msgid "Failed to import timetable.csv"
+#~ msgstr "Αποτυχία"
+
+#, fuzzy
+#~ msgid "roster.txt imported successfully."
+#~ msgstr "Η λίστα ανάκτησης πιστοποιητικών έχει εισαχθεί επιτυχώς."
+
+#~ msgid "Other charset:"
+#~ msgstr "Άλλη κωδικοποίηση χαρακτήρων:"
+
+#, fuzzy
+#~ msgid "Note that the import may take a while. Please be patient."
+#~ msgstr "Σημείωση a."
+
+#, fuzzy
+#~ msgid "Format of the files"
+#~ msgstr "Αδυναμία αναγνώρισης τύπου αρχείου %s"
+
+#, fuzzy
+#~ msgid ""
+#~ "<strong>timetable.csv</strong> contains lines of comma-separated values "
+#~ "as in the following example:"
+#~ msgstr "<strong></strong> περιέχει γραμμές από κόμμα in following:"
+
+#, fuzzy
+#~ msgid ""
+#~ "<strong>roster.txt</strong> contains plain text as in the following "
+#~ "example:"
+#~ msgstr "<strong></strong> περιέχει κείμενο in following:"
+
+#, fuzzy
+#~ msgid "Timetable schema name must not be empty"
+#~ msgstr "not"
+
+#, fuzzy
+#~ msgid ""
+#~ "Timetable schema name can only contain English letters, numbers, and the "
+#~ "following punctuation characters: - . , ' ( )"
+#~ msgstr "Αγγλική and following"
+
+#, fuzzy
+#~ msgid "Timetable schema with this name already exists."
+#~ msgstr ""
+#~ "Ένα αρχείο με αυτό το όνομα υπάρχει ήδη.\n"
+#~ "Να αντικατασταθεί;"
+
+#, fuzzy
+#~ msgid "Duration cannot be negative"
+#~ msgstr "Αυτή η λειτουργία δεν μπορεί να εκτελεσθεί χωρίς σύνδεση"
+
+#, fuzzy
+#~ msgid "Duration cannot be longer than 24 hours"
+#~ msgstr "Διάρκεια ώρες"
+
+#, fuzzy
+#~ msgid ""
+#~ "An identifier for a section, made up if instructor\n"
+#~ "            names, courses, and meeting time."
+#~ msgstr ""
+#~ "για a πάνω\n"
+#~ " and."
+
+#, fuzzy
+#~ msgid "Title of the section."
+#~ msgstr "Ο τίτλος του κουτιού διαλόγου επιλογής"

Added: schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# English translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: English <en at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/en/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4763 @@
+# English translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: English <en at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/en_AU/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/en_AU/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/en_AU/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# English (Australia) translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-05-03 05:00+0000\n"
+"Last-Translator: Ian Griffiths <ianrgriffiths at gmail.com>\n"
+"Language-Team: English (Australia) <en_AU at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/en_GB/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/en_GB/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/en_GB/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2452 @@
+# English (United Kingdom) translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-06-02 15:57+0000\n"
+"Last-Translator: Owl <takowl at tiscali.co.uk>\n"
+"Language-Team: English (United Kingdom) <en_GB at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "People"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 person"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} people"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Username or password is incorrect"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "This week"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "March"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "January"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "February"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "June"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "May"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "July"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Tomorrow"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Today"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Yesterday"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "October"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "December"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Monday"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Tuesday"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Wednesday"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Thursday"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Sunday"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Saturday"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Friday"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Mon"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Tue"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Wed"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Thu"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Fri"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sat"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Sun"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Title"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "All day"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Date"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Time"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duration"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutes"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Hours"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Days"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Location"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Description"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Day"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Week"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Month"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Year"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repeat every"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Until"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "forever"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Number of events"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Weekdays"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Weekday"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Monthly"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "First"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "Fourth"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "Third"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "Second"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "Fifth"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "End date is earlier than start date"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Invalid date. Please specify YYYY-MM-DD, one per line."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Add event"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Add"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Edit event"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Update"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "iCalendar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Next week"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "This week"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Last week"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Next month"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "This month"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Last month"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Title"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Groups"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Duration"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Date"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Resource index"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Add a new resource"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Insufficient data provided."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "This month"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "This month"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Groups"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Resources"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Resources"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Person index"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Add a new person"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Cancel"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Change Membership"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Username"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Password"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "This username is already used!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Last month"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Person Information"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Starts"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sat"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Next"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Number of events"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Full name"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Full name"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Full name"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Photo"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Photo (in JPEG format)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "New Note"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Password was successfully changed!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Password was successfully changed!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Password was successfully changed!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Person Information"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Group index"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Add a new group"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Resource index"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Add a new resource"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Last week"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Password was successfully changed!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "This week"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Password was successfully changed!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Starts"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Next week"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Username may not be empty"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Fullname may not be empty"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "New password"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "New password"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "View calendar"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Name that should be displayed"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Resource index"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Add a new resource"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Resource index"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Add a new resource"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Insufficient data provided."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Insufficient data provided."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Insufficient data provided."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Photo"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "top"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Change Details"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "New Note"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Add a new person"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Starts"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Invalid date. Please specify YYYY-MM-DD, one per line."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Add a new resource"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} people"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Note"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "New photo"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "A small picture (about 48x48 pixels in JPEG format)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Clear photo"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Check this to clear the photo"
+
+#~ msgid "Verify password"
+#~ msgstr "Verify password"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Passwords do not match."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Passwords do not match!"
+
+#~ msgid "View"
+#~ msgstr "View"
+
+#~ msgid "Edit"
+#~ msgstr "Edit"
+
+#~ msgid "Create new objects"
+#~ msgstr "Create new objects"
+
+#~ msgid "Add events"
+#~ msgstr "Add events"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modify/delete events"
+
+#~ msgid "Control access"
+#~ msgstr "Control access"
+
+#~ msgid "Manage membership"
+#~ msgstr "Manage membership"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Authenticated users"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Unauthenticated users"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Change Preferences"
+
+#~ msgid "New Person"
+#~ msgstr "New Person"
+
+#~ msgid "Import Persons"
+#~ msgstr "Import People"
+
+#~ msgid "Add a Group"
+#~ msgstr "Add a Group"
+
+#~ msgid "New Group"
+#~ msgstr "New Group"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Edit Group Information"
+
+#~ msgid "A Group"
+#~ msgstr "A Group"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell Group"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Add/Remove Members"
+
+#~ msgid "Import Groups"
+#~ msgstr "Import Groups"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Add a Resource"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Edit Resource Information"
+
+#~ msgid "New Resource"
+#~ msgstr "New Resource"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell Resource"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Allows the user to add people, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the People Index, "
+#~ "that user will be able to see the calendars of all people. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "There are no people with calendars accessible to you."
+
+#~ msgid "day"
+#~ msgstr "day"
+
+#~ msgid "week"
+#~ msgstr "week"
+
+#~ msgid "month"
+#~ msgstr "month"
+
+#~ msgid "year"
+#~ msgstr "year"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Who can view the note?"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "edit details"
+#~ msgstr "edit details"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modify this person's details"
+
+#~ msgid "Add person"
+#~ msgstr "Add person"
+
+#~ msgid "Add to groups"
+#~ msgstr "Add to groups"
+
+#~ msgid "Edit person"
+#~ msgstr "Edit person"
+
+#~ msgid "Current"
+#~ msgstr "Current"
+
+#~ msgid "Future"
+#~ msgstr "Future"
+
+#~ msgid "All"
+#~ msgstr "All"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Tomorrow's Events"

Added: schooltool/branches/upstream/current/src/schooltool/locales/en_US/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/en_US/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/en_US/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2397 @@
+# #############################################################################
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2004 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# #############################################################################
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolTool (unknown version)\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-01-06 11:58+0000\n"
+"Last-Translator: Albertas Agejevas <alga at pov.lt>\n"
+"Language-Team: SchoolTool Developers <schooltool at schooltool.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: schooltool/translation/i18nextract.py\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+#, fuzzy
+msgid "Leaders"
+msgstr "Supervisors"
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Supervisors for ${group}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "Supervisors"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolBell"
+
+#~ msgid "SchoolTool server not listening on %s:%s"
+#~ msgstr "SchoolBell server not listening on %s:%s"
+
+#~ msgid "Pupils"
+#~ msgstr "Members"
+
+#~ msgid "www/logo.png"
+#~ msgstr "www/schoolbell.png"
+
+#~ msgid "Teaching"
+#~ msgstr "Supervision"
+
+#~ msgid "Cannot add teacher %(other)s to %(this)s"
+#~ msgstr "Cannot add supervisor %(other)s to %(this)s"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolTool. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+
+#~ msgid "Set who can add/remove members<br />and teachers of this group."
+#~ msgstr "Set who can add/remove members<br />and supervisors of this group."
+
+#~ msgid "This group has no teachers."
+#~ msgstr "This group has no supervisors."
+
+#~ msgid "There are no teachers."
+#~ msgstr "There are no supervisors."
+
+#~ msgid "Sorry, there are no teachers that could be added."
+#~ msgstr "Sorry, there are no supervisors that could be added."
+
+#~ msgid "Add teacher"
+#~ msgstr "Add supervisor"
+
+#~ msgid "Welcome to SchoolTool"
+#~ msgstr "Welcome to SchoolBell"
+
+#~ msgid ""
+#~ "Warning: resetting the database will irreversibly destroy all data in "
+#~ "this SchoolTool instance. Are you sure you want to proceed?"
+#~ msgstr ""
+#~ "Warning: resetting the database will irreversibly destroy all data in "
+#~ "this SchoolBell instance. Are you sure you want to proceed?"
+
+#~ msgid "Reset the SchoolTool database"
+#~ msgstr "Reset the SchoolBell database"
+
+#~ msgid "Teacher tasks"
+#~ msgstr "Supervisor tasks"
+
+#~ msgid "Creating teachers... "
+#~ msgstr "Creating supervisors... "
+
+#~ msgid "Creating pupils... "
+#~ msgstr "Creating members... "
+
+#~ msgid "Add &Teacher"
+#~ msgstr "Add &Supervisor"
+
+#~ msgid "Add a teacher to this group"
+#~ msgstr "Add a supervisor to this group"
+
+#~ msgid "Add Teacher"
+#~ msgstr "Add Supervisor"
+
+#~ msgid "Could not get a list of teachers: %s"
+#~ msgstr "Could not get a list of supervisors: %s"
+
+#~ msgid "Select a teacher to add to %s"
+#~ msgstr "Select a supervisor to add to %s"
+
+#~ msgid "Could not add teacher: %s"
+#~ msgstr "Could not add supervisor: %s"
+
+#~ msgid ""
+#~ "%s, %s\n"
+#~ "Teacher: %s\n"
+#~ "Activity: %s"
+#~ msgstr ""
+#~ "%s, %s\n"
+#~ "Supervisor: %s\n"
+#~ "Activity: %s"
+
+#~ msgid ""
+#~ "%s, %s\n"
+#~ "Teacher: %s"
+#~ msgstr ""
+#~ "%s, %s\n"
+#~ "Supervisor: %s"
+
+#~ msgid "Perhaps another SchoolTool instance is using it?"
+#~ msgstr "Perhaps another SchoolBell instance is using it?"
+
+#~ msgid ""
+#~ "Old database format is incompatible with the new SchoolTool version.\n"
+#~ "Please remove your Data.fs and try again.  Note that you will lose all\n"
+#~ "the data."
+#~ msgstr ""
+#~ "Old database format is incompatible with the new SchoolBell version.\n"
+#~ "Please remove your Data.fs and try again.  Note that you will lose all\n"
+#~ "the data."
+
+#~ msgid "%s is not a teacher of %s"
+#~ msgstr "%s is not a supervisor of %s"
+
+#~ msgid "Welcome to the SchoolTool server"
+#~ msgstr "Welcome to the SchoolBell server"
+
+#~ msgid "Teacher Group"
+#~ msgstr "Supervisor Group"
+
+#~ msgid "The teaching relationship."
+#~ msgstr "The supervision relationship."
+
+#~ msgid "Teacher"
+#~ msgstr "Supervisor"
+
+#~ msgid "A role of a teacher."
+#~ msgstr "A role of a supervisor."
+
+#~ msgid "Taught"
+#~ msgstr "Supervised"
+
+#~ msgid "A role of a group that has a teacher."
+#~ msgstr "A role of a group that has a supervisor."
+
+#~ msgid "Invalid group %s for teacher %s"
+#~ msgstr "Invalid group %s for supervisor %s"
+
+#~ msgid "Imported person (teacher): %s"
+#~ msgstr "Imported person (supervisor): %s"

Added: schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2243 @@
+# Spanish translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-05-13 18:49+0000\n"
+"Last-Translator: Carlos Perelló Marín <carlos.perello at canonical.com>\n"
+"Language-Team: Spanish <es at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Las contraseñas no coinciden."

Added: schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/es/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5257 @@
+# Spanish translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# Mario Fuentes <mario at gnome.cl>, 2005.
+# , fuzzy
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To:\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-06-26 21:36+0000\n"
+"Last-Translator: Miguel Yunuen <miguelyunuen at gmail.com>\n"
+"Language-Team: Spanish <es at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Apodo"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Un apodo corto para esta persona."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Correo Electrónico primario"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Correo Electrónico secundario"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Teléfono primario"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Número de Teléfono recomendado."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Teléfono secundario"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Número de Teléfono secundario."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Sitio Web"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Sitio Web o Bitácora (blog)."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Domicilio"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personas"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 persona"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personas"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nombre de usuario o contraseña incorrecta"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Marzo"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Enero"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Febrero"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Junio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mayo"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Septiembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Julio"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Siguiente día"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hoy"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Día anterior"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Octubre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Diciembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Noviembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Lunes"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Martes"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Jueves"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Domingo"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Sábado"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Viernes"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Lun"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Mar"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Mie"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Jue"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Vie"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Dom"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Nombre"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Todo el día"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Fecha"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Iniciar hora en formato de 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duración"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipo de Duración"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minutos"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Horas"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Días"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Ubicación"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Descripción"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Recurrente"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Ocurre cada"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Día"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Mes"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Año"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repetir cada"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Rango"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Contador"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Hasta que"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "para siempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Cantidad de eventos"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Repetir hasta que"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Días de la semana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Día de la semana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Mensual"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Fechas especiales"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "mismo día de la semana"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1er"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4to"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3ro"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2do"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5to"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "última día de la semana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Último ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Un error aparecio"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Hora no válida"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "La fecha final es más temprano que la fecha del comienzo"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Fecha no válida. Porfavor especifique AAAA-MM-DD, uno por línea."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Añadir evento"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Añadir"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Actualizar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Actualizado el ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Calencario"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Próxima semana"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Semana actual"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Semana anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Próximo mes"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mes actual"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mes anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Semana ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Próximo año"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Año Actual"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Año anterior"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Acciones"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Calencario"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Calencario"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Calencario"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Calencario"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Ver"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Calencario"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Añadir evento"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Ingresar"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navegación"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Acciones"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Calencario"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "No se proveyeron datos"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "No se pudo convertir los datos a Unicode (codificación incorrecta)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "El archivo CSV se importó correctamente."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Falló la importación del archivo CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "El texto CSV se importó correctamente."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Falló la importación del texto CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "No se especificó una codificación"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Codificación desconocida"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Los datos CSV contienen errores, linea ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Falló la conversión a Unicode en la linea ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "La fila 2 no está vacía"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+"Línea mal formada ${line_no} (debe de existir un identificador de dia y un "
+"identificador de periodo)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "La descripción de la sección está incompleta en la linea ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"La primera fila del archivo CSV debe contener el identificador del término y "
+"el del esquema de horario."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "El término ${term} no existe."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "El esquema de horario ${schema} no existe."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Ocurrió un error en el dato de horario del CSV, linea ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+"Los identificadores de días no están definidos en el esquema seleccionado: "
+"${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "No se definieron periodos en los días seleccionados: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "No se encontró la Persona: {args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "No se encontró la Asignatura: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "No se encontró la Sección: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Registros no válidos: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Cambios guardados."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "todo el día"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Ubicación: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Recursos reservados: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "recurrente"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "cubierto por %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendario diario para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendario semanal para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Semana %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendario mensual para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"El soporte para PDF está desactivado. Éste puede ser activado por el "
+"administrador."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Modificar Preferencias"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Preferencias del Calendario"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Preferencias del Calendario"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Editar preferencias de la persona"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Editar preferencias de la persona"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Descripción"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Ir a..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Eventos para mañana"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Versión imprimible"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Ver calendario diario"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Diario"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Ver calendario semanal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Semanal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Ver calendario mensual"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Ver calendario anual"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Anual"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Calendario para ${title} - ${celandar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Cal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Calendario personal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Calendario del horario"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Mi calendario"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendarios"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Más..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Calencario"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Ver calendario"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Calendario semanal para %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "delete-button"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "cancel-button"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Remover"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "No hay ninguno"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Encuentre ahora"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Limpiar"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Nada para agregar."
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Añadir evento"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Detalles"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Cambiar el profesor de esta asignatura."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Recursos reservados: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "editar grupos"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Modificar/borrar eventos"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Modificar información de la sección"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "edtiar detalles"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Actualizar"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Hoy"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Semana"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Mes"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Año"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Repetir hasta que"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Ver calendario"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Repetir cada"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Recursos reservados: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Información del usuario: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Nombre"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "cambiar ubicación"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Asignaturas"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Bienvenido a SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Modificar información de la sección"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Ingresar"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "recurrente"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Todo el día"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Occidental (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Occidental (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Otro (especifique)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Otro juego de caracteres: ${other_charser}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Datos CSV de Entrada"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "Datos CSV"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "submit-button"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Importar horario"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Puede crear un archivo CSV en una hoja de cálculos y exportarla en formato "
+"CSV (Valores Separados por Coma).  La estructura de la tabla se describe a "
+"continuación"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"La primera fila del archivo debe contener el nombre del <strong>término</"
+"strong> y el <strong>esquema de horario</strong> que se utilizará para los "
+"horarios nuevos. La segunda fila estará vacia. Después pueden ir varios "
+"descripciones de secciones separadas por una linea en blanco."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+#, fuzzy
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+"Cada primera fila de la descripción de la sección contiene el "
+"<strong>identificador de la asignatura</strong> y el <strong>identificador "
+"del profesor</strong> para la nueva sección. Entonces varias filas, cada una "
+"conteniendo un <strong>identificador del día</strong>, un "
+"<strong>identificador del período</strong> y opcionalmente un "
+"<strong>identificador de la ubicación</strong>, siguiente. La lista de "
+"descripciones de período es terminada por tres asteriscos ('***') en la "
+"primera columna. Después de terminado, cualquier número de "
+"<strong>identificadores de personas</strong> puede seguir, las personas "
+"anotadas serán añadidas a la sección como estudiantes."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Subir horario en un archivo CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Ejemplo:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"filosofía\",\"lorch\"\n"
+"\"Lunes\",\"A\",\"room137\"\n"
+"\"Lunes\",\"B\"\n"
+"\"Martes\",\"C\",\"room138\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literatura\",\"guzman\"\n"
+"\"Miércoles\",\"B\"\n"
+"\"Miércoles\",\"C\",\"room139\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"El ejemplo anterior creará dos nuevas secciones, una para la cátedra de "
+"filosofía y otra para la cátedra de literatura. La sección para la cátedra "
+"de filosofía tendrá a las personas con los identificadores 'Johnny' y "
+"'billy' como estudiantes, y sus horarios contendrán tres actividades del "
+"horario, dos el lunes (uno tomando lugar en la ubicación denotada por el "
+"identificador `room137`, y uno sin una ubicación específica). La sección de "
+"literatura se procesará de modo similar."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Note que solamente identificadores de objetos deberán ser utilizadas en el "
+"archivo, no títulos. Si una fila termina con celdas vacías (por ejemplo, <em>"
+"\"philosophy\",\"lorch\",\"\",\"\"</em>), Esas celdas serán descartadas. "
+"Usted puede separar las descripciones de la sección por más de una línea. En "
+"la lista de estudiantes, sólo la primera columna que contiene los "
+"identificadores personales que están procesadosse, las otras columnas serán "
+"ignoran. Usted puede importar los mismos datos varias veces sin ningún "
+"efecto lateral."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Subir archivo CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "Archivo CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Codificación:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Occidental (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendario para %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Recursos reservados: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"El nombre de la Escuela u Organización que está corriendo\n"
+"            este servidor. Este será mostrado en los calendarios públicos\n"
+"            en la parte inferior de toda las páginas y en el título."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Página principal del Calendario"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Muestra el calendario en la página principal\n"
+"            del sitio."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Falta una entrada requerida"
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "La entrada del formulario no es un archivo objeto"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Dato entero no válido"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Dato de texto no válido"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Dato textual no válido"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Dato Unicode no válido"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Dato real no válido"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Dato de tiempo no válido"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Enviado al fondo, PID del demonio: %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Ejecute %s -h para obtener ayuda."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: el modo demonio no esta soportado en su sistema operativo"
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Leyendo configuración de %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Administrador"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Tiempo de arranque: %.3f seg reales, %.3f seg de CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"No se pudo iniciar la base de datos:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"¿Quizás otra instancia %s está utilizándolo?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Precaución: no se encontró la biblioteca reportlab.\n"
+"El soporte de PDF será deshabilitado."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Precaución: el directorio de tipografías '%s' no existe.\n"
+"El soporte para PDF será deshabilitado."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Precaución: la tipografía '%s' no existe.\n"
+"El soporte para PDF será deshabilitado."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"No se definió un almacenamiento en el archivo de configuración.\n"
+"\n"
+"Si esta usando el archivo de configuración por defecto, por favor edítelo\n"
+"ahora y descomente una de las secciones ZODB de almacenamiento.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Este no es una base de datos de SchoolBell 1.0, abortando.\n"
+"\n"
+"Por favor ejecute el script de actualización de la base de datos.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "LCA"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Bienvenido al servidor SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Preferencias del Calendario"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Editar preferencias de la persona"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Personas"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Planificando para ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Leyenda:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minutos"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "recurrente"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Domingo"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Nada para agregar."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "La fecha que ingresó no pertenece a este término."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Nada para agregar."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Planificandoa para ${person}"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Año anterior"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Siguiente"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Ubicación"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Añadir una Sección"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Ver"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Editar evento"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Añadir una Sección"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Modificar información de la sección"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importar Asignaturas"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr "Añadir Asignatura"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Nueva Asignatura"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Índice de asignaturas"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Añadir una nueva asignatura"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Se proveyeron insuficientes datos"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "El nombre no puede estar en blanco"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "No existe esta asignatura."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Se necesita un ID de asignatura."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Añadir una sección a ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Profesor"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Profesores Actuales"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Profesores disponibles"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Estudiantes"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grupos"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Índice de secciones"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Añadir una nueva sección"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"Los datos CSV <strong>deben</strong> incluir el nombre de la asignatura y "
+"opcionalmente <strong>puede</strong> agregar una descripción del ella. "
+"Cualquier información adicional será ignorada."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"La historia antigua, La prehistoria alrededor del 1000 A.C.\n"
+"Historia de los Estados Unidos\n"
+"Historia del Mundo, Del 1000 A.C. al siglo XX, Texto después de la segunda "
+"coma\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"El ejemplo anterior creará 3 asignaturas tituladas 'La historia antigua',  "
+"'Historia de los Estados Unidos' e 'Historia del Mundo'.  La primera y "
+"últimaasignatura tendrán las descripciones 'La prehistoria alrededor del "
+"1000 A.C.' y'Del 1000 A.C. al siglo XX', respectivamente. La segunda "
+"signatura no tendrádescripción, y el texto 'Texto después de la segunda "
+"coma' sera ignorado."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Subir asignaturas en un archivo CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Secciones"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "Estudiantes"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Sección de ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "editar nombre"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Cambiar la ubicación o el nombre de la sección."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Cambiar el profesor de esta asignatura."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Recursos reservados: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Cambiar el profesor de esta asignatura."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "editar profesor"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "editar individuos"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Cambiar individualmente los estudiantes en esta sección"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Cambiar por grupos los estudiantes de esta sección."
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "editar grupos"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Identificador (opcional)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Sección"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Tamaño Actual"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Hay ${num_errors} errores de entrada."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Nombre de la Asignatura."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Descripción de la Asignatura."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Etiqueta"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Un identificador para una sección, compuesto del nombre del\n"
+"            profesor, asignaturas, y duración de la cátedra."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Código"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "Código identificador para la sección."
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Descripción de la sección."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Personas"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Marzo"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Día escolar"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Día de Emergencia"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Día de Emergencia"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Día de Emergencia"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Editar"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Cancelar"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Nombre de Usuario"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Contraseña"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "¡Este nombre de usuario ya está en uso!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Aplicar"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Diario"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "No hay ninguno"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "No hay ninguno"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Notas"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nombre completo"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Fotografía"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Fotografía (en formato JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Asignaturas"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "delete-button"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "add-button"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "cancel-button"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Añadir una Sección"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Editar evento"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Estudiantes"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "delete-button"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Periodo ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importar Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Añadir nuevo grupo"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Modificar información de la sección"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Administrar asociación"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"Los datos CSV <strong>deben</strong> incluir el nombre del grupo y "
+"opcionalmente <strong>puede</strong> agregar una descripción del él. "
+"Cualquier información adicional será ignorada."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"GUL, Grupo de Usuarios de Linux\n"
+"Club de Ajedrez\n"
+"Club Deportivo, Actividades deportivas extra-programáticas, <em> Texto "
+"después de la segunda coma</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"El ejemplo anterior creará 3 grupos llamados 'GUL', 'Club de Ajedrez' y "
+"'Club Deportivo'. El primer y el último grupo tendrán las descripciones "
+"'Grupo de Usuarios de Linux' y 'Actividades deportivas extra-programáticas', "
+"respectivamente. El grupo 'Club de Ajedrez' no tendrá descripción, y texto "
+"'Texto después de la segunda coma' será ignorado."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Subir los Grupos en un archivo CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Noviembre"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "editar nombre"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Cambiar la ubicación o el nombre de la sección."
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Índice de grupos"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Añadir nuevo grupo"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Nombre del grupo."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Descripción del grupo."
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Private_calendar"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Añadir evento"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Editar evento"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "ninguno"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "add-button"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Semana actual"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Estudiantes"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "cancel-button"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "add-button"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "cancel-button"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nuevo término"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Nombre de la nota."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Contenido"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Contenido de la nota."
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Privacidad"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Notas"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Privacidad"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Añadir término"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Fecha"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "el nombre de usuario no puede estar en blanco"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "el nombre completo no puede estar en blanco"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Nombre de usuario duplicado: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importar Personas"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"Los datos CSV <strong>deben</strong> contener un nombre de usuario y el "
+"nombre completo. Opcionalmente <strong>puede</strong> especificar una "
+"contraseña."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"El ejemplo anterior creará 3 usuarios, 'jjones', 'jbjones' y 'howard'. De "
+"los 3, solo 'jbjones' tiene una contraseña ('r2m45j') y está habilitado para "
+"entrar al sistema. Notar que las contraseñas serán enviadas en texto plano."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Subir las Personas en un archivo CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Cambiar preferencias de ${use}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Editar preferencias de la persona"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Zona Horaria"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Zona horaria utilizada para mostrar el calendario"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formato de Hora"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formato de Fecha"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAA-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Día, Mes, Año"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "La semana comienza el día:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Mostrar semanas en Domingo o Lunes"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Mostrar periodos"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Mostrar nombre de los periodos la vista diaria"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nombre que será mostrado"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Relaciones"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Añadir Asignatura"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Editar evento"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Nuevo término"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Mostrando"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "de"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "elementos"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importar Recursos"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Añadir nuevo recurso"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Modificar información de la sección"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Recursos"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Recursos"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"Los datos CSV <strong>deben</strong> incluir el nombre del recurso y "
+"opcionalmente <strong>puede</strong> agregar una descripción él. Cualquier "
+"información adicional será ignorada."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRY302, Proyector central #302\n"
+"Auditorio Principal\n"
+"CP-805, Computador Portátil #805, <em> Texto después de la segunda coma</"
+"em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"El ejemplo anterior creará 3 recursos llamados 'PRY302', 'Auditorio "
+"Principal' y 'CP-805'.  El primer y último recurso tendrán la descripción "
+"'Proyector central #302' y 'Computador Portátil #805', respectivamente. El "
+"recurso 'Auditorio Principal' no tendrá descripción, y el texto 'Texto "
+"después de la segunda coma' será ignorado."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "Subir recursos en un archivo CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Añadir nuevo recurso"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Nombre del recurso."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Descripción del recurso."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Una ubicación."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indica que este recurso es una ubicación, como una sala de clases."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Calendar_relationships"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Calendar_ACL"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Este no es una base de datos de SchoolBell 1.0, abortando.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Este no es una base de datos de SchoolBell 1.0, abortando.\n"
+"\n"
+"Por favor ejecute el script de actualización de la base de datos.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "top"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Fechas especiales"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Ingresar"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Nombre de Usuario:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Salir"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Nuevo Término"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Cancelar la Escuela en Emergencia"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "La fecha de recuperación que ingresó no es válida."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+"La escuela está cerrada por la emergencia. Día de recuperación $replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Día de recuperación por la emergencia: $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+"La fecha que ingresó no es válida.  Po favor utilice el formato YYYY-MM-DD"
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "La fecha que ingresó no pertenece a este término."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "La fecha que ingresó no es un día escolar hábil."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"Usted seleccionó el ${DYNAMIC_CONTENT} como día de emergencia. Ahora "
+"seleccione el día de recuperación. La selección de abajo consiste en días "
+"sin clases que seguirán a la emergencia y varios días después de su término."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Por favor ingrese abajo la fecha de recuperación."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Recuperación"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Elija una recuperación para el día de emergencia."
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"El siguiente formulario le permite marcar las fechas en que no habrán clases "
+"debido a una emergencia, y definir los días de recuperación."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr "Por favor ingrese abajo la fecha de emergencia."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Día de Emergencia"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Cambiar Término: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Nuevo término"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Términos"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Añadir un nuevo término"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Fecha de inicio"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Fecha de término"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Semana ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Añadir término"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Guardar cambios"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Primero, nombre y defina el periodo de tiempo del término. El rando de "
+"fechas es incluyente (p.e., 2004-09-01 a 2004-12-31). Las fechas deben ser "
+"ingresadas en el formato AAAA-MM-DD."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "El rango de fechas es incluyente (p.e., 2004-09-01 a 2004-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"Segundo, especifique que días son días de escuela, y que días son feriados."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+"Por favor especifique que días son días de escuela, y que días son feriados."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Leyenda:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Día escolar"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Feriado"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Marque los siguientes días de la semana:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "Horario de ${object}"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Fecha no válida. Por favor utilice el formato AAAA-MM-DD"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "La fecha no pertenece a ningún término."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Algunos valores no son válidos.  Ellos están marcados en rojo"
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Cambiar el Horario para Un Día"
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Nuevo Horario"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Ver Horarios"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Agenda"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Por favor utilice el formato HH:MM para las horas de inicio y término"
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Debe especificar a lo menos un periodo."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Horarios de Escuela"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Añadir un nuevo esquema"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Por favor elija un valor"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Día ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Periodo 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Periodo ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Esquema de horario ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Los días del horario son usados sequencialmente, salándose los que no hay "
+"escuela."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Tercero, defina las horas y duración de los periodos cuando caigan en "
+"ciertos días de semana. Utilice uno de los siguientes formatos: <tt>HH:MM</"
+"tt> (no olvide especificar la duración en la entrada inferior) o <tt>HH:MM - "
+"HH:MM</tt> (debe expecificar explícitamente ambos extremos, p.e. 9:30 - "
+"10:15). No es necesario definir los periodos de toda la semana, la ausencia "
+"de alguno solo producirá que ese periodo sea saltados ese día. Si la lista "
+"de periodos no se actualiza con los datos que ingresó en la tabla de arriba, "
+"persione el boton Actualizar el formulario."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Por favor elija un nombre para el esquema de horario que quiere crear."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+"Algunas especificaciones del periodo son incorrectas, por lo tanto serán "
+"descartadas."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Finalmente, asegúrese que la información del formulario es correcta, por que "
+"la única forma de corregirla será borrar este horario y recrearlo."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Crear un esquema de horario"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Primero, defina los días y periodos del horario."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Copiar los periodos del día anterior"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Remover este día"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Añadir día"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Añadir periodo"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Segundo, seleccione los días del horario alineados con los del calendario."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"Nota: si una sección aparece en más de una intervalo, en todos ellos debe "
+"seleccionar <em>ninguno</em> para removerla."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Horario"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Término"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Horario"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Planificandoa para ${person}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Elegir"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Este formulario le permite fijar el horario de una persona añadiendo o "
+"eliminando de él, además las secciones del horario en donde tiene clases."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "como parte de"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "ninguno"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "Conflicto de Planificación"
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Guardar"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr "No hay términos o esquemas de horario definidos"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Elija una plantilla de planificación"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "Para término(s):"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Planificando para ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Usando horario:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Esta es una forma fácil de crear un esquema de horario semanal. Solo llene "
+"un número suficiente de lineas para su periodo."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Si usted busca más facilidad puede utilizar el <a href=\"add.html"
+"\">Asistente se creación de esquemas de horario</a>, o bien un <a href="
+"\"complexadd.html\">complejo formulario de creación de esquemas de horario</"
+"a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Nombre del periodo (opcional)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Hora se inicio del periodo"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "Hora de término del periodo"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Crear"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"Usted puede ajustar las horas de inicio y término de ${DYNAMIC_CONTENT} en "
+"el formulario de abajo. Para eliminar un periodo del día, solo borre las "
+"horas de inicio y término de él."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Nombre del periodo"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Inicio original"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Término original"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Nuevo inicio"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Nuevo término"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Modificar"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Este formulario le permite cambiar las horas de inicio y término de los "
+"periodos de un día particular, o cancelar completamente unos periodos."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+"Por favor ingrese abajo la fecha cuando los periodos requieran ser cambiados."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Elija un día especial"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Avance"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Crear un esquema de horario"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Horario para ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Nuevo esquema de horario"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+"¿El ciclo de horarios de la escuela usa los dias de la semana, o un ciclo "
+"rotatorio?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Días de la semana"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Ciclo de rotación"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Ingrese los nombres de los días en el ciclo, uno por linea."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Por favor ingrese a lo menos un nombre de día."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Por favor asegúrese que los nombres de los días sean únicos."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"¿Hacer que las clases comiencen y terminen a la misma hora cada día del "
+"horario?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "La misma hora cada día"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Horas diferentes"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Ingrese las horas de inicio y término de cada intervalo (HH:MM - HH:MM), uno "
+"por linea."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Intervalo de horas no válido: $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Por favor ingrese a lo menos un intervalo de horas."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Ingrese la hora de inicio y término de los intervalos de cada día, un "
+"intervalo (HH:MM - HH:MM) por linea."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Por favor ingrese a lo menos un intervalo de horas por $day."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr "¿Los periodos tienen nombres o son identificados por hora?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Tienen nombres"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Identificado por hora"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Ingrese los nombres de los periodos, uno por linea."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Por favor ingrese al menos $number periodos."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Por favor asegúrese que el nombre del periodo sea único."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "¿La secuencia de periodos es siempre igual o diferente?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Igual"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Diferente"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Por favor peque los periodos en orden:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Por favor especifique todo los periodos."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Los siguientes periodos fueron seleccionados más de una vez: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Por favor pegue los periodos en orden de día correlativo:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period en el día $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Identificador de día desconocido: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Identificador de periodo desconocido: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Nombre de Usuario:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Cambiar el nombre de la persona, su fotografía o su contraseña"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Administrar esta asociación de personas"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importar Secciones"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "La linea ${line_no} está formada mal (debe contener un identificador de "
+#~ "día, un identificador del periodo y opcionalmente un identificador de la "
+#~ "ubicación)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "No se encontró la ubicación: ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Cambiar los detalles de esta persona"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Secciones Mostradas"
+
+#~ msgid "via group"
+#~ msgstr "via group"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Servidor corriendo SchoolTool <span>"
+#~ "${DYNAMIC_CONTENT}</span> &copy; La Fundación Shuttleworth 2003 - "
+#~ "<span>2005</span>: Auspiciando la Innovación Social. </p> <p> "
+#~ "SchoolTool&trade; es Marca Registrada de la Fundación Shuttleworth. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Mis preferencias"
+
+#~ msgid "Person index"
+#~ msgstr "Índice de personas"
+
+#~ msgid "Add a new person"
+#~ msgstr "Añadir nueva persona"
+
+#~ msgid "New photo"
+#~ msgstr "Nueva fotografía"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr ""
+#~ "Usar una imágen pequeña (alrededor de 48x48 pixeles en formato JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Limpiar fotografía"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Chequeé aquí para limpiar la fotografía"
+
+#~ msgid "New password"
+#~ msgstr "Nueva contraseña"
+
+#~ msgid "Verify password"
+#~ msgstr "Repetir contraseña"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Las constraseñas no coinciden."
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "¡La contraseña fue cambiada!"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "¡Las constraseñas no coinciden!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Crear nuevos objetos"
+
+#~ msgid "Add events"
+#~ msgstr "Añadir eventos"
+
+#~ msgid "Control access"
+#~ msgstr "Control de acceso"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Usuarios validados"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Usuarios sin validar"
+
+#~ msgid "An error occured."
+#~ msgstr "Ocurrió un error."
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Usuarios no validados"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Usuario no validado"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Usuarios validados"
+
+#~ msgid "All Users"
+#~ msgstr "Todo los Usuarios"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: precaución: la opción de configuración '%s' fue ignorada"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Modo de empleo: %s [opciones]\n"
+#~ "Opciones:\n"
+#~ "  -c, --config xxx       usar este archivo de configuración\n"
+#~ "  -h, --help             muestra este mensaje de ayuda\n"
+#~ "  -d, --daemon           enviar al fonto después de arrancar\n"
+#~ "  -r, --restore-manager  recuperar el usuario administrador con la "
+#~ "contraseña por defecto\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Bienvenido al servidor SchoolBell"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Este no es una base de datos de SchoolBell 1.10, abortando.\n"
+
+#~ msgid ""
+#~ "You can create the CSV file in a spreadsheet and export it in CSV (Comma- "
+#~ "Separated Values) format. The structure of the table is described below."
+#~ msgstr ""
+#~ "Puede crear un archivo CSV en una hoja de cálculos y exportarla en "
+#~ "formato CSV (Valores Separados por Coma).  La estructura de la tabla se "
+#~ "describe a continuación"
+
+#~ msgid ""
+#~ "Third, define the time and duration of periods when they fall on certain "
+#~ "days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+#~ "don't forget to specify the duration in the text box below) or <tt>HH:MM- "
+#~ "HH:MM</tt> (when you want to specify both endpoints explicitly, e.g., "
+#~ "9:30-10:15). It is not necessary to define all periods for all days of "
+#~ "week, omissions will just cause that period to be skipped if it happens "
+#~ "to fall on that day of week. If the list of periods is not up to date "
+#~ "with the changes you made in the table above, use the Update button to "
+#~ "refresh the form."
+#~ msgstr ""
+#~ "Tercero, defina las horas y duración de los periodos cuando caigan en "
+#~ "ciertos días de semana. Utilice uno de los siguientes formatos: <tt>HH:"
+#~ "MM</tt> (no olvide especificar la duración en la entrada inferior) o "
+#~ "<tt>HH:MM - HH:MM</tt> (debe expecificar explícitamente ambos extremos, p."
+#~ "e. 9:30 - 10:15). No es necesario definir los periodos de toda la semana, "
+#~ "la ausencia de alguno solo producirá que ese periodo sea saltados ese "
+#~ "día. Si la lista de periodos no se actualiza con los datos que ingresó en "
+#~ "la tabla de arriba, persione el boton Actualizar el formulario."
+
+#~ msgid ""
+#~ "First, please name and define the time period of the term. The date range "
+#~ "is inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in "
+#~ "YYYY- MM-DD format."
+#~ msgstr ""
+#~ "Primero, nombre y defina el periodo de tiempo del término. El rando de "
+#~ "fechas es incluyente (p.e., 2004-09-01 a 2004-12-31). Las fechas deben "
+#~ "ser ingresadas en el formato AAAA-MM-DD."

Added: schooltool/branches/upstream/current/src/schooltool/locales/es_CL/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/es_CL/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/es_CL/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4763 @@
+# Spanish (Chile) translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-27 16:10+0000\n"
+"Last-Translator: Mario Fuentes <mario at gnome.cl>\n"
+"Language-Team: Spanish (Chile) <es_CL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/es_ES/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/es_ES/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/es_ES/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3163 @@
+# Spanish (Spain) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# Alejandro S�nchez Mar�n <asmarin at us.es>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-11-09 19:05+0000\n"
+"Last-Translator: Alejandro Sánchez Marín <asmarin at us.es>\n"
+"Language-Team: Spanish (Spain) <es_ES at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Alias"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Un alias corto para esta persona."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Correo electrónico principal"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Correo electrónico secundario"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Teléfono principal"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Número de teléfono recomendado."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Teléfono secundario"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Numero de teléfono secundario."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Sitio web"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Sitio web o blog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Dirección de correo"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personas"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1ª persona"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personas"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nombre de usuario o contraseña incorrectos"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Año actual"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Grupos disponibles"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Marzo"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Enero"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Febrero"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Junio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mayo"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Septiembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Julio"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Día siguiente"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hoy"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Día anterior"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Octubre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Diciembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Noviembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Lunes"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Martes"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Jueves"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Domingo"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Sábado"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Viernes"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Lunes"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Martes"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Miércoles"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Jueves"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Viernes"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sábado"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Domingo"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titulo"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Todos los días"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Fecha"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Hora de comienzo en formato 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duración"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipo de duración"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutos"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Horas"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Días"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Ubicación"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Descripción"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Recurrente"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Marcar todo"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Día"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mes"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Año"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repetir cada"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Rango"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Contador"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Hasta"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "siempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Numero de eventos"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Repetir hasta"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Días de la Semana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Día de la Semana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Mensualmente"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Excepto en fechas"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "misma semana"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2º"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5º"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "Última semana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Última ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Se ha producido un error."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Tiempo inválido"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "La fecha de finalización es menor que la de comienzo."
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Fecha inválida. Por favor especifique AAAA-MM-DD, una por línea"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Añadir evento"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Añadir"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Actualizar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Actualizado en ${date time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Calendarios"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Siguiente semana"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Semana actual"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Semana anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Siguiente mes"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mes actual"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mes anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Semana ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Año siguiente"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Año actual"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Año anterior"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Datos no suministrados"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"No se puede convertir datos a Unicode (¿conjunto de caractéres incorrecto?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Archivo CVS importado correctamente"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Fallo al importar archivo CVS"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Texto CVS importado correctamente"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Fallo al importar texto CVS"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Mapa de caracteres no especificado"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Juego de caracteres desconocido"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Error en datos CVS, línea ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Conversión a unicode fallida en línea ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Error en datos CVS, línea ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Información personal: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Cambios guardados"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "Todo el día"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Localización: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Recursos registrados: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "recurrente"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "solapamiento desde %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendario diario para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendario semanal para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Semana %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendario mensual para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "Soporte para PDF desactivado. Puede ser activado por su administrador."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendarios para %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"El nombre de la escuela o la organización ejecutando\n"
+"          este servidor. Será mostrado en todos los calendarios públicos, en "
+"el\n"
+"          fin de todas las páginas y en la página principal."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Calendario principal"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Mostrar calendario lateral como principal."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Datos requeridos no introducidos."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "El formulario de entrada de daros no es un fichero objeto"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Datos enteros inválidos"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Datos de texto inválidos"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Datos textuales inválidos"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Datos unicod inválidos"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Datos en coma flotante inválidos"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Datos de fecha inválidos"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Moviendo a segundo plano, demonio pid %D"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Ejecute %s -h para ayuda"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: modo demonio no soportado por su sistema operativo."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Leyendo configuración desde %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Administrador"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Tiempo ejecutando: %.3f seg real, %.3f seg CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"No puedo inicializar la base de datos:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"¿Tal vez otra instancia %s se esté ejecutando?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Atención: no se puede encontrar la librería reportlab.\n"
+"Soporte PDF desactivado."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Atención: directorio de fuentes '%s' no existe.\n"
+"Soporte PDF desactivado."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Atención: fuente '%s' no existe.\n"
+"Soporte PDF desactivado."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Uso: %s [opciones]\n"
+"Opciones:\n"
+"  -c, --config xxx usa este archivo de configuración en vez del por defecto\n"
+"  -h, --help muestra este mensaje de ayuda\n"
+"  -d, --daemon el demonio va a segundo plano después de ejecutar\n"
+"  -r, --restore-manager restaura al usuario manager con la contraseña por "
+"defecto\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"No está definida la ruta de almacenamiento en el archivo de configuración.\n"
+"\n"
+"Si está utilizando la configuración por defecto, por favor editelá ahora y\n"
+"descomente una en la sección de almacenamiento de ZODB.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Esto no es una base de datos de Schoolbell 1.0, abortando.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Esto no es una base de datos de schoolbell 1.0, abortando.\n"
+"\n"
+"Por favor ejecute el script local de actualización.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titulo"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Título de la nota."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grupo"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Duración"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Fecha"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Indice de recursos"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Añadir nuevo recurso"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Datos suministrados insuficientes"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Los títulos no puede estar vacíos"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Grupos actuales"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Grupos disponibles"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Mes actual"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Grupos disponibles"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupos"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Grupos actuales"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Grupos disponibles"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importar recursos"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Recursos disponibles"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Índice de personas"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Añadir una nueva persona"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Título del recurso."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Descripción del recurso."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Descripción del grupo."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Sitio web"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Cancelar"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Cambiar información para ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Cambiar pertenecia a grupo"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Cambiar preferencias para ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Cambiar detalles de contacto para ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Cambiar detalles de contacto para ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Información de contacto"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nombre de usuario"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Contraseña"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "¡El usuario ya existe!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Aplicar"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Teléfono principal"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Anterior"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Información de evento"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Alias"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Comienza"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sábado"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Zona Horaria"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Teléfono secundario"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notas"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Siguiente"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Numero de eventos"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Editar nombre"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Editar nombre"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "Editar nombre"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Mis preferencias"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nombre completo"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (en formato JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nueva nota"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Texto CVS importado correctamente"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Contraseña modificada correctamente"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Contraseña modificada correctamente"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Ejemplo:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Inofrmación personal"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Índice de grupos"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Añadir un nuevo grupo"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Grupos de ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Miembros de ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Miembros actuales"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Añadir miembros"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Título del grupo."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Descripción del grupo."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Indice de recursos"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Añadir nuevo recurso"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Semana anterior"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "Texto CVS importado correctamente"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Contraseña modificada correctamente"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Semana actual"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Contraseña modificada correctamente"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Usuario"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Título del recurso."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Descripción del recurso."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Comienza"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Título de la nota."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Siguiente semana"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Título de la nota."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Diario"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Título de la nota."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Cuerpo"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Cuerpo de la nota."
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Privado"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "El nombre de usuario no debe estar vacío"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "El nombre completo no debe estar vacío"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Nombre de usuario duplicado: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nueva contraseña"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Cambiar contraseña"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Zona Horaria"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Zona horaria usada para ver su calendario"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formato horario"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formato fecha"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAAA-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Día Mes, año"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Semana comienza en:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "La semana comienza en Domíngo o Sábado"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Ver calendario"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nombre que debería ser mostrado"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Indice de recursos"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Añadir nuevo recurso"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Indice de recursos"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Añadir nuevo recurso"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Título del recurso."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Descripción del recurso."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Una localización."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indica que este recurso es una localización, como clase."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Datos suministrados insuficientes"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Datos suministrados insuficientes"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Datos suministrados insuficientes"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Mi calendario"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Más..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendarios"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Bienvendio a SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navegación"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Usuario:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "Editar nombre"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Cambiar nombre, foto o contraseña del usuario"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Información personal: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Gestionar los grupos a los que pertenece esta persona"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "Editar grupos"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Esto no es una base de datos de Schoolbell 1.0, abortando.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Esto no es una base de datos de schoolbell 1.0, abortando.\n"
+"\n"
+"Por favor ejecute el script local de actualización.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "Arriba"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Cambios guardados"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Cambiar detalles"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nueva nota"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "elementos"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Añadir una nueva persona"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Comienza"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Excepto en fechas"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Fecha inválida. Por favor especifique AAAA-MM-DD, una por línea"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Añadir nuevo recurso"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} personas"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Cuerpo de la nota."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "misma semana"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "Editar nombre"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Nota"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Juego de caracteres desconocido"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nueva foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Una foto pequeña (sobre 48x48 piexls en formato jpg)"
+
+#~ msgid "Clear photo"
+#~ msgstr "foto eliminada"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Marcar para borrar la foto"
+
+#~ msgid "Verify password"
+#~ msgstr "Compruebe la contraseña"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Las contraseñas no coinciden."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "¡Contraseñas no coinciden!"
+
+#~ msgid "View"
+#~ msgstr "Vista"
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "Create new objects"
+#~ msgstr "Crear nuevos objetos"
+
+#~ msgid "Add events"
+#~ msgstr "Añadir Evento"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modificar/Borrar eventos"
+
+#~ msgid "Control access"
+#~ msgstr "Control de acceso"
+
+#~ msgid "Manage membership"
+#~ msgstr "Gestión de usuarios"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Usuarios autenticados"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Usuarios no autenticados"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Configurar acceso"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Canbiar preferencias"
+
+#~ msgid "New Person"
+#~ msgstr "Nueva persona"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importar personas"
+
+#~ msgid "Add a Group"
+#~ msgstr "Añadir a Grupo"
+
+#~ msgid "New Group"
+#~ msgstr "Nuevo Grupo"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Editar información de grupo"
+
+#~ msgid "A Group"
+#~ msgstr "Un grupo"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Grupo SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Añadir/Eliminar miembros"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importar grupos"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Añadir un recurso"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Editar información recurso"
+
+#~ msgid "New Resource"
+#~ msgstr "Nuevo recurso"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Recurso SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Un recurso"
+
+#~ msgid "Actions"
+#~ msgstr "Acciones"
+
+#~ msgid "View Calendar"
+#~ msgstr "Ver calendario"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Calendario (Diario)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Calendario (Diario, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Calendario(Semanal)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Calendario (Semanal, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Calendario(Mensual)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Calendario (Mensual, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Calendario(Anual)"
+
+#~ msgid "Atom View"
+#~ msgstr "Atom View"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Libre/Ocupado"
+
+#~ msgid "New Event"
+#~ msgstr "Nuevo Evento"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Abrir en iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Editar evento"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Cambiar preferencias del sitio"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Estos permisos permiten ver nombres, títulos, fotos, lista de objetos y "
+#~ "otros recursos de información."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Permite editar nombres, títulos, descripciones, fotos, etc."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Permite al usuario crear nuevos usuarios, grupos y recursos."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Permite ver calendario de personas, grupos y recursos."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Permite añadir nuevos eventos al calendario."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Permite añadir y eliminar eventos en calendarios."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Control de acceso para ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Permite al usuario usar este formulario (Control de acceso)"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Permite al usuario añadir personas, grupos y recursos a otros grupos. A "
+#~ "la hora de añadir algo a un grupo, el usuario necesita permisos para ese "
+#~ "grupo. Tenga en cuenta que la unión a un grupo tiene implicaciones en la "
+#~ "seguridad."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Permisos para grupos"
+
+#~ msgid "Access control"
+#~ msgstr "Control de acceso"
+
+#~ msgid "Set Access"
+#~ msgstr "Definir acceso"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Permisos para usuarios"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Los permisos son inherentes a la  estructura de objetos. Por ejemplo, si "
+#~ "define una vista de calendario para un usuario en el índice de personas, "
+#~ "ese usuario debe ser capaz de ver el calendario de todos los usuarios. Si "
+#~ "quiere que un usuario solamente acceda una parte de los recursos del "
+#~ "calendario, debe definir una vista de calendario con permisos únicamente "
+#~ "para ese usuario en ese recurso."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "La siguiente lista tiene los nombre de permisos con sus correspondientes "
+#~ "significados."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Cambiar preferencias del sitio"
+
+#~ msgid "General preferences"
+#~ msgstr "Preferencias generales"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Editar preferencias del sitio"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Eventos para"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_description"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_enabled"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_more_info"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Validar mi Atom feed"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Valid Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Localización: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Seleccione calendarios adicionales para mostrar"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Pulse Ctrl o Shift para seleccionar múltiples calendarios"
+
+#~ msgid "Public Calendar"
+#~ msgstr "Calendario público"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "Calendario lateral"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Seleccione calendarios para mostar"
+
+#~ msgid "People"
+#~ msgstr "Personas"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "No hay personas con ese calendario accesibles para usted."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "No hay grupos con calendarios accesibles para usted"
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Aquí no hay recursos con calendarios accesibles para usted"
+
+#~ msgid "Showing"
+#~ msgstr "Mostrando"
+
+#~ msgid "of"
+#~ msgstr "de"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "¿Está seguro de borrar los elementos seleccionados?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "No ha seleccionado ningún elemento"
+
+#~ msgid "delete-button"
+#~ msgstr "Botón de borrado"
+
+#~ msgid "Exception"
+#~ msgstr "Excepción"
+
+#~ msgid "Traceback"
+#~ msgstr "Traza"
+
+#~ msgid "Server Error"
+#~ msgstr "Error del servidor"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Un error interno del servidor ha ocurrido. Lo más posible es que haya "
+#~ "encontrado un fallo en SchoolBell. Por favor reportelo en <a href="
+#~ "\"http://issues.schooltool.org\">el gestor de fallos</a>"
+
+#~ msgid "All day event"
+#~ msgstr "Evento diario"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Esto es un evento recurrente."
+
+#~ msgid "Ends"
+#~ msgstr "Finaliza"
+
+#~ msgid "edit event"
+#~ msgstr "Editar evento"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Cambia los detalles de este evento"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Agenda de recursos"
+
+#~ msgid "edit resources"
+#~ msgstr "Editar recursos"
+
+#~ msgid "delete event"
+#~ msgstr "borrar evento"
+
+#~ msgid "Event details"
+#~ msgstr "Detalles de evento"
+
+#~ msgid "Book Resources"
+#~ msgstr "Libro de recursos"
+
+#~ msgid "Update form"
+#~ msgstr "Formulario de actualización"
+
+#~ msgid "day"
+#~ msgstr "día"
+
+#~ msgid "week"
+#~ msgstr "semana"
+
+#~ msgid "month"
+#~ msgstr "mes"
+
+#~ msgid "year"
+#~ msgstr "año"
+
+#~ msgid "Weekly"
+#~ msgstr "Semanalmente"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr ""
+#~ "Esta sección solo es aplicable cuando está seleccionada como semanalmente "
+#~ "concurrente"
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr ""
+#~ "Esta sección solo es aplicable cuando está seleccionada como mensualmente "
+#~ "concurrente"
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Dia ${monthday} de cada mes"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} de cada mes"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} of every month"
+
+#~ msgid "Repeat"
+#~ msgstr "Repetir"
+
+#~ msgid "times"
+#~ msgstr "veces"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Repetir siempre"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Libro de recursos"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Libros de recursos para ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Título:"
+
+#~ msgid "Starts:"
+#~ msgstr "Comienza:"
+
+#~ msgid "Ends:"
+#~ msgstr "Finaliza:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "¡Esto es un evento de recurrencia!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Registro de recursos"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Eventos conflictivos"
+
+#~ msgid "Book"
+#~ msgstr "Reservar"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "Datos CSV <strong>TIENEN</strong> que incluir un título de grupo y "
+#~ "<strong>DEBEN</strong> incluir una descripción de grupo opcional. "
+#~ "Cualquier información adicional será descartada."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Lug, Linux Users Groups\n"
+#~ "Chess Club\n"
+#~ "Sport Club, After-school sport club, <em> texto despues de la segunda "
+#~ "coma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "El siguiente ejemplo creará 3 grupos titulados 'LUG', 'Chess Club' y "
+#~ "'Sports Club'. El primer y últino grupo tendrán las descripciones 'Linux "
+#~ "Users Group' y 'After-school sport club' respectivamente. El grupo 'Chess "
+#~ "Club' no tendrá descripción, y el texto adicional \"después de la segunda "
+#~ "coma\" en el tercer grupo será ignorado."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Subir grupos schooltool como CSV"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Subir fichero CSV"
+
+#~ msgid "CSV File"
+#~ msgstr "Fichero CSV"
+
+#~ msgid "Charset:"
+#~ msgstr "Mapa de caracteres:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Western (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Western (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Western (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Otro (especificar)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Otro mapa de caracteres: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Introducir datos CSV"
+
+#~ msgid "CSV Data"
+#~ msgstr "Datos CVS"
+
+#~ msgid "Members"
+#~ msgstr "Miembros"
+
+#~ msgid "edit members"
+#~ msgstr "Editar miembros"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Cambiar personas que son miembros de este grupo"
+
+#~ msgid "Remove"
+#~ msgstr "Eliminar"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "No tiene permitido acceder a esta página. Pulse el botón de retroceder en "
+#~ "el navegador para volver, o pida más privilegios de usuario para "
+#~ "registrarse."
+
+#~ msgid "Please log in"
+#~ msgstr "Por favor, registrese"
+
+#~ msgid "Login"
+#~ msgstr "Registro"
+
+#~ msgid "User Information"
+#~ msgstr "Información de usuario"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Su sesión ha caducado."
+
+#~ msgid "There are none."
+#~ msgstr "No hay nadie."
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "Envío"
+
+#~ msgid "There are none to add."
+#~ msgstr "No hay nada que añadir."
+
+#~ msgid "Find Now"
+#~ msgstr "Encontrar ahora"
+
+#~ msgid "Clear"
+#~ msgstr "Borrar"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "Cancelar"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Quién puede ver la nota"
+
+#~ msgid "Private"
+#~ msgstr "Privado"
+
+#~ msgid "Public"
+#~ msgstr "Publico"
+
+#~ msgid "Add note"
+#~ msgstr "Añadir nota"
+
+#~ msgid "add-button"
+#~ msgstr "Añadir"
+
+#~ msgid "Delete"
+#~ msgstr "Borrar"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Por favor anote lo siguiente:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Esta intentando escribir un url incorrecta"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Esta intentando acceder a una página que no existe"
+
+#~ msgid "Not Found"
+#~ msgstr "No encontrado"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "La página a la que intenta acceder no está disponible"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "Datos CSV <strong>TIENE</strong> que contener un nombre de usuario y un "
+#~ "nombre completo. Opcionalmente una contraseña <strong>DEBE</strong> "
+#~ "incluirse."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "El siguiente ejemplo creará 3 usuarios, 'jjones', 'jbjones' y 'howard'. "
+#~ "De los tres, solo 'jbjones' tiene una contraseña ('r2m45J') y podrá "
+#~ "entrar en el sistema. Tenga en cuenta que las contraseñas son enviadas en "
+#~ "texto plano."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Subir personas de schooltool como CSV"
+
+#~ msgid "Details"
+#~ msgstr "Detalles"
+
+#~ msgid "edit details"
+#~ msgstr "Editar detalles"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modificar detalles de la persona"
+
+#~ msgid "Add person"
+#~ msgstr "Añadir persona"
+
+#~ msgid "Add to groups"
+#~ msgstr "Añadir a grupos"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Lo siento, no puede eliminar su propia cuenta."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Editar información de contacto"
+
+#~ msgid "Edit person"
+#~ msgstr "Editar persona"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Preferencias de calendario"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Editar preferencias personales"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Está intentando eliminar un evento repetitivo."
+
+#~ msgid "Current"
+#~ msgstr "Actual"
+
+#~ msgid "Future"
+#~ msgstr "Próximo"
+
+#~ msgid "All"
+#~ msgstr "Todo"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Eliminando un evento repetitivo (${event_title})"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "Datos CSV <strong>TIENEN</strong> que incluir un título de recuso y "
+#~ "<strong>DEBEN</strong> incluir opcionalmente una descripción de recurso. "
+#~ "Otra información extra será descartada."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>texto después de la segunda coma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "El siguiente ejemplo creará 3 recursos titulados 'PRJ302', 'Main "
+#~ "Auditorium' y 'LC-805'. El primer y el último recurso tendrán las "
+#~ "siguientes descripciones 'Overhead Projector #302' y 'Laptop Computer "
+#~ "#805' respectivamente. El recurso \"Main Auditorium\" no tendrá "
+#~ "descripción y el \"texto después de la segunda coma\" en el tercer "
+#~ "recurso será ignorado."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Subir recursos schooltool como CSV"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "Hay ${num_errors} errores de entrada."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identificación (opcional)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Servidor ejecutando Schoolbell <span>"
+#~ "${DYNAMIC_CONTENT}</span>&copy; The Shuttleworth Foundation 2003 - "
+#~ "<span>2005</span>: Apoyando la innovación social.</p> "
+#~ "<p>Schooltool&trade; es marca registrada de The Shuttleworth Foundation. "
+#~ "</p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Versión para imprimir"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Ver calendario diario"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Ver calendario semanal"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Ver calendario mensual"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Ver calendario anual"
+
+#~ msgid "Yearly"
+#~ msgstr "Anual"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Calendario para ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Ir a..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Eventos para mañana"
+
+#~ msgid "Log in"
+#~ msgstr "Registrarse"
+
+#~ msgid "User:"
+#~ msgstr "Usuario:"
+
+#~ msgid "Log Out"
+#~ msgstr "Salir"
+
+#~ msgid "Edit Info"
+#~ msgstr "Editar información"
+
+#~ msgid "Add Event"
+#~ msgstr "Añadir evento"
+
+#~ msgid "Modify Event"
+#~ msgstr "Modificar evento"
+
+#~ msgid "Set up access"
+#~ msgstr "Configurar acceso"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Usuarios no registrados"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Usuario no registrado"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Usuarios autenticados"
+
+#~ msgid "All Users"
+#~ msgstr "Todos los usuarios"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: Atención: ignorando opciones de configuración '%s'"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/es_MX/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/es_MX/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/es_MX/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2319 @@
+# Spanish (Mexico) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-12-01 12:59+0000\n"
+"Last-Translator: AlbertoDiaz <alberto_diaz at ipsd.org>\n"
+"Language-Team: Spanish (Mexico) <es_MX at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personas"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "una persona"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "#{numbero} personas"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "El nombre de usuario o la contraseña es incorrecto/a"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Marzo"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Enero"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Febrero"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Junio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mayo"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Septiembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Julio"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Octubre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Diciembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Noviembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Lunes"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Martes"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Jueves"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Domingo"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Sábado"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Viernes"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Lun"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Mar"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Mie"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Jue"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Vie"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sab"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Dom"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Título"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Fecha"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duración"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Horas"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Localidad"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Recurrente"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Día"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mes"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Año"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repetir cada"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Rango"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Cuenta"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Hasta"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "siempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Número de eventos"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Repetir hasta"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Días de la semana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Mensualmente"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Excepciones"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2°"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5°"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Agregar evento"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Agregar"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Ver el calendario"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Los datos no se pudieron convertir a Unicode (¿juego de caracteres "
+"incorrecto?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Título"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grupos"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Duración"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Fecha"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Índice de recurso"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Agregar nuevo recurso"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupos"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Índice de Personal"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Agregar nueva persona"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Usuario"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Contraseña"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Este nombre de usuario ya existe!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sab"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notas"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Número de eventos"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Nombre completo"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Nombre completo"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nombre completo"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Fotografía"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Fotografía (en formato JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "La contraseña ha sido cambiada!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "La contraseña ha sido cambiada!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "La contraseña ha sido cambiada!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Duración"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Índice de grupo"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Agregar nuevo grupo"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Índice de recurso"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Agregar nuevo recurso"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "La contraseña ha sido cambiada!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "La contraseña ha sido cambiada!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Usuario"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Sab"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Tu nueva contraseña"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Tu nueva contraseña"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Ver el calendario"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nombre que te identificará"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Índice de recurso"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Agregar nuevo recurso"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Índice de recurso"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Agregar nuevo recurso"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Fotografía"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Agregar nueva persona"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Excepciones"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Agregar nuevo recurso"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "#{numbero} personas"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Nota"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Fotografía"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr ""
+#~ "Una foto pequeña (de aproximandamente 48x48 pixels, en formato JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Borrar la fotografía"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Checa aqui para borrar la fotografía"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifica la contraseña"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Las contraseñas no coinciden."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Las contraseñas no coinciden"
+
+#~ msgid "View"
+#~ msgstr "Ver"
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Occidental (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Occidental (ISO-8859-15)"
+
+#~ msgid "Public"
+#~ msgstr "Público"
+
+#~ msgid "Add note"
+#~ msgstr "Agregar nota"

Added: schooltool/branches/upstream/current/src/schooltool/locales/es_PE/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/es_PE/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/es_PE/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Spanish (Peru) translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-04-14 19:55+0000\n"
+"Last-Translator: Daniel Alejandro Yucra Sotomayor <info at somoslibres.org>\n"
+"Language-Team: Spanish (Peru) <es_PE at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/es_US/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/es_US/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/es_US/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Spanish (United States) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Spanish (United States) <es_US at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2341 @@
+# Estonian translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-07-27 12:53+0000\n"
+"Last-Translator: diana_reet <intelx86 at hot.ee>\n"
+"Language-Team: Estonian <et at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Isikud"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 inimene"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} inimest"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Praegune aasta"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Märts"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Jaanuar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Veebruar"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juuni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Aprill"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juuli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Järgmine päev"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Täna"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Eelmine päev"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktoober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Detsember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Esmaspäev"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Teisipäev"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Kolmapäev"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Neljapäev"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Pühapäev"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Laupäev"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Reede"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Esmasp."
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Teisip."
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Kolmap."
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Neljap."
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Reede"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Laup."
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Pühap."
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Teema"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Terve päev"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Kuupäev"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Aeg"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Alusta 24tunni formaadis"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Kestvus"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Kestvuse tüüp"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuteid"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Tunde"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Päevi"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Asukoht"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Kirjeldus"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Päev"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Nädal"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Kuu"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Aasta"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Korda iga"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Ulatus"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Loenda"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Kuni"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "Alati"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Sündmuste arv"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Korda kuni"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Nädalapäevad"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Nädalapäev"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Kuuti"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Va. päevad"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "Samal nädalapäeval"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "Esimene"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "Neljas"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "Kolmas"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "Teine"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "Viies"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "Eelmine nädalapäev"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Ilmnes viga"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Mittesobiv aeg"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Lõpukuupäev on varasem kui alguskuupäev"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Mittesobiv kuupäev. Palun täpsusta: AAAA-KK-PP, üks igal real."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Lisa sündmus"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Lisa"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Muuda sündmust"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Uuenda"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Vaata kalendrit"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Järmine nädal"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Praegune nädal"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Eelnev nädal"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Jörgmine kuu"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Praegune kuu"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Eelnev kuu"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Järgmine aasta"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Praegune aasta"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Eelnev aasta"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Teema"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grupid"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Kestvus"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Kuupäev"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Grupi teema"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Lisa uus grupp"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Praegune kuu"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Praegune kuu"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupid"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Ressursid"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Ressursid"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Lisa uus isik"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Muuda liikmelisust"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Kasutajanimi"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Salasõna"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "See kasutajanimi on juba kasutuses!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Eelnev kuu"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Laup."
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Märkmed"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Sündmuste arv"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Täisnimi"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Täisnimi"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Täisnimi"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (JPEG formaadis"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Uus märge"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Salasõna edukalt muudetud!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Salasõna edukalt muudetud!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Salasõna edukalt muudetud!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Kestvus"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Grupi teema"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Lisa uus grupp"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Lisa uus isik"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Eelnev nädal"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Salasõna edukalt muudetud!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Praegune nädal"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Salasõna edukalt muudetud!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Kasutaja"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Laup."
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Järmine nädal"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Uus salasõna"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Uus salasõna"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Vaata kalendrit"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nimi, mida näidatakse"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Lisa uus isik"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Muuda detaile"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Uus märge"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Lisa uus isik"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Va. päevad"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Mittesobiv kuupäev. Palun täpsusta: AAAA-KK-PP, üks igal real."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Lisa uus isik"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} inimest"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "Samal nädalapäeval"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Uus foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Väike pilt (umbes 48x48 pikselit JPEG formaadis)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Kustuta foto"
+
+#, fuzzy
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Märgi see, et fotot kustutada"
+
+#~ msgid "Verify password"
+#~ msgstr "Salasõna uuesti"
+
+#, fuzzy
+#~ msgid "Passwords do not match."
+#~ msgstr "Salasõnad ei klapi."
+
+#~ msgid "View"
+#~ msgstr "Vaade"
+
+#, fuzzy
+#~ msgid "Edit"
+#~ msgstr "Redigeeri"
+
+#~ msgid "Create new objects"
+#~ msgstr "Loo uus objekt"
+
+#~ msgid "Add events"
+#~ msgstr "Lisa sündmus"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Muuda/kustuta sündmus"
+
+#~ msgid "Control access"
+#~ msgstr "Kontroll-ühendus"
+
+#~ msgid "Manage membership"
+#~ msgstr "Halda liikmelisust"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Autentitud kasutajad"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Mitteautentitud kasutajad"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Lisa ühendus"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Salvesta muudatused"
+
+#~ msgid "New Person"
+#~ msgstr "Uus isik"

Added: schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/et/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4937 @@
+# Estonian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:44+0000\n"
+"Last-Translator: hennko <hennko at gmail.com>\n"
+"Language-Team: Estonian <et at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Kasutajad"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Esmaspäev"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Teisipäev"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Kolmapäev"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Neljapäev"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Pühapäev"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Laupäev"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Reede"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Pealkiri"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Kirjeldus"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Kuu"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Aasta"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Iga kuu"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Uuenda"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Tegevused"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+#, fuzzy
+msgid "SchoolTool"
+msgstr "Koolitöö vahend"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalendrid"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalendrid"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalendrid"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Vaata"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalendrid"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Logi sisse"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigeerimine"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Tegevused"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalendrid"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Rida 2 ei ole tühi"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Mitte komplektne sektsiooni kirjeldus real ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Esimine rida CSV failis peab sisaldma perioodi id ja tunniplaani visandi id."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+#, fuzzy
+msgid "The term ${term} does not exist."
+msgstr "Perioodi ${term} ei ole olemas."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Tunniplaani visandit ${schema} ei ole olemas."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Viga tunniplaani CSV andmetes, rida ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+#, fuzzy
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Päeva ids ei ole defineeritud valitud visandil: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Tunnid on defineerimata antud päevadel: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Kasutajaid ei leitud"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Kursuseid ei leitud"
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Sektsiooni ei leitud: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Salvesta muudatused"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Muuda eelistusi"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Kalendri seaded"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Kalendri seaded"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Muuda kasutaja eelistusi"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Muuda kasutaja eelistusi"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "Koolitöö vahend"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "Koolitöö vahend"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Kirjeldus"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Hüppa ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Homsed sündmused"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+#, fuzzy
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Näita päeva kalendrit"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Päevane"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Näita nädala kalendrit"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Iga nädal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Näita kuu kalendrit"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Näita aasta kalendrit"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Iga aasta"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Kasutaja kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "Timetable calendar"
+msgstr "Näita päeva kalendrit"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Minu kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendrid"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Veel..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Minu kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Näita päeva kalendrit"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "kustutamis-nupp"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "tühistamis-nupp"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Kalendrid"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Üksikasjad"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Alguskuupäev"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "muuda üksikasju"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Muuda selles sektsioonis õppureid grupi järgi"
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "muuda gruppe"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "muuda üksikasju"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Vahendid"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Uuenda"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Reede"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Iga nädal"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Kuu"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Aasta"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Kasutaja kalender"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Vahendid"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Kasutaja info"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Pealkiri"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Vahendid"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Kursused"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Tere tulemast SchoolTool'i"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Logi sisse"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "Loo"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Lääne (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Lääne (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Teised (palun määra)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Teised kooditabelid"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Sisesta CSV andmed"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV andmed"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "esitamis-nupp"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Impordi tunniplaan"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Lae SchoolTool tunniplaanid ülesse kui CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Näidis:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "lae ülesse CSV fail"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV fail"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Märgistik"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Lääne (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Vahendid"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Tere tulemast SchoolTool'i serverisse"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Kalendri seaded"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Muuda kasutaja eelistusi"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Kasutajad"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Seletuskiri"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Pühapäev"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Järgmine"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Lisa uus sektsioon"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Vaata"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Muuda"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Lisa uus sektsioon"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Impordi kursused"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Lisa uus kursus"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Uus kursus"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Kursuse indeks"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Lisa uus kursus"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Õppurid"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grupid"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Vahendid"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool courses as CSV"
+msgstr "Lae SchoolTool tunniplaanid ülesse kui CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Sektsioon"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+#, fuzzy
+msgid "students"
+msgstr "Õppurid"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+#, fuzzy
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "muuda nime"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Sektsiooni kirjeldus"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Muuda selles sektsioonis õppureid grupi järgi"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Vahendid"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+#, fuzzy
+msgid "Change the instructors for this section."
+msgstr "Muuda selles sektsioonis õppureid grupi järgi"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "edit individuals"
+msgstr "muuda üksikasju"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "Change the students in this section individually"
+msgstr "Muuda selles sektsioonis õppureid individuaalselt"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Muuda selles sektsioonis õppureid grupi järgi"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "muuda gruppe"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+#, fuzzy
+msgid "Identifier (optional)"
+msgstr "Perioodi pealkiri (mittekohustuslik)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Sektsioon"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Kursuse pealkiri"
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Kursuse kirjeldus"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Silt"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Sektsiooni kirjeldus"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Kasutajad"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Aasta"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Koolipäev"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Muuda"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Rakenda"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Päevane"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Kursused"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "kustutamis-nupp"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "lisamis-nupp"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "tühistamis-nupp"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Lisa uus sektsioon"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Õppurid"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "kustutamis-nupp"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Tund"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Impordi grupid"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Muuda eelistusi"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupid"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupid"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Lae SchoolTool tunniplaanid ülesse kui CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "muuda nime"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Kasutaja kalender"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Lisa uus periood"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "pole"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "lisamis-nupp"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Õppurid"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "tühistamis-nupp"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "lisamis-nupp"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "tühistamis-nupp"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Uus periood"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Loo"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Lisa tähtaeg"
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "kasutaja nimi ei saa olla tühi"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "täisnimi ei saa olla tühi"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Kasutaja nimi juba kasutusel"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Impordi kasutajaid"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CSV andmed <strong>peavad</strong> sisaldma kasutajatunnust ja täisnime. "
+"Soovitud salasõna <strong>peaks</strong> samuti lisama."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Üleval olev näide loob kolm kasutajat, 'jjones', 'jbjones' ja 'howard'. "
+"Neist kolmel kasutajal, ainult 'jbjones' on salasõna ('r2m45J') ja tal on "
+"võimalik süsteemi sisse logida. Pane tähel, et salasõnad tuleb saata "
+"lihttekstina."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Lae SchoolTool tunniplaanid ülesse kui CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Muuda eelistusi"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Muuda kasutaja eelistusi"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Näita tunde"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+#, fuzzy
+msgid "Relationships"
+msgstr "Seosed"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Lisa uus kursus"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Uus periood"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "Tingimused"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Impordi vahendid"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Lisa uus kursus"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Vahendid"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Vahendid"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "Lae SchoolTool tunniplaanid ülesse kui CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+#, fuzzy
+msgid "Calendar_relationships"
+msgstr "Seosed"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Kalendrid"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "ülesse"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Tegevused"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Logi sisse"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Kasutaja"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Logi välja"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Uus periood"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Muuda perioodi"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Uus periood"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Tingimused"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Lisa uus periood"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Alguskuupäev"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Lõppkuupäev"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Nädal"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Lisa tähtaeg"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Salvesta muudatused"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Uuenda"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+#, fuzzy
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr "Teiseks, määra millised on koolipäevad ja millal on vaheajad"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+#, fuzzy
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr "Palun määra millised on koolipäevad ja millal on vaheajad"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Seletuskiri"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Koolipäev"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Vaheaeg"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+#, fuzzy
+msgid "Toggle the following days of week:"
+msgstr "Märgista järgmised päevad nädalas"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "${object}'i tunniplaan"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Uus tunniplaan"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Vaata tunniplaane"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+#, fuzzy
+msgid "Schedule"
+msgstr "Ajakava"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Palun kasuta HH:MM formaati, tunni algus ja lõppu aegades"
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Sa pead määrama vähemalt ühe tunni"
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Kooli tunniplaanid"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Lisa uus visand"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Palun vali väärtus"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Päev"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Tund 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Tund"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+#, fuzzy
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Palun vali tunniplaani visandile nimi, mida soovid luua"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+#, fuzzy
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Lõpuks veendu, et andmed selles formis on õiged, sest ainus võimalus neid "
+"parandada on siis kui see tunniplaani visand kustutada ja siis uuesti luua."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Loo tunniplaani visand"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Esimesena määra tunniplaanis päevad ja perioodid"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Kopeeri perioodid eelmistest päevast"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Eemalda see päev"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Lisa päev"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Lisa tund"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+#, fuzzy
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr "Teiseks, vali kuidas paigutuvad tunniplaani päevad kalendri päevades"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Tunniplaan"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Semester"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Vali"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "pole"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Salvesta"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+#, fuzzy
+msgid "There are no terms or timetable schemas defined."
+msgstr "Loo tunniplaani visand"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Vaata tunniplaane"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Perioodi pealkiri (mittekohustuslik)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Perioodi algus aeg"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "Perioodi lõppemise aeg"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Loo"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "Perioodi lõppemise aeg"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+#, fuzzy
+msgid "New start"
+msgstr "Uus periood"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Uus periood"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Esmaspäev"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Loo tunniplaani visand"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Tunniplaan"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Uus tunniplaani skeem"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Tundmatu päeva id: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+#, fuzzy
+msgid "Unknown period id: %r"
+msgstr "Tundmatu tunni id: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Kasutajanimi"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Muuda selle kasutaja nime, pilti, või salasõna"
+
+#~ msgid "Import Sections"
+#~ msgstr "Impordi sektsioonid"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Valesti koostatud rida ${line_no} (see peaks sisaldma päeva id, tunni id "
+#~ "ja võimalusel asukoha id)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Kohta ei leitud"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Muuda selle kasutaja üksikasju"
+
+#~ msgid "My Preferences"
+#~ msgstr "Minu eelistused"
+
+#~ msgid "An error occured."
+#~ msgstr "Tekkis tõrge"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Autoriseerimata kasutaja"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Autoriseerimata kasutaja"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Autoriseeritud kasutaja"
+
+#~ msgid "All Users"
+#~ msgstr "Kõik kasutajad"

Added: schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Basque translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Basque <eu at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/eu/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4819 @@
+# Basque translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:45+0000\n"
+"Last-Translator: astarbe <astarbe at gmail.com>\n"
+"Language-Team: Basque <eu at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Atalak"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "IkastolakoTresna"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Nabigazioa"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Bigarren zutabea ez dago hutsik"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Eguna ez dago definitua hautatutako eskeman: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Periodo ez definituak hautatutako egunetan: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "IkastolakoTresna"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "IkastolakoTresna"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "Baliabideak"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Sailaki informazio editatu"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Baliabideak"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Baliabideak"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Baliabideak"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Kurtsoak"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "SchoolToolera ongietorria"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Sailaki informazio editatu"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+#, fuzzy
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Egutegia Ikusi"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "SchoolTool pertsonak CSV bezala igo"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Adibidea:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "CSV Fitxategia igo"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV Fitxategia"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Karaktere multzoa:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Baliabideak"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+#, fuzzy
+msgid "Welcome to the SchoolTool server"
+msgstr "SchoolToolera ongietorria"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Pertsonak importatu"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Sail bat gehitu"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Sail bat gehitu"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Sailaki informazio editatu"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Ikastaroak importatu"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Ikastaro bat gehitu"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Ikastaro berria"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Ikastaro indizea"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Ikastaro bat gehitu"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+#, fuzzy
+msgid "Need a course ID."
+msgstr "Ikastaro ID behar dezu"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+#, fuzzy
+msgid "Add a Section to ${course}"
+msgstr "Sail bat gehitu ${course}ri"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Taldeak"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Baliabideak"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Sailen indizea"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Sail bat gehitu"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Schooltool kurtsoak CSV bezaal igo"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Atalak"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Baliabideak"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Atalak"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors}--${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Ikastaro berria"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Kurtsoak"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Sail bat gehitu"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Taldeak importatu"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Sailaki informazio editatu"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Taldeak"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Taldeak"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "SchoolTool taldeak CSV bezala igo"
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Ikastaro berria"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Pertsonak importatu"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "SchoolTool pertsonak CSV bezala igo"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Preferentziak Aldatu"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Ikastaro bat gehitu"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Baliabideak importatu"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Ikastaro bat gehitu"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Sailaki informazio editatu"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Baliabideak"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Baliabideak"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "Schooltool kurtsoak CSV bezaal igo"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+#, fuzzy
+msgid "Refresh"
+msgstr "Baliabideak"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "IkastolakoTresna"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Egutegia Ikusi"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Egutegia Ikusi"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Sail bat gehitu"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Egutegia Ikusi"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Kurtsoak"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Egutegia Ikusi"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Egutegia Ikusi"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Import Sections"
+#~ msgstr "Sailak importatu"

Added: schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2931 @@
+# Persian translation for schoolbell
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schoolbell package.
+# Reza Mohammadi <remohammadi at gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-04-05 07:16+0000\n"
+"Last-Translator: Reza Mohammadi <remohammadi at gmail.com>\n"
+"Language-Team: Persian <fa at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "نام مستعار"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "یک لقب کوچک برای این فرد."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "پست الکترونیکی اصلی"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "پست الکترونیکی دوم"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "تلفن اصلی"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "شماره تلفن پیشنهادی."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "تلفن دوم"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "شماره تلفن دوم."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "وب‌گاه"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "وب‌گاه یا وب‌نوشت"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "آدرس پستی"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "افراد"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "۱ فرد"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number}I نفر"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "نام کاربری یا گذرواژه نادرست است"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "سال جاری"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "گروه‌های در دسترس"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "مارس"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "ژانویه"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "فوریه"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "ژوئن"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "می"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "آوریل"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "اوت"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "سپتامبر"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "جولای"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "روز بعدی"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "امروز"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "روز قبلی"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "اکتبر"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "دسامبر"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "نوامبر"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "دوشنبه"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "سه‌شنبه"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "چهارشنبه"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "پنج‌شنبه"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "یک‌شنبه"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "شنبه"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "جمعه"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "دوشنبه"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "سه‌شنبه"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "چهارشنبه"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "پنجشنبه"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "جمعه"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "شنبه"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "یکشنبه"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "عنوان"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "تمام روز"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "تاریخ"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "زمان"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "زمان شروع در قالب ۲۴ ساعتی"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "مدت"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "نوع مدت"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "دقیقه"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "ساعت"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "روز"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "مکان"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "توضیح"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "مکرر"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "تکرار در هر"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "روز"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "هفته"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "ماه"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "سال"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "تکرار در هر"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "محدوده"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "تعداد"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "تا"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "برای همیشه"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "تعداد رویدادها"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "تکرار تا"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "روزهای هفته"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "روز هفته"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "ماهانه"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "تاریخ‌های مستثتا"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "هر روز هفته"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "اولین"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "جهارمین"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "سومین"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "دومین"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "پنجمین"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "آخرین روز هفته"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "آخرین ${weekday}I روز هفته"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "مشکلی پیش آمد."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "زمان نادرست"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "تاریخ پایان قبل از تاریخ شروع است"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "تاریخ نادرست. لطفاً در هر خط به قالب YYYY-MM-DD وارد کنید."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "اضافه کردن رویداد"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "اضافه کردن"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "ویرایش رویداد"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "به‌هنگام‌سازی"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "به‌هنگام رساندن در ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "تقویم‌ها"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "هفتهٔ بعدی"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "هفتهٔ جاری"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "هفتهٔ قبلی"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year}I (هفتهٔ ${week}I)"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "ماه بعدی"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "ماه جاری"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "ماه قبلی"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}I"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "هفتهٔ ${week_no}I"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "سال بعد"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "سال جاری"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "سال قبلی"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "اطلاعاتی ندارک دیده نشده است"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "اطلاعات را نمی‌توان به یونی‌کد تبدیل کرد (مجموعه‌نویسهٔ نادرست؟)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "پروندهٔ اطلاعات جداشده با کاما با موفقیت وارد گردید."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "ورود پروندهٔ اطلاعات جداشده با کاما شکست خورد"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "متن اطلاعات جداشده با کاما با موفقیت وارد گردید."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "ورود متن اطلاعات جداشده با کاما شکست خورد"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "مجموعه‌نویسه‌ای مشخص نشده است"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "مجموعه‌نویسهٔ نامعلوم"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "خطا در اطلاعات جداشده با کاما، خط ${line_no}I"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "تبدیل به یونی‌کد در خط ${line_no}I با خطا مواجه شد."
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "خطا در اطلاعات جداشده با کاما، خط ${line_no}I"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "اطلاعات فرد: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "تغییرات ذخیره گشت."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "تمام روز"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "مکان: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "منبع ثبت‌شده: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "تکرار"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+#, fuzzy
+msgid "overlaid from %s"
+msgstr "از %s روی هم افتاده است."
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "تقویم روزانهٔ %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "تقویم هفتگیِ %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "هفته %Id (%s - %s), %Id"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "تقویم ماهانهٔ %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "پشتیبانی PDF غیرفعال است. مدیر می‌تواند آن را فعال کند."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "تقویم برای %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"نام مدرسه یا سازمانی که این خادم را اجرا کرده است.\n"
+"این عنوان روی تقویم عمومی، پایین همهٔ صفحات\n"
+"و در عنوان صفحه نمایش داده می‌شود."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "تقویم صفحهٔ اول"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "نمایش تقویم پایگاه-گسترده به عنوان صفحهٔ اول سایت"
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "ورودی ضروری جا افتاده است."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "اطلاعات عددی نادرست"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "اطلاعات متنی نادرست"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "عنوان"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "عنوان یادداشت."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "گروه"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "مدت"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "تاریخ"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "ردیفِ منبع"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "اضافه کردن منبع جدید"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "اطلاعات ناقص تدارک دیده شده‌اند."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "عناوین نمی‌توانند خالی باشند."
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "ماه جاری"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "گروه‌های در دسترس"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "ماه جاری"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "گروه‌های در دسترس"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "گروه‌ها"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "گروه‌های در دسترس"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "منابع"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "وارد کردن منابع"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "منابع در دسترس"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "ردیفِ فرد"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "اضافه کردن فرد جدید"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "عنوان منبع"
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "توضیح منبع."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "توضیح گروه"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "وب‌گاه"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "انصراف"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "تغییر اطلاعات برای ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "تغییر عضویت"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "تغییر ترجیحات برای ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "تغییر اطلاعات آشنا‌ها برای ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "اسکول‌تول"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "تغییر اطلاعات آشنا‌ها برای ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "اطلاعات آشناها"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "نام کاربر"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "گذرواژه"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "این نام کاربری قبلاً انتخاب شده است!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "اعمال"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "تلفن اصلی"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "قبلی"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "اطلاعات رویداد"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "نام مستعار"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "آغاز می‌شود"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "شنبه"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "منطقهٔ زمانی"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "تلفن دوم"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "یادداشت‌ها"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "بعدی"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "تعداد رویدادها"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "ویرایش نام"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "ویرایش نام"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "ویرایش نام"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "ترجیحات من"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "اسم کامل"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "عکس"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "عکس (در فرمت JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "یادداشت جدید"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "متن اطلاعات جداشده با کاما با موفقیت وارد گردید."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "گذر‌واژه با موفقیت تغییر کرد!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "گذر‌واژه با موفقیت تغییر کرد!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "مثال:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "اطلاعات فرد"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "ردیفِ گروه"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "اضافه کردن گروه جدید"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "اعضای ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "اعضای فعلی"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "اضافه کردن اعضا"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "عنوان گروه."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "توضیح گروه"
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "ردیفِ منبع"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "اضافه کردن منبع جدید"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "هفتهٔ قبلی"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "متن اطلاعات جداشده با کاما با موفقیت وارد گردید."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "گذر‌واژه با موفقیت تغییر کرد!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "هفتهٔ جاری"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "گذر‌واژه با موفقیت تغییر کرد!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "کاربر"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "عنوان منبع"
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "توضیح منبع."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "آغاز می‌شود"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "عنوان یادداشت."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "هفتهٔ بعدی"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "عنوان یادداشت."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "روزانه"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "عنوان یادداشت."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "متن"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "متن یادداشت."
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "خصوصی"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "نام کاربری نمی‌تواند خالی باشند."
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "نام کامل نمی‌تواند خالی باشند."
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "تکرار نام کاربری: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "گذرواژه جدید"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "تغییر گذرواژه"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "منطقهٔ زمانی"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "منطقهٔ زمانی‌ای که برای نمایش تقویم شما استفاده می‌شود."
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "قالب زمان"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "قالب تاریخ"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "روز ماه، سال"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "هفته شروع می‌شود از:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "نمایش هفته از روز یکشنبه شروع شود و یا دوشنبه"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "نمایش تقویم"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "نامی که باید نمایش داده شود"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "ردیفِ منبع"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "اضافه کردن منبع جدید"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "ردیفِ منبع"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "اضافه کردن منبع جدید"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "عنوان منبع"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "توضیح منبع."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "یک مکان."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "مشخص می‌کند که این منبع یک مکان است، مثلاً کلاس."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "اطلاعات ناقص تدارک دیده شده‌اند."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "اطلاعات ناقص تدارک دیده شده‌اند."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "اطلاعات ناقص تدارک دیده شده‌اند."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "تقویم من"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "بیشتر..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "تقویم‌ها"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "به اسکول‌بل خوش آمدید"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "ناوش"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "عکس"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "نام کاربری:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "ویرایش نام"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "تغییر نام، عکس و یا گذرواژهٔ این فرد"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "اطلاعات فرد: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "مدیریت عضویت‌های این کاربر"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "ویرایش گروه‌ها"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "ابتدا"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "تغییرات ذخیره گشت."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "تغییر جزئیات"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "یادداشت جدید"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "مورد"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "اضافه کردن فرد جدید"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "آغاز می‌شود"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "تاریخ‌های مستثتا"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "تاریخ نادرست. لطفاً در هر خط به قالب YYYY-MM-DD وارد کنید."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "اضافه کردن منبع جدید"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number}I نفر"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "متن یادداشت."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "هر روز هفته"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "ویرایش نام"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "یادداشت"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "مجموعه‌نویسهٔ نامعلوم"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "عکس جدید"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "عکس کوچک (حدود ۴۸×۴۸ پیکسل در فرمت JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "پاک کردن عکس"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "این را انتخاب کنید تا عکس پاک گردد"
+
+#~ msgid "Verify password"
+#~ msgstr "تأیید گذرواژه"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "دو گذرواژه شما با هم فرق دارند."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "گذرواژه‌ها با هم یکی نیستند."
+
+#~ msgid "View"
+#~ msgstr "نما"
+
+#~ msgid "Edit"
+#~ msgstr "ویرایش"
+
+#~ msgid "Create new objects"
+#~ msgstr "ایجاد اشیای جدید"
+
+#~ msgid "Add events"
+#~ msgstr "اضافه‌کردن رویدادها"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "تغییر/حذف رویدادها"
+
+#~ msgid "Control access"
+#~ msgstr "کنترل دسترسی"
+
+#~ msgid "Manage membership"
+#~ msgstr "مدیریت عضویت"
+
+#~ msgid "Authenticated users"
+#~ msgstr "کاربران تأیید شده"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "کاربران تأیید نشده"
+
+#~ msgid "Set Up Access"
+#~ msgstr "تعیین دسترسی‌ها"
+
+#~ msgid "Change Preferences"
+#~ msgstr "تغییر ترجیحات"
+
+#~ msgid "New Person"
+#~ msgstr "فرد جدید"
+
+#~ msgid "Import Persons"
+#~ msgstr "وارد کردن افراد"
+
+#~ msgid "Add a Group"
+#~ msgstr "اضافه کردن یک گروه"
+
+#~ msgid "New Group"
+#~ msgstr "گروه جدید"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "ویرایش اطلاعات گروه"
+
+#~ msgid "A Group"
+#~ msgstr "یک گروه"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "گروه اسکول‌بل"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "اضافه/حذف افراد"
+
+#~ msgid "Import Groups"
+#~ msgstr "وارد کردن گروه‌ها"
+
+#~ msgid "Add a Resource"
+#~ msgstr "اضافه کردن یک منبع"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "ویرایش اطلاعات منبع"
+
+#~ msgid "New Resource"
+#~ msgstr "منبع جدید"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "منبع اسکول‌بل"
+
+#~ msgid "A Resource"
+#~ msgstr "یک منبع"
+
+#~ msgid "Actions"
+#~ msgstr "کنش‌ها"
+
+#~ msgid "View Calendar"
+#~ msgstr "نمایش تقویم"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "تقویم (روزانه)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "تقویم (روزانه، PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "تقویم (هفتگی)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "اسکول‌بل"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "تقویم (هفتگی، PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "تقویم (ماهانه)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "تقویم (ماهانه، PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "تقویم (سالانه)"
+
+#~ msgid "Atom View"
+#~ msgstr "نمایش اتم"
+
+#~ msgid "Free/Busy"
+#~ msgstr "آزاد/مشغول"
+
+#~ msgid "New Event"
+#~ msgstr "رویداد جدید"
+
+#~ msgid "Open in iCal"
+#~ msgstr "باز کردن در iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "ویرایش رویداد"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "تغییر ترجیحات وبگاه"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "این حق دسترسی اجازهٔ نمایش اسم‌ها، عنوان‌ها، عکس‌ها، لیست اشیا و دیگر اطلاعات "
+#~ "را می‌دهد."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "اجازهٔ ویرایش اسم‌ها عنوان‌ها، توضیحات، عکس‌ها و غیره را می‌دهد."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "به کاربر اجازهٔ ایجاد افراد، گروه‌ها و منابع جدید را می‌دهد."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "اجازهٔ نمایش تقویم‌های افراد، گروه‌ها و منابع را می‌دهد."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "اجازهٔ اضافه کردن رویدادهای جدید به تقویم‌ها را می‌دهد."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "اجازهٔ ویرایش و حذف رویدادها در تقویم‌ها را می‌دهد."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "کنترل دسترسی برای ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "به کاربر اجازهٔ استفاده از این فرم و کنترل اجازه‌ها را می‌دهد."
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "به کاربر اجازهٔ اضافه کردن افراد، گروه‌ها و منابع را به گروه‌ها می‌دهد. برای "
+#~ "اضافه کردن چیزی به یک گروه، کاربر تنها نیاز به این دسترسی فقط روی آن گروه "
+#~ "خاص دارد. حواستان باشد که الحاق دو گروه مستلزم رعایت نکات امنیتی است."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "دسترسی‌های گروه‌ها"
+
+#~ msgid "Access control"
+#~ msgstr "کنترل دسترسی"
+
+#~ msgid "Set Access"
+#~ msgstr "تنظیم دسترسی"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "دسترسی‌های کاربران"
+
+#, fuzzy
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "اجازه‌ها به طور سلسله‌مراتبی به ارث می‌رسد. برای مثال اگر در ردیف افراد به "
+#~ "یک کاربر اجازهٔ نمایش تقویم بدهید، آن کاربر می‌تواند تقویم همهٔ افراد را "
+#~ "ببیند. اگر می‌خواهید کاربر فقط به تقویم یک منبع خاص دسترسی داشته باشد، "
+#~ "می‌توانید اجازهٔ نمایش تقویم را برای آن کاربر روی آن منبع دهید."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr "در زیر لیست نام دسترسی‌ها به همراه مفهومشان را می‌توانید مشاهده کنید."
+
+#~ msgid "Change site preferences"
+#~ msgstr "تغییر ترجیحات سایت"
+
+#~ msgid "General preferences"
+#~ msgstr "ترجیحات عمومی"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "ویرایش ترجیحات وبگاه"
+
+#~ msgid "Events for"
+#~ msgstr "رویداد‌ها برای"
+
+#, fuzzy
+#~ msgid "atom_description"
+#~ msgstr ""
+#~ "این یک XML در قالب اتم است. انتظار می‌رود که در یک خیر‌خوان و یا قالب‌یافته "
+#~ "در یک سایت دیگر خوانده شود. برای اطلاعات بیشتر"
+
+#, fuzzy
+#~ msgid "atom_enabled"
+#~ msgstr "Atom Enabled"
+
+#, fuzzy
+#~ msgid "atom_more_info"
+#~ msgstr "را ببینید."
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "اعتبارسنجی اتم خورد من"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[اتم معتبر]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "محل: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "تقویم‌های بیشتری را جهت نمایش انتخاب کنید"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "برای انتخاب چندتایی تقویم‌ها، دکمهٔ مهار و یا دگرساز را نگه دارید."
+
+#~ msgid "Public Calendar"
+#~ msgstr "تقویم عمومی"
+
+#, fuzzy
+#~ msgid "site-wide calendar"
+#~ msgstr "تقویم پایگاه-گسترده"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "تقویم‌ها را جهت نمایش انتخاب کنید"
+
+#~ msgid "People"
+#~ msgstr "افراد"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "هیچ فردی با تقویم قابل دسترس برای شما وجود ندارد."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "هیچ گروهی با تقویم قابل دسترس برای شما وجود ندارد."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "هیچ منبعی با تقویم قابل دسترس برای شما وجود ندارد."
+
+#~ msgid "Showing"
+#~ msgstr "نمایش"
+
+#~ msgid "of"
+#~ msgstr "از"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "آیا مطمئنید که می‌خواهید مورد انتخابی را حذف کنید؟"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "شما موردی انتخاب نکردید."
+
+#~ msgid "delete-button"
+#~ msgstr "حذف"
+
+#~ msgid "Exception"
+#~ msgstr "استثنا"
+
+#~ msgid "Traceback"
+#~ msgstr "مسیر طی‌شده"
+
+#~ msgid "Server Error"
+#~ msgstr "خطای کارگزار"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "کارگزار دچار یک مشکل داخلی شده است. به نظر می‌آید که از اسکول‌بل یک اشکال "
+#~ "پیدا کرده‌اید. لطفاً این اشکال را در <a href=\"http://issues.schooltool.org"
+#~ "\">پی‌گیری مسائل</a> گزارش دهید"
+
+#~ msgid "All day event"
+#~ msgstr "رویداد تمام روز"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "این یک رویداد مکرر است."
+
+#~ msgid "Ends"
+#~ msgstr "پایان می‌یابد"
+
+#~ msgid "edit event"
+#~ msgstr "ویرایش رویداد"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "تغییر جزئیات این رویداد"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "منابع زمان‌بندی شده"
+
+#~ msgid "edit resources"
+#~ msgstr "ویرایش منابع"
+
+#~ msgid "delete event"
+#~ msgstr "حذف رویداد"
+
+#~ msgid "Event details"
+#~ msgstr "جزئیات رویداد"
+
+#~ msgid "Book Resources"
+#~ msgstr "ثبت منابع"
+
+#~ msgid "Update form"
+#~ msgstr "به‌روزرسانی فرم"
+
+#~ msgid "day"
+#~ msgstr "روز"
+
+#~ msgid "week"
+#~ msgstr "هفته"
+
+#~ msgid "month"
+#~ msgstr "ماه"
+
+#~ msgid "year"
+#~ msgstr "سال"
+
+#~ msgid "Weekly"
+#~ msgstr "هفتگی"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr "این قسمت فقط زمانی که تکرار هفتگی انتخاب شده اعمال می‌شود."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr "این قسمت فقط زمانی که تکرار ماهانه انتخاب شده اعمال می‌شود."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "روز ${monthday}I از هر ماه"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} از هر ماه"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} از هر ماه"
+
+#~ msgid "Repeat"
+#~ msgstr "تکرار"
+
+#~ msgid "times"
+#~ msgstr "بار"
+
+#~ msgid "Repeat forever"
+#~ msgstr "تکرار برای همیشه"
+
+#~ msgid "Book resources"
+#~ msgstr "ثبت منابع"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "ثبت منبع برای ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "عنوان:"
+
+#~ msgid "Starts:"
+#~ msgstr "شروع:"
+
+#~ msgid "Ends:"
+#~ msgstr "پایان:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "این یک رویداد تکراردار است."
+
+#~ msgid "Resource Booking"
+#~ msgstr "ثبت منابع"
+
+#~ msgid "Conflicting events"
+#~ msgstr "رویدادهای متداخل"
+
+#~ msgid "Book"
+#~ msgstr "ثبت"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "یونی‌کد (UTF-8)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "غیره (لطفاً مشخص کنید)"
+
+#~ msgid "Members"
+#~ msgstr "اعضا"
+
+#~ msgid "edit members"
+#~ msgstr "ویرایش اعضا"
+
+#~ msgid "Remove"
+#~ msgstr "حذف"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "شما برای دسترسی به این صفحه اجازه ندارید. می‌توانید با فشار دکمه عقب "
+#~ "مرورگر برگردید، و یا از یک کاربر با امتیاز بیشتر بخواهید که وارد شود."
+
+#~ msgid "Please log in"
+#~ msgstr "لطفاً وارد شوید"
+
+#~ msgid "Login"
+#~ msgstr "ورود"
+
+#~ msgid "User Information"
+#~ msgstr "اطلاعات کاربر"
+
+#~ msgid "Your session has expired."
+#~ msgstr "نشست شما تمام شده است."
+
+#~ msgid "There are none."
+#~ msgstr "هیچ‌کس نیست."
+
+#~ msgid "submit-button"
+#~ msgstr "تایید"
+
+#~ msgid "There are none to add."
+#~ msgstr "کسی برای اضافه کردن نیست."
+
+#~ msgid "Find Now"
+#~ msgstr "پیدا کردن"
+
+#~ msgid "Clear"
+#~ msgstr "پاک کردن"
+
+#~ msgid "cancel-button"
+#~ msgstr "انصراف"
+
+#~ msgid "Private"
+#~ msgstr "شخصی"
+
+#~ msgid "Public"
+#~ msgstr "عمومی"
+
+#~ msgid "Add note"
+#~ msgstr "اضافه کردن ویرایش"
+
+#~ msgid "add-button"
+#~ msgstr "اضافه"
+
+#~ msgid "Delete"
+#~ msgstr "حذف کردن"
+
+#~ msgid "Please note the following:"
+#~ msgstr "لطفاً به موارد زیر توجه داشته باشید:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "شما ممکن است در تایپ نشانی اینترنتی اشتباه کرده باشید."
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "ممکن است برای نشانی اینترنتی مورد نظر صفحه‌ای موجود نباشد"
+
+#~ msgid "Not Found"
+#~ msgstr "یافت نشد"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "صفحه‌ای که می‌خواهید به آن دسترسی پیدا کنید موجود نیست"
+
+#~ msgid "Details"
+#~ msgstr "جزئیات"
+
+#~ msgid "edit details"
+#~ msgstr "ویرایش جزئیات"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "تغییر جزئیات این فرد"
+
+#~ msgid "Add person"
+#~ msgstr "اضافه کردن فرد"
+
+#~ msgid "Add to groups"
+#~ msgstr "اضافه کردن به گروه‌ها"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "متأسفانه شما نمی‌توانید حساب کاربری خود را حذف کنید."
+
+#~ msgid "Edit contact information"
+#~ msgstr "ویرایش اظلاعات آشنا‌ها"
+
+#~ msgid "Edit person"
+#~ msgstr "ویرایش فرد"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "ترجیحات تقویم"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "ویرایش ترجیحات فرد"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "شما در تلاشید تا یک رویداد تکراردار را حذف کنید."
+
+#~ msgid "Current"
+#~ msgstr "فعلی"
+
+#~ msgid "Future"
+#~ msgstr "بعدی‌ها"
+
+#~ msgid "All"
+#~ msgstr "همه"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "در حال حذف یک رویداد تکراردار (${event_title})"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "${num_errors}I مشکل ورودی وجود دارد."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "مشخصه (اختیاری)"
+
+#~ msgid "Printable version"
+#~ msgstr "نسخه مناسب چاپ"
+
+#~ msgid "View daily calendar"
+#~ msgstr "نمایش تقویم روزانه"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "نمایش تقویم هفتگی"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "نمایش تقویم ماهانه"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "نمایش تقویم سالانه"
+
+#~ msgid "Yearly"
+#~ msgstr "سالانه"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "تقویمِ ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "بپر به ..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "اسکول‌تول"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "رویداد‌های فردا"
+
+#~ msgid "Log in"
+#~ msgstr "ورود"
+
+#~ msgid "User:"
+#~ msgstr "کاربر:"
+
+#~ msgid "Log Out"
+#~ msgstr "خروج"
+
+#~ msgid "Edit Info"
+#~ msgstr "ویرایش اطلاعات"
+
+#~ msgid "Add Event"
+#~ msgstr "اضافه کردن رویداد"
+
+#~ msgid "Modify Event"
+#~ msgstr "تغییر رویداد"
+
+#~ msgid "Set up access"
+#~ msgstr "تنظیم دسترسی"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "کاربران تأییدنشده"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "کاربران تأیید نشده"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "کاربران تأیید شده"
+
+#~ msgid "All Users"
+#~ msgstr "همه کاربران"

Added: schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fa/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4791 @@
+# Persian translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: 2006-08-12 19:10+0000\n"
+"Last-Translator: Reza Mohammadi <remohammadi at gmail.com>\n"
+"Language-Team: Persian <fa at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "ردیف ۲ خالی نیست"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "تغییر ترجیحات"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "تغییر ترجیحات"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "تغییر ترجیحات"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "تغییر ترجیحات"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "ویرایش اطلاعات بخش"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "ویرایش اطلاعات بخش"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+#, fuzzy
+msgid "Show timetables"
+msgstr "نمایش جدول زمان‌بندی"
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "تغییر ترجیحات"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "تغییر ترجیحات"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "اضافه کردن بخش"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "اضافه کردن بخش"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "ویرایش اطلاعات بخش"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "اضافه کردن درس جدید"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "درس جدید"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "شاخص درس"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "اضافه کردن درس جدید"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "چنین درسی وجود ندارد."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "اضافه کردن بخش به ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "جستجوی شاخص"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "اضافه کردن بخش جدید"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "درس جدید"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "تغییر ترجیحات"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+#, fuzzy
+msgid "Contact information"
+msgstr "ویرایش اطلاعات بخش"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "ویرایش اطلاعات بخش"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "درس جدید"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "اضافه کردن بخش"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "ویرایش اطلاعات بخش"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "تغییر ترجیحات"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "درس جدید"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "شاخص درس"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "اضافه کردن درس جدید"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "درس جدید"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "اضافه کردن درس جدید"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "شاخص درس"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "اضافه کردن درس جدید"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "اضافه کردن درس جدید"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "ویرایش اطلاعات بخش"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "درس جدید"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "نمایش جدول زمان‌بندی"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2646 @@
+# Finnish translation for schoolbell
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-08-11 14:38+0000\n"
+"Last-Translator: vsh <vsh at iki.fi>\n"
+"Language-Team: Finnish <fi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Toissijainen puhelin"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Toissijainen puhelinnumero."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Sivusto"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Sivusto tai blogi"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Postiosoite"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Henkilö"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "henkilö"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "henkilöä"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Käyttäjänimi tai salasana ovat väärät"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Tämä vuosi"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Vapaat resurssit"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Maaliskuu"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Tammikuu"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Helmikuu"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "kesäkuu"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "toukokuu"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "huhtikuu"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "elokuu"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "syyskuu"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "heinäkuu"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Seuraava päivä"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Tänään"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Eilen"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "lokakuu"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "joulukuu"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "marraskuu"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Maanantai"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Tiistai"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Keskiviikko"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Torstai"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Sunnuntai"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Lauantai"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Perjantai"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Ma"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ti"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Ke"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "To"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pe"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "La"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Su"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Otsikko"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Koko päivä"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Päivämäärä"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Aika"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Alkamisaika muodossa 24-tuntia"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Kesto"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Keston tyyppi"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuutit"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Tunnit"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Päivät"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Paikka"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Kuvaus"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Toistuva"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Toistuu joka"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Päivä"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Viikko"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Kuukausi"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Vuosi"
+
+#: /src/schooltool/app/browser/cal.py:1707
+#, fuzzy
+msgid "Repeat every"
+msgstr "Toista"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Väli"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Lukumäärä"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "ikuisesti"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Toista kunnes"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Viikonpäivät"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Viikonpäivä"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Kuukausittain"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Poikkeuspäivät"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "sama viikonpäivä"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "ensimmäinen"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "neljäs"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "kolmas"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "toinen"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "viides"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Virhe tapahtunut."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Väärä aika"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Päättymispäivä on aikaisempi kuin alkamispäivä"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Lisää tapahtuma"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Lisää"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Muokkaa tapahtumaa"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Päivitä"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalenterit"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Ensi viikko"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Tämä viikko"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Viime viikko"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Seuraava kuukausi"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Tämä kuukausi"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Edellinen kuukausi"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Seuraava vuosi"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Tämä vuosi"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Edellinen vuosi"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV tiedoston tuonti onnistunut."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "CSV tiedoston tuonti epäonnistui."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV tekstin tuonti onnistui."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "CSV tekstin tuonti epäonnistui."
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Merkistöä ei määritelty"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Tuntematon merkistö"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Virhe CSV tiedoissa, rivillä ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Virhe CSV tiedoissa, rivillä ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Henkilön tiedot: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Muutokset tallennettu."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "koko päivän"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Sijainti: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Varattu resurssi: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "toistuva"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Otsikko"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Resurssin nimi."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Ryhmä"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Kesto"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Päivämäärä"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Resurssilista"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Lisää uusi resurssi"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Tämä kuukausi"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Vapaat resurssit"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Tämä kuukausi"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Vapaat resurssit"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Resurssi"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Tuo resursseja"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Vapaat resurssit"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Henkilölista"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Lisää uusi henkilö"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Resurssin nimi."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Resurssin kuvaus."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Ryhmän kuvaus."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Sivusto"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Peruuta"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Muokkaa käyttäjän ${user} valintoja"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "muokkaa nimeä"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Muokkaa käyttäjän ${user} valintoja"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Käyttäjänimi"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Salasana"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Tämä käyttäjänimi on jo käytössä!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Lisää"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Edellinen kuukausi"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Tapahtumatiedot"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Alkaa:"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "La"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Aikavyöhyke"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Toissijainen puhelin"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Muistiinpanot"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "muokkaa nimeä"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "muokkaa nimeä"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "muokkaa nimeä"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "muokkaa nimeä"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Koko nimi"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Valokuva"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Valokuva (JPEG formaatissa)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV tekstin tuonti onnistui."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Salasana vaihdettu onnistuneesti!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Salasana vaihdettu onnistuneesti!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Kesto"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+#, fuzzy
+msgid "Group index"
+msgstr "Ryhmälista"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Lisää uusi ryhmä"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "${title} jäsen"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Nykyiset jäsenet"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Lisää jäseniä"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Ryhmän nimi."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Ryhmän kuvaus."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Resurssilista"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Lisää uusi resurssi"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Viime viikko"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV tekstin tuonti onnistui."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Salasana vaihdettu onnistuneesti!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Tämä viikko"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Salasana vaihdettu onnistuneesti!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Resurssin nimi."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Resurssin kuvaus."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Alkaa:"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Resurssin nimi."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Ensi viikko"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Resurssin nimi."
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Runko"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Muistiinpanon runko"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Yksityisyys"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Uusi salasana"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Uusi salasana"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Aikavyöhyke"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Kalenterissa käytetty aikavyöhyke"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Ajan muoto"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "TT:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Päivämäärän muoto"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "KK/PP/VV"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Näytä kalenteri"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nimi, joka tulisi näyttää"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Resurssilista"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Lisää uusi resurssi"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+#, fuzzy
+msgid "Resource index"
+msgstr "Resurssilista"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Lisää uusi resurssi"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Resurssin nimi."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Resurssin kuvaus."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Sijainti."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Enemmän..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalenterit"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Valokuva"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Käyttäjänimi:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "muokkaa nimeä"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Muokkaa tämän henkilön nimeä, kuvaa tai salasanaa"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Henkilön tiedot: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Hallinnoi tämän henkilön jäsenyyksiä"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "muokkaa ryhmiä"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+#, fuzzy
+msgid "top"
+msgstr "yläpuoli"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Muutokset tallennettu."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Uusi resurssi"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "kohdetta"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Lisää uusi henkilö"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Poikkeuspäivät"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Lisää uusi resurssi"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "henkilöä"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Muistiinpanon runko"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "sama viikonpäivä"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "muokkaa nimeä"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Muistiinpano"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Tuntematon merkistö"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Uusi valokuva"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Pieni kuva (noin 48x48 pikseliä JPEG formaatissa)"
+
+#, fuzzy
+#~ msgid "Clear photo"
+#~ msgstr "Tyhjennä valokuva"
+
+#, fuzzy
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Valitse tämä tyhjentääksesi valokuvan"
+
+#~ msgid "Verify password"
+#~ msgstr "Varmista salasana"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Salasanat eivät vastaa toisiaan."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Salasanat eivät vastaa toisiaan!"
+
+#~ msgid "View"
+#~ msgstr "Näytä"
+
+#~ msgid "Edit"
+#~ msgstr "Muokkaa"
+
+#~ msgid "Create new objects"
+#~ msgstr "Luo uusi objekti"
+
+#~ msgid "Add events"
+#~ msgstr "Lisää tapahtuma"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Muokkaa/poista tapahtuma"
+
+#~ msgid "Control access"
+#~ msgstr "Pääsynvalvonta"
+
+#, fuzzy
+#~ msgid "Manage membership"
+#~ msgstr "Hallitse jäsenyyksiä"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Tunnistetut käyttäjät"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Tunnistamattomat käyttäjät"
+
+#~ msgid "A Group"
+#~ msgstr "Ryhmä"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell ryhmä"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Lisää/Poista jäseniä"
+
+#~ msgid "Import Groups"
+#~ msgstr "Tuo ryhmiä"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Lisää resurssi"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Muokkaa resurssin tietoja"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell resurssi"
+
+#~ msgid "A Resource"
+#~ msgstr "Resurssi"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Vapaa/Varattu"
+
+#~ msgid "New Event"
+#~ msgstr "Uusi tapahtuma"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Avaa iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Muokkaa tapahtumaa"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Muokkaa sivuston valintoja"
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Sallii uusien tapahtumien lisäämisen kalentereihin."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Sallii tapahtumien muokkaamisen ja poiston kalentereissa."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Pääsynvalvonta ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Sallii käyttäjän käyttää tätä lomaketta (Pääsynvalvonta)."
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Sallii käyttäjän lisätä jäseniä, ryhmiä ja resursseja ryhmiin. Käyttäjä "
+#~ "tarvitsee vain tämän lisätäkseen jotain ryhmään. Ryhmien yhdistelyllä on "
+#~ "turvallisuusvaikutuksia."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Käyttöoikeudet ryhmiin"
+
+#~ msgid "Access control"
+#~ msgstr "Pääsynvalvonta"
+
+#~ msgid "Set Access"
+#~ msgstr "Aseta pääsy"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Käyttöoikeudet käyttäjille"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Sijainti: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Valitse ylimääräiset kalenterit näyttöön"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Paina Ctrl tai Shift valitaksesi useampia kalentereja."
+
+#~ msgid "Showing"
+#~ msgstr "Näkyvissä"
+
+#~ msgid "of"
+#~ msgstr "/"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Haluatko varmasti poistaa valitut kohteet?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Et ole valinnut yhtään kohdetta."
+
+#~ msgid "Exception"
+#~ msgstr "Poikkeus"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Muuta tämän tapahtuman yksityiskohtia"
+
+#~ msgid "edit resources"
+#~ msgstr "muokkaa resursseja"
+
+#~ msgid "delete event"
+#~ msgstr "poista tapahtuma"
+
+#~ msgid "Event details"
+#~ msgstr "Tapahtuman yksityiskohdat"
+
+#~ msgid "Book Resources"
+#~ msgstr "Varaa resursseja"
+
+#~ msgid "Update form"
+#~ msgstr "Päivitä lomake"
+
+#~ msgid "day"
+#~ msgstr "päivä"
+
+#~ msgid "week"
+#~ msgstr "viikko"
+
+#~ msgid "times"
+#~ msgstr "ajat"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Toista ikuisesti"
+
+#~ msgid "Book resources"
+#~ msgstr "Varaa resursseja"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Resurssin varaus ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Otsikko:"
+
+#~ msgid "Ends:"
+#~ msgstr "Loppuu:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Tämä on toistuva tapahtuma!"
+
+#~ msgid "CSV File"
+#~ msgstr "CSV tiedosto"
+
+#~ msgid "Charset:"
+#~ msgstr "Merkistö:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Western (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Western (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Western (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Muu (määrittele)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Muu merkistö: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Syötä CSV tiedot"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV tiedot"
+
+#~ msgid "Login"
+#~ msgstr "Kirjautuminen"
+
+#~ msgid "User Information"
+#~ msgstr "Käyttäjätiedot"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Istuntosi on vanhentunut."
+
+#~ msgid "There are none."
+#~ msgstr "Ei yhtään."
+
+#~ msgid "Who can view the note"
+#~ msgstr "Kuka voi näyttää muistiinpanon"
+
+#~ msgid "Private"
+#~ msgstr "Yksityinen"
+
+#~ msgid "Public"
+#~ msgstr "Julkinen"
+
+#~ msgid "Add note"
+#~ msgstr "Lisää muistiinpano"
+
+#~ msgid "Delete"
+#~ msgstr "Poista"
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Hae Schooltool henkilöt CSV tiedostoon"
+
+#~ msgid "Details"
+#~ msgstr "Yksityiskohdat"
+
+#~ msgid "edit details"
+#~ msgstr "muokkaa yksityiskohtia"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Muokkaa tämän henkilön yksityiskohtia"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Kalenterin valinnat"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Muokkaa henkilön valintoja"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Olet poistamassa toistuvan tapahtuman."
+
+#~ msgid "Current"
+#~ msgstr "Nykyinen"
+
+#~ msgid "Future"
+#~ msgstr "Tuleva"
+
+#~ msgid "All"
+#~ msgstr "Kaikki"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Poistetaan toistuva tapahtuma (${event_title})."
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "CSV tiedoissa <strong>pitää</strong> olla resurssin nimi ja se "
+#~ "<strong>voi</strong> sisältää vapaavalintaisen kuvauksen resurssista. "
+#~ "Kaikki muu ylimääräinen tieto poistetaan."
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Näytä viikkokalenteri"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Näytä kuukausikalenteri"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Näytä vuosikalenteri"
+
+#~ msgid "Yearly"
+#~ msgstr "Vuosittain"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Kalenteri ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Siirry..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Huomisen tapahtumat"
+
+#~ msgid "Log in"
+#~ msgstr "Kirjaudu"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Tunnistamattomat käyttäjät"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Tunnistamaton käyttäjä"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Tunnistetut käyttäjät"
+
+#~ msgid "All Users"
+#~ msgstr "Kaikki käyttäjät"

Added: schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fi/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5227 @@
+# Finnish translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-07-24 13:44+0000\n"
+"Last-Translator: Akerchri <christer.akers at vgcom.fi>\n"
+"Language-Team: Finnish <fi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Lempinimi"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Henkilön lempinimi"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Ensisijainen Sähköposti"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Toissijainen Sähköposti"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Ensisijainen puhelin"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Suositeltava puhelinnumero."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Toissijainen puhelin"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Toissijainen puhelinnumero."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Web-sivu"
+
+#: /src/schoolbell/app/interfaces.py:38
+#, fuzzy
+msgid "Website or weblog."
+msgstr "Kotisivu tai webloki"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Postiosoite"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Henkilöt"
+
+#: /src/schooltool/app/browser/__init__.py:259
+#, fuzzy
+msgid "1 person"
+msgstr "1 henkilö"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+#, fuzzy
+msgid "${number} persons"
+msgstr "${numero} henkilöt"
+
+#: /src/schooltool/app/browser/app.py:231
+#, fuzzy
+msgid "Username or password is incorrect"
+msgstr "Käyttäjätunnus tai salasana virhellinen"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Maaliskuu"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Tammikuu"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Helmikuu"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Kesäkuu"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Toukokuu"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Huhtikuu"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Elokuu"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Syyskuu"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Heinäkuu"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Seyraava päivä"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Tänään"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Edellinen päivä"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Lokakuu"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Joulukuu"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Marraskuu"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+#, fuzzy
+msgid "Monday"
+msgstr "Maanantai"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Tiistai"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Keskiviikko"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Torstai"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Sunnuntai"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Lauantai"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Perjantai"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Ma"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ti"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Ke"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "To"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pe"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "La"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Su"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Otsikko"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+#, fuzzy
+msgid "All day"
+msgstr "Koko päivä"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Päivämäärä"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Kellonaika"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Alkamisaika 24t formatissa"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Kesto"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Kestotyyppi"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuuttia"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Tuntia"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Päiviä"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Sijainti"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Kuvaus"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Toistuva"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Toistuu jokainen"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Päivä"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Viikko"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Kuukausi"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Vuosi"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Toistuu joka"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Väli"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Laske"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Kunnes"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "ikuisesti"
+
+#: /src/schooltool/app/browser/cal.py:1720
+#, fuzzy
+msgid "Number of events"
+msgstr "Tapahtumien"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+#, fuzzy
+msgid "Repeat until"
+msgstr "Toista kunnes"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Arkisin"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Arkipäivä"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Kuukausittain"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Poikkeuspäivämäärät"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "sama arkipäivä"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "viimeinen arkipäivä"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Viimeinen ${arkipäivä}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Virhe taphtui"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Virhellinen aika"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Loppupäivämäärä on ennnen aloituspäivämäärä"
+
+#: /src/schooltool/app/browser/cal.py:1944
+#, fuzzy
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Päivämäärä virhellinen. Olkaa hyvä ja määritelkää VVVV-KK-PP,riviä kohti."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Lisää tapahtuma"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Lisää"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Muokkaa tapahtuma"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Päivitä"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+#, fuzzy
+msgid "Updated on ${date_time}"
+msgstr "Päivitetty ${päivämäärä_kellonaika}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalenteri"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "{viikko päivä}, ${pvm}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Ensi viikko"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Nykyinen viikko"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Viime viikko"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${kuukausi}, ${vuosi} (viikko ${viikko})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Seuraava kuukausi"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Nykyinen kuukausi"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Edellinen kuukausi"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${kuukausi}, ${vuosi}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Viikko ${viikko_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Seuraava vuosi"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Kuluva vuosi"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Edellinen vuosi"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Tehtävät"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+#, fuzzy
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalenteri"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalenteri"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalenteri"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalenteri"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Näytä"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalenteri"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Lisää tapahtuma"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Muokkaa tapahtuma"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Kirjaudu sisään"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+#, fuzzy
+msgid "Navigation"
+msgstr "Selaaminen"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Tehtävät"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalenteri"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Dataa ei annettu"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+#, fuzzy
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Ei voitu muuntaa dataa Unicodeksi (väärä merkkijono)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+#, fuzzy
+msgid "CSV file imported successfully."
+msgstr "CSV-tiedosto tuotu onnistuneesti."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+#, fuzzy
+msgid "Failed to import CSV file"
+msgstr "CSV-tiedoston lataus epäonnistui"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV textin lataus onnistui"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+#, fuzzy
+msgid "Failed to import CSV text"
+msgstr "CSV tekstin lataus epäonnistui"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Merkkijono ei määritelty"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Tuntematon merkkijono"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Virhe CSV data:ssa, rivi ${rivi_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+#, fuzzy
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Muuntaminen unicode:n epäonnistui rivillä, ${rivi_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+#, fuzzy
+msgid "Row 2 is not empty"
+msgstr "Rivi 2 ei ole tyhjä"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr "Epäonistunut rivi ${line_no} (tulee olla päivä id ja jakso id)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+#, fuzzy
+msgid "Incomplete section description on line ${line}"
+msgstr "Epätäydellinen osuus-kuvaus rivillä ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+#, fuzzy
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"CSV-tiedoston ensimmäisen rivin täytyy sisältää termin id, ja aikataulu "
+"kaavion id."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+#, fuzzy
+msgid "The term ${term} does not exist."
+msgstr "Termi ${term} ei ole olemassa."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+#, fuzzy
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Aikataulu kaavio ${schema} ei ole olemassa."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Virhe aikataulu-CSV-datassa, rivi ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+#, fuzzy
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Päivä id ei määritelty valitussa kaaviossa: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+#, fuzzy
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Jaksot eivät määritelty valittujen päivien yhteydessä: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Henkilöt eivät löytyneet: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+#, fuzzy
+msgid "Courses not found: ${args}."
+msgstr "Kurssit eivät löytyneet: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+#, fuzzy
+msgid "Sections not found: ${args}."
+msgstr "Kappaleet eivät löytyneet: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+#, fuzzy
+msgid "Invalid records: ${args}."
+msgstr "Väärät tapahtumat: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Muutokset tallennettu."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "koko päivä"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Sijainti: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Varatut resurssit: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "toistuva"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+#, fuzzy
+msgid "overlaid from %s"
+msgstr "päällystettynä %s :sta"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+#, fuzzy
+msgid "Daily calendar for %s"
+msgstr "Päivittäinen ajanlasku %s:ta varten"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+#, fuzzy
+msgid "Weekly calendar for %s"
+msgstr "Viikkokalenteri %s:ta varten"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Viikko %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+#, fuzzy
+msgid "Monthly calendar for %s"
+msgstr "Kuukausittainen ajanlasku %s:ta varten"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+#, fuzzy
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "PDF-tuki on passivoitu. Järjestelmänvalvoja voi mahdollistaa sen."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Muuttakaa etusijoja"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Kalenteri-etusijat"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Kalenteri-etusijat"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Muokkaa henkilöä, etusijat"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Muokkaa henkilöä, etusijat"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Kuvaus"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#, fuzzy
+msgid "Printable version"
+msgstr "Tulostettava versio"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "Näyttää päivittäistä kalenteria"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#, fuzzy
+msgid "Daily"
+msgstr "Päivittäin"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+#, fuzzy
+msgid "View weekly calendar"
+msgstr "Näytä kalenteri viikkoitain"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+#, fuzzy
+msgid "Weekly"
+msgstr "Viikkoittain"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "Näytä kalenteri kuukausittain"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+#, fuzzy
+msgid "View yearly calendar"
+msgstr "Näytä kalenteri vuosittain"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Vuosittain"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Cal"
+msgstr "Kalenteri"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Personal calendar"
+msgstr "Henkilökohtainen kalenteri"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Aikataulukalenteri"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+#, fuzzy
+msgid "My Calendar"
+msgstr "Oma kalenteri"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalenterit"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+#, fuzzy
+msgid "More..."
+msgstr "Lisää..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalenteri"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Näytä kalenteri"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Viikkokalenteri %s:ta varten"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+#, fuzzy
+msgid "delete-button"
+msgstr "poistaa-painike"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+#, fuzzy
+msgid "cancel-button"
+msgstr "lisää-painike"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+#, fuzzy
+msgid "R"
+msgstr "V"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+#, fuzzy
+msgid "Remove"
+msgstr "Poista"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+#, fuzzy
+msgid "There are none."
+msgstr "Ei ole mitään lisättävä"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+#, fuzzy
+msgid "Find Now"
+msgstr "Etsi nyt"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Tyhjennä"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+#, fuzzy
+msgid "There are none to add."
+msgstr "Ei ole mitään lisättävä"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Lisää tapahtuma"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+#, fuzzy
+msgid "Details"
+msgstr "Tiedot"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "La"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Muokkaa tapahtuma"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Vaihtakaa opettajia täksi osuudeksi."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Varatut resurssit: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "muokkaa ryhmiä"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Muuttaa/poistaa tapahtumia"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Muokkaa kappaletietoa"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "muokkaa tiedot"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Resurssit"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Päivitä"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Tänään"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Viikko"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Kuukausi"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Vuosi"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Toista kunnes"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Kellonaika"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Näytä kalenteri"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Toistuu joka"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Varatut resurssit: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Henkilötiedot: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Otsikko"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "La"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Resurssi indeksi"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "muuttaa sijainti"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "Kurssit"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "Tervetuloa KouluTyökaluun"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Muokkaa kappaletietoa"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Kirjaudu sisään"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "toistuva"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Koko päivä"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+#, fuzzy
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+#, fuzzy
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+#, fuzzy
+msgid "Other (please specify)"
+msgstr "Muu (olkaa hyvä määritelkää)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+#, fuzzy
+msgid "Other charset: ${other_charset}"
+msgstr "Muu merkistö: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+#, fuzzy
+msgid "Input CSV Data"
+msgstr "Syöttäkää CSV-data"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+#, fuzzy
+msgid "CSV Data"
+msgstr "CSV Data"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#, fuzzy
+msgid "submit-button"
+msgstr "poistaa-painike"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Tuo Aikataulu"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+#, fuzzy
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Te voitte luoda CSV-tiedoston taulukkolaskennassa ja viedä sitä CSV:n "
+"formaatissa (Comma-Separated Values). Pöydän rakennetta kuvataan alla."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+#, fuzzy
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"Tiedoston ensimmäisen rivin täytyy sisältää <strong>term</strong>, ja "
+"<strong>aikataulu-kaavio<strong> jota käytetään uusiin aikatauluihin. Toisen "
+"rivin pitäisi olla tyhjä. Sen jälkeen useat osuuskuvaukset saattavat "
+"seurata. Tyhjä linja erottaa ne."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Vie Koulu Työkalu aikataulu CSV muodossa"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+#, fuzzy
+msgid "Example:"
+msgstr "Esimerkki"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-syyksyy\",\"kolme-päivää\" \n"
+"\"\",\"\",\"\" \n"
+"\"filosofia\",\"lorch\" \n"
+"\"Maanantai\",\"A\",\"huone137\" \n"
+"\"Maanantai\",\"B\" \n"
+"\"Tiistai\",\"C\",\"huone138\" \n"
+"\"***\" \n"
+"\"johnny\" \n"
+"\"billy\" \n"
+"\"\" \n"
+"\"kirjallisuus\",\"guzman\" \n"
+"\"Keskiviikko\",\"B\"  \n"
+"\"Keskiviikko\",\"C\",\"huone139\" \n"
+"\"***\" \n"
+"\"johnny\" \n"
+"\"pete\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"Yllämainittu esimerkki luo kaksi uutta osuutta, ensimmäinen filosofialuentoa "
+"varten, ja toinen kirjallisuusluentoa varten. Osuudella filosofialuentoa "
+"varten on henkilöjä ids'llä, 'johnny' ja 'billy', oppilaina ja sen aikataulu "
+"sisältää kolme aikataulutoimintaa, kaksi maanantaina (eräs tapahtuu "
+"sijainnissa, jota id tarkoitti, 'huone137', toinen ilman määriteltyä "
+"sijaintia). Kirjallisuusosuutta käsitellään samanlaisella tavalla."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+#, fuzzy
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Huomatkaa, että vain objektien ids?n tulee käyttää tiedostossa, ei otsikot. "
+"Jos rivi päättyy tyhjäsoluihin (esim.,<em>-\"filosofia\"\", lorch\",</em>), "
+"ne solut hylätään. Te voitte erottaa osuuskuvaukset enemmän kuin yhden rivin "
+"luona. Oppilaiden luettelossa, käsitellään vain ensimmäinen sarake, joka "
+"sisältää henkilötunnukset, muut sarakkeet jätetään huomiotta. Te voitte "
+"tuoda samaa dataa monta kertaa ilman mitään sivuvaikutuksia."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+#, fuzzy
+msgid "Upload CSV File"
+msgstr "Vie CSV kansio"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+#, fuzzy
+msgid "CSV File"
+msgstr "CSV kansio"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+#, fuzzy
+msgid "Charset:"
+msgstr "Merkistö"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+#, fuzzy
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+#, fuzzy
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+#, fuzzy
+msgid "Calendar for %s"
+msgstr "Kalenteri %s:ta varten"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Varatut resurssit: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+#, fuzzy
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Koulun/Yhdistyksen nimi joka pitää \n"
+"            tämä palvelin pystyssä.Tämä näytetään↵\n"
+"            julkisella kalenterilla, juuri pohja ja sivun otsikossa."
+
+#: /src/schooltool/app/interfaces.py:140
+#, fuzzy
+msgid "Front Page Calendar"
+msgstr "Rintama-sivukalenteri"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+#, fuzzy
+msgid "Welcome to the SchoolTool server"
+msgstr "Tervetuloa KouluTyökaluun"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Kalenteri-etusijat"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Muokkaa henkilöä, etusijat"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Henkilöt"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuuttia"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "toistuva"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Sunnuntai"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Ei ole mitään lisättävä"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Ei ole mitään lisättävä"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Lisää uusi henkilö"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Edellinen vuosi"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+#, fuzzy
+msgid "Next"
+msgstr "Ensi viikko"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Sijainti"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Lisätkää kappaletta"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+#, fuzzy
+msgid "View"
+msgstr "Näytä"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Muokkaa tapahtuma"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "Lisätkää kappaletta"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+#, fuzzy
+msgid "Edit Section Information"
+msgstr "Muokkaa kappaletietoa"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+#, fuzzy
+msgid "Import Courses"
+msgstr "Tuo kurssit"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Syöttäkää CSV-data"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Uusi kurssi"
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Muu merkistö: ${other_charset}"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Syöttäkää CSV-data"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+#, fuzzy
+msgid "Insufficient data provided."
+msgstr "Riittämätön data annettu."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+#, fuzzy
+msgid "Titles may not be empty"
+msgstr "Nimikkeet eivät saata olla tyhjä"
+
+#: /src/schooltool/course/browser/section.py:103
+#, fuzzy
+msgid "No such course."
+msgstr "Ei sellainen kurssi."
+
+#: /src/schooltool/course/browser/section.py:113
+#, fuzzy
+msgid "Need a course ID."
+msgstr "Tarvitaan kurssi-tunnus"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+#, fuzzy
+msgid "Add a Section to ${course}"
+msgstr "Lisää uusi kappale ${kurssi}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Opettajat"
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Nykyiset opettajat"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Saatavissa olevat opettajat"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Opiskelijat"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+#, fuzzy
+msgid "Groups"
+msgstr "Ryhmät"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+#, fuzzy
+msgid "Resources"
+msgstr "Resurssit"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "CSV Data"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Lisää uusi kappale"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV-data <strong>täytyy käsittää kurssin otsikko</strong>, ja <strong>,"
+"saattaa käsittää valinnaisen kurssikuvauksen</strong>. Yhtään ylimääräistä "
+"tietoa hylätään."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+#, fuzzy
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Varhaishistoria, Pre-history 1000:n ajan A.D.\n"
+"Yhdysvaltalainen History\n"
+"Maailmanhistoria, 1000 jKr. 20:n vuosisadan välityksellä, toisen pilkun "
+"jälkeen teksti\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Yllämainittu esimerkki luo 3 kurssia nimeltään, 'Vanhan ajan historia', "
+"'USAn historia' ja 'Maailmanhistoria'. Ensimmäisellä ja viimeisellä "
+"kurssilla on kuvaukset 'Pre-history 1000:n ajan jKr.', ja '1000 jKr., 20:n "
+"vuosisadan välityksellä', vastaavasti. Toisella kurssilla ei ole mitään "
+"kuvausta ja ylimääräinen teksti \"teksti toinen pilkun jälkeen\" kolmannella "
+"kurssilla jätetään huomiotta."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool courses as CSV"
+msgstr "Kopioikaa schooltool kurssit CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Kappaleet"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "opiskelijat"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "Muokkaa nimi"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Muuttakaa tämän osuuden sijaintia tai nimeä."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Vaihtakaa opettajia täksi osuudeksi."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Varatut resurssit: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+#, fuzzy
+msgid "Change the instructors for this section."
+msgstr "Vaihtakaa opettajia täksi osuudeksi."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+#, fuzzy
+msgid "edit instructors"
+msgstr "muokkaa opettajia"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "edit individuals"
+msgstr "muokkaa henkilöt"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "Change the students in this section individually"
+msgstr "Muuttakaa opiskelijoita tässä osuudessa yksitellen"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+#, fuzzy
+msgid "Change the students in this section by groups"
+msgstr "Muuttakaa opiskelijoita tässä osuudessa ryhmien toimesta"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+#, fuzzy
+msgid "edit groups"
+msgstr "muokkaa ryhmiä"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+#, fuzzy
+msgid "Identifier (optional)"
+msgstr "Tunniste (valinnainen)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "osuus"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+#, fuzzy
+msgid "Current Size"
+msgstr "Nykyinen koko"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+#, fuzzy
+msgid "There are ${num_errors} input errors."
+msgstr "On olemassa ${num_errors} syötetty virheet"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+#, fuzzy
+msgid "${instructors} -- ${courses}"
+msgstr "Muu (olkaa hyvä määritelkää)"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Henkilöt"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Maaliskuu"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Muokkaa"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+#, fuzzy
+msgid "Username"
+msgstr "Käyttäjänimi"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+#, fuzzy
+msgid "Password"
+msgstr "Salasana"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+#, fuzzy
+msgid "This username is already used!"
+msgstr "Tätä käyttäjätunnusta on jo käytössä !"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Päivittäin"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Ei ole mitään lisättävä"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Ei ole mitään lisättävä"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Muistiinpanot"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+#, fuzzy
+msgid "Full name"
+msgstr "Täydellinen nimi"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+#, fuzzy
+msgid "Photo"
+msgstr "Valokuva"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+#, fuzzy
+msgid "Photo (in JPEG format)"
+msgstr "Valokuva (JPEG formatissa)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Kurssit"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "poistaa-painike"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+#, fuzzy
+msgid "add-button"
+msgstr "lisää-painike"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "lisää-painike"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Lisätkää kappaletta"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Muokkaa tapahtuma"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Opiskelijat"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "poistaa-painike"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Tuo ryhmät"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Lisää uusi ryhmä"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Muokkaa kappaletietoa"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Jäsenyyden Hallinta"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Ryhmät"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Ryhmät"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"CSV data <strong>must</strong> käsitää ryhmän otsikko, ja <strong>may</"
+"strong> käsittäkää valinnainen ryhmäkuvaus. Yhtään ylimääräistä tietoa "
+"hylätään."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+#, fuzzy
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"LUG, Linux Users Group \n"
+"Chess Club \n"
+"Urheiluseura, koulupäivän jälkeen tapahtuva urheiluseura,<em>-teksti toisen "
+"pilkun jälkeen</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+#, fuzzy
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Yllämainittu esimerkki luo 3 ryhmää nimeltään, 'LUG', 'shakkikerho' ja "
+"'urheilukerho'. Ensimmäisellä ja viimeisellä ryhmällä on vastaavasti "
+"kuvaukset, 'Linuxin käyttäjien ryhmä' ja 'koulupäivän jälkeen tapahtuvaa "
+"urheiluseuraa'. 'Shakkikerho'ryhmällä ei ole mitään kuvausta ja ylimääräinen "
+"\"teksti toinen pilkku jälkeen\" teksti kolmannella ryhmällä jätetään "
+"huomiotta."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Vie Koulu Työkalu ryhmät CSV muodossa"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Marraskuu"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "Muokkaa nimi"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Muuttakaa tämän osuuden sijaintia tai nimeä."
+
+#: /src/schooltool/group/browser/group.py:47
+#, fuzzy
+msgid "Group index"
+msgstr "Ryhmä indeksi"
+
+#: /src/schooltool/group/browser/group.py:48
+#, fuzzy
+msgid "Add a new group"
+msgstr "Lisää uusi ryhmä"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Ryhmän nimike"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Ryhmän kuvaus"
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Näytä kalenteri"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Lisää tapahtuma"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Muokkaa tapahtuma"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "Muistiinpanot"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "lisää-painike"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Nykyinen viikko"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Opiskelijat"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "poistaa-painike"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "lisää-painike"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "poistaa-painike"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Uusi valokuva"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Muistiinpanon nimike."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Runko"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Muistiinpanon runko."
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+#, fuzzy
+msgid "Privacy"
+msgstr "yksityisyys"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Muistiinpanot"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "yksityisyys"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Lisää tapahtuma"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Päivämäärä"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+#, fuzzy
+msgid "username may not be empty"
+msgstr "Käyttäjänimi ei saa olla tyhjä"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+#, fuzzy
+msgid "fullname may not be empty"
+msgstr "Täydelllinen nimi ei saa olla tyhjä"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Kaksois käyttäjänimi: ${käyttäjänimi}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+#, fuzzy
+msgid "Import Persons"
+msgstr "Tuo henkilöjä"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Vie Koulu Työkalu ryhmät CSV muodossa"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Vaihda etusijoja ${käyttäjä}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+#, fuzzy
+msgid "Edit person preferences"
+msgstr "Muokkaa henkilöä, etusijat"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Aikavyöhyke"
+
+#: /src/schooltool/person/interfaces.py:155
+#, fuzzy
+msgid "Time Zone used to display your calendar"
+msgstr "Kalenterin Aikavyöhyke"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+#, fuzzy
+msgid "Time Format"
+msgstr "Kellonaika Formatti"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+#, fuzzy
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Päivämäärä Formatti"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "KK/PP/VV"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "VVVV-KK-PP"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Päivä Kuukausi, Vuosi"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Viikon alkamispäivä:"
+
+#: /src/schooltool/person/interfaces.py:174
+#, fuzzy
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Viikkojen alku-näytteillepano sunnuntaina tai maanantai"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+#, fuzzy
+msgid "Name that should be displayed"
+msgstr "Nimi, joka pitäisi näyttää"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Lisää tapahtuma"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Muokkaa tapahtuma"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "kohdteet"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "Tuo resurssit"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Lisää uusi resurssi"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Muokkaa kappaletietoa"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Resurssit"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Resurssit"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV data <strong>must</strong> käsittää resurssin otsikko ja <strong>may</"
+"strong>\n"
+"käsittää valinnaisen resurssikuvauksen. Yhtään ylimääräistä tietoa hylätään."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+#, fuzzy
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, yläpuolinen projektori #302 \n"
+"Pää Auditorium \n"
+"LC-805, sylimikrotietokone #805,<em>-teksti toisen pilkun jälkeen</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Yllämainittu esimerkki luo 3 resurssia nimeltään, 'PRJ302', 'pääauditorio', "
+"ja 'LC-805'. Ensimmäisellä ja viimeisellä resurssilla on kuvaukset, "
+"'yläpuolinen projektori, #302', ja 'sylimikrotietokone, #805', vastaavasti. "
+"\"Pääauditorio\"resurssilla ei ole mitään kuvausta ja \"teksti toinen pilkku"
+"\" -tekstin  kolmannella resurssilla jätetään huomiotta"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "Kopioikaa schooltool kurssit CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+#, fuzzy
+msgid "Resource index"
+msgstr "Resurssi indeksi"
+
+#: /src/schooltool/resource/browser/resource.py:40
+#, fuzzy
+msgid "Add a new resource"
+msgstr "Lisää uusi resurssi"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Resurssin nimike."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Resurssin kuvaus."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Sijainti"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Osoittakaa, että tämä resurssi on sijainti, kuten, luokkahuone."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Kalenteri"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+#, fuzzy
+msgid "top"
+msgstr "ylä"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Poikkeuspäivämäärät"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+#, fuzzy
+msgid "Log In"
+msgstr "Kirjaudu sisään"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Käyttäjä"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Kirjaudu ulos"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${month} ${year}"
+msgstr "${kuukausi}, ${vuosi}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+#, fuzzy
+msgid "Week ${week_number}"
+msgstr "Viikko ${viikko_no}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+#, fuzzy
+msgid "Save changes"
+msgstr "Muutokset tallennettu."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+#, fuzzy
+msgid "Refresh"
+msgstr "Resurssit"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Tänään"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Katselkaa aikatauluja"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+#, fuzzy
+msgid "View Timetables"
+msgstr "Katselkaa aikatauluja"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Edellinen päivä"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "Koko päivä"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Lisää uusi henkilö"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Katselkaa aikatauluja"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Kurssit"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Katselkaa aikatauluja"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+#, fuzzy
+msgid "Period title (optional)"
+msgstr "Tunniste (valinnainen)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Päivämäärä"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "Henkilötiedot: ${title}"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Näytä kalenteri"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Maanantai"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Aikataulukalenteri"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Katselkaa aikatauluja"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Käyttäjänimi"
+
+#, fuzzy
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Vaihda henkilön nimi, kuva, tai salasana"
+
+#, fuzzy
+#~ msgid "Import Sections"
+#~ msgstr "Lataa kappaleita"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Epämuodostunut linja ${line_no} (sen pitäisi sisältää päivän id, kausi id "
+#~ "ja omavalintaisesti sijainti id)"
+
+#, fuzzy
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Sijainnit eivät löytyneet: ${args}."
+
+#, fuzzy
+#~ msgid "Modify this person's details"
+#~ msgstr "Muuttaa henkilön tiedot"
+
+#, fuzzy
+#~ msgid "Sections Taught"
+#~ msgstr "Kappaleet"
+
+#~ msgid "via group"
+#~ msgstr "ryhmän kautta"
+
+#, fuzzy
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<P> Server Running Koulu Työkalu <span>${DYNAMIC_CONTENT}</span> © "
+#~ "Shuttleworthin säätiö 2003 - <span>2005</span>: Tukeva sosiaalinen "
+#~ "innovaatio. </p> <p> SchoolTool™ on Shuttleworth Foundationin "
+#~ "tavaramerkki. </p>"
+
+#, fuzzy
+#~ msgid "Person index"
+#~ msgstr "henkilöindeksi"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Pieni kuva (noin 48x48-pikselit JPEG-formaatissa)"
+
+#, fuzzy
+#~ msgid "Clear photo"
+#~ msgstr "Tyhjennä valokuva"
+
+#, fuzzy
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Ruksaa tämän poistakseen valokuvan"
+
+#, fuzzy
+#~ msgid "New password"
+#~ msgstr "Uusi salasana"
+
+#, fuzzy
+#~ msgid "Verify password"
+#~ msgstr "Tarkistakaa salasana"
+
+#, fuzzy
+#~ msgid "Passwords do not match."
+#~ msgstr "Salasanat eivät sovi yhteen."
+
+#, fuzzy
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Salasanaa muutettiin onnistuneesti!"
+
+#, fuzzy
+#~ msgid "Passwords do not match!"
+#~ msgstr "Salasanat eivät sovi yhteen!"
+
+#, fuzzy
+#~ msgid "Create new objects"
+#~ msgstr "Luo uudet objektit"
+
+#, fuzzy
+#~ msgid "Add events"
+#~ msgstr "Lisää tapahtumat"
+
+#, fuzzy
+#~ msgid "Control access"
+#~ msgstr "Pääsyvalvonta"
+
+#, fuzzy
+#~ msgid "Authenticated users"
+#~ msgstr "Tunnistetut käyttäjät"
+
+#~ msgid "An error occured."
+#~ msgstr "On tapahtunut virhe"

Added: schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3188 @@
+# French translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-01-02 20:55+0000\n"
+"Last-Translator: Christophe JAC <christophe.jac at gmail.com>\n"
+"Language-Team: French <fr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Surnom"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Un court surnom pour cette personne"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Adresse électronique principale"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Adresse électronique seconddaire"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Téléphone principal"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Numéro de téléphone recommandé."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Téléphone secondaire"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Numéro de téléphone secondaire."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Site Web"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Site Web ou web log"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Adresse de mailling"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personnes"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 personne"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personnes"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Le nom d'utilsateur ou le mot de passe est incorrect"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Année courante"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Groupes Disponibles"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Mars"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Janvier"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Février"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juin"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Avril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Août"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Septembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juillet"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Le jour suivant"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Aujourd'hui"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Le jour précédent"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Octobre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Décembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Novembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Lundi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Mardi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Mercredi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Jeudi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Dimanche"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Samedi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Vendredi"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Lun"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Mar"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Mer"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Jeu"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Ven"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sam"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Dim"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titre"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Toute la journée"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Date"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Heure"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Heure de départ dans le format 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Durée"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Type de Durée"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutes"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Heures"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Jours"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Emplacement"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Description"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Récurrent"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Repete toujours"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Jour"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semaine"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mois"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Année"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Répéter chaque"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Intervalle"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Nombre"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Jusqu'à"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "pour toujours"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Nombre d'événements"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Répéter jusqu'à"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Jours de la semaine"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Jour de la semaine"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Mensuel"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Sauf aux dates"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "même jour de la semaine"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1er"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4ème"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3ème"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2ème"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5ème"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "dernier jour de la semaine"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Dernier ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Une erreur s'est produite"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Heure non valide"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "La date de fin est antérieure à la date de début"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Date invalide. Veuillez entrer une date du type AAAA-MM-JJ, une par ligne"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Ajouter un événement"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Ajouter"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Éditer un événement"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Mettre à jour"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Mis à jour le ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Calendriers"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Semaine suivante"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Semaine courante"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Semaine précédente"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Mois suivant"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mois courrant"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mois précédent"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "${week_no} ème Semaine"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Année suivante"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Année courante"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Année précédente"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Pas de donnée fournie"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Impossible de convertir les données en Unicode (Jeu de caractères "
+"incorrect ?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Importation réussie du fichier CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Échec de l'importation du fichier CVS"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Importation réussie du texte CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Importation CSV texte à échoué"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Jeu de caractères non spécifié"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Jeu de caractères inconnu"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Erreur dans les données CSV, ligne ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "La conversion en unicode a échoué à la ligne ${ligne_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Erreur dans les données CSV, ligne ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Information sur la personne : ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Changements sauvés"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "toute la journée"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Endroit : %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Ressources réservées : %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "récurrent"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "Depuis l'image %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendrier quotidien pour %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendrier hebdomadaire pour %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Semaine %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendrier mensuel pour %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Le support du PDF est désactivé. Il peut être activé par votre "
+"administrateur."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendrier pour %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Le nom de l'école ou de l'organisation où fonctionne /n\n"
+"            ce serveur. Cela sera afficher sur le calendrier publique, en /"
+"n\n"
+"bas de toute les pages et de la page d'accueil."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Page de garde du calendrier"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Afficher le calendrier grande taille sur la page de garde du /n\n"
+"site."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "L'entrée exigée est absente."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "L'entrée de formulaire n'est pas un objet fichier"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Donnée entière invalide"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Donnée texte invalide"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Donnée textuelle invalide"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Donnée unicode invalide"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Donnée virgule flottante invalide"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Donnée heure et date invlide"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Passage à l'arrière-plan, pid du démon %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "lancer %s -h pour de l'aide"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s : Mode service non supporté par votre système d'exploitation."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Lire la configuration depuis %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Gerer"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Démarrer depuis : %.3f sec reel, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"N'a pas pu initialiser la base de données :\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Peut-être une autre instance de %s l'emploie ?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Avertissement : n'a pas pu trouver la bibliothèque reportlab.\n"
+"Support de PDF désactivé."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Avertissement : le dossier des polices '%s' n'existe pas.\n"
+"Support de PDF invalidé."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Avertissement : la police '%s'n'existe pas/\n"
+"Support de PDF invalidé."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Utilisation : %s [options] \n"
+"Options :\n"
+"  - c, --config xxx       employer ce fichier de configuration au lieu du "
+"défaut\n"
+"  - h, --help             afficher ce message d'aide\n"
+"  - d, --daemon           passe en arrièreplan après le démarrage\n"
+"  - r, --restore-manager  restaure l'utilisateur gestionnaire avec le mot de "
+"passe par défaut\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Aucun stockage défini dans le fichier de configuration\n"
+"\n"
+"Si vous employez le fichier de configuration par défaut, veuillez\n"
+"l'éditer maintenant et décommenter un des sections de stockage ZODB.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Ceci n'est pas un fichier de base de données de SchoolBell 1.0, abandon.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Ceci n'est pas un fichier de base de données de SchoolBell 1.0, abandon.\n"
+"\n"
+"Veuillez exécuter le script autonome de mise à niveau de la base de "
+"données.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titre"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Titre de la note."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Groupe"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Durée"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Date"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Numéro de ressource"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Donnée fournie insuffisante"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Le titre ne doit pas être vide"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Groupes Courants"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Groupes Disponibles"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Mois courrant"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Groupes Disponibles"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Groupes"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Groupes Courants"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Groupes Disponibles"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Ressources"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importer des ressources"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Ressource disponible"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Numéro d'identification"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Ajouter une nouvelle personne"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Titre de la ressource"
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Description de la ressource"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Description du groupe"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Site Web"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Annuler"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Changer l'information pour ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Modifier l'inscription"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Changer preferences pour ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Changez les détails de contact pour ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Changez les détails de contact pour ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "information de contact"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Mot de passe"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Ce nom d'utilisateur est déjà utilisé"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Appliquer"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Téléphone principal"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Précédent"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Information sur l'événement"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Surnom"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Débuts"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sam"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Fuseau horaire"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Téléphone secondaire"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notes"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Suivant"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Nombre d'événements"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Modifier le nom"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Modifier le nom"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "Modifier le nom"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Mes préférences"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nom complet"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Photo"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Photo (au format JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nouvelle note"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Importation réussie du texte CSV"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Le mot de passe a été changé avec succès"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Le mot de passe a été changé avec succès"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Exemple:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Information sur la Personne"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Numéro de groupe"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Ajouter un nouveau groupe"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Group du ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Membres de ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Membres Courants"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Ajouter membres"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Titre du groupe."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Description du groupe"
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Numéro de ressource"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Semaine précédente"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "Importation réussie du texte CSV"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Le mot de passe a été changé avec succès"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Semaine courante"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Le mot de passe a été changé avec succès"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Utilisateur"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Titre de la ressource"
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Description de la ressource"
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Débuts"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Titre de la note."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Semaine suivante"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Titre de la note."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Quotidien"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Titre de la note."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Corps"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Corps de la note."
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Intimité"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Le nom d'utilisateur ne peut laissé être vide"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Le nom complet ne peut être laissé vide"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Nom d'utilisateur déjà utilisé: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nouveau mot de passe"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Changer le mot de passe"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Fuseau horaire"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Fuseau Horaire utilisé pour afficher votre calendrier"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Format d'Heure"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Format de date"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/JJ/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAAA-MM-JJ"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Jour Mois, Année"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "La semaine commence le :"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Commencement des semaines le Dimanche ou Lundi"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Voir le calendrier"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nom que vous souhaitez afficher"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Numéro de ressource"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Numéro de ressource"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Titre de la ressource"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Description de la ressource"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Un emplacement"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+"Indique l'emplacement de la ressource, de préférence une salle de classe"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Donnée fournie insuffisante"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Donnée fournie insuffisante"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Donnée fournie insuffisante"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Mon Calendrier"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Plus..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendriers"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Bienvenue dans SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigation"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Photo"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Nom d'utilisateur"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "Modifier le nom"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Changer le nom de personne, photo ou le mot de passe"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Information sur la personne : ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Gérer les adhésions de cette personne"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "éditer les groupes"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Ceci n'est pas un fichier de base de données de SchoolBell 1.0, abandon.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Ceci n'est pas un fichier de base de données de SchoolBell 1.0, abandon.\n"
+"\n"
+"Veuillez exécuter le script autonome de mise à niveau de la base de "
+"données.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "top"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Changements sauvés"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Changer les informations"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nouvelle note"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "articles"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Ajouter une nouvelle personne"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Débuts"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Sauf aux dates"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+"Date invalide. Veuillez entrer une date du type AAAA-MM-JJ, une par ligne"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} personnes"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Corps de la note."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "même jour de la semaine"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "Modifier le nom"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Note"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Jeu de caractères inconnu"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nouvelle photo"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Une petite image (environ 48 par 48 pixels au format JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Effacer la photo"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Cochez ceci pour effacer la photo"
+
+#~ msgid "Verify password"
+#~ msgstr "Vérifier le mot de passe"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Les mots de passe ne correspondent pas."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Les mots de passe ne correspondent pas!"
+
+#~ msgid "View"
+#~ msgstr "Voir"
+
+#~ msgid "Edit"
+#~ msgstr "Éditer"
+
+#~ msgid "Create new objects"
+#~ msgstr "Créer de nouveaux objets"
+
+#~ msgid "Add events"
+#~ msgstr "Ajouter des évènements"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modifier/Effacer des évènements"
+
+#~ msgid "Control access"
+#~ msgstr "Contrôler l'accès"
+
+#~ msgid "Manage membership"
+#~ msgstr "Gérer les inscriptions"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Utilisateurs authentifiés"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Utilisateurs non-authentifiés"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Accès à l'Installation"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Changer les préférences"
+
+#~ msgid "New Person"
+#~ msgstr "Nouvelle personne"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importer des personnes"
+
+#~ msgid "Add a Group"
+#~ msgstr "Ajouter un groupe"
+
+#~ msgid "New Group"
+#~ msgstr "Nouveau groupe"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Modifier les informations sur le groupe"
+
+#~ msgid "A Group"
+#~ msgstr "Un groupe"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Groupe SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Ajouter/Enlever des membres"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importer des groupes"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Ajouter une ressource"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Modifier les informations pour une ressource"
+
+#~ msgid "New Resource"
+#~ msgstr "Nouvelle ressource"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Ressource SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Une ressource"
+
+#~ msgid "Actions"
+#~ msgstr "Actions"
+
+#~ msgid "View Calendar"
+#~ msgstr "Voir le calendrirer"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Calendrier (Journalier)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Calendrier ( Journée, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Calendrier (Hebdomadaire)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Calendrier(Hebdomadaire,PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Calendrier (Mensuel)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Calendrier(Mensuel,PD"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Calendrier (Annuel)"
+
+#~ msgid "Atom View"
+#~ msgstr "Vue Atom"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Libre/Occupé"
+
+#~ msgid "New Event"
+#~ msgstr "Nouvel événement"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Lire au format iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Éditer l'événement"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Changer les préférences du site"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Cette permission vous autorise à voir les noms, les photos, les listes "
+#~ "d'objets, et autres vinformations."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr ""
+#~ "Permission d'éditer les nom, les titres, les descriptions , les photos, "
+#~ "etc."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr ""
+#~ "Laisse l'utilisateur créer de nouveaux personnes, groupes, et ressources."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr ""
+#~ "Permission de visualiser les calendriers, les personnes, les groupes, et "
+#~ "les ressources."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Autorise l'ajout de nouveaux évènements aux calendriers"
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Autorise l'édition et le retrait d'évènements de calendriers"
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Contrôle d'accès pour ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Autorise l'usage du formulaire (Contrôle d'accès)"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Permet à l'utilisateur d'ajouter des personnes, des groupes et des "
+#~ "ressources aux groupes.  Afin d'ajouter quelque chose à un groupe, "
+#~ "l'utilisateur a besoin de cette permission seulement sur le groupe.  "
+#~ "Maintenez dans l'esprit que joindre des groupes a des implications de "
+#~ "sécurité."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Permissions pour les groupes"
+
+#~ msgid "Access control"
+#~ msgstr "Contrôle d'accès"
+
+#~ msgid "Set Access"
+#~ msgstr "Accés"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Permissions pour les utilisateurs"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Les permissions sont héritées dans la hiérarchie.  Par exemple, si vous "
+#~ "placez une permission de visualiser le calendrier pour un utilisateur sur "
+#~ "l'index de personnes, cet utilisateur pourra voir les calendriers de "
+#~ "toutes les personnes.  Si vous voulez que l'utilisateur puisse accéder "
+#~ "juste à un calendrier d'une certaine ressource, vous pouvez placer la "
+#~ "permission de visualiser le calendrier pour cet utilisateur sur cette "
+#~ "ressource."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "Ci-dessous une liste des noms de permissions avec leurs significations "
+#~ "respectives"
+
+#~ msgid "Change site preferences"
+#~ msgstr "Change les préférences de site"
+
+#~ msgid "General preferences"
+#~ msgstr "Préférence Général"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Éditer les préférences du site"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Événements pour"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_description"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_enabled"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_more_info"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Valider mon \"Atom feed\""
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Valider Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Endroit : ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Selectionner un calendrier additionnel à afficher"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr ""
+#~ "Maintenez Ctrl ou Shift enfoncé pour sélectionner des calendriers "
+#~ "multiples"
+
+#~ msgid "Public Calendar"
+#~ msgstr "Calendrier Public"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "Calendrier grande largeur"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Sélectionnez les calendriers à afficher"
+
+#~ msgid "People"
+#~ msgstr "Personnes"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Il n'y a aucune personne avec des calendriers accessibles par vous."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Il n'y a aucun groupe avec des calendriers accessibles par vous."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr ""
+#~ "Il n'y a aucune ressource avec des calendriers accessibles par vous."
+
+#~ msgid "Showing"
+#~ msgstr "Affichage"
+
+#~ msgid "of"
+#~ msgstr "d'"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Êtes-vous sûr de vouloir supprimer les articles choisis ?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Vous n'avez pas choisi d'articles."
+
+#~ msgid "delete-button"
+#~ msgstr "bouton \"effacer\""
+
+#~ msgid "Exception"
+#~ msgstr "Exception"
+
+#~ msgid "Traceback"
+#~ msgstr "Suivi"
+
+#~ msgid "Server Error"
+#~ msgstr "Erreur du serveur"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Une erreur interne du serveur s'est produite.  Ceci signifie très "
+#~ "probablement que vous avez trouvé un bogue dans SchoolBell.  Veuillez le "
+#~ "rapporter sur <a href=\"http://issues.schooltool.org\">Report de Bogue</"
+#~ "a>."
+
+#~ msgid "All day event"
+#~ msgstr "Journée complète"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "C'est un évenement répétitif"
+
+#~ msgid "Ends"
+#~ msgstr "Fins"
+
+#~ msgid "edit event"
+#~ msgstr "Modifier l'évènement"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Change les détails de cet évènement"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Ressources programmées"
+
+#~ msgid "edit resources"
+#~ msgstr "éditer les ressources"
+
+#~ msgid "delete event"
+#~ msgstr "supprimer l'événement"
+
+#~ msgid "Event details"
+#~ msgstr "Détails de l'événement"
+
+#~ msgid "Book Resources"
+#~ msgstr "Réserver des Ressources"
+
+#~ msgid "Update form"
+#~ msgstr "Formulaire de mise à jour"
+
+#~ msgid "day"
+#~ msgstr "jour"
+
+#~ msgid "week"
+#~ msgstr "semaine"
+
+#~ msgid "month"
+#~ msgstr "mois"
+
+#~ msgid "year"
+#~ msgstr "année"
+
+#~ msgid "Weekly"
+#~ msgstr "Hebdomadaire"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr ""
+#~ "Cette section s'applique seulement quand la répétition hebdomadaire est "
+#~ "choisie."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr ""
+#~ "Cette section s'applique seulement quand la répétition mensuelle est "
+#~ "choisie."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Le jour ${monthday} de chaque mois"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} de chaque mois"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} de chaque mois"
+
+#~ msgid "Repeat"
+#~ msgstr "Répéter"
+
+#~ msgid "times"
+#~ msgstr "fois"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Répéter indéfiniment"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Catalogue de ressource"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Ressource cataloguer pour ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Titre:"
+
+#~ msgid "Starts:"
+#~ msgstr "Débuts"
+
+#~ msgid "Ends:"
+#~ msgstr "Fins"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Ceci est un évenement répétitif"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Réservation de Ressource"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Événements conflictuels"
+
+#~ msgid "Book"
+#~ msgstr "Réserver"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "Les données CSV <strong>doivent</strong> inclure un titre de groupe et "
+#~ "<strong>peuvent</strong> inclure une description de groupe facultative. "
+#~ "N'importe quelle information supplémentaire sera jetée."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GUL, Groupe d'Utilisateurs de Linux\n"
+#~ "Club d'Échecs\n"
+#~ "Club Sportif, Club sportif après l'école, <em>texte après une deuxième "
+#~ "virgule</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "L'exemple ci-dessus créera 3 groupes intitulés 'GUL', 'Club d'Échecs'et "
+#~ "les 'Club Sportif'. Le premier et dernier groupe auront les descriptions "
+#~ "'Groupe d'Utilisateurs de Linux 'et 'Club sportif après l'école' "
+#~ "respectivement. Le groupe 'Club d'Échecs'n'aura aucune description, et le "
+#~ "texte supplémentaire \"texte après une deuxième virgule\"  sur le "
+#~ "troisième groupe sera ignoré."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Charger les groupes schooltool au format CSV"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Charger le fichier CSV"
+
+#~ msgid "CSV File"
+#~ msgstr "Fichier CSV"
+
+#~ msgid "Charset:"
+#~ msgstr "Jeu de caractères :"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Occidental (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Occidental (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Occidental (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Autre (spécifier)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Autre jeu de caractère : ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Entrer les données CSV"
+
+#~ msgid "CSV Data"
+#~ msgstr "Données CSV"
+
+#~ msgid "Members"
+#~ msgstr "Membres"
+
+#~ msgid "edit members"
+#~ msgstr "Modifier les membres"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Changer les personnes qui sont membre de son group"
+
+#~ msgid "Remove"
+#~ msgstr "Enlever"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Vous n'êtes pas autorisés à accéder à cette page. Vous pouvez cliquer sur "
+#~ "le bouton précédent de votre navigateur pour revenir en arrière, ou "
+#~ "demandez à un utilisateur plus privilégié d'ouvrir une session."
+
+#~ msgid "Please log in"
+#~ msgstr "Veuillez vous connecter"
+
+#~ msgid "Login"
+#~ msgstr "Identification"
+
+#~ msgid "User Information"
+#~ msgstr "Information de l'utilisateur"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Votre session s'est terminée."
+
+#~ msgid "There are none."
+#~ msgstr "Il n'y en a pas."
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "bouton de soumission"
+
+#~ msgid "There are none to add."
+#~ msgstr "Il n'y a personne à ajouter"
+
+#~ msgid "Find Now"
+#~ msgstr "Rechercher maintenant"
+
+#~ msgid "Clear"
+#~ msgstr "Effacer"
+
+#~ msgid "A"
+#~ msgstr "Un"
+
+#~ msgid "cancel-button"
+#~ msgstr "Bouton d'annulation"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Qui peut regarder la note"
+
+#~ msgid "Private"
+#~ msgstr "Privé"
+
+#~ msgid "Public"
+#~ msgstr "Publique"
+
+#~ msgid "Add note"
+#~ msgstr "Ajout d'une note"
+
+#~ msgid "add-button"
+#~ msgstr "bouton ajouter"
+
+#~ msgid "Delete"
+#~ msgstr "Supprimer"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Veuillez noter ce qui suit :"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Vous avez probablement mal épelé l'URL"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Vous essayez probablement d'accéder à une page non-existante"
+
+#~ msgid "Not Found"
+#~ msgstr "Non trouvé"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "La page à la laquelle vous essayez d'accéder n'est pas disponible"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "Les données CSV <strong>doivent</strong> contenir un nom d'utilisateur et "
+#~ "un nom et prénoms. Un mot de passe facultatif <strong>peut</strong> être "
+#~ "aussi inclus."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "/n\n"
+#~ "jjones, Jimmy Jones/n\n"
+#~ "jbjones, Jim Bob Jones, r2m45J/n\n"
+#~ "howard, Howard/n\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "L'exemple ci-dessus créera trois utilisateurs, 'jjones ', 'jbjones et "
+#~ "'howard '.  Des trois, seul 'jbjones a un mot de passe ('r2m45J ') et "
+#~ "pourra se connecter à l'ouverture au système.  Notez que des mots de "
+#~ "passe doivent être en texte non codé."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Télécharger le fichier de personne en CSV"
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "edit details"
+#~ msgstr "modifier Details"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modifier les détail de cette personne"
+
+#~ msgid "Add person"
+#~ msgstr "Ajouter un utilisateur"
+
+#~ msgid "Add to groups"
+#~ msgstr "Ajoutez aux groupes"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr ""
+#~ "Désolé, vous ne pouvez pas supprimer votre propre compte d'utilisateur."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Éditer l'information de contact"
+
+#~ msgid "Edit person"
+#~ msgstr "Éditer la personne"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Préférence du calendrier"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Modifier les préférences de personne"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Vous essayez de supprimer un événement répétitif."
+
+#~ msgid "Current"
+#~ msgstr "Actuel"
+
+#~ msgid "Future"
+#~ msgstr "Futur"
+
+#~ msgid "All"
+#~ msgstr "Toutes"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Effacer un événement récurrent (${event_title})"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "les données CSV <strong>doivent</strong>inclure un nom de ressource et "
+#~ "<strong>peuvent</strong> inclure une description de ressource.N'importe "
+#~ "quelle information supplémentaire sera rejetée."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "/n\n"
+#~ "PRJ302, Overhead Projector #302/n\n"
+#~ "Main Auditorium/n\n"
+#~ "LC-805, Laptop Computer #805, <em>Texte après la deuxième virgule</em>/n\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "L'exemple ci-dessus créera 3 ressources intitulées 'PRJ302 ', 'salle "
+#~ "principale 'et 'Lc-805 '.  La première et dernière ressource auront "
+#~ "respectivement les descriptions 'rétroprojecteur # 302 'et 'ordinateur "
+#~ "portable # 805 '.  La ressource ' salle principale' n'aura aucune "
+#~ "description, et \"texte après une deuxième  virgule\" le texte de la "
+#~ "troisième ressource sera ignoré."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Télécharger les ressources Schooltool en CSV"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "Ce sont les ${num_errors} erreurs d'entrée"
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identifiant (Optionel)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; est une marque "
+#~ "déposée The Shuttleworth Foundation. </p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Version imprimable"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Voir le calendrier quotidien"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Voir le calendrier hebdomadaire"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Voir le calendrier mensuel"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Voir le calendrier annuel"
+
+#~ msgid "Yearly"
+#~ msgstr "Annuellement"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Calendrier pour ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Aller à ..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Evenement du lendemain"
+
+#~ msgid "Log in"
+#~ msgstr "Authentifiez vous"
+
+#~ msgid "User:"
+#~ msgstr "Utilisateur :"
+
+#~ msgid "Log Out"
+#~ msgstr "Deconnection"
+
+#~ msgid "Edit Info"
+#~ msgstr "Modifier les informations"
+
+#~ msgid "Add Event"
+#~ msgstr "Ajouter un Événement"
+
+#~ msgid "Modify Event"
+#~ msgstr "Modifier l'Événement"
+
+#~ msgid "Set up access"
+#~ msgstr "Configurer l'accès"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Utilisateurs non-authentifiés"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Utilisateur inconnu"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Utilisateur authentifié"
+
+#~ msgid "All Users"
+#~ msgstr "Tous les utilisateurs"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s : Attention : Option de configuration %s ignorée."
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fr/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5216 @@
+# French translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:45+0000\n"
+"Last-Translator: Christophe Sauthier <christophe.sauthier at gmail.com>\n"
+"Language-Team: French <fr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Surnom"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Un surnom pour cet personne"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Courriel principal"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Courriel secondaire"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Téléphone principal"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Numéro de téléphone principal"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "téléphone secondaire"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "NNuméro de téléphone secondaire"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Site web"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Site Web ou Weblog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Adresse de Mailing"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personnes"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 personne"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personnes"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Le mot de passe ou nle nom utilisateur est incorrect"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Mars"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Janvier"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Fevrier"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juin"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Avril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Aout"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Septembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juillet"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Le jour suivant"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Aujourd'hui"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Le jour précédent"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Octobre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Decembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Novembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Lundi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Mardi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Mercredi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Jeudi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Dimanche"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Samedi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Vendredi"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Lun"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Mar"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Mer"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Jeu"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Ven"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sam"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Dim"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titre"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Tous les jours"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Date"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Heure"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Format des heures sur 24H"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Durée"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Type de durée"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minutes"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Heures"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Jours"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Lieu"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Description"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Repetition"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Repete toujours"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Jour"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semaine"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Mois"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Année"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repete tout(e) les"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "intervalle"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Compte"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Tant que"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "Toujours"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Nombre d'évennement"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "repète tant que"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Jours de la semaine"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Jour de la semaine"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Mensuel"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Exeption"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "Même jour de semaine"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1er"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4eme"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3eme"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2nd"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5eme"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "Denier jours de la semaine"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Dernier ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Heure invalide"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Date de fin inférieur à la date de début"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Date invalide. S'il vous plait spécifier AAAA-MM-JJ, une par ligne"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Ajouter un évenement"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Ajout"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Modifie l'évenement"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Mettre à jour."
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Mise à jour le ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Calendrier"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Prochaine semaine"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Cette semaine"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Semaine précédente"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Prochain mois"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Ce mois"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Prochain mois"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Semaine ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Prochaine année"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Anné en cours"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Année précédente"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Actions"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "Outils scolaire"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Calendrier"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Calendrier"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Calendrier"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Calendrier"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Affichage"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Calendrier"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Ajouter un évenement"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Modifie l'évenement"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Connecter"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigation"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Actions"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Calendrier"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Pas de donnée fournie"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Impossible de convertir la donnée en Unicode (jeu de caractères invalide ?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Le fichier CSV est importé avec succés"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "L'importation du fichier CSV à échoué"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "L'importation du text CSV à réussie"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "L'importation du texte CSV à échoué"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Aucun jeu de caractères spécifié"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Jeu de caractères inconnu"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Erreur dans la donnée CSV , Ligne ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "La conversion unicode a échoué lgine ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "La ligne 2 n'est pas vide"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Description incomplète de la section à la ligne ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"La première ligne du fichier au format CSV doit contenir l'identificateur de "
+"trimestre (ou autr période) et celui du calendrier"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Le terme ${term} n'existe pas"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Le schéma de l'emploi du temps ${schema} n'existe pas"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Erreur de données dans l'emploi du temps CSV, ligne ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Jour non défini dans le schéma ${args} sélectionné."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Période non définie dans les jours ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Personnes non trouvées : ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Cours non trouvés : ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Sections non trouvées : ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Enregistrements invalides : ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Modifications sauvés"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "Tous les jours"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Lieu : %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Ressources réservées : %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "récurrent"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "Depuis l'image %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Vue journalière pour %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Vue hebdomadaire pour %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Semaine %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Vue mansuelle pour %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Le support du format PDF est désactiver. Il peut être activer par votre "
+"administrateur."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Changer les préférences"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Préférences calendrier"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Préférences calendrier"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Editer les préférences de cette personne"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Editer les préférences de cette personne"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "Outils scolaire"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "Outils scolaire"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Description"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Aller à..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Evenement du lendemain"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Version imprimable"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Voir l'aalendrier journalier"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Journalier"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Afficher une semaine"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Hebdomadaire"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Afficher un mois"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Afficher une année"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Annuel"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Calendrier pour ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "cal (Calendrier)"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Calendrier Personnel"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Calendrier de l'emploi du temps"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Mon aalendrier"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendriers"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Suite..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Calendrier"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Voir l'aalendrier"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Vue hebdomadaire pour %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "Un"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "bouton \"supprimer\""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "bouton annuler"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Supprimer"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Il n'y en a aucun."
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Lancer la recherche"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Effacer"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Il n'y a rien à ajouter"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Ajouter un évenement"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "détails"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Sam"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Modifie l'évenement"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Changer les professeurs de cette classe."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Ressources réservées : %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "éditer les groupes"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Modifier/Effacer évenement(s)"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Éditer les informations de la section"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "éditer les détails"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Ressources"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Mettre à jour."
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Aujourd'hui"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Semaine"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Mois"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Année"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "repète tant que"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Heure"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Voir l'aalendrier"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Repete tout(e) les"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Ressources réservées : %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "informations associées à la personne: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Titre"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Sam"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Index des ressources"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "Changer le lieu"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Cours"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Bienvenue sur SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Éditer les informations de la section"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Connecter"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "récurrent"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Tous les jours"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Occidental (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Occidental (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Autre (veuillez préciser)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Autr jeu de caractères: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Entrer données CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "Données CSV"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "bouton \"Envoyer\""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Importer un aalendrier"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Vous pouvez préparer le fichier CSV dans un tableur par exemple et "
+"l'exporter au format CSV (\"comma-separated values\": valeurs séparées par "
+"des virgules). La structure de la table est décrite ci-dessous."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"La première ligne du fichier doit contenir le nom du <strong>trimestre</"
+"strong> et le <strong>schéma de l'aalendrier</strong> qui sera utilisé pour "
+"les nouveaux aalendriers. La seconde ligne doit être vide. Ensuite, "
+"plusieurs descriptions de classes peuvent suivre. Elles sont séparées par "
+"une ligne blanche."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+#, fuzzy
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+"Chaque première ligne de description de section contient un <strong>ID de "
+"cours</strong> et un <strong>ID de professeur</strong> pour la nouvelle "
+"section. Puis pour chaque ligne suivent.\n"
+"Puis suivent un certain nombre de lignes, contenant chacune un <strong> ID "
+"journée</strong>, un <strong> ID périodique</strong> et un <strong> ID  "
+"Lieu</strong>(Falcutatif).\n"
+"La liste de descriptions de période est terminée par trois astérisques"
+"('***')  dans la première colonne. \n"
+"Après celle-ci, tout <strong>ID Personne<strong> qui suit sera considéré "
+"être un étudiant."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Charger l'emploi du temps SchoolTool en tant que CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Exemple :"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"↵\n"
+"\"2005-fall\",\"three-day\"↵\n"
+"\"\",\"\",\"\"↵\n"
+"\"philosophy\",\"lorch\"↵\n"
+"\"Monday\",\"A\",\"room137\"↵\n"
+"\"Monday\",\"B\"↵\n"
+"\"Tuesday\",\"C\",\"room138\"↵\n"
+"\"***\"↵\n"
+"\"johnny\"↵\n"
+"\"billy\"↵\n"
+"\"\"↵\n"
+"\"literature\",\"guzman\"↵\n"
+"\"Wednesday\",\"B\"↵\n"
+"\"Wednesday\",\"C\",\"room139\"↵\n"
+"\"***\"↵\n"
+"\"johnny\"↵\n"
+"\"pete\"↵\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"L'exemple ci dessus créera deux nouvelles rubriques, une pour l'étude "
+"philosophique et l'autre pour l'étude littéraire La section pour l'étude "
+"philosophique comprendra des personnes ayant comme identifiant \"johny\" et "
+"\"billy\" comme élèves, et son emploi du temps comprendra trois items , deux "
+"le Lundi (un ayant lieu dans le lieu désigné par l'identifiant \"salle137\", "
+"l'autre sans lieu mentionné) La rubrique littéraire sera traitée d'une façon "
+"analogue."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+#, fuzzy
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Notez que seul les ID d'objet sont utilisé dans le fichier, pas leur titre. "
+"Si une ligne se termine par une cellule vide (e.g., <em>\"philosophy\","
+"\"lorch\",\"\",\"\"</em>), ces cellules seront supprimé. Vous pouvez mettre "
+"une ligne de séparation entre chaque description de section. Dans la liste "
+"d'étudiants, seule la première colonne contenant les <strong>ID "
+"personne<strong> est traitée, les autres colonnes sont ignorées. Vous pouvez "
+"importer les mêmes données plusieurs fois sans aucun effet secondaire."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Charger fichier CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "Fichier CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Jeu de caractères :"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Occidental (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendrier pour %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Ressources réservées : %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Le nom de l'école ou organisation utilisatrice            du serveur. Celui-"
+"ci sera affiché sur l'aalendrier public,            en bas de chaque page et "
+"sur la page d'accueil."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Page de garde du calendrier"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Afficher le calendrier complet sur la page de garde."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "L'entrée requise est manqante"
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Ceci n'est pas fichier objet"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Donnée invalide (Entier)"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Donnée invalide (Texte)"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Donnée invalide (Textual)"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Donnée invalide (Unicode)"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Donnée invalide (Reel)"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Donnée invalide (Dater)"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Mettre le daemon pid %d en arrière plan"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Lancer %s -h pour l'aide."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s : Ce daemon n'est pas supporté par votre système d'exploitation"
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Lire la configuration depuis %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Gerer"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Démarré : %.3f sec Reel,  %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr "Ne peut créer la base de donnée : « %s » %s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Peut être une autre instance de %s est utilisé ?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Attention : Impossible de trouver la library reportlab. \n"
+"Le support PDF est desactivé."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Attention : Le repertoire font '%s' est introuvable. \n"
+"Le support PDF est desactivé."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Attention : La font '%s' n'existe pas. \n"
+"Le support PDF est desactivé."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Aucun stockage défini dans la configuration file.\n"
+"\n"
+"Si vous utiliser un fichier de configuration de défaut, éditez le et\n"
+"uncomment one of the ZODB storage sections.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Ce n'est pas un fichier de base de donnée SchoolTool 0.10, abandonné.\n"
+"\n"
+"SVP lancer le script de mise à jour de la base de donnée.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Bienvenue sur le serveur SchoolTools"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Préférences calendrier"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Editer les préférences de cette personne"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Personnes"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Programmé pour ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Légende :"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minutes"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "récurrent"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Dimanche"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Il n'y a rien à ajouter"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "La date entrée dépasse le terme"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Il n'y a rien à ajouter"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Programmé pour ${person}"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Année précédente"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Suivant"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Lieu"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Ajouter une section"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Affichage"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Modifie l'évenement"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Ajouter une section"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Éditer les informations de la section"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importer des cours"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Ajouter un nouveau cours"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Nouveau cours"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Index des cours"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Ajouter un nouveau cours"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Donnée fournie insuffisante"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Les titres peuvent ne pas être vides"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Pas de cours de ce type"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "ID du cours requis"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Ajouter une section à ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Professeurs"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Professeurs actuels"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Professeurs disponibles"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Etudiants"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Groupes"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Ressources"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Index des sections"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Ajouter une nouvelle section"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"Les données CSV <strong>doivent</strong> comporter le titre du cours et "
+"<strong>peuvent</strong> y ajouter une description, optionnelle. Toute autre "
+"information sera ignorée."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Histoire antique, Préhistoire jusqu'à 1000 ans ap. J-C\n"
+"Histoire des Etats-Unis\n"
+"Histoire mondiale, de 1000 ap. J-C. à nos jours, texte après une seconde "
+"virgule\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"L'exemple ci dessus créera 3 cours appelés \"Histoire Antique\" , \"Histoire "
+"des Etats-Unis d'Amérique\" et \"Histoire du Monde\". Le premier et le "
+"dernier cours n'auront pas de description, et  le texte \"texte après une "
+"seconde virgule\" en plus sur le troisième cours sera ignoré."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "envoyer à SchoolTool un planning de cours au format CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "classes"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "étudiants"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Classe de ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "éditer le nom"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Changer le lieu ou le nom de cette classe."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Changer les professeurs de cette classe."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Ressources réservées : %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Changer les professeurs de cette classe."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "Editer la liste des professeurs"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "éditer les personnes"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Changer individuellement les étudiants de cette classe"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Changer les étudiants de cette classe par groupe"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "éditer les groupes"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "identifiant (optionel)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Classe"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Taille actuelle"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Il y a ${num_errors} erreurs d'encodage."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Titre du cours."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Description du cours."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "étiquette"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Un identifiant pour une section, composé de nom de \n"
+"professeur, de cours et de l'heure de réunion."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Code"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "ID pour la section"
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Description de la section."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Personnes"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Mars"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Jour scolaire"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Jour de secour"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Jour de secour"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Jour de secour"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Editer"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Annuler"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Nom de l'utilisateur"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Mot de passe"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Ce nom d'utilisateur est déjà utilisé!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Appliquer"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Journalier"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Il n'y en a aucun."
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Il n'y en a aucun."
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nom Complet"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Photo"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Photo(Au format JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Cours"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "bouton \"supprimer\""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "bouton \"ajouter\""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "bouton annuler"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Ajouter une section"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Modifie l'évenement"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Etudiants"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "bouton \"supprimer\""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Période ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importer des groupes"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Ajouter un groupe"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Éditer les informations de la section"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Gerer les membres"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Groupes"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Groupes"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"Les données CSV <strong>doivent</strong> comporter le titr du groupe et "
+"<strong>peuvent</strong> y ajouter une description, optionnelle. Toute "
+"information supplémentaire sera ignorée."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"LUG, Groupe d'utilisateurs de Linux\n"
+"Club d'Echecs\n"
+"Club Sportif, Club de sport apres l'école, <em> Texte apres une deuxieme "
+"virgule</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"L'exemple ci-dessus va créer trois groupes nommés \"LUG\", \"Club d'Echecs\" "
+"et \"Club Sportif\". Le premier et le dernier comporteront respectivement "
+"les descriptions \"Groupe d'utilisateurs de Linux\" et \"Club de sport apres "
+"l'école\". \"Club d'Echecs\" n'aura pas de description, et le \"texte après "
+"une deuxième virgule\" du troisième groupe sera ignoré."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Telecharger les groupes SchoolTool en CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Novembre"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "éditer le nom"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Changer le lieu ou le nom de cette classe."
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Index des groupes"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Ajouter un groupe"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Nom du groupe."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Description du groupe"
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Calendrier privé"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Ajouter un évenement"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Modifie l'évenement"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "aucun"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "bouton \"ajouter\""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Cette semaine"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Etudiants"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "bouton annuler"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "bouton \"ajouter\""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "bouton annuler"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nouveau  nom"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Titre de la note"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Corp"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Corp de la note"
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Privé"
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Privé"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Ajouter un terme"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Date"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Le nom d'utilisateur ne peut être vide"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Le nom complet ne peut être vide"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Dupliquer le nom d'utilisateur : ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importer des personnes"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"Les données CSV <strong>doivent</strong> comporter un nom d'utilisateur et "
+"son nom complet. Le mot de passe <strong>peut</strong> aussi être ajouté."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"ppaul, Poutz Paul↵\n"
+"dljean, De Lasalle Jean, r2m45j↵\n"
+"leon, Léon↵\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"L'exemple ci-dessus créera trois utilisateurs,'ppaul', 'dljean' et 'leon'. "
+"'dljean' a un mot de passe ('r2m45J') et peut donc se connecter au système. "
+"Notez que les mots de passe ne seront pas cryptés."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "télécharger une liste de personnes au format CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Changer les préférences pour ${user}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Editer les préférences de cette personne"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Fuseau horaire"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Fuseau horaire utilisé pour votre aalendrier"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Format de l'heure"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Format de la date"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/JJ/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAAA-MM-JJ"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Jour Mois, Année"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "LA semaine commence le :"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Demmarer la semaine Dimanche ou Lundi"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Afficher la période"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Afficher le nom de la période dans la vue journalière"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nom devant etre affiché"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Rapports"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Ajouter un évenement"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Modifie l'évenement"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Nouveau  nom"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Montrant"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "de"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "éléments"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importer des Ressources"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Ajouter une ressource"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Éditer les informations de la section"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Ressources"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Ressources"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"Les données CSV <strong>doivent</strong> comporter un titre de ressource et "
+"<strong>peuvent</strong> y ajouter une description, optionnelle. Toute "
+"information supplémentaire sera ignorée."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, rétroprojecteur n° 302\n"
+"Grand Auditorium\n"
+"LC-805, ordinateur portable n° 805,<em>commentaire supplémentaire après la "
+"seconde virgule</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"L'exemple ci-dessus créera trois ressources nommées \"PRJ302\", \"Grand "
+"Auditorium\" et \"LC-805\". La première et la dernière auront en outre les "
+"descriptions \"rétroprojecteur n° 302\" et \"ordinateur portable n° 805\", "
+"et le texte \"commentaire supplémentaire après la seconde virgule\" sera "
+"ignoré."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "télécharger des ressources au format CSV vers Schooltool."
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Index des ressources"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Ajouter une ressource"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Nom des ressources"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Description des ressources"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Emplacement :"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+"Indique que cette ressource est un lieu, sans doute une salle de classe"
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Calendrier"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Droit du calendrier"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Ce n'est pas une base de donnée de SchoolBell 1.0, abandonné.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Ce n'est pas une base de donnée de SchoolBell 1.0, abandonné.\n"
+"\n"
+"SVP lancer le script de mise à jour de la base de donnée.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "Haut"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Exeption"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Connecter"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Utilisateur :"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Déconnexion"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Nouveau terme"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Annulé les cours en urgence"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "Le remplacement de date est invalide"
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+"Les cours sont annulé pour une urgence. Le jour de remplacement est "
+"$replacement"
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Le jour de remplacement pour le jour d'urgence $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "La date entrée est invalide. SVP utilisé le format : AAAA-MM-JJ"
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "La date entrée dépasse le terme"
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "La date entrée n'est pas un jour d'école."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"Vous avez choisi ${dynamic_content } comme jour de secour.  Maintenant, "
+"veuillez choisir le jour de remplacement.  Le choix ci-dessous se compose "
+"des jours non scolaire dsuivant le jour de secours et de plusieurs jours "
+"après la limite."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Veuillez écrire la date de rechange ci-dessous."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Remplacement"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Choisissez un remplacement pour le jour de secours."
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Ce formulaire vous permet de marquer une date comme jour d'urgence et "
+"d'ajouter un jour de remplacement à la place."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr "Veuillez écrire la date de secours ci-dessous."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Jour de secour"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Modifie le nom : $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Nouveau  nom"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Termes"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Ajouter un terme"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Date de début"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Date de fin"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Semaine ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Ajouter un terme"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Sauvegarder les changements"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Premièrement, veuillez nommer et définir l'heure périodique du terme. "
+"L'intervalle de date est inclusif(e.g., 2004-09-01 to 2004-12-31). Les dates "
+"doivent être spécifier au format AAAA-MM-JJ."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "L'intervalle de date est inclusif(e.g., 2004-09-01 to 2004-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Actualiser"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"Deuxiemement , veuillez préciser les jour d'école et les jours de vacances."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr "Veuillez préciser les jour d'école et les jours de vacances."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Légende :"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Jour scolaire"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Vacances"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Basculez les jours suivants de la semaine :"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "Planning de ${object}"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Date invalide. SVP utilisé le format : AAAA-MM-JJ"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "La date n'a pas de limite"
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Certaines valeurs sont invalide. Elles sont surligné en rouge."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Change le planning pour un jour."
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Nouveau planning"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Voir les emplois du temps"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Programme"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+"SVP utilisez le format HH:MM pour l'heure de fin et de début de la période."
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Vous devez indiquer au moins une période."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Planning scolaire"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Ajouter un shema"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Veuillez sélectionner une valeur"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Jour ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Période 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Période ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Schema du planning ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Le jour de planning coïncide toujours avec le jour de la semaine (c.-à-d. le "
+"lundi où le premier jour d'horaire est employé, le mardi la seconde, et "
+"ainsi de suite)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Les jours de planning sont employés séquentiellement, sautant par-dessus les "
+"jours qui ne sont pas des jours d'école)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Troisièmement, définissez la période et la durée des périodes où ils tombent "
+"certains jours de semaine.  Employez le format suivant:  <tt>HH:MM</tt > "
+"(aussi, n'oubliez pas d'indiquer la durée dans la boîte de texte ci-dessous) "
+"ou <tt>HH:MM-HH:MM</tt > (quand vous voulez indiquer les deux points finaux "
+"explicitement, par exemple, 9:30-10:15).  Il n'est pas nécessaire de définir "
+"toutes les périodes pendant tous les jours de semaine.  Si la liste de "
+"périodes n'est pas à jour avec les changements que vous avez faits dans la "
+"table ci-dessus, utilisez le bouton de mise à jour pour régénérer la forme."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Choisissez un nom pour le schema du planning que vous créez."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+"Certaines caractéristiques de période étaient incorrectes, et ont été "
+"rejetées."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"En conclusion, assurez-vous que l'information sous cette forme est correcte, "
+"parce que la seule manière de la corriger sera d'enlever ce schéma d'horaire "
+"et de le recréer."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Créer le shema du planning"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Définissez d'abord, les jours et les périodes de l'horaire."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Copiez les périodes de la veille"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Retirer ce jour"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Ajouter un jour"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Ajouter période"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"En second lieu, choisissez le planning de manière que les jours soit alignés "
+"avec les jours du calendrier."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+#, fuzzy
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"Nota : si une section apparait dans plus que dans un seul slot, elles "
+"doivent toutes être à la valeur <em>rien</em> pour les supprimer."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Planning"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Terme"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Schéma"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Programmé pour ${person}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Choisir"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Installez le planning d'une personne en ajoutant et en enlevant la personne "
+"aux sections qui ont des classes dans leurs plannings."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "une partie de"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "aucun"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "Horaires incompatibles"
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Enregistrer"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr "Il n'y a aucun schéma de limites ou d'horaire défini."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Choisir le modèle de programmation"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "Pour le(s) terme(s)"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Programmé pour ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Utilise le planning"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"C'est une manière simple de créer un schéma hebdomadaire d'horaire.  Il faut "
+"juste complétez un nombre suffisant de lignes pendant vos périodes."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+#, fuzzy
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Si vous avez besoin de plus de fléxibilité, vous pouvez utilisez l'<a href="
+"\"add.html\">assistant de création des schémas d'emploi du temps</a>, ou un "
+"<a href=\"complexadd.html\">formulaire de mise en forme des schémas d'emploi "
+"du temps complexes</a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Titre de la période (optionnel)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+#, fuzzy
+msgid "Period start time"
+msgstr "Heure de début de la période"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "Heure de fin de la période"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Créer"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Titre de la période"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Début"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Fin"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Début"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Fin"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Modifier"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Changer les temps de début et de fin pendant des périodes une certaine date, "
+"ou de décommander quelques périodes tout à fait."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+"Veuillez entrer la date quand les périodes doivent être changées, ci-dessous."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Choisir un jour spécial"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Procéder"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Créer le shema du planning"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Planning pour ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Nouveau schema de planning"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+"Le cycle d'horaire de votre école emploie-t-il des jours de la semaine, ou "
+"un cycle tournant?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Jours de la semaine"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Cycle de rotation"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Entrer le nom des jours du cycle, un par ligne."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Veuillez entrer au moins un nom de jour."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Veuillez vérifier que le nom du jour soit unique."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Les jours de votre planning commence t'il et finisse t'il tous aux même "
+"heures ?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Même heure chaque jour"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Différentes heures"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Écrivez le début et finissez des périodes pour chaque slot, un slot (HH:mm - "
+"HH:mm) par ligne."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "N'est pas une heure valide : $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Veuillez entrer dans au moins un slot de temps."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Écrivez le début et finissez des périodes pour chaque slot chaque jour, un "
+"slot (HH:mm - HH:mm) par ligne."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Veuillez entrer dans au moins un slot pour $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+"Les périodes ont-elles des noms ou sont-elles simplement indiquées par temps?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "ont des noms"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Indiqué par l'heure"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Entrez le nom de la période , un par ligne"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Veuillez entrer au moins $number périodes"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Veuillez vérifier que le nom de la période soit unique"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "L'ordre des périodes est-il chaque jour les mêmes ou différent?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Même"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Différent"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Veuillez mettre les périodes dans l'ordre:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Veuillez fournir toutes les périodes."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Les périodes suivantes ont été choisies plus d'une fois : $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Veuillez mettre les périodes dans l'orde pour chaque jour :"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period le jour $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "ID du Jour inconnu : %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "ID de période inconnu : %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Nom de l'utilisateur :"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr ""
+#~ "modifier le nom, le mot de passe ou l'image associés à cette personne"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "choisir les groupes auxquels cette personne appartient"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importer des sections"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "La ligne ${line_no} n'est pas conforme (elle doit contenir un "
+#~ "identificateur de jour et, le cas échéant, un identificateur de lieu)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Emplacement non trouvé : ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "modifier les détails pour cette personne"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Classes suivies"
+
+#~ msgid "via group"
+#~ msgstr "via le groupe"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; est une marque "
+#~ "déposée de  The Shuttleworth Foundation. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Mes préférences"
+
+#~ msgid "Person index"
+#~ msgstr "Index des personnes"
+
+#~ msgid "Add a new person"
+#~ msgstr "Ajouter une personne"
+
+#~ msgid "New photo"
+#~ msgstr "Nouvelle photo"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Une petite image (48x48 pixels au format JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Effacer photo"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Verifier pour effacer la photo"
+
+#~ msgid "New password"
+#~ msgstr "Nouveau mot de passe"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifiez le mot de passe"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Le mot de passe n'est pas correct."
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Le mot de passe à été changé avec succés"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Mot de passe incorrect!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Couvel objetreer un"
+
+#~ msgid "Add events"
+#~ msgstr "Ajouter évenement(s)"
+
+#~ msgid "Control access"
+#~ msgstr "Control d'accés"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Utilisateur authentifier"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Utilisateur inconnu"
+
+#~ msgid "An error occured."
+#~ msgstr "Erreur"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Utilisateur inconnu"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Utilisateur inconnu"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Utilisateur authentifié"
+
+#~ msgid "All Users"
+#~ msgstr "Tout le monde"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s ! Attention : %s ignore les optyions de configuration"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Utilisation : %s [options]\n"
+#~ "Options : \n"
+#~ " -c, --config xxx   Utiliser ce fichier de configuration -h, --"
+#~ "help             Affiche ce message d'aide\n"
+#~ " -d, --daemon       Se met en arrière plan au démarrage\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Bienvenue sur le serveur SchoolBell"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ce n'est pas un fichier de base de donnée SchoolTool 0.10, abandonné.\n"

Added: schooltool/branches/upstream/current/src/schooltool/locales/fr_BE/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fr_BE/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fr_BE/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# French (Belgium) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-07-24 13:54+0000\n"
+"Last-Translator: sheeplover <john.goedmakers at home.nl>\n"
+"Language-Team: French (Belgium) <fr_BE at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "des personnes"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "une personne"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/fr_CA/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fr_CA/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fr_CA/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2243 @@
+# French (Canada) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-01-08 02:56+0000\n"
+"Last-Translator: Roger Khalife <wildbeast at gmail.com>\n"
+"Language-Team: French (Canada) <fr_CA at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Ajouter"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notes"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Usager"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Public"
+#~ msgstr "Publique"

Added: schooltool/branches/upstream/current/src/schooltool/locales/fr_FR/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/fr_FR/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/fr_FR/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2372 @@
+# French (France) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-08-19 10:28+0000\n"
+"Last-Translator: flobe <florianbeau at free.fr>\n"
+"Language-Team: French (France) <fr_FR at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personnes"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 personne"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personnes"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nom d'utilisateur ou mot de passe incorrect"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Année en cours"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Mars"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Janvier"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Février"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juin"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Avril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Août"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Septembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juillet"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Le jour suivant"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Aujourd'hui"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Le jour précédent"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Octobre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Décembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Novembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Lundi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Mardi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Mercredi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Jeudi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Dimanche"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Samedi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Vendredi"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Lun"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Mar"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Mer"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Jeu"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Ven"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sam"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Dim"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titre"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Tous les jours"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Date"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Heure"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Heure de départ  dans le format 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Durée"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Type de Durée"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutes"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Heures"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Jours"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Lieu"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Description"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Récurrent"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Tout les"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Jour"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semaine"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mois"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Année"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Répéter chaque"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Période"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Compter"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Tant que"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "Pour toujours"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Nombre d'évènements"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Répéter jusqu'à"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Jours ouvrés"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Jour de la semaine"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Tout les mois"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "même jour de la semaine"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1er"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4ème"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3ème"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2ème"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5ème"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "dernier jour ouvré"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Dernier ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Une erreur s'est produite."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Heure non valide"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "La date de fin est antérieure à la date de début"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Date non valide. S'il vous plait spécifiez AAAA-MM-JJ, une par ligne"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Ajouter événement"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Ajouter"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Modifier un évènement"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Mettre à jour"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Mis à jour le ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Voir le calendrier"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Semaine suivante"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Semaine en cours"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Semaine précédente"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Mois suivant"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mois en cours"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mois précédent"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Semaine ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Année suivante"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Année en cours"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Année précédente"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titre"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Groupes"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Durée"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Date"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Liste des ressources"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Mois en cours"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Mois en cours"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Groupes"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Ressources"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Ressources"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Liste des personnes"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Ajouter une nouvelle personne"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Modifier l'inscription"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nom d'utilisateur"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Mot de passe"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Ce nom d'utilisateur est déja pris!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Mois précédent"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sam"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notes"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Suivant"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Nombre d'évènements"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Nom complet"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Nom complet"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nom complet"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Photo"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Photo (au format JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Le mot de passe a bien été modifié!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Le mot de passe a bien été modifié!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Le mot de passe a bien été modifié!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Durée"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Listes des groupes"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Ajouter un nouveau groupe"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Liste des ressources"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Semaine précédente"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Le mot de passe a bien été modifié!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Semaine en cours"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Le mot de passe a bien été modifié!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Utilisateur"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Sam"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Semaine suivante"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nouveau mot de passe"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Nouveau mot de passe"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Voir le calendrier"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nom affiché"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Liste des ressources"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Liste des ressources"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Photo"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nouvelle personne"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Ajouter une nouvelle personne"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Date non valide. S'il vous plait spécifiez AAAA-MM-JJ, une par ligne"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Ajouter une nouvelle ressource"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} personnes"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "même jour de la semaine"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nouvelle photo"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Une petite image (environ 48x48 pixels au format JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Effacer la photo"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Cocher cette case pour effacer la photo"
+
+#~ msgid "Verify password"
+#~ msgstr "Contrôle du mot de passe"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Les mots de passe ne sont pas les mêmes."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Les mots de passe ne sont pas identiques !"
+
+#~ msgid "View"
+#~ msgstr "Voir"
+
+#~ msgid "Edit"
+#~ msgstr "Modifier"
+
+#~ msgid "Create new objects"
+#~ msgstr "Créer de nouveaux objets"
+
+#~ msgid "Add events"
+#~ msgstr "Ajouter un évènement"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modifier/supprimer des évènements"
+
+#~ msgid "Control access"
+#~ msgstr "Gérer les accés"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Utilisateurs authentifiés"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Utilisateurs non authentifiés"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Changer les préférences"
+
+#~ msgid "Add a Group"
+#~ msgstr "Ajouter un groupe"
+
+#~ msgid "New Group"
+#~ msgstr "Nouveau groupe"
+
+#~ msgid "A Group"
+#~ msgstr "Un groupe"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Groupe SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Ajouter/Enlever des membres"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importer des groupes"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Western (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Western (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Western (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Autre (spécifiez)"
+
+#~ msgid "Public"
+#~ msgstr "Publique"
+
+#~ msgid "Add note"
+#~ msgstr "Ajouter une note"

Added: schooltool/branches/upstream/current/src/schooltool/locales/gl/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/gl/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/gl/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4763 @@
+# Galician translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Galician <gl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2637 @@
+# Hebrew translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-09-20 12:27+0000\n"
+"Last-Translator: Yaniv Abir <yanivabir at gmail.com>\n"
+"Language-Team: Hebrew <he at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "כינוי"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "כתובת דוא\"ל עיקרית"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "מספר טלפון משני."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "אתר"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "אתר או בלוג."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "כתובת"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "אנשים"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "אדם אחד"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} אנשים"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "שם המשתמש או הסיסמה שגויים"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "השנה"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "קבוצות זמינות"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "מרץ"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "ינואר"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "פברואר"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "יוני"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "מאי"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "אפריל"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "אוגוסט"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "ספטמבר"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "יולי"
+
+#: /src/schooltool/app/browser/cal.py:1021
+#, fuzzy
+msgid "The next day"
+msgstr "מחר"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "היום"
+
+#: /src/schooltool/app/browser/cal.py:1023
+#, fuzzy
+msgid "The previous day"
+msgstr "אתמול"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "אוקטובר"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "יום שני"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "יום שלישי"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "יום חמישי"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "יום ראשון"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "יום שבת"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "יום שישי"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "ב'"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "ג'"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "ד'"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "ה'"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "ו'"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "ש'"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "א'"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "כל היום"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "תאריך"
+
+#: /src/schooltool/app/browser/cal.py:1667
+#, fuzzy
+msgid "Time"
+msgstr "שעה"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "משך זמן"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "דקות"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "שעות"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "ימים"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "מיקום"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "תיאור"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "יום"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "שבוע"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "חודש"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "שנה"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "טווח"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "עד"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "לעולם"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "מספר אירועים"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "ימות השבוע"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "כל חודש"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "ראשון"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "רביעי"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "שלישי"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "שני"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "חמישי"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "חלה שגיאה."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "זמן שגוי"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "תאריך הסיום מוקדם יותר מתאריך ההתחלה"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "הוספת אירוע"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "הוספה"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "עריכת אירוע"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "עדכון"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "עודכן ב ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "לוחות שנה"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "שבוע הבא"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "השבוע"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "השבוע הקודם"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (שבוע ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "החודש הבא"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "החודש"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "החודש הקודם"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "שבוע ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "שנה הבאה"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "השנה"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "אשתקד"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "קובץ CSV יובא בהצלחה."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "ייבוא קובץ CSV נכשל."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "המרה ל-unicode נכשלה בשורה ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "המרה ל-unicode נכשלה בשורה ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "השינויים נשמרו."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "כל היום"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "משאבים שהוזמנו: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "לוח שנה יומי עבור %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "לוח שנה שבועי עבור %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "שבוע %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "לוח שנה חודשי עבור %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "לוח שנה עבור %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "קבוצה"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "משך זמן"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "תאריך"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "אינדקס משאבים"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "הוספת משאב"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "החודש"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "קבוצות זמינות"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "החודש"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "קבוצות זמינות"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "קבוצות"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "קבוצות זמינות"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "מקורות"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "משאבים זמינים"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "אינדקס אנשים"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "הוספת אדם חדש"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "פרטי המשאב."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "פרטי המשאב."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "פרטי הקבוצה."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "אתר"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "ביטול"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "שינוי פרטים"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "שם משתמש"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "סיסמה"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "שם המשתמש כבר בשימוש!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "החל"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "כתובת דוא\"ל עיקרית"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "החודש הקודם"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "מידע אירוע"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "כינוי"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "מתחיל"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "ש'"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "רשימות"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "הבא"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "מספר אירועים"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "שם מלא"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "שם מלא"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "ההעדפות שלי"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "שם מלא"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "תמונה"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "תמונה (בפורמט JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "הערה חדשה"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "הסיסמה שונתה בהצלחה!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "הסיסמה שונתה בהצלחה!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "הסיסמה שונתה בהצלחה!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "משך זמן"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "אינדקס קבוצות"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "הוספת קבוצה"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "פרטי הקבוצה."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "אינדקס משאבים"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "הוספת משאב"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "השבוע הקודם"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "הסיסמה שונתה בהצלחה!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "השבוע"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "הסיסמה שונתה בהצלחה!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "משתמש"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "פרטי המשאב."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "פרטי המשאב."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "מתחיל"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "שבוע הבא"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "יומי"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "סיסמה חדשה"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "סיסמה חדשה"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "השבוע מתחיל ב-"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "הצג שבוע המתחיל ביום ראשון או שני"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "צפייה בלוח השנה"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "אינדקס משאבים"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "הוספת משאב"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "אינדקס משאבים"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "הוספת משאב"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "פרטי המשאב."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "מיקום"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "ציון המשאב כמיקום מסוים, למשל כיתה."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "לוח השנה שלי"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "עוד..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "לוחות שנה"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "ברוכים הבאים ל-SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "תמונה"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "עריכת קבוצות"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "השינויים נשמרו."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "שינוי פרטים"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "הערה חדשה"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "פריטים"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "הוספת אדם חדש"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "מתחיל"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "הוספת משאב"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} אנשים"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "הערה"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "תמונה חדשה"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "תמונה קטנה (בערך 48X48 פיקסלים בפורמט JPEG)"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "הסיסמאות אינן תואמות."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "הסיסמאות לא תואמות!"
+
+#~ msgid "View"
+#~ msgstr "תצוגה"
+
+#~ msgid "Edit"
+#~ msgstr "עריכה"
+
+#~ msgid "Add events"
+#~ msgstr "הוספת אירועים"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "עריכת/מחיקת אירועים"
+
+#~ msgid "Change Preferences"
+#~ msgstr "שינוי העדפות"
+
+#~ msgid "New Person"
+#~ msgstr "אדם חדש"
+
+#~ msgid "Import Persons"
+#~ msgstr "ייבוא אנשים"
+
+#~ msgid "Add a Group"
+#~ msgstr "הוספת קבוצה"
+
+#~ msgid "New Group"
+#~ msgstr "קבוצה חדשה"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "עריכת פרטי קבוצה"
+
+#~ msgid "A Group"
+#~ msgstr "קבוצה"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "קבוצת SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "הוספת/הסרת חברים"
+
+#~ msgid "Import Groups"
+#~ msgstr "ייבוא קבוצות"
+
+#~ msgid "Add a Resource"
+#~ msgstr "הוספת משאב"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "עריכת פרטי משאב"
+
+#~ msgid "New Resource"
+#~ msgstr "משאב חדש"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "משאב SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "משאב"
+
+#~ msgid "Actions"
+#~ msgstr "פעולות"
+
+#~ msgid "View Calendar"
+#~ msgstr "צפייה בלוח השנה"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "לוח שנה (יומי)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "לוח שנה (יומי, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "לוח שנה (שבועי)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "לוח שנה (שבועי, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "לוח שנה (חודשי)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "לוח שנה (חודשי, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "לוח שנה (שנתי)"
+
+#~ msgid "Free/Busy"
+#~ msgstr "פנוי/עסוק"
+
+#~ msgid "New Event"
+#~ msgstr "אירוע חדש"
+
+#~ msgid "Edit Event"
+#~ msgstr "עריכת אירוע"
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "מאפשר למשתמש ליצור אנשים , קבוצות ומשאבים חדשים."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "מאפשר צפייה בלוח שנה של אנשים, קבוצות ומשאבים."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "מאפשר הוספת אירועים חדשים ללוח השנה."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "מאפשר עריכה ומחיקה של אירועים בלוח השנה."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "הרשאות לקבוצות"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "הרשאות משתמשים"
+
+#~ msgid "General preferences"
+#~ msgstr "הגדרות כלליות"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "אירועים עבור"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "בחירת לוחות שנה נוספים לצפייה"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "יש ללחוץ ולהחזיק את Ctrl או Shift כדי לבחור מספר לוחות שנה."
+
+#~ msgid "Public Calendar"
+#~ msgstr "לוח שנה פומבי"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "בחר לוחות שנה שיוצגו"
+
+#~ msgid "People"
+#~ msgstr "אנשים"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "אין אנשים עם לוחות שנה הזמינים לך."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "אין קבוצות עם לוחות שנה הזמינים לך."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "אין משאבים עם לוחות שנה הזמינים לך."
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "האם ברצונך למחוק את הפריטים הנבחרים?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "לא נבחרו שום פריטים"
+
+#~ msgid "Server Error"
+#~ msgstr "שגיאת שרת"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "אירעה שגיאת שרת פנימית. קרוב לוודאי שמצאת באג ב-SchoolBell. נבקש <a href="
+#~ "\"http://issues.schooltool.orf\">לדווח עליו</a>"
+
+#~ msgid "Ends"
+#~ msgstr "מסתיים"
+
+#~ msgid "edit event"
+#~ msgstr "עריכת אירוע"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "שינוי פרטי האירוע הזה"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "משאבים שהוזמנו"
+
+#~ msgid "edit resources"
+#~ msgstr "עריכת משאבים"
+
+#~ msgid "delete event"
+#~ msgstr "מחק אירוע"
+
+#~ msgid "Event details"
+#~ msgstr "פרטי אירוע"
+
+#~ msgid "Book Resources"
+#~ msgstr "הזמן משאבים"
+
+#~ msgid "Update form"
+#~ msgstr "עדכן מ"
+
+#~ msgid "day"
+#~ msgstr "יום"
+
+#~ msgid "week"
+#~ msgstr "שבוע"
+
+#~ msgid "month"
+#~ msgstr "חודש"
+
+#~ msgid "year"
+#~ msgstr "שנה"
+
+#~ msgid "Weekly"
+#~ msgstr "כל שבוע"
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "ב-${monthday} של כל חודש"
+
+#~ msgid "Book resources"
+#~ msgstr "הזמן משאבים"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "הזמנות משאבים עבור ${title}"
+
+#~ msgid "Resource Booking"
+#~ msgstr "הזמנות משאבים"
+
+#~ msgid "Conflicting events"
+#~ msgstr "אירועים מתנגשים"
+
+#~ msgid "Book"
+#~ msgstr "הזמן"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "מערב אירופה (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "מערב אירופה (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "מערב אירופה (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "אחר (נא לציין)"
+
+#~ msgid "Remove"
+#~ msgstr "הסר"
+
+#~ msgid "User Information"
+#~ msgstr "פרטי משתמש"
+
+#~ msgid "Clear"
+#~ msgstr "נקה"
+
+#~ msgid "Delete"
+#~ msgstr "מחק"
+
+#~ msgid "Please note the following:"
+#~ msgstr "אנא שימו לב ל:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "יכול להיות שטעיתם בהקלדת הכתובת"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "יכול להיות שאתם מנסים לצפות בדף שאינו קיים"
+
+#~ msgid "Not Found"
+#~ msgstr "לא נמצא"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "אתם מנסים לצפות בדף שאינו קיים"
+
+#~ msgid "edit details"
+#~ msgstr "עריכת פרטים"
+
+#~ msgid "Add person"
+#~ msgstr "הוספת אדם"
+
+#~ msgid "Add to groups"
+#~ msgstr "הוספה לקבוצות"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "אינכם רשאים למחוק את חשבון המשתמש של עצמכם."
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "אפשרויות לוח שנה"
+
+#~ msgid "All"
+#~ msgstr "הכל"
+
+#~ msgid "Printable version"
+#~ msgstr "גירסה להדפסה"
+
+#~ msgid "View daily calendar"
+#~ msgstr "צפיה בלוח שנה יומי"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "צפייה בלוח שנה שבועי"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "צפייה בלוח שנה חודשי"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "צפייה בלוח שנה שנתי"
+
+#~ msgid "User:"
+#~ msgstr "משתמש:"
+
+#~ msgid "Log Out"
+#~ msgstr "התנתק"
+
+#~ msgid "Edit Info"
+#~ msgstr "עריכת פרטים"
+
+#~ msgid "Add Event"
+#~ msgstr "הוספת אירוע"
+
+#~ msgid "Modify Event"
+#~ msgstr "עריכת אירוע"
+
+#~ msgid "All Users"
+#~ msgstr "כל המשתמשים"

Added: schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/he/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4778 @@
+# Hebrew translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:46+0000\n"
+"Last-Translator: Yaniv Abir <yanivabir at gmail.com>\n"
+"Language-Team: Hebrew <he at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+#, fuzzy
+msgid "Import Courses"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "ייבוא קבוצות"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "ייבוא קבוצות"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+#, fuzzy
+msgid "Import Persons"
+msgstr "ייבוא קבוצות"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "ייבוא משאבים"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "לוח זמנים"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2245 @@
+# Hindi translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-03-25 16:38+0000\n"
+"Last-Translator: Alfred J.Tims <t1nt1n at linuxmail.org>\n"
+"Language-Team: Hindi <hi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "पिछला"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "अगला"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "पूरा नाम"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "पूरा नाम"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "पूरा नाम"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "पिछला"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/hi/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4930 @@
+# Hindi translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: 2006-09-15 19:01+0000\n"
+"Last-Translator: Anne Ogborn <anne at pragatischool.org>\n"
+"Language-Team: Hindi <hi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+#, fuzzy
+msgid "SchoolTool"
+msgstr "स्कूल औज़ार"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "पत्रे"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "पत्रे"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "पत्रे"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "पत्रे"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+#, fuzzy
+msgid "Navigation"
+msgstr "कहा जाना?"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "पत्रे"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+#, fuzzy
+msgid "Row 2 is not empty"
+msgstr "पंक्ति 2 खाला नहीं है"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+#, fuzzy
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+"बुरा रेखा ${line_no}| उचत रेखॅ में एक दिन ऐ॰ दी॰ है, एक पहर ऐ॰ दी॰, और शयद एक जगह "
+"ऐ॰ दी॰ भी होगा|"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+#, fuzzy
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+"बुरा रेखा ${line_no}| उचत रेखॅ में एक दिन ऐ॰ दी॰ है, एक पहर ऐ॰ दी॰, और शयद एक जगह "
+"ऐ॰ दी॰ भी होगा|"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+#, fuzzy
+msgid "Incomplete section description on line ${line}"
+msgstr "रेखा ${line} पेर अनुभाग आधा है|"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+#, fuzzy
+msgid "No students in section (line ${line})"
+msgstr "रेखा ${line} पेर अनुभाग आधा है|"
+
+#: /src/schooltool/app/browser/csvimport.py:462
+#, fuzzy
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"जो रेखा CSV सिंचा में पहेली है उसी में 'term id' और 'timetable schema id' भी ज़रुर हैं|"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+#, fuzzy
+msgid "The term ${term} does not exist."
+msgstr "'term' ${term} नहीं जानता है|"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+#, fuzzy
+msgid "The timetable schema ${schema} does not exist."
+msgstr "'timetable schema' नहीं जानता है|"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "टीम्टेब्ल CSV में कुच गलट है, रेखा ${line_no} में"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+#, fuzzy
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "जो schema यहां हैं उसे में दिन ऐ॰ दी॰ नहीं जनता है| देखो: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:550
+#, fuzzy
+msgid "Periods not defined in selected days: ${args}."
+msgstr "पहरों तो इन दिनों में नहीं जनता हैं| देखो: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "ये लोग नहीं पाया: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+#, fuzzy
+msgid "Courses not found: ${args}."
+msgstr "पाठ्यक्रम ना पाया: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:553
+#, fuzzy
+msgid "Sections not found: ${args}."
+msgstr "अनुभाग ना पाया, देखो: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:554
+#, fuzzy
+msgid "Invalid records: ${args}."
+msgstr "रेकर्द ख़राब है: ${args}"
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "तेरे मार्ज़ी बदलो"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "तेरे मार्ज़ी बदलो"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "तेरे मार्ज़ी बदलो"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "तेरे मार्ज़ी बदलो"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "स्कूल औज़ार"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "स्कूल औज़ार"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Cal"
+msgstr "पत्रा"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Personal calendar"
+msgstr "निजि पत्रा"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "Timetable calendar"
+msgstr "टीमटेब्ल पत्रा"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "TT"
+msgstr "टी॰ टी॰"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+#, fuzzy
+msgid "Calendars"
+msgstr "पत्रे"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+#, fuzzy
+msgid "More..."
+msgstr "और भी..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "पत्रे"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "टीमटेब्ल पत्रा"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "सामान"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "अनुभग सम्पादित करो"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "सामान"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "निजि पत्रा"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "सामान"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "सामान"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "पाठ्यक्रम"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "स्कुल औज़र को स्वगत"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "अनुभग सम्पादित करो"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+#, fuzzy
+msgid "Western (ISO-8859-15)"
+msgstr "पश्चिमी (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+#, fuzzy
+msgid "Western (Windows-1252)"
+msgstr "पश्चिमी (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+#, fuzzy
+msgid "Other (please specify)"
+msgstr "अगला (क्या?)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+#, fuzzy
+msgid "Other charset: ${other_charset}"
+msgstr "अगला charset: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+#, fuzzy
+msgid "Input CSV Data"
+msgstr "CSV दटा टाय्प करो"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+#, fuzzy
+msgid "CSV Data"
+msgstr "CSV दटा"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#, fuzzy
+msgid "submit-button"
+msgstr "आगे रखना बटन"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+#, fuzzy
+msgid "Example:"
+msgstr "नमूना:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+#, fuzzy
+msgid "Upload CSV File"
+msgstr "CSV फ़िल को सर्वर पर लादिये|"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+#, fuzzy
+msgid "CSV File"
+msgstr "CSV फ़िल"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+#, fuzzy
+msgid "Charset:"
+msgstr "Charset:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+#, fuzzy
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+#, fuzzy
+msgid "Western (ISO-8859-1)"
+msgstr "पश्चिमी (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "सामान"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+#, fuzzy
+msgid "Show timetables"
+msgstr "टैमटेब्ल दिखओ"
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "तेरे मार्ज़ी बदलो"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "तेरे मार्ज़ी बदलो"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "लोग अन्दर लाओ|"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "एक अनुभाग जोड़ो"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "समूह"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "एक अनुभाग जोड़ो"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+#, fuzzy
+msgid "Edit Section Information"
+msgstr "अनुभग सम्पादित करो"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+#, fuzzy
+msgid "Import Courses"
+msgstr "पाठ्यक्रमों को अन्दर लाओ"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "एक नै पाठयक्रम जोड़ो"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+#, fuzzy
+msgid "New Course"
+msgstr "नैया पाठ्यक्रम"
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "पाठयक्रम का सुचक"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "एक नै पाठयक्रम जोड़ो"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+#, fuzzy
+msgid "No such course."
+msgstr "ऐसे पाठयक्रम यहां नहीं है|"
+
+#: /src/schooltool/course/browser/section.py:113
+#, fuzzy
+msgid "Need a course ID."
+msgstr "पाठयक्रम ऐ दी ज़रूर है|"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+#, fuzzy
+msgid "Add a Section to ${course}"
+msgstr "${course} को एक पाठयक्रम जोड़ो"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+#, fuzzy
+msgid "Groups"
+msgstr "समूह"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+#, fuzzy
+msgid "Current Groups"
+msgstr "दलों को अन्दर लाओ|"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+#, fuzzy
+msgid "Resources"
+msgstr "सामान"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "रेसौर्स अन्दर लाओ|"
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+#, fuzzy
+msgid "Available Resources"
+msgstr "सामान"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "अनुभाग का सुचक"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "एक नै अनुभाग जोड़ो"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV आंकड़ा में पाठ्यक्रम पदवी ज़ारूर है, और भी शयद पाठ्यक्रम वर्णन| दुसरी पदवी तो, फ़ैन्क "
+"दोगे|"
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+#, fuzzy
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"पुरनी इतिहास , इतिहास शुरू कर्नेवले से मुघाल राज तक\n"
+"भारती इतिहास\n"
+"दुनिया इतिहास, मुघाल राज से अभी तक, कुच शब्द एक दुसेरा अल्पविराम के बाद\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"जो नमूना है, उस तीन पाठ्यक्रम बनेगा| पहेले को 'पुरनी इतिहास' नाम होगा, और उस को "
+"'इतिहास शुरू कर्नेवले से मुघाल राज तक' वर्णन होगा| दुसेरे को 'भारती इतिहास' नाम होगा, "
+"और इस्को वर्णन नही होगा| तीसरी तो  'मुघाल राज से अभी तक' नाम होगा, और वर्णन '' "
+"होगा, और 'कुच शब्द एक दुसेरा अल्पविराम के बाद' को ध्यान न दोगा|"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool courses as CSV"
+msgstr "सेर्वर पर स्कुल औज़र पाट्यक्रम CSV लादिये"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "अनुभाग"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+#, fuzzy
+msgid "students"
+msgstr "विद्यार्थी"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "सामान"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "नैया पाठ्यक्रम"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "तेरे मार्ज़ी बदलो"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+#, fuzzy
+msgid "Contact information"
+msgstr "अनुभग सम्पादित करो"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+#, fuzzy
+msgid "Apply"
+msgstr "आर्ज़ी दुं"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "अनुभग सम्पादित करो"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+#, fuzzy
+msgid "Student ID"
+msgstr "विद्यार्थी"
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "पाठ्यक्रम"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "आगे रखना बटन"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "नैया पाठ्यक्रम"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "एक अनुभाग जोड़ो"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "विद्यार्थी"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "आगे रखना बटन"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "नमूना:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+#, fuzzy
+msgid "Import Groups"
+msgstr "दलों को अन्दर लाओ|"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "अनुभग सम्पादित करो"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "तेरे मार्ज़ी बदलो"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "समूह"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "समूह"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr "CSV आंकड़ा में समूह पदवी ज़ारूर है, और भी शयद समूह वर्णन| दुसरी पदवी तो, फ़ैन्क दोगे|"
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+#, fuzzy
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"लाल टोपीवाले, Linux समाज\n"
+"शतरंज समाज\n"
+"क्रिकेट समाज, स्कुल के बाद क्रिकेट समाज, <em>कुच शब्द जो एक दुसेरे अल्पविराम के बाद\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+#, fuzzy
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"जो नमूना ऊपर है, उसे तीन स्माज बनेंगे|\r\n"
+"पहेले की पदवी '' होगी, और वर्णन '' होगा|\r\n"
+"दुसेरे को पदवी '' होगी, पेर उस्को वर्णन ना होगा|\r\n"
+"तीसरे तो पदवी '' होगी, और वर्णन '' होगा| जो चिज़ दुसेरे अल्पविराम   के बाद है, उस्को "
+"ध्यान ने रहेगा|"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "स्कूल औज़र समूह को CSV से सर्वर पर लादिये|"
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "पाठयक्रम का सुचक"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "एक नै पाठयक्रम जोड़ो"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "आगे रखना बटन"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "विद्यार्थी"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "आगे रखना बटन"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "नैया पाठ्यक्रम"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+#, fuzzy
+msgid "Import Persons"
+msgstr "लोग अन्दर लाओ|"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CSV देटा में user name और पुरा नाम दोनो <strong>ज़रूर</strong> हैं| password वैकल्पिक "
+"हैं|"
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+#, fuzzy
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jjones, Jimmy Jones↵\n"
+"jbjones, Jim Bob Jones, r2m45J↵\n"
+"howard, Howard↵\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "एक नै पाठयक्रम जोड़ो"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "पाठयक्रम का सुचक"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "एक नै पाठयक्रम जोड़ो"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "रेसौर्स अन्दर लाओ|"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "एक नै पाठयक्रम जोड़ो"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "अनुभग सम्पादित करो"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "सामान"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "सामान"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+#, fuzzy
+msgid "View Timetables"
+msgstr "टैमटेब्ल दिखओ"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "टीमटेब्ल पत्रा"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Import Sections"
+#~ msgstr "अनुभग अन्दर लाओ"
+
+#, fuzzy
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "जगह ना पाया, देखो:  ${args}"

Added: schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2328 @@
+# Hungarian translation for schoolbell
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-01-14 22:51+0000\n"
+"Last-Translator: Bubi <bubreg at freemail.hu>\n"
+"Language-Team: Hungarian <hu at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Személyek"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 fő"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "$(number) fő"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Hibás felhasználónév vagy jelszó"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Ezen a héten"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Hétfő"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Kedd"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Szerda"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Csütörtök"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Vasárnap"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Szombat"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Péntek"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Hét"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ke"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Sze"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Csü"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pé"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Szo"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Vas"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Cím"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Egész nap"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Dátum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Idő"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Kezdet 24 órás formátumban"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Tartam"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tartam típusa"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Perc"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Óra"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Nap"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Hely"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Leírás"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Ismétlődés"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Ismétlődik minden"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Nap"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Hét"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Hónap"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Év"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Ismétel minden"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Tartomány"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Számláló"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Amíg"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "örökké"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Események száma"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Ismétlés amíg"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Hétköznapokon"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Hétköznap"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Havonta"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Kivéve"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "ugyanazon a napon"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "a hét utolsó napján"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Utolsó $(weekday)"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Hiba történt."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Érvénytelen idő"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "A befejező dátum korábbi, mint a kezdő"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Érvénytelen dátum. ÉÉÉÉ-HH-NN formában add meg, soronként egyet."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Új esemény"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Új"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Esemény szerkesztése"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Frissít"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Frissítve $(date_time)"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Naptár megtekintése"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Jövő héten"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Ezen a héten"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Múlt héten"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Cím"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Tartam"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Dátum"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Erőforrás index"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Új erőforrás"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Ezen a héten"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Ezen a héten"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Személyek jegyzéke"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Új személy"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Felhasználónév"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Jelszó"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "A felhasználónév már létezik!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Múlt héten"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Szo"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Események száma"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Teljes név"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Teljes név"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Teljes név"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Fotó"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Fotó (JPEG formátumban)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "A jelszóváltozatás sikerült!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "A jelszóváltozatás sikerült!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "A jelszóváltozatás sikerült!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Tartam"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Csoport index"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Új csoport"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Erőforrás index"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Új erőforrás"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Múlt héten"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "A jelszóváltozatás sikerült!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Ezen a héten"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "A jelszóváltozatás sikerült!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Szo"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Jövő héten"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Új jelszó"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Új jelszó"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Naptár megtekintése"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Megjelenített név"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Erőforrás index"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Új erőforrás"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Erőforrás index"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Új erőforrás"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Fotó"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Új személy"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Kivéve"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Érvénytelen dátum. ÉÉÉÉ-HH-NN formában add meg, soronként egyet."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Új erőforrás"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "$(number) fő"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "ugyanazon a napon"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Új fotó"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Kis kép (kb. 48x48 pixel JPEG formátumban)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Fotó törlése"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Jelöld be a fotó törléséhez"
+
+#~ msgid "Verify password"
+#~ msgstr "Jelszó ellenőrzése"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "A jelszavak különbözők."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "A jelszavak különbözők!"
+
+#~ msgid "View"
+#~ msgstr "Megnéz"
+
+#~ msgid "Edit"
+#~ msgstr "Szerkeszt"
+
+#~ msgid "Create new objects"
+#~ msgstr "Új objektum"
+
+#~ msgid "Add events"
+#~ msgstr "Új esemény"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Esemény módosítása/törlése"
+
+#~ msgid "Control access"
+#~ msgstr "Hozzáférés vezérlése"
+
+#~ msgid "Manage membership"
+#~ msgstr "Tagság kezelése"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Hitelesített felhasználók"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Nem hitelesített felhasználók"

Added: schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/hu/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4806 @@
+# Hungarian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:46+0000\n"
+"Last-Translator: attisan <ferencz.attila at gmail.com>\n"
+"Language-Team: Hungarian <hu at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Szekció hozzáadása"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "A 2. sor nem üres"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "Erőforrások importálása"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Szekció információk szerkesztése"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Erőforrások importálása"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Erőforrások importálása"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "Új kurzusok"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Szekció információk szerkesztése"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Időterv megtekintése"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Erőforrások importálása"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Személyek importálása"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Szekció hozzáadása"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Szekció hozzáadása"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Szekció információk szerkesztése"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Kurzusok importálása"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Új kurzus hozzáadása"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Új kurzusok"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Kurzus index"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Új kurzus hozzáadása"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Nincs ilyen kurzus."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Kell egy kurzus ID."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Szekciót ad a ${course}-hoz"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Szekció index"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Új szekció hozzáadása"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "Szekciók importálása"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Erőforrások importálása"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Szekció hozzáadása"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instrukciók} -- ${kurzusok}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Új kurzusok"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Szekció hozzáadása"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Csoportok importálása"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Szekció információk szerkesztése"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Új kurzusok"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Csoportok importálása"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Új kurzusok"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Személyek importálása"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Preferenciák módosítása"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Új kurzus hozzáadása"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Erőforrások importálása"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Új kurzus hozzáadása"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Szekció információk szerkesztése"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Új kurzusok"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Erőforrások importálása"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Időterv megtekintése"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Időterv megtekintése"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Szekció hozzáadása"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Időterv megtekintése"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Időterv megtekintése"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Időterv megtekintése"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2414 @@
+# Indonesian translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-06-11 02:53+0000\n"
+"Last-Translator: Loedee <mauludiin at gmail.com>\n"
+"Language-Team: Indonesian <id at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Orang"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 orang"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} orang"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nama user atau password salah"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Tahun ini"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Maret"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januari"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Pebruari"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mei"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agustus"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Besok"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hari ini"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Hari sebelumnya"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Desember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Nopember"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Senin"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Selasa"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Rabu"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Kamis"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Minggu"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Sabtu"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Jumat"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Senin"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Selasa"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Rabu"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Kamis"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Jumat"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sabtu"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Minggu"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Judul"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Sehari penuh"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Tanggal"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Jam"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Jam mulai dalam format 24jam"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Lama"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Menit"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Jam"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Hari"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Lokasi"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Keterangan"
+
+#: /src/schooltool/app/browser/cal.py:1694
+#, fuzzy
+msgid "Recurring"
+msgstr "Mengulang"
+
+#: /src/schooltool/app/browser/cal.py:1698
+#, fuzzy
+msgid "Recurs every"
+msgstr "Ulang setiap"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Hari"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Minggu"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Bulan"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Tahun"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Ulangi setiap"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Range"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Jumlah"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Sampai"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "selamanya"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Jumlah acara"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Ulangi sampai"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Bulanan"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Akhir ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Error."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Waktu salah"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Tanggal akhir lebih awal dari tanggal mulai"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Tanggal salah. Gunakan YYYY-MM-DD, satu tanggal tiap baris."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Tambah acara"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Tambah"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Edit acara"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#, fuzzy
+msgid "Update"
+msgstr "Perbaharui"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+#, fuzzy
+msgid "Updated on ${date_time}"
+msgstr "Diperbaharui pada ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Lihat kalender"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Minggu depan"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Minggu ini"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Minggu sebelumnya"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (${week} minggu)"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Bulan depan"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Bulan ini"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Bulan sebelumnya"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Minggu ke {$week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Tahun depan"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Tahun ini"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Tahun sebelumnya"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+#, fuzzy
+msgid "No data provided"
+msgstr "Data tidak tersedia"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+#, fuzzy
+msgid "CSV file imported successfully."
+msgstr "Sukses mengimpor file CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+#, fuzzy
+msgid "Failed to import CSV file"
+msgstr "Gagal mengimpor file CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+#, fuzzy
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konversi ke unicode gagal pada baris ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Konversi ke unicode gagal pada baris ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Perubahan disimpan"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "semua hari"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Lokasi: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Judul"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grup"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Lama"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Tanggal"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Grup index"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Tambahkan resource baru"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+#, fuzzy
+msgid "Titles may not be empty"
+msgstr "Judul tidak boleh kosong"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Bulan ini"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Bulan ini"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Minggu ini"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Tambah anggota"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Ganti keanggotaan"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nama user"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Password"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Nama user telah ada, gunakan yang lain!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Bulan sebelumnya"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Edit informasi grup"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sabtu"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Jumlah acara"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Nama lengkap"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Nama lengkap"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nama lengkap"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (dlm format JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Buat catatan"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Password berhasil diubah!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Password berhasil diubah!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Password berhasil diubah!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Lama"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Grup index"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Tambah grup baru"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Tambahkan resource baru"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Minggu sebelumnya"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Password berhasil diubah!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Minggu ini"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Password berhasil diubah!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Sabtu"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Minggu depan"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+#, fuzzy
+msgid "username may not be empty"
+msgstr "namauser tidak boleh kosong"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+#, fuzzy
+msgid "fullname may not be empty"
+msgstr "namalengkap tidak boleh kosong"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+#, fuzzy
+msgid "Duplicate username: ${username}"
+msgstr "User dengan nama ${username} sudah ada"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Password baru"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Password baru"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Lihat kalender"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nama yang akan ditampilkan"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Tambahkan resource baru"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+#, fuzzy
+msgid "Add a new resource"
+msgstr "Tambahkan resource baru"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Perubahan disimpan"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Ganti detail"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Buat catatan"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Tambah anggota"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Tanggal salah. Gunakan YYYY-MM-DD, satu tanggal tiap baris."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Tambahkan resource baru"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} orang"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Foto baru"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Sebuah gambar kecil (sekitar 48x48 piksel dlm format JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Hapus foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Cek ini untuk menghapus foto"
+
+#~ msgid "Verify password"
+#~ msgstr "Masukkan password lagi"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Password tidak sama"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Password tidak sama!"
+
+#~ msgid "View"
+#~ msgstr "View"
+
+#~ msgid "Edit"
+#~ msgstr "Edit"
+
+#~ msgid "Create new objects"
+#~ msgstr "Buat objek baru"
+
+#~ msgid "Add events"
+#~ msgstr "Tambah acara"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Ubah/hapus acara"
+
+#~ msgid "Control access"
+#~ msgstr "Akses kontrol"
+
+#~ msgid "Manage membership"
+#~ msgstr "Mengatur keanggotaan"
+
+#~ msgid "New Person"
+#~ msgstr "Orang baru"
+
+#~ msgid "Import Persons"
+#~ msgstr "Impor orang"
+
+#~ msgid "Add a Group"
+#~ msgstr "Tambah grup"
+
+#~ msgid "New Group"
+#~ msgstr "Buat grup"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Grup Schoolbell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Tambah/Hapus anggota"
+
+#~ msgid "Import Groups"
+#~ msgstr "Import group"
+
+#, fuzzy
+#~ msgid "Add a Resource"
+#~ msgstr "Tambahkan Resource"
+
+#, fuzzy
+#~ msgid "Edit Resource Information"
+#~ msgstr "Ubah Informasi Resource"
+
+#, fuzzy
+#~ msgid "New Resource"
+#~ msgstr "Resource Baru"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalender (Harian)"
+
+#, fuzzy
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Kalender (Harian, PDF)"
+
+#, fuzzy
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalender (Mingguan)"
+
+#, fuzzy
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalender (Mingguan, PDF)"
+
+#, fuzzy
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalender (Bulanan)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalender (Bulanan, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalender (Tahunan)"
+
+#, fuzzy
+#~ msgid "Free/Busy"
+#~ msgstr "Bebas/Penuh"
+
+#, fuzzy
+#~ msgid "New Event"
+#~ msgstr "Kegiatan Baru"
+
+#, fuzzy
+#~ msgid "Open in iCal"
+#~ msgstr "Buka dengan iCal"
+
+#, fuzzy
+#~ msgid "Edit Event"
+#~ msgstr "Ubah Kegiatan"

Added: schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/id/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5011 @@
+# Indonesian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-07-26 07:27+0000\n"
+"Last-Translator: Toosa <pht854 at yahoo.com>\n"
+"Language-Team: Indonesian <id at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Nama panggilan"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Email utama"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Email kedua"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telepon utama"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Website"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Website atau weblog."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Alamat"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Orang-orang"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 orang"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} orang"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Username atau password salah"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Maret"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januari"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februari"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mei"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agustus"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Esok hari"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hari ini"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Kemarin"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Desember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Senin"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Selasa"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Rabu"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Kamis"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Minggu"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Sabtu"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Jumat"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Sen"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Sel"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Rab"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Kam"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Jum"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sab"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Mingg"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Judul"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Semua hari"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Tanggal"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Waktu"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Durasi"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipe durasi"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Menit"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Jam"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Hari"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Lokasi"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Deskripsi"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Hari"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Minggu"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Bulan"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Tahun"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Ulangi setiap"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Hitung"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Hingga"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "selamanya"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Jumlah events"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Ulangi hingga"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Hari-hari kerja"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Hari Kerja"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Bulanan"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Hari perkecualian"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "hari kerja yang sama"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "Pertama"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "Keempat"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "Ketiga"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "Kedua"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "Kelima"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "hari kerja yang lalu"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "${weekday} terakhir"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Sebuah kesalahan muncul"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Waktu salah"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Tanggal akhir lebih awal dari tanggal awal"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Tambahkan"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalender"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Minggu depan"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Minggu ini"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Minggu lalu"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Bulan depan"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Bulan ini"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Bulan lalu"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Tahun depan"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Tahun ini"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Tahun lalu"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Bagian"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Lihat"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Tambahkan events"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Tambahkan events"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Lokasi"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigasi"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Lokasi."
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Tidak ada data"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+#, fuzzy
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Tidak dapat mengkonversi data menjadi Unicode (charset salah?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "File CVS telah berhasil diimpor"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konversi ke unicode gagal pada baris ${nomor_baris}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Baris 2 tidak kosong"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Skema jadwal ${schema} tidak ada"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Kesalahan di data jadwal CSV, baris nomor ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Waktu belum ditentukan pada hari terpilih: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Orang tidak ditemukan: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Pelajaran tidak ditemukan: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Bagian tidak ditemukan: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Perubahan tersimpan"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "semua hari"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Lokasi: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Kalender harian untuk %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Kalender mingguan untuk %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Minggu %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Kalender bulanan untuk %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Ubah Preferensi"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Preferensi Kalender"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Preferensi Kalender"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Preferensi-ku"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Preferensi Kalender"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Deskripsi"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Pindah ke ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Kegiatan besok"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "versi print"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Lihat kalender harian"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Harian"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Lihat kalender mingguan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Mingguan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Lihat kalender bulanan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Lihat kalender tahunan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Tahunan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Kalender untuk ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Kalender pribadi"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "Timetable calendar"
+msgstr "Lihat kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Kalender-ku"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Lihat kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Kalender mingguan untuk %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "tombol-delete"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+#, fuzzy
+msgid "cancel-button"
+msgstr "tombol-delete"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+#, fuzzy
+msgid "There are none."
+msgstr "Tidak ada apa-apa untuk ditambahkan"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Cari sekarang"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Clear"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Tidak ada apa-apa untuk ditambahkan"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Semua hari"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "detail"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Sab"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Tambahkan events"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Ganti instruktur untuk bagian ini"
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "edit grup"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Modifikasi/hapus events"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Edit Informasi Bagian"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "detail"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Format Tanggal"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Hari ini"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Minggu"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Bulan"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Tahun"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Ulangi hingga"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Waktu"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Lihat kalender"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Ulangi setiap"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Judul"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Sab"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "ganti lokasi"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Pelajaran"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Selamat datang di SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${DYNAMIC_CONTENT}"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Edit Informasi Bagian"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Keluar"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "Ukuran sekarang"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Semua hari"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Yang Lain (tolong ditentukan)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Memasukkan Data CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "Data CSV"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "tombol kirim"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Lihat Jadwal Mata Pelajaran"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Contoh:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"musim gugur-2005\",\"tiga hari\"\n"
+"\"\",\"\",\"\"\n"
+"\"filosofi\",\"lorch\"\n"
+"\"Senin\",\"A\",\"kamar137\"\n"
+"\"Senin\",\"B\"\n"
+"\"Selasa\",\"C\",\"kamar138\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literatur\",\"guzman\"\n"
+"\"Rabu\",\"B\"\n"
+"\"Rabu\",\"C\",\"kamar139\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Upload File CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "File CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+#, fuzzy
+msgid "Charset:"
+msgstr "Charset:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+#, fuzzy
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalender untuk %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Input yang diperlukan tidak ada."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Tidak bisa menginisialisasi database:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Selamat datang di server SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Preferensi Kalender"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Ubah Preferensi"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Orang-orang"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Menit"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Minggu"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Tidak ada apa-apa untuk ditambahkan"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Tidak ada apa-apa untuk ditambahkan"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Tambahkan orang baru"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Tahun lalu"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+#, fuzzy
+msgid "Next"
+msgstr "Minggu depan"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Lokasi"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Tambahkan Sebuah Bagian Baru"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Lihat"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Ubah"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Tambahkan Sebuah Bagian Baru"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Edit Informasi Bagian"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Impor Mata Pelajaran"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Tambahkan mata pelajaran baru"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Mata Pelajaran Baru"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Indeks mata pelajaran"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Tambahkan mata pelajaran baru"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Data yang diberikan tidak cukup"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Judul tidak boleh kosong"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Tidak ada mata pelajaran tersebut"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Identitas mata pelajaran diperlukan"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Tambahkan bagian ke ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Instruktur"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Instruktur sekarang"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Instruktur yang ada"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "murid-murid"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grup"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Indeks bagian"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Tambahkan bagian baru"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Sejarah kuno, pra-sejarah sebelum 1000 S.M\n"
+"Sejarah Amerika Serikat\n"
+"Sejarah dunia, 1000 S.M. hingga abad ke-20, teks setelah koma yang kedua\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Bagian"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "murid-murid"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "edit nama"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Ganti lokasi atau nama dari bagian ini"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Ganti instruktur untuk bagian ini"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Ganti instruktur untuk bagian ini"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "edit instruktur"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "Change the students in this section individually"
+msgstr "Ganti instruktur untuk bagian ini"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+#, fuzzy
+msgid "Change the students in this section by groups"
+msgstr "Ganti instruktur untuk bagian ini"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "edit grup"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Pengenal (opsional)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Bagian"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Ukuran sekarang"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Judul mata pelajaran"
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Deskripsi mata pelajaran"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Label"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Kode"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Deskripsi bagian ini"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${pengajar} -- ${mata pelajaran}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Orang-orang"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Maret"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Ubah"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Username"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Password"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Username ini sudah terpakai!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Harian"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Tidak ada apa-apa untuk ditambahkan"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Tidak ada apa-apa untuk ditambahkan"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Catatan"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nama lengkap"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (dalam format JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Pelajaran"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "tombol-delete"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+#, fuzzy
+msgid "add-button"
+msgstr "tombol-delete"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "ganti lokasi"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Tambahkan Sebuah Bagian Baru"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "murid-murid"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "tombol-delete"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Impor Grup"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Tambahkan grup baru"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Edit Informasi Bagian"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Pengelolaan keanggotaan"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grup"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grup"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+#, fuzzy
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"KPLI, Kelompok Pengguna Linux Indonesia\n"
+"Klub catur\n"
+"Klub olah raga, Klub olah raga seusai sekolah, <em>teks setelah koma yang "
+"kedua</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "November"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "edit nama"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Ganti lokasi atau nama dari bagian ini"
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Tambahkan grup baru"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Lihat kalender"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Tambahkan events"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "Tidak"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "tombol-delete"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Minggu ini"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "murid-murid"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "tombol-delete"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "tombol-delete"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "tombol-delete"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Foto baru"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Judul dari catatan."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Body"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Prifasi"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Catatan"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Prifasi"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Tambahkan events"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Tanggal"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "nama pengguna tidak boleh kosong"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "nama lengkap tidak boleh kosong"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+#, fuzzy
+msgid "Duplicate username: ${username}"
+msgstr "nama pengguna berduplikat: ${namapengguna}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Impor Orang"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45j\n"
+"howard, Howard\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Contoh di atas akan membuat tiga pengguna, 'jjones', 'jbjones' dan 'howard'. "
+"Dari ketiganya, hanya 'jbjones' yang mempunyai password ('r2m45j') dan dapat "
+"login ke sistem. Harap diperhatikan bahwa password harus dikirim dalam teks "
+"biasa."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Merubah preferensi untuk ${pengguna}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+#, fuzzy
+msgid "Edit person preferences"
+msgstr "Preferensi Kalender"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Zona waktu"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Zona waktu yang ditampilkan pada kalender"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Format waktu"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Format Tanggal"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/YY"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "YYYY-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Hari Bulan, Tahun"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Minggu dimulai pada:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Lihat periode"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nama yang ditampilkan"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Hubungan"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Tambahkan mata pelajaran baru"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Semester baru"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Tunjukkan"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "dari"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "Menit"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Impor Sumber Daya"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Tambahkan resource baru"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Edit Informasi Bagian"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, OHP #302\n"
+"Auditorium Utama\n"
+"LC-805, komputer laptop #805, <em>teks setelah koma kedua</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Tambahkan resource baru"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Lokasi."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+#, fuzzy
+msgid "Calendar_relationships"
+msgstr "Hubungan"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Kalender"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "atas"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Hari perkecualian"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+#, fuzzy
+msgid "Log In"
+msgstr "Keluar"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "User:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Keluar"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Semester baru"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+#, fuzzy
+msgid "Please enter the replacement date below."
+msgstr "Silahkan masukkan paling tidak sebanyak $number periode"
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+#, fuzzy
+msgid "Please enter the emergency date below."
+msgstr "Silahkan masukkan paling tidak sebanyak $number periode"
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${month} ${year}"
+msgstr "${month}, ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+#, fuzzy
+msgid "Save changes"
+msgstr "Perubahan tersimpan"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+#, fuzzy
+msgid "Refresh"
+msgstr "Sumber Daya"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Hari ini"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Lihat Jadwal Mata Pelajaran"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Lihat Jadwal Mata Pelajaran"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Kemarin"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "Semua hari"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Lihat periode"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Lihat Jadwal Mata Pelajaran"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "Semester baru"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Pelajaran"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+#, fuzzy
+msgid "Save"
+msgstr "Sama"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Lihat Jadwal Mata Pelajaran"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+#, fuzzy
+msgid "Period title (optional)"
+msgstr "Pengenal (opsional)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Tanggal"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Semester baru"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Senin"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Lihat Jadwal Mata Pelajaran"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+"Masukkan nama-nama periode, masing-masing satu baris untuk satu periode"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Silahkan masukkan paling tidak sebanyak $number periode"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Mohon pastikan nama periodenya unik"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "Apakah urutan periode setiap harinya adalah sama atau berbeda?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Sama"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Berbeda"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Silahkan masukkan periode secara berurutan"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Silahkan berikan seluruh periode"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Periode-periode berikut ini dipilih lebih dari satu kali: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Silahkan letakkan setiap periode secara berurut untuk setiap harinya:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period pada hari $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+"Apakah Anda memeriksa kehadiran siswa hari itu di dalam periode homeroom "
+"atau ekuivalen?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr "Ya"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr "Tidak"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr "Silahkan tunjukkan periode(s) homeroom untuk setiap harinya:"
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Hari yang tidak diketahi id: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Periode yang tidak diketahi id: %"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Username:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Ganti nama, foto, atau password orang ini"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Atur keanggotaan orang ini"
+
+#~ msgid "Import Sections"
+#~ msgstr "Impor Bagian"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Lokasi tidak ditemukan: ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "modifikasi detail orang ini"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Foto kecil (sekitar 48x48 piksel dalam format JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Bersihkan foto"
+
+#~ msgid "New password"
+#~ msgstr "Password baru"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifikasi password"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Password tidak sama"
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Password telah diganti"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Password tidak sama!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Buat obyek baru"
+
+#~ msgid "Control access"
+#~ msgstr "Pengendali akses"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Pengguna terautentikasi"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Penggunan yang sudah diautentikasi"
+
+#~ msgid "An error occured."
+#~ msgstr "Sebuah kesalahan muncul"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Selamat datang di server SchoolBell"

Added: schooltool/branches/upstream/current/src/schooltool/locales/is/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/is/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/is/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4836 @@
+# Icelandic translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:46+0000\n"
+"Last-Translator: Salvör <salvor at gmail.com>\n"
+"Language-Team: Icelandic <is at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "Skólatól"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Dagatöl"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Dagatöl"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Dagatöl"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Skoða"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Dagatöl"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Dagatöl"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Engar upplýsingar til staðar"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Umbreyting í unicode tókst ekki í línu  ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Röð 2 er ekki auð"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Ófullgerð lýsing á kafla í línu ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Fyrsta röð í CSV skránni verður að innihalda auðkenni tímabils og auðkenni "
+"fyrir stundatöfluskema."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Tímabilið ${term} er ekki til."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Skema fyrir stundatöflu ${schema} er ekki til."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Villa í stundatöflu CSV gögnum, lína ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Auðkenni daga er ekki skilgreind í völdu skema: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Tímabil eru ekki skilgreind í völdum dögum: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Persónur finnast ekki: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Námskeið finnast ekki: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Kaflar finnast ekki ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Ógild færsla: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "Skólatól"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "Skólatól"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "Stundatöfludagatal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+#, fuzzy
+msgid "View weekly calendar"
+msgstr "Stundatöfludagatal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "Persónulegt dagatal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+#, fuzzy
+msgid "View yearly calendar"
+msgstr "Stundatöfludagatal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Persónulegt dagatal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Stundatöfludagatal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Dagatöl"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Meira..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Dagatöl"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Stundatöfludagatal"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Dagatöl"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "Flytja inn námu"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Flytja inn námu"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Persónulegt dagatal"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Flytja inn námu"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "Nýtt námskeið"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "Skólatól"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Ný stundatafla"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Flytja inn námu"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Flytja inn persónur"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Skoða"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Breyta"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "Bæta við nýjum kafla"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Flytja inn námskeið"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Bæta við nýju námskeiði"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Nýtt námskeið"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Námskeiðsyfirlit"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Bæta við nýju námskeiði"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Ófullnægjandi gögn."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Þetta námskeið er ekki til."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Þarf  auðkenni námskeiðs."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Bæta kafla við  ${námskeið}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Kaflayfirlit"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Bæta við nýjum kafla"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "Kaflayfirlit"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Flytja inn námu"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Kaflayfirlit"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${kennarar} -- ${námsskeið}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Nýtt tímabil"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Breyta"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Virkja"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Bæta við nýjum kafla"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Flytja inn hópa"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Nýtt námskeið"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Flytja inn hópa"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Persónulegt dagatal"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nýtt námskeið"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "notendanafn má ekki vera eyða"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "fullt nafn má ekki vera eyða"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Notendanafn þegar til: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Flytja inn persónur"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Breyta uppsetningu,"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Bæta við nýju námskeiði"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Nýtt tímabil"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Flytja inn námu"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Bæta við nýju námskeiði"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Nýtt námskeið"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Flytja inn námu"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Dagatöl"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Nýtt tímabil"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "Skólatól"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Ný stundatafla"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Skoða stundatöflur"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Stundaskrá"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Ný stundatafla"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "Nýtt tímabil"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Skoða stundatöflur"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Nýtt tímabil"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Stundatöfludagatal"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Ný stundatafla"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Ekki rétt uppbyggð lína ${line_no} (hún ætti að innihalda auðkenni dags, "
+#~ "auðkenni tímabils og ef vill auðkenni staðar)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Staðir finnast ekki: ${args}."
+
+#~ msgid "An error occured."
+#~ msgstr "Villa hefur komið upp."

Added: schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3165 @@
+# Italian translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: Giancarlo Gaifas <lallo at artiemestieri.tn.it>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-09-13 07:45+0000\n"
+"Last-Translator: lallo <lallo at artiemestieri.tn.it>\n"
+"Language-Team: Italian <it at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Soprannome"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Un nomignolo per questa persona."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Email principale"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Email secondaria"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telefono principale"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Numero di telefono raccomandato"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Telefono secondario"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Numero di telefono secondario"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Sito web"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Sito web o weblog personale"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Indirizzo postale"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Persone"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "Una persona"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} persone"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Il nome utente o la password sono sbagliati"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "anno corrente"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Gruppi disponibili"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "marzo"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "gennaio"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "febbraio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "giugno"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "maggio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "aprile"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "settembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "luglio"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "giorno successivo"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "oggi"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "giorno precedente"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "ottobre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "dicembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "novembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "lunedì"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "martedì"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "mercoledì"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "giovedì"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "domenica"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "sabato"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "venerdì"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "lun"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "mar"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "mer"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "gio"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "ven"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "sab"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "dom"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titolo"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Tutti i giorni"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Ora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Orario di inizio in formato 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Durata"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipo di durata"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuti"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Ore"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Giorni"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Luogo"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Descrizione"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Ricorsività"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Ricorre ogni"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Giorno"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Settimana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mese"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Anno"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Ripeti ogni"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Intervallo"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Conta"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Fino a"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "per sempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Numero di eventi"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Ripetere fino al"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Giorni della settimana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Giorno della settimana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Mensile"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Date eccezionali"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "stesso giorno settimanale"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2°"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5°"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "Ultimo giorno della settimana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Ultimo ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "C'è stato un errore"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ora non valida"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "La data finale è precedente alla data di inizio"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Data non valida.  Specificare in formato AAAA-MM-GG, una per riga."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Aggiungi un evento"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Aggiungi"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Modifica l'evento"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Aggiorna"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Aggiorna dal ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Calendari"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "settimana successiva"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "settimana corrente"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "settimana precedente"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "mese successivo"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "mese corrente"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "mese precedente"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Settimana ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "anno successivo"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "anno corrente"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "anno precedente"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Non è stato fornito alcun dato"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Non è possibile convertire i dati ad unicode (set dei caratteri sbagliato?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Dati CSV importati correttamente"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "L'importazione del file CSV è fallita"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Il testo CSV è stato importato correttamente."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "L'importazione del testo CSV è fallita"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Non è stato specificato alcun set di caratteri"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Set di caratteri sconosciuto"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Errore nei dati CSV alla riga ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Conversione ad unicode fallita alla riga ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Errore nei dati CSV alla riga ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Informazioni della persona: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Modifiche salvate"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "Tutto il giorno"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Luogo: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Risorse prenotate: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "ricorsivo"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "superato da %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendario giornaliero di %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendario settimanale di %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Settimana %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendario mensile di %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Supporto del formato PDF disabilitato.  Può essere riattivato "
+"dall'amministratore."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendario di %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Il nome dell'organizzazione o della scuola che gestisce\n"
+"            questo server.  Viene mostrato nel calendario pubblico, in\n"
+"            fondo a tutte le pagine e nel titolo della pagina."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Calendario in prima pagina"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Mostra il calendario generale come pagina iniziale del sito."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Manca un input che è richiesto"
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Il modello di input non è un oggetto di tipo file"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Dati integer non validi"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Dati testo non validi"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Dati testuali non validi"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Dati unicode non validi"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Dati a virgola mobile non validi"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Dati in formato data non validi"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Vado in background, con il pid daemon %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Per un aiuto lanciare %s -h"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: il modo daemon non è supportato dal tuo sistema operativo."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Lettura della configurazione da %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Tempo per l'avvio del server: %.3f sec. reali, %.3f sec. CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr "Non posso aprire il database"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Forse c'è un'altra istanza %s che lo utilizza?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Attenzione: non è possibile trovare la libreria reportlab\n"
+"Il supporto al formato PDF è disabilitato."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Attenzione: la cartella dei caratteri '%s' non esiste.\n"
+"Il supporto al formato PDF è disabilitato."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Attenzione: l'insieme dei caratteri '%s' non esiste.\n"
+"Il supporto al formato PDF è disabilitato."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Uso: %s [opzioni]\n"
+"Opzioni:\n"
+"-c, --config xxx       usa questa configurazione invece che quella di "
+"default\n"
+"-h, --help             mostra questo messaggio\n"
+"-d, --daemon           vai in background dopo l'avvio\n"
+"-r, --restore-manager  ripristina l'utente manager con la password "
+"predefinita\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Nel file di configurazione non è stato trovato alcun indirizzo di "
+"archiviazione (storage).\n"
+"\n"
+"Se si sta usando il file di default modificarlo subito scommentando una "
+"delle sezioni ZODB\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Questo non sembra un file database di SchoolBell 1.0, operazione annullata.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Questo non sembra un file database di SchoolBell 1.0, operazione annullata.\n"
+"\n"
+"Lanciare il singolo script di aggiornamento del database\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titolo"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Titolo della nota."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Gruppi"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Durata"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Data"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Indice delle risorse"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Aggiungi una nuova risorsa"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "I dati forniti sono insufficenti"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Il titolo non può essere vuoto"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Gruppo corrente"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Gruppi disponibili"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "mese corrente"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Gruppi disponibili"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Gruppi"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Gruppo corrente"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Gruppi disponibili"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Risorse"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importa le risorse"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Risorse disponibili"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Indice delle persone"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Aggiungi una nuova persona"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Titolo della risorsa."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Descrizione della risorsa."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Descrizione del gruppo"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Sito web"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Elimina"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Modifica le informazioni per ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Modifica le appartenenze"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Modifica le preferenze per ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Modifica i dettagli di contatto per ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Modifica i dettagli di contatto per ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Informazioni sul contatto"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nome utente"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Password"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Questo nome utente è già in uso"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Conferma"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Telefono principale"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "precedenti"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Informazioni sull'evento"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Soprannome"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Inizio"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "sab"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Zona oraria"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Telefono secondario"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Annotazioni"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "successivi"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Numero di eventi"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "modifica il nome"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "modifica il nome"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "modifica il nome"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Le mie preferenze"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nome esteso"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (in formato JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nuova annotazione"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Il testo CSV è stato importato correttamente."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "La password è stata cambiata"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "La password è stata cambiata"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Esempio:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Informazioni della persona"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Indice dei gruppi"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Aggiungi un nuovo gruppo"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Gruppi di ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Componenti del gruppo ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Collaboratori attuali"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Aggiungi dei collaboratori al gruppo"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Titolo del gruppo"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Descrizione del gruppo"
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Indice delle risorse"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Aggiungi una nuova risorsa"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "settimana precedente"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "Il testo CSV è stato importato correttamente."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "La password è stata cambiata"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "settimana corrente"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "La password è stata cambiata"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Utente"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Titolo della risorsa."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Descrizione della risorsa."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Inizio"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Titolo della nota."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "settimana successiva"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Titolo della nota."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Giornaliero"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Titolo della nota."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Corpo"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Corpo dell'annotazione"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Riservatezza"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Il nome utente non può essere vuoto"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Il nome esteso non può essere vuoto"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Nome utente duplicato: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nuova password"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Modifica la password"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Zona oraria"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Zona oraria di visualizzazione del tuo calendario"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formato delle ore"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formato delle date"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/GG/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAAA-MM-GG"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Giorno, mese, anno"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "La settimana inizia il:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Inizia la visualizzazione delle settimane di domenica o di lunedì"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Visualizza il calendario"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nome che verrà mostrato"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Indice delle risorse"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Aggiungi una nuova risorsa"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Indice delle risorse"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Aggiungi una nuova risorsa"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Titolo della risorsa."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Descrizione della risorsa."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Un luogo"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+"Indica che questa risorsa è una località, un punto di incontro, come una "
+"classe."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "I dati forniti sono insufficenti"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "I dati forniti sono insufficenti"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "I dati forniti sono insufficenti"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Il mio calendario"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Continua ..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendari"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Benvenuti in SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigazione"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Nome utente:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "modifica il nome"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Modifica il nome, la foto o la password di questa persona"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Informazioni della persona: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Gestisci le appartenenze di questa persona"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "modifica i gruppi"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Questo non sembra un file database di SchoolBell 1.0, operazione annullata.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Questo non sembra un file database di SchoolBell 1.0, operazione annullata.\n"
+"\n"
+"Lanciare il singolo script di aggiornamento del database\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "top"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Modifiche salvate"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Modifica i dettagli"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nuova annotazione"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "elementi"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Aggiungi una nuova persona"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Inizio"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Date eccezionali"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Data non valida.  Specificare in formato AAAA-MM-GG, una per riga."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Aggiungi una nuova risorsa"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} persone"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Corpo dell'annotazione"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "stesso giorno settimanale"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "modifica il nome"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Nota"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Set di caratteri sconosciuto"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nuova foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Una piccola immagine (circa 48x48 pixel nel formato JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Cancella foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Controlla questo per cancellare la foto"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifica password"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "La password non corrisponde"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "La password non corrisponde"
+
+#~ msgid "View"
+#~ msgstr "Visualizza"
+
+#~ msgid "Edit"
+#~ msgstr "Modifica"
+
+#~ msgid "Create new objects"
+#~ msgstr "Crea nuovi oggetti"
+
+#~ msgid "Add events"
+#~ msgstr "Aggiungi un evento"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modifica/cancella un evento"
+
+#~ msgid "Control access"
+#~ msgstr "Accesso di controllo"
+
+#~ msgid "Manage membership"
+#~ msgstr "Gestisci le appartenenze dei membri"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Utenti registrati"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Utenti non registrati"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Imposta i permessi"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Modifica le preferenze"
+
+#~ msgid "New Person"
+#~ msgstr "Nuova persona"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importa le persona"
+
+#~ msgid "Add a Group"
+#~ msgstr "Aggiungi un gruppo"
+
+#~ msgid "New Group"
+#~ msgstr "Nuovo gruppo"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Modifica le informazioni del gruppo"
+
+#~ msgid "A Group"
+#~ msgstr "Un gruppo"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Gruppo SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Aggiungi/rimuovi membri"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importa i gruppi"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Aggiungi una risorsa"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Modifica le informazioni della risrsa"
+
+#~ msgid "New Resource"
+#~ msgstr "Nuova risorsa"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Risorse di SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Una risorsa"
+
+#~ msgid "Actions"
+#~ msgstr "Azioni"
+
+#~ msgid "View Calendar"
+#~ msgstr "Vista calendario"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Calendario (giornaliero)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Calendario (giornaliero, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Calendario (settimanale)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Calendario (settimanale, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Calendario (mensile)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Calendario (mensile, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Calendario (annuale)"
+
+#~ msgid "Atom View"
+#~ msgstr "Vista atomica"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Libero/occupato"
+
+#~ msgid "New Event"
+#~ msgstr "Nuovo evento"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Apri in iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Modifica un evento"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Modifica le preferenze del sito"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Questo permesso consente la visualizzazione dei nomi, titoli, elenchi di "
+#~ "oggetti ed altre informazioni."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Consenti la modifica dei nomi, titoli, descrizioni, foto ecc."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Consenti all'utente di creare nuove persone, gruppi e risorse."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr ""
+#~ "Consenti la visualizzazione dei calendari delle persone, dei gruppi e "
+#~ "delle risorse."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Consenti l'aggiunta di nuovi eventi al calendario."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Consenti la modifica e l'eliminazione degli eventi del calendario."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Controllo degli accessi per ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr ""
+#~ "Consenti all'utente l'uso di questo modulo (controllo degli accessi)"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Consenti all'utente di aggiungere persone, gruppi e risorse ai gruppi.\n"
+#~ "Per aggiungere qualcosa ad un gruppo l'utente ha la necessità di avere\n"
+#~ "il permesso solo su questo gruppo.\n"
+#~ "Rammentare che l'unione dei gruppi ha implicazioni sulla sicurezza."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Permessi dei gruppi"
+
+#~ msgid "Access control"
+#~ msgstr "Controllo degli accessi"
+
+#~ msgid "Set Access"
+#~ msgstr "Imposta i permessi"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Permessi degli utenti"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "I permessi sono ereditati dalla gerarchia del contenitore.  Per esempio "
+#~ "se si imposta un permesso Vista calendario per un utente nell'elenco "
+#~ "delle persone tale utente potrà vedere i calendari di tutte le persone "
+#~ "nell'indice.  Se si desidera che l'utente possa vedere solo il calendario "
+#~ "di alcune risorse è necessario impostare il permesso View Calendar per "
+#~ "questo utente su quelle risorse."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "Qua sotto c'è un elenco dei nomi dei permessi con i relativi significati."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Modifica le preferenze del sito"
+
+#~ msgid "General preferences"
+#~ msgstr "Preferenze generali"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Modifica le preferenze del sito"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Eventi di"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_description"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_enabled"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_more_info"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Validate my Atom feed"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Valid Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Luogo: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Seleziona i calendari aggiuntivi da visualizzare"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Premere i tasti Ctrl o Maiuscolo per selezionare più calendari."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Calendario pubblico"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "Calendario complessivo"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Seleziona i  calendari da mostrare"
+
+#~ msgid "People"
+#~ msgstr "Gente"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Non ci sono persone con calendari a te accessibili"
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Non ci sono gruppi con calendari a te accessibili"
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Non ci sono risorse con calendari a te accessibili"
+
+#~ msgid "Showing"
+#~ msgstr "Mostro"
+
+#~ msgid "of"
+#~ msgstr "di"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Sei sicuro di voler eliminare gli elementi selezionati?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Non è stato selezionato alcun elemento."
+
+#~ msgid "delete-button"
+#~ msgstr "Elimina"
+
+#~ msgid "Exception"
+#~ msgstr "Eccezione"
+
+#~ msgid "Traceback"
+#~ msgstr "Traccia dell'errore"
+
+#~ msgid "Server Error"
+#~ msgstr "Errore del server"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Si è verificato un errore del server.  Ciò significa presumibilmente che "
+#~ "è stato incontrato un difetto di SchoolBell.  Si prega di segnalarlo nel "
+#~ "<a href=\\\"http://issues.schooltool.org\\\">tracciatore dei problemi di "
+#~ "SchoolTool</a>"
+
+#~ msgid "All day event"
+#~ msgstr "Evento giornaliero"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Questo è un evento ricorrente."
+
+#~ msgid "Ends"
+#~ msgstr "Fine"
+
+#~ msgid "edit event"
+#~ msgstr "modifica evento"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Cambia i dettagli di questo evento"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Risorse prenotate"
+
+#~ msgid "edit resources"
+#~ msgstr "modifica le risorse"
+
+#~ msgid "delete event"
+#~ msgstr "cancella evento"
+
+#~ msgid "Event details"
+#~ msgstr "Dettagli dell'evento"
+
+#~ msgid "Book Resources"
+#~ msgstr "Prenotazione risorse"
+
+#~ msgid "Update form"
+#~ msgstr "Modulo di aggiornamento"
+
+#~ msgid "day"
+#~ msgstr "giorni"
+
+#~ msgid "week"
+#~ msgstr "settimane"
+
+#~ msgid "month"
+#~ msgstr "mesi"
+
+#~ msgid "year"
+#~ msgstr "anni"
+
+#~ msgid "Weekly"
+#~ msgstr "Settimanale"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr ""
+#~ "Questa sezione viene applicata solo quando è selezionata la ricorrenza "
+#~ "settimanale."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr ""
+#~ "Questa sezione viene applicata solo quando è selezionata la ricorrenza "
+#~ "mensile."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Giorno ${monthday} di ogni mese"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} di ogni mese"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "\"${DYNAMIC_CONTENT} di ogni mese"
+
+#~ msgid "Repeat"
+#~ msgstr "Ripeti"
+
+#~ msgid "times"
+#~ msgstr "volte"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Ripeti per sempre"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Risorse librarie"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Prenotazione delle risorse per ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Titolo"
+
+#~ msgid "Starts:"
+#~ msgstr "Inizio:"
+
+#~ msgid "Ends:"
+#~ msgstr "Fine:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Questo è un evento ricorrente!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Prenotazione delle risorse"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Eventi contemporanei"
+
+#~ msgid "Book"
+#~ msgstr "Prenota"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "I dati CSV <strong>devono</strong> includere un titolo di gruppo e "
+#~ "<strong>possono</strong> includere facoltativamente una descrizione del "
+#~ "gruppo.  Qualsiasi altra informazione verrà scartata."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LUG, Linux Users Groups\n"
+#~ "Circolo scacchi\n"
+#~ "Circolo sportivo, Circolo sportivo del dopo scuola, <em> testo dopo la "
+#~ "seconda virgola</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Questo esempio crea tre gruppi con titolo 'LUG', 'Circolo scacchi' e "
+#~ "'Circolo sportivo'.  Il primo e l'ultimo gruppo hanno rispettivamente la "
+#~ "descrizione 'Linux Users Groups' e 'Circolo sportivo del dopo scuola'.  "
+#~ "Il gruppo 'Circolo scacchi' non ha descrizione mentre il testo \"testo "
+#~ "dopo la seconda virgola\", del terzo gruppo, viene ignorato."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Carica i gruppi SchoolTool come CSV"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Carica un file CSV"
+
+#~ msgid "CSV File"
+#~ msgstr "File CSV"
+
+#~ msgid "Charset:"
+#~ msgstr "Insieme di caratteri:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Western (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Western (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Western (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Altro (da specificare)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Altro insieme di caratteri: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Dati di imput in formato CSV"
+
+#~ msgid "CSV Data"
+#~ msgstr "Dati CSV"
+
+#~ msgid "Members"
+#~ msgstr "Componenti"
+
+#~ msgid "edit members"
+#~ msgstr "modifica i componenti del gruppo"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Modifica gli appartenenti a questo gruppo."
+
+#~ msgid "Remove"
+#~ msgstr "Rimuovi"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Non hai il permesso di accedere a questa pagina.  Puoi ritornare indietro "
+#~ "tramite il pulsante 'indietro' del tuo browser. Se necessario chiedi "
+#~ "maggiori privilegi per accedere."
+
+#~ msgid "Please log in"
+#~ msgstr "Si prega di registrarsi"
+
+#~ msgid "Login"
+#~ msgstr "Registrati"
+
+#~ msgid "User Information"
+#~ msgstr "Informazioni utente"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "La tua sessione è terminata"
+
+#~ msgid "There are none."
+#~ msgstr "Qui non c'è niente."
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "Conferma"
+
+#~ msgid "There are none to add."
+#~ msgstr "Qui non c'è niente da aggiungere."
+
+#~ msgid "Find Now"
+#~ msgstr "Trova ora"
+
+#~ msgid "Clear"
+#~ msgstr "Svuota"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "Esci"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Chi può vedere l'annotazione"
+
+#~ msgid "Private"
+#~ msgstr "Privata"
+
+#~ msgid "Public"
+#~ msgstr "Pubblica"
+
+#~ msgid "Add note"
+#~ msgstr "Aggiungi una annotazione"
+
+#~ msgid "add-button"
+#~ msgstr "Aggiungi"
+
+#~ msgid "Delete"
+#~ msgstr "Elimina"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Notare il seguito:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Forse si è inserito l'indirizzo URL malformato"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Forse si cerca di accedere ad una pagina inesistente"
+
+#~ msgid "Not Found"
+#~ msgstr "Non trovata"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "La pagina a cui si sta cercando di accedere non è disponibile"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "I dati CSV <strong>devono</strong> contenere un nome utente ed un nome "
+#~ "esteso.  Può essere facoltativamente inclusa anche una password."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\"jjones, Jimmy Jones\\n\"\n"
+#~ "\"jbjones, Jim Bob Jones, r2m45J\\n\"\n"
+#~ "\"howard, Howard\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "L'esempio precedente crea tre utenti: 'jjones', 'jbjones' e 'howard'.  "
+#~ "Dei tre, solo 'jbjones' ha una password ('r2m45J') ed è in grado di "
+#~ "entrare (login) nel sistema.  Notare che le password devono essere "
+#~ "inviate in formato testo."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Carica le persone di SchoolTool come CSV"
+
+#~ msgid "Details"
+#~ msgstr "Dettagli"
+
+#~ msgid "edit details"
+#~ msgstr "modifica i dettagli"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modifica i dettagli della persona"
+
+#~ msgid "Add person"
+#~ msgstr "Aggiungi una persona"
+
+#~ msgid "Add to groups"
+#~ msgstr "Aggiungi ai gruppi"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Ovviamente non è possibile eliminare il proprio account!"
+
+#~ msgid "Edit contact information"
+#~ msgstr "Modifica le informazioni sul contatto"
+
+#~ msgid "Edit person"
+#~ msgstr "Modifica la persona"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Preferenze per il calendario"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Modifica le preferenze della persona"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Stai cercando di cancellare un evento ripetitivo."
+
+#~ msgid "Current"
+#~ msgstr "Corrente"
+
+#~ msgid "Future"
+#~ msgstr "Futuro"
+
+#~ msgid "All"
+#~ msgstr "Tutti"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Cancellazione di un evento ripetitivo ${event_title})"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "\"I dati CSV <strong>devono</strong> includere un titolo di una risorsa e "
+#~ "<strong>possono</strong> opzionalmente includere una descrizione della "
+#~ "risorsa.  Qualsiasi altra informazione viene scartata."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Proiettore #302\n"
+#~ "Auditorium principale\n"
+#~ "LC-805, Computer Laptop #805, <em>text after a second comma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Questo esempio crea tre risorse con nome 'PRJ302', 'Auditorium "
+#~ "principale' e 'LC-805'.  La prima e l'ultima risorsa hanno "
+#~ "rispettivamente le descrizioni 'Proiettore #302' e ' Computer Laptop "
+#~ "#805'.  La risorsa \"Auditorium principale\" non ha descrizione ed il "
+#~ "testo \"text after a second comma\" della terza risorsa viene ignorato."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Carica le risorse SchoolTool come CSV"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "Ci sono  ${num_errors} errori di input."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identificatore (facoltativo)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Versione stampabile"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Vista calendario giornaliero"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Vista calendario settimanale"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Vista calendario mensile"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Vista calendario annuale"
+
+#~ msgid "Yearly"
+#~ msgstr "Annuale"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "calendarip di ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Salta a ..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Eventi di domani"
+
+#~ msgid "Log in"
+#~ msgstr "Registrati"
+
+#~ msgid "User:"
+#~ msgstr "Utente:"
+
+#~ msgid "Log Out"
+#~ msgstr "Scollegati"
+
+#~ msgid "Edit Info"
+#~ msgstr "Modifica le informazioni"
+
+#~ msgid "Add Event"
+#~ msgstr "Aggiungi un evento"
+
+#~ msgid "Modify Event"
+#~ msgstr "Modifica l'evento"
+
+#~ msgid "Set up access"
+#~ msgstr "Imposta i permessi"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Utenti non registrati"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Utente non registrato"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Utenti registrati"
+
+#~ msgid "All Users"
+#~ msgstr "Tutti gli utenti"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: attenzione: ignorata l'opzione di configurazione '%s'"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/it/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5225 @@
+# Italian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: Giancarlo Gaifas <lallo at artiemestieri.tn.it>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:46+0000\n"
+"Last-Translator: lallo <lallo at artiemestieri.tn.it>\n"
+"Language-Team: Italian <it at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Soprannome"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Un nomignolo per questa persona."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Email principale"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Email secondaria"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telefono principale"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Numero di telefono raccomandato"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Telefono secondario"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Numero di telefono secondario"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Sito web"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Sito web o weblog personale"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Indirizzo postale"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Persone"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 persona"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} persone"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Il nome utente o la password sono sbagliati!"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "marzo"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "gennaio"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "febbraio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "giugno"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "maggio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "aprile"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "settembre"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "luglio"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "giorno successivo"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "oggi"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "giorni precedenti"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "ottobre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "dicembre"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "novembre"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "lunedì"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "martedì"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "mercoledì"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "giovedì"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "domenica"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "sabato"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "venerdì"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "lun"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "mar"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "mer"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "gio"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "ven"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "sab"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "dom"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titolo"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Tutto il giorno"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Ora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Orario di inizio in formato 24h (HH:MM)"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Durata"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipo di durata"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuti"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Ore"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Giorni"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Luogo"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Descrizione"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Ricorsivo"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Ricorre ogni"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Giorno"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Settimana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Mese"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Anno"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Ripeti ogni"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Intervallo dei valori"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Conto"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Fino a"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "per sempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Numero di eventi"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Ripeti fino al"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Giorni della settimana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Giorno della settimana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Mensile"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Date di eccezione"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "stessa settimana"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3°"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2°"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5°"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "ultimo giorno della settimana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Ultimo ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Orario non valido"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "La data finale è precedente alla data di inizio"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Data non valida.  Specificare in formato AAAA-MM-GG, una per riga."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Aggiungi un evento"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Conferma"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Modifica l'evento"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Aggiorna"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Aggiornato il ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Calendario"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "settimana successiva"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "settimana corrente"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "settimana precedente"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "mese successivo"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "mese corrente"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "mese precedente"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Settimana ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "anno successivo"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "anno corrente"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "anno precedente"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Azioni"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Calendario"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Calendario"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Calendario"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Calendario"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Visualizza"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Calendario"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Aggiungi un evento"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Modifica l'evento"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Registrati"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigazione"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Azioni"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Calendario"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Non è stata inserita alcuna data"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Non è possibile convertire i dati ad unicode (insieme dei caratteri "
+"sbagliato?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Il file CSV è stato importato correttamente."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "L'importazione del file CSV è fallita."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Il testo CSV è stato importato correttamente."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "L'importazione del testo CSV è fallita."
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Non è stato specificato alcun insieme di caratteri"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "set di caratteri sconosciuto"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Errore nei dati CSV alla riga ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Errore di conversione ad unicode alla riga ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "La seconda riga non è vuota"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Descrizione incompleta della classe alla riga ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"La prima riga del file CSV deve contenere l'id del periodo e dell'orario"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Il periodo ${term} non esiste"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Lo schema orario ${schema} non esiste"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Errore nei dati dell'orario CSV alla riga ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Id dei giorni non definito nello schema selezionato: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Periodi non definiti nei giorni selezionati: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Persone non trovate: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Materie non trovate: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Classi non trovate: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Record invalidi: ${args}"
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Modifiche salvate."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "tutto il giorno"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Luogo: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Risorse prenotate: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "ricorsivo"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "superato da %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendario giornaliero di %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendario settimanale di %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Settimana %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendario mensile di %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Supporto del formato PDF disabilitato.  Può essere riattivato "
+"dall'amministratore."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Modifica le preferenze"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Preferenze del calendario"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Preferenze del calendario"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Modifica le preferenze della persona"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Modifica le preferenze della persona"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Descrizione"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+#, fuzzy
+msgid "Validate my Atom feed"
+msgstr "Verifica livelli"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Salta a ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Eventi di domani"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Versione stampabile"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Vista calendario giornaliero"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Giornaliero"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Vista calendario settimanale"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Settimanale"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Vista calendario mensile"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Vista calendario annuale"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Annuale"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Calendario di ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Cal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Calendario personale"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Calendario orario"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Il mio calendario"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendario"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Altri..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Calendario"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Vista calendario"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Calendario settimanale di %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "Elimina"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "Esci"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Elimina"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Non ce ne sono"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Trova ora"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Svuota"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Non c'è niente da aggiungere"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Aggiungi un evento"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Dettagli"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Stato"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Modifica l'evento"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Modifica gli insegnanti per questa classe."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Risorse prenotate: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "modifica gruppi"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Modifica/cancella gli eventi"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Informazioni sulla classe"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "modifica i dettagli"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Risorse"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Aggiorna"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "oggi"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Settimana"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Mese"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Anno"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Ripeti fino al"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Ora"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Vista calendario"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Ripeti ogni"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Risorse prenotate: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Informazioni personali: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Titolo"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Stato"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Indice delle risorse"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "modifica il luogo"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Materie"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr "Livelli"
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Benvenuti in SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Informazioni sulla classe"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Registrati"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "ricorsivo"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Tutto il giorno"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Altro (specificare)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Altro insieme di caratteri ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Dati input CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "Dati CSV"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "Conferma"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Importa un orario"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"È possibile creare il file CSV in un foglio di calcolo ed esportarlo in quel "
+"formato (Comma Separated Values).  La struttura della tabella è descritta "
+"qui sotto."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"La prima riga del file deve contenere il nome del <strong>periodo</strong> "
+"(Id esistente! n.d.t.) e lo <strong>schema orario</strong> (Id esistente! n."
+"d.t.) che sarà usato per il nuovo orario.  La seconda riga deve essere "
+"vuota. Possono seguire diverse descrizioni di classi separate da una riga "
+"vuota."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+#, fuzzy
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+"La prima riga di ciascuna descrizione delle classi contiene un <strong>Id "
+"materia</strong> e un <strong>Id insegnante</strong> per la nuova classe.  "
+"Segue un certo numero di righe contenenti ciascuna un <strong>Id giorno</"
+"strong>, un <strong>Id intervallo</strong> e, facoltativamente, un "
+"<strong>Id luogo</strong>.  L'elenco della descrizione del periodo termina "
+"con tre asterischi ('***') nella prima colonna.  Dopo questo delimitatore "
+"può seguire un numero qualsiasi di <strong>Id persona</strong>.  Le persone "
+"corrispondenti saranno aggiunte alla classe come insegnanti."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Carica un orario SchoolTool come CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Esempio:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-recupero\",\"tre-giorni\"\n"
+"\"\",\"\",\"\"\n"
+"\"filosofia\",\"rossi\"\n"
+"\"Lunedì\",\"A\",\"classe137\"\n"
+"\"Lunedì\",\"B\"\n"
+"\"Martedì\",\"C\",\"classe138\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"letteratura\",\"bianchi\"\n"
+"\"Mercoledì\",\"B\"\n"
+"\"Mercoledì\",\"C\",\"classe139\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"Questo esempio crea due nuove classi, una per le lezioni di filosofia ed una "
+"per quelle di letteratura.  La classe per le lezioni di filosofia ha le "
+"persone con id 'johnny' e 'billy' come insegnanti ed il suo orario contiene "
+"tre attività orarie due il lunedì (una delle quali si terrà nel luogo "
+"denominato 'classe137' mentre l'altra non ha un luogo definito).  La classe "
+"letteratura viene letta nello stesso modo."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Notare che nel file devono essere usati solo gli 'id' degli oggetti e non i "
+"titoli.  Se una riga termina con uno campo vuoto (per es. <em>\"filosofia\","
+"\"rossi\",\"\",\"\"</em>, questo verrà ignorato.\n"
+"Si possono separare le descrizioni delle classi con più di una riga. "
+"Nell'elenco degli insegnanti viene letta solo la prima colonna con gli id "
+"delle persone, eventuali altre colonne sono ignorate.  Si può importare più "
+"volte una medesima data senza effetti secondari."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Carica file CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "File CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Set dei caratteri:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendario di %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Risorse prenotate: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Il nome dell'organizzazione o della scuola che gestisce\n"
+"            questo server.  Viene mostrato nel calendario pubblico, in\n"
+"            fondo a tutte le pagine e nel titolo della pagina."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Pagina principale del calendario"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Mostra il calendario generale come pagina iniziale del sito."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "È stato omesso un valore obbligatorio"
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "L'input dato al modello non è un oggetto file"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Dati in formato integer non valido"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Dati in formato testo non validi"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Dati testuali non validi"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Dati in formato unicode non validi"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Dati in formato a virgola mobile non validi"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Dati in formato data non validi"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Funziona in sottofondo, con Id del demone %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Per un aiuto lancia %s -h."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: il sistema operativo non consente la modalità demone."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "La configurazione viene letta da %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "Manager %s"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Tempo di avvio: %.3f secondi reali, %.3f secondi CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Non è possibile avviare il database:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"forse c'è un'altra istanza %s che lo sta impegnando"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Attenzione: non è possibile trovare la libreria reportlab\n"
+"Il supporto al formato PDF è disabilitato."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Attenzione: la cartella dei caratteri '%s' non esiste.\n"
+"Il supporto al formato PDF è disabilitato."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Attenzione: l'insieme dei caratteri '%s' non esiste.\n"
+"Il supporto al formato PDF è disabilitato."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Nel file di configurazione non è stato trovato alcun indirizzo di \"\n"
+"\"archiviazione (storage).\"\n"
+"\n"
+"\"Se si sta usando il file di default modificarlo ora scommentando una \"\n"
+"\"delle sezioni di archiviazione del database ZODB\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Questo non è un file database di SchoolTool 0.10, operazione annullata.\n"
+"\n"
+"Lanciare il singolo script di aggiornamento del database\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Benvenuti nel server di SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Preferenze del calendario"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Modifica le preferenze della persona"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Persone"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Programmazione per ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Legenda:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuti"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "ricorsivo"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "domenica"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Non c'è niente da aggiungere"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "La data inserita non appartiene a questo periodo"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Non c'è niente da aggiungere"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Programmazione per ${person}"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "anno precedente"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "successivi"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Luogo"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Aggiungi una classe"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Visualizza"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr "Modifica le informazioni"
+
+#: /src/schooltool/configure.zcml:46
+#, fuzzy
+msgid "Add Info"
+msgstr "Modifica le informazioni"
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Aggiungi una classe"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Informazioni sulla classe"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importa le materie"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Aggiungi una nuova materia"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Nuova materia"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Indice delle materie"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Aggiungi una nuova materia"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Dati insufficenti"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "I titoli non possono essere vuoti"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Questa materia non esiste"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "È necessario l'ID della materia"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Aggiungi una classe a ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Insegnanti"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Insegnanti attuali"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Insegnanti disponibili"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Studenti"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Gruppi"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Risorse"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Indice delle classi"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Aggiungi una nuova classe"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"I dati CSV <strong>devono</strong> includere un titolo di una materia e "
+"<strong>possono</strong> opzionalmente includere una descrizione della "
+"materia.  Qualsiasi altra informazione viene scartata."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Storia antica, Preistoria fino al 1000 d.c.\n"
+"Storia italiana\n"
+"Storia mondiale, dal 1000 al 20° secolo, testo dopo la seconda virgola\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Questo esempio crea tre materie intitolate 'Storia antica', 'Storia "
+"italiana', e 'Storia mondiale'.  La prima e l'ultima materia hanno "
+"rispettivamente le descrizioni 'Preistoria fino al 1000 d.c.' e 'dal 1000 al "
+"20° secolo'.  La seconda materia non ha descrizione mentre il testo \"testo "
+"dopo la seconda virgola\" della terza materia viene ignorata."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Carica le materie schooltool come CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Classi"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "studenti"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Classi di ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "Modifica le informazioni"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Modifica il luogo o il nome di questa classe."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Modifica gli insegnanti per questa classe."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Risorse prenotate: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Modifica gli insegnanti per questa classe."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "modifica gli insegnanti"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "modifiche individuali"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Modifica individualmente gli studenti di questa classe"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Modifica gli studenti di questa classe per gruppi"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "modifica gruppi"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Identificatore (opzionale)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Classe"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Dimensione attuale"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Ci sono ${num_errors} errori di input."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Titolo della materia"
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Descrizione della materia"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Etichetta"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Un identificatore per una classe, composta da insegnante,\n"
+"            nomi, materie e orari degli incontri."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Codifica"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "Id code della classe."
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Descrizione della classe."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Persone"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "marzo"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "scolastico"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Giorno di emergenza"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Giorno di emergenza"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Giorno di emergenza"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Modifica"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Annulla"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Nome utente"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Password"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Questo nome utente è già in uso"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Conferma"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Giornaliero"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Non ce ne sono"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Non ce ne sono"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nome esteso"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (in formato JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Materie"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "Elimina"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "Aggiungi"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "Esci"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Aggiungi una classe"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Modifica l'evento"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+#, fuzzy
+msgid "Grade"
+msgstr "Diplomato"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Gestione studenti"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "Elimina"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Periodo  ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importa i gruppi"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Aggiungi un nuovo gruppo"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Informazioni sulla classe"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Gestisci i gruppi di appartenenza"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Gruppi"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Gruppi"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"I dati CSV <strong>devono</strong> includere un titolo per il gruppo e "
+"<strong>possono</strong> includere una descrizione opzionale per il gruppo.  "
+"Qualsiasi altra informazione viene scartata."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"LUG, Linux Users Groups\n"
+"Circolo scacchi\n"
+"Circolo sportivo, Circolo sportivo del dopo scuola, <em> testo dopo la "
+"seconda virgola</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Questo esempio crea tre gruppi con titolo 'LUG', 'Circolo scacchi' e "
+"'Circolo sportivo'.  Il primo e l'ultimo gruppo hanno rispettivamente la "
+"descrizione 'Linux Users Groups' e 'Circolo sportivo del dopo scuola'.  Il "
+"gruppo 'Circolo scacchi' non ha descrizione mentre il testo \"testo dopo la "
+"seconda virgola\", del terzo gruppo, viene ignorato."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Carica i gruppi SchoolTool come CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "novembre"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "modifica il nome"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Modifica il luogo o il nome di questa classe."
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Indice dei gruppi"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Aggiungi un nuovo gruppo"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Titolo del gruppo"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Descrizione del gruppo"
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Calendario privato"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr "Aggiungi un livello"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr "Modifica livello"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr "Gestione studenti"
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr "Percorso accademico"
+
+#: /src/schooltool/level/browser/level.pt:15
+#, fuzzy
+msgid "This is an initial level."
+msgstr "Questo livello è il livello più basso della scuola"
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "nessuno"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr "Indice dei livelli"
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr "Aggiungi un nuovo livello"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr "Livello precedente"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+"Il precedente livello scolastico.  Se è nello stato 'no value' non ci sono "
+"livelli più bassi."
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "Aggiungi"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "settimana corrente"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Studenti"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+#, fuzzy
+msgid "Student Name (username)"
+msgstr "Gestione studenti"
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "Esci"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+#, fuzzy
+msgid "Inital Level"
+msgstr "È il livello iniziale"
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "Aggiungi"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+#, fuzzy
+msgid "Level Outcome"
+msgstr "Risultato"
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr "Non è stato selezionato alcuno studente."
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr "Studenti regolarmente iscritti."
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr "I percorsi degli studenti sono stati regolarmente aggiornati"
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr "Lavoro terminato."
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr "Livello corrente: $level"
+
+#: /src/schooltool/level/browser/record.pt:107
+#, fuzzy
+msgid "History"
+msgstr "Storia accademica"
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+#, fuzzy
+msgid "Academic Record for ${name}"
+msgstr "Percorso accademico"
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "Esci"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr "Lo stato è stato regolarmente aggiornato."
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr "Il cambiamento di livello è stato regolarmente avviato"
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr "Il cambiamento di livello è stato regolarmente rimosso."
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr "Orario della modifica"
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr "La data e l'ora di creazione del record."
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Utente"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr "L'Id dell'utente che ha fatto il record."
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr "Titolo del record"
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr "Descrizione dettagliata del record"
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr "Storia accademica"
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr "La storia accademica dello studente."
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr "Stato"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr "Lo stato scolastico corrente dello studente."
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr "Diplomato"
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr "Ritirato"
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr "Iscritto"
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr "Percorso del livello"
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+"Il controllo di flusso del livello che lo studente sta attualmente "
+"completando"
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr "Titolo del livello"
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr "Questo livello è il livello più basso della scuola"
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr "Livello successivo"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+"Il livello successivo della scuola. Se  è nello stato 'no value' non ci sono "
+"livelli successivi."
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr "Risultato"
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr "Risultato di livello"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr "fallito"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr "ritirato"
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr "promosso"
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr "Livello"
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr "Il livello iniziale dello studente nella scuola"
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nuovo periodo"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Titolo dell'annotazione"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Corpo"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Corpo dell'annotazione."
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Riservatezza"
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Riservatezza"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Aggiungi il periodo"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Data"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "il nome utente non può essere vuoto"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "il nome esteso non può essere vuoto"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Nome utente duplicato: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importa le persone"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"I dati CSV <strong>devono</strong> contenere un nome utente ed un nome "
+"esteso.  Può essere opzionalmente inclusa anche una password."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"L'esempio precedente crea tre utenti: 'jjones', 'jbjones' e 'howard'.  Dei "
+"tre, solo 'jbjones' ha una password ('r2m45J') ed è in grado di entrare "
+"(login) nel sistema. Notare che le password devono essere inviate in formato "
+"testo."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Carica le persone di SchoolTool come CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Modifica le preferenze per ${user}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Modifica le preferenze della persona"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Ora locale"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Ora locale da mostrare nel calendario"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formato orario"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formato data"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/GG/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAAA-MM-GG"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "giorno, mese, anno"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "La settimana inizia il:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Visualizza le settimane iniziando con le domeniche o con i lunedì"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Mostra i periodi"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Mostra i nomi dei periodi nella vista giornaliera"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Il nome che verrà mostrato"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Relazioni"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Aggiungi un evento"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Modifica l'evento"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Nuovo periodo"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Mostro"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "di"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "elementi"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importa le risorse"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Aggiungi una nuova risorsa"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Informazioni sulla classe"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Risorse"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Risorse"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"I dati CSV <strong>devono</strong> includere un titolo di una risorsa e "
+"<strong>possono</strong> includere una descrizione opzionale della risorsa"
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, Proiettore #302\n"
+"Auditorium principale\n"
+"LC-805, Computer Laptop #805, <em>text after a second comma</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Questo esempio crea tre risorse con nome 'PRJ302', 'Auditorium principale' e "
+"'LC-805'.  La prima e l'ultima risorsa hanno rispettivamente le descrizioni "
+"'Proiettore #302' e ' Computer Laptop #805'.  La risorsa \"Auditorium "
+"principale\" non ha descrizione ed il testo \"text after a second comma\" "
+"della terza risorsa viene ignorato."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "Carica le risorse SchoolTool come CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Indice delle risorse"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Aggiungi una nuova risorsa"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Titolo della risorsa"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Descrizione della risorsa"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Un luogo."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+"Indica che questa risorsa è una località, un punto di incontro, come una "
+"classe."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Relazioni dei calendari"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Calendario ACL"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Questo non sembra un file database di SchoolTool 1.0, operazione annullata.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Questo non è un file database di SchoolTool 1.0, operazione annullata.\n"
+"\n"
+"Lanciare il singolo script di aggiornamento del database\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "top"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Date di eccezione"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Registrati"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Utente:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Scollegati"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Nuovo periodo"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Chiusura della scuola per emergenza"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "La data sostituita non è valida."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+"Chiusura della scuola per emergenza. Modifica nell'orario del giorno "
+"$replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Sostituzione per l'emergenza del giorno $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "La data inserita non è valida.  Usare il formato AAAA-MM-GG"
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "La data inserita non appartiene a questo periodo"
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "La data inserita non è un giorno di scuola"
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"È stato selezionato  ${DYNAMIC_CONTENT} come giorno di emergenza.  Inserire "
+"il giorno sostitutivo.  La selezione sottostante consiste di giorni non "
+"scolastici in questo stesso periodo, successivamente all'emergenza, e di "
+"alquanti giorni dopo tale periodo."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Inserire la data sostitutiva qua sotto."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Sostituzione"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Scegliere una sostituzione (per le attività) del giorno di emergenza"
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Questo modulo consente di segnalare una data come giorno di emergenza non "
+"scolastico e di aggiungere un giorno sostitutivo al periodo."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr "Inserire la data del giorno di emergenza"
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Giorno di emergenza"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Cambia il periodo: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Nuovo periodo"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Periodi"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Aggiungi un nuovo periodo"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Data di inizio"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Data finale"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Settimana ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Aggiungi il periodo"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Salva le modifiche"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Primo, fornire un nome ed la durata del periodo.  Le date sono inclusive "
+"(per es. dal 2005-09-01 al 2005-12-31).  Le date devono essere specificate "
+"nel formato AAAA-MM-GG."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "Le date sono inclusive (per es. dal 2005-09-01 al 2005-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Aggiorna"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"Secondo, specificare quali sono i giorni di scuola e quali sono festivi."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr "Specificare quali sono i giorni di scuola e quali sono festivi."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "scolastico"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "festivo"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Scambia i seguenti giorni della settimana:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "Orario di ${object}"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Data invalida. Usare il formato AAAA-MM-GG"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Data che non appartiene ad alcun periodo definito"
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Alcuni valori non erano validi.  Ora sono evidenziati in rosso."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Modifica dell'orario per un giorno"
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Nuovo orario"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Visualizza gli orari"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Programmazione"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Usare il formato HH:MM per gli orari di inizio e di fine"
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Si deve specificare almeno un periodo"
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Orari della scuola"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Aggiungi un nuovo schema"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Selezionare un valore"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Giorno ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Periodo 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Periodo  ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Schema orario ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"L'orario giornaliero coincide sempre con il giorno della settimana (per es. "
+"di lunedì viene usato il primo orario, il martedì il secondo, e così via)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Gli orari dei giorni sono usati sequenzialmente saltando i giorni che non "
+"sono scolastici (feriali n.d.t.)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Terzo, definire l'ora e la durata dei periodi che cadono in certi giorni "
+"della settimana.  Usare uno dei seguenti formati: <tt>HH:MM</tt> (e non "
+"dimenticare di specificare la durata nel campo di testo sottostante) o "
+"<tt>HH:MM-HH:MM</tt> (quando si desiderano specificare esplicitamente i due "
+"termini orari. Per es.: 9:30-10:15).  Non è necessario definire tutti i "
+"periodi per tutti i giorni della settimana, le omissioni comportano che un "
+"periodo viene saltato se succede che cade in questo giorno della settimana.  "
+"Se l'elenco dei periodi non è aggiornato con le modifiche effettuate nella "
+"precedente tabella premere il pulsante \"Aggiorna\" per allineare la pagina"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Scegli un nome per lo schema orario che desideri creare"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+"Alcune specifiche del periodo erano scorrette e quindi sono state scartate."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Infine, assicurarsi che le informazioni in questo modulo siano corrette in "
+"quanto l'unico modo per correggerle è rimuovere questo schema orario e "
+"ricrearlo."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Crea uno schema di orario"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Primo, definire i giorni ed i periodi dell'orario"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Copia i periodi dal giorno precedente"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Rimuovi questo giorno"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Aggiungi un giorno"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Aggiungi un periodo"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Secondo, selezionare in che modo l'orario giornaliero è allineato con il "
+"calendario"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"Nota: se una classe compare in più di un posto tutte devono essere impostate "
+"a <em>nessuno</em> per rimuoverla"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Orario"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Periodi"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Schema"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Programmazione per ${person}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Scegli"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Questo modulo consente di impostare l'orario di una persona aggiungendola e "
+"rimuovendola dalle classi che hanno sottoclassi (?) nel loro orario."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "come parte di"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "nessuno"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "Conflitto di programmazione."
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Salva"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr "Non ci sono periodi o schemi orari definiti."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Scegli il modello di programmazione."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "Per i/il periodi/o:"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Programmazione per ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Orario utilizzato:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Questo è un semplice sistema per creare uno schema di orario settimanale.  "
+"inserire un numero sufficente di righe per i periodi necessari."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Se si desidera maggior flessibilità si può usare un <a href=\"add.html"
+"\">wizard di aiuto per la creazione dell'orario</a>, o un più complesso <a "
+"href=\"complexadd.html\">schema del modulo di impostazione dell'orario</a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Titolo dell'intervallo (facoltativo)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Ora di inizio"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "Ora di fine"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Crea"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"Con il modulo sottostante è possibile spostare l'inizio e la fine degli "
+"intervalli di tempo per ${DYNAMIC_CONTENT}. Per rimuovere un intervallo da "
+"un giorno cancellare l'orario iniziale e finale."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Titolo dell'elemento orario"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Ora iniziale originale"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Ora finale originale"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Nuovo orario iniziale"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Nuovo orario finale"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Modifica"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Con questo modulo è possibile modificare l'orario  iniziale e finale degli "
+"intervalli di una certa data o di cancellare alcuni intervalli "
+"contemporaneamente."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr "Inserire la data in cui è necessario modificare intervalli"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Scegliere un giorno speciale"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Avanti"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Crea uno schema di orario"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Orario di ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Nuovo schema orario"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+"La scuola usa, per il calcolo dell'orario, i giorni della settimana oppure "
+"un ciclo di rotazione?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Giorni della settimana"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Ciclo di rotazione"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Inserire il nome dei giorni ciclici, uno per riga."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Inserire almeno il nome di un giorno."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Assicurarsi che il nome del giorno sia unico!"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr "Nella scuola tutte le classi iniziano e finiscono al medesimo orario?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Stesso orario ogni giorno"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Orari differenti"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Inserire l'ora di inizio e di fine per ciascun intervallo (usando il formato "
+"HH:MM - HH:MM). Ogni intervallo su una propria riga."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Non è un orario valido per l'intervallo $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Inserire almeno un intervallo."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Inserire l'inizio e la fine per ogni intervallo di ciascun giorno.  Ogni "
+"intervallo su una propria riga."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Inserire almeno un intervallo orario per il $day."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+"Agli intervalli viene dato un nome o quest'ultimo è determinato dal tempo?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Hanno un nome"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Determinato dall'oraDeterminato dal tempo."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Inserire i nomi degli intervalli, uno per riga,"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Inserire almeno $number intervalli"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Assicurarsi che il nome del periodo sia unico."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "La sequenza di periodo è sempre quella o c'è qualcosa nell'aria?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Uguale"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Diverso"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Inserire i periodi in ordine:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Inserire tutti i periodi!"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Questo periodi sono stati selezionati più di una volta: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Inserire i periodi in ordine per ciascun giorno:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period del giorno $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Id giorno sconosciuto: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Id periodo sconosciuto: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Nome utente:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Modifica il nome, l'immagine o la password di questa persona"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Gestisci i gruppi di appartenenza di questa persona"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importa le classi"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "La riga ${line_no} è malformata (dovrebbe contenere l'id giorno, l'id "
+#~ "periodo e opzionalmente un id luogo)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Posizioni non trovate: ${args}"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modifica i dettagli di questa persona"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Materie di insegnamento"
+
+#~ msgid "via group"
+#~ msgstr "modifica per gruppi"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Le mie preferenze"
+
+#~ msgid "Person index"
+#~ msgstr "Indice delle persone"
+
+#~ msgid "Add a new person"
+#~ msgstr "Aggiungi una nuova persona"
+
+#~ msgid "New photo"
+#~ msgstr "Nuova foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Una piccola immagine (circa 48x48 pixel nel formato JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Elimina la foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Premere per eliminare la foto"
+
+#~ msgid "New password"
+#~ msgstr "Nuova password"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifica password"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Le password non corrispondono."
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "La password è stata cambiata"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Le password non corrispondono!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Crea dei nuovi oggetti"
+
+#~ msgid "Add events"
+#~ msgstr "Aggiunta eventi"
+
+#~ msgid "Control access"
+#~ msgstr "Controllo degli accessi"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Utenti registrati"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Utenti non registrati"
+
+#~ msgid "An error occured."
+#~ msgstr "Si è verificato un errore"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Utenti non registrati"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Utente non registrato"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Utenti registrati"
+
+#~ msgid "All Users"
+#~ msgstr "Tutti gli utenti"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: attenzione: è stata ignorata  l'opzione di configurazione '%s'"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Uso: %s [opzioni]\n"
+#~ "Opzioni:\n"
+#~ "  -c, --config xxx       usa questo file di configurazione invece che "
+#~ "quello predefinito\n"
+#~ "  -h, --help             mostra questo messaggio di aiuto\n"
+#~ "  -d, --daemon           va in sottofondo dopo la partenza\n"
+#~ "  -r, --restore-manager  ripristina l'utente manager con la password "
+#~ "predefinita\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Benvenuti nel server di SchoolTool"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Questo non sembra un file database di SchoolTool 0.10, operazione "
+#~ "annullata.\n"
+
+#~ msgid "New Level"
+#~ msgstr "Nuovo livello"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ja/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ja/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ja/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4907 @@
+# Japanese translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:47+0000\n"
+"Last-Translator: Timtak <nospam at nihonbunka.com>\n"
+"Language-Team: Japanese <ja at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "セクション"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "スクールツール"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "カレンダー"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "カレンダー"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "カレンダー"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "カレンダー"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "ナビゲーション"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "カレンダー"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "行2は空白ではありません。"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+#, fuzzy
+msgid "Incomplete section description on line ${line}"
+msgstr "${line}行での情報は不完全です。"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+#, fuzzy
+msgid "The term ${term} does not exist."
+msgstr "${term} という用語は存在しません。"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+#, fuzzy
+msgid "The timetable schema ${schema} does not exist."
+msgstr "${schema} という時間割スキーマは存在しません。"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+#, fuzzy
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+"曜日IDは、選択されている${args}というスキーマの中で定義されていません。"
+
+#: /src/schooltool/app/browser/csvimport.py:550
+#, fuzzy
+msgid "Periods not defined in selected days: ${args}."
+msgstr "時限IDは、選択されている${args}という曜日には定義されていません。"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "${args}という人物は見つかりません"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "${args}という科目が見つかりません。"
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "${args}というセクションが見つかりません。"
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "${args}という登録は不正です。"
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "設定を変更"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "カレンダーの設定を変更"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "カレンダーの設定を変更"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "ユーザー設定を変更"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "ユーザー設定を変更"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "スクールツール"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "スクールツール"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "時間割カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#, fuzzy
+msgid "Daily"
+msgstr "詳細"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+#, fuzzy
+msgid "View weekly calendar"
+msgstr "時間割カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "マイン・カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+#, fuzzy
+msgid "View yearly calendar"
+msgstr "時間割カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Cal"
+msgstr "暦"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Personal calendar"
+msgstr "マイン・カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "時間割カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+#, fuzzy
+msgid "More..."
+msgstr "続く。。。"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "時間割カレンダー"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+#, fuzzy
+msgid "delete-button"
+msgstr "実行ボタン"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "カレンダー"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "詳細"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "ユーザー情報を編集"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "リソース"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "セクション情報を編集"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "ユーザー情報を編集"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "リソース"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "アイテム"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "マイン・カレンダー"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "リソース"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "${title}のユーザー情報"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "リソース"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "科目"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "スクールツールへようこそ"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "セクション情報を編集"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+#, fuzzy
+msgid "Western (ISO-8859-15)"
+msgstr "西ヨーロッパ言語(ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+#, fuzzy
+msgid "Western (Windows-1252)"
+msgstr "西ヨーロッパ言語(Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+#, fuzzy
+msgid "Other (please specify)"
+msgstr "その他(ご指定ください)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "その他: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "CSVデータを入力"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSVデータ"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "実行ボタン"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "時間割を閲覧する"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "スクールツール人物をCSVとしてアップロードする。"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+#, fuzzy
+msgid "Example:"
+msgstr "例:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "CSVファイルをアップロード"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSVファイル"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+#, fuzzy
+msgid "Charset:"
+msgstr "エンコード:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+#, fuzzy
+msgid "Western (ISO-8859-1)"
+msgstr "西ヨーロッパ言語(ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "リソース"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+#, fuzzy
+msgid "Welcome to the SchoolTool server"
+msgstr "スクールツールへようこそ"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "カレンダーの設定を変更"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "ユーザー設定を変更"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "人をインポート"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "セクションを追加"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "セクションを追加"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "セクション情報を編集"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+#, fuzzy
+msgid "Import Courses"
+msgstr "科目をインポート"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "科目を追加"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+#, fuzzy
+msgid "New Course"
+msgstr "新しい科目"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "科目一覧"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "科目を追加"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "科目は存在しません。"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "科目コードが必要です。"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "${course}にセクションを追加"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "グループ"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "リソース"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "セクション一覧"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "セクションを追加"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "スクールツールの科目をCVSとしてアップロード"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "セクション"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+#, fuzzy
+msgid "students"
+msgstr "生徒"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "名前を編集"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "リソース"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "edit individuals"
+msgstr "ユーザー情報を編集"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "セクション"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+#, fuzzy
+msgid "${instructors} -- ${courses}"
+msgstr "${教師} -- ${科目}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "新しい科目"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+#, fuzzy
+msgid "Apply"
+msgstr "変更を実行"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "科目"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "実行ボタン"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+#, fuzzy
+msgid "add-button"
+msgstr "実行ボタン"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "セクションを追加"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "生徒"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "実行ボタン"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "グループをインポート"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "グループを経由"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "セクション情報を編集"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "設定を変更"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "グループ"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "グループ"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "スクールツール人物をCSVとしてアップロードする。"
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "名前を編集"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "マイン・カレンダー"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "実行ボタン"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "生徒"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "実行ボタン"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "新しい科目"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "人をインポート"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CSVデータは<strong>必ず</>ユーザー名と氏名を含むこと。しかし、パスワードの指"
+"定は<strong>任意</strong>です。"
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"suzukii, 鈴木一郎↵\n"
+"matsuih, 松井秀樹,  r2m45J↵\n"
+"shinjou, 新庄↵\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"上述の用例は、suzukii・matsuih・shinjouという三つのユーザーを作成します。この"
+"三つの内にパスワード('r2m45')を持ってシステムにログインできるのは、matsuih"
+"のみです。注意:パスワードは、純テキストとして送信しなければなりません。"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "スクールツール人物をCSVとしてアップロードする。"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "ユーザー${user}の情報を変更"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "ユーザー設定を変更"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "科目を追加"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+#, fuzzy
+msgid "Showing"
+msgstr "表示中"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+#, fuzzy
+msgid "of"
+msgstr "This is going to involved changing the word order."
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "アイテム"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "リソースをインポート"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "科目を追加"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "セクション情報を編集"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "リソース"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "リソース"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "スクールツールの科目をCVSとしてアップロード"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "カレンダー"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+#, fuzzy
+msgid "User:"
+msgstr "ユーザー名:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+#, fuzzy
+msgid "Refresh"
+msgstr "リソース"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "スクールツール"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "時間割を閲覧する"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "時間割を閲覧する"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "セクションを追加"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "時間割を閲覧する"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "科目"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "時間割を閲覧する"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "${title}のユーザー情報"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "時間割カレンダー"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "時間割を閲覧する"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "この人の名前・写真、またはパスワードを変更"
+
+#, fuzzy
+#~ msgid "Manage this person's memberships"
+#~ msgstr "この人物の属性を管理する"
+
+#~ msgid "Import Sections"
+#~ msgstr "セクションをインポート"
+
+#, fuzzy
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "${line_no}は正しく構成されていません。 (曜日IDと時限IDと場合には場所IDを含"
+#~ "んでいるはずです)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "${args}という場所は見つかりません。"
+
+#, fuzzy
+#~ msgid "Modify this person's details"
+#~ msgstr "このユーザーの情報を編集"
+
+#, fuzzy
+#~ msgid "Sections Taught"
+#~ msgstr "教えられたセクション"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Georgian translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-10-20 03:17+0000\n"
+"Last-Translator: Vladimer Sichinava <alinux at siena.linux.it>\n"
+"Language-Team: Georgian <ka at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "ადამიანები"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 ადამიანი"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ka/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4771 @@
+# Georgian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:47+0000\n"
+"Last-Translator: Vladimer Sichinava <alinux at siena.linux.it>\n"
+"Language-Team: Georgian <ka at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "ახალი გაკვეთილი"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "დაამატე ახალი სექცია"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "ახალი გაკვეთილი"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "ახალი გაკვეთილი"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "დაამატე ახალი სექცია"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "ახალი გაკვეთილი"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "დაამატე ახალი სექცია"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "ახალი გაკვეთილი"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "ახალი გაკვეთილი"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "ახალი გაკვეთილი"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/ko/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ko/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ko/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4762 @@
+# Korean translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Korean <ko at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3156 @@
+# Lithuanian translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-10-30 21:05+0000\n"
+"Last-Translator: Saulius Šopaga <saulius.shopaga at gmail.com>\n"
+"Language-Team: Lithuanian <lt at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Pravardė"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Trumpa pravardė (nick'as) asmeniui"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Pagrindins el. pašto adresas"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Papildomas el. pašto adresas"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Pagrindinis telefonas"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Dažniausiai naudojamas telefono numeris"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Papildomas telefonas"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Papildomas telefono numeris"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Svetainė"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Svetainė ar internetinis dienoraštis"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Pašto adresas"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Asmenys"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 asmuo"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} asmenys(ų)"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Vardas arba slaptažodis klaidingi"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Šie metai"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Galimos grupės"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Kovas"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Sausis"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Vasaris"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Birželis"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Gegužė"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Balandis"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Rugpjūtis"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Rugsėjis"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Liepa"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Kita diena"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Ši diena"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Diena prieš"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Spalis"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Gruodis"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Lapkritis"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Pirmadienis"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Antradienis"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Trečiadienis"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Ketvirtadienis"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Sekmadienis"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Šeštadienis"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Penktadienis"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Pr"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "An"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Tr"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Kt"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pn"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Št"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Sk"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Pavadinimas"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Visą dieną"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Laikas"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Pradžia 24-ių valandų formatu"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Trukmė"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Trukmės tipas"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutės"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Valandos"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dienos"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Vieta"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Aprašymas"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Pasikartojantis"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Kartojasi kiekvieną"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Diena"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Savaitė"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mėnuo"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Metai"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Kartoti kiekvieną"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Intervalas"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Kiekis"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Kol"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "visada"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Įvykių  kiekis"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Kartoti kol"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Savaitės dienos"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Savaitės diena"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Kas mėnesį"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Išskyrus datas"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "ta pati savaitės diena"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "Pirmas"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "Ketvirtas"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "Trečias"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "Antras"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "Penktas"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "paskutinę savaitės dieną"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Paskutinis ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Klaida."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Netinkamas laikas"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Pabaigos data ankstesnė nurodytai pradžios datai"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Netinkama data. Nurodyti YYYY-MM-DD formatu, po vieną eilutėje"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Pridėti įvykį"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Pridėti"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Redaguoti įvykį"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Atnaujinti"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Atnaujintas ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalendoriai"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Kita savaitė"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Ši savaitė"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Praėjusi savaitė"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (${week} savaitė)"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Kitas mėnuo"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Šis mėnuo"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Praėjęs mėnuo"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "${week_no} savaitė"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Kiti metai"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Šie metai"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Praėję metai"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nepateikti duomenys"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Klaida konvertuojant į Unikodą (neteisinga koduotė?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV failo duomenys sėkmingai įkelti."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Klaida įkeliant CSV failo duomenis."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV tekstas sėkmingai įkeltas."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Nepavyko įkelti CSV tekstą"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Nenurodyta koduotė"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Nežinoma koduotė"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Klaida CSV duomenyse, eilutė: ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Klaida konvertuojant į unikodą, eilutė ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Klaida CSV duomenyse, eilutė: ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Asmens info: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Paketimai išsaugoti."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "visą dieną"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Patalpa: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Užsakyti resursai: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "periodinis"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "%s denginys"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "%s kalendorius dienomis"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "%s kalendorius savaitėmis"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "%d (%s - %s) savaitė, %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "%s kalendorius menesiais"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "PDF palaikymo nėra. Kreiptis į sistemos administratorių"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "%s kalendorius"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Mokyklos ar įstaigos pavadinimas, kurioje dirba\n"
+"            ši tarnybinė stotis. Tai bus atvaizduota viešame kalendoriuje, \n"
+"            puslapių apačioje ir puslapio antraštėje."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Pradinio puslapio kalendorius"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Rodyti visos svetainės kalendorių kaip pradinį puslapį\n"
+"            svetainei."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Nenurodytas reikiamas įvedimas."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Formos įvedimas nėra failas"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Netinkamas sveikas duomuo"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Netinkamas tekstinis duomuo"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Netinkamas teksto duomuo"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Netinkamas unikodinis duomuo"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Netinkamas dešimtainis duomuo"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Netinkama laiko reikšmė"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Pereinama į foninį režimą, proceso id %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "% -h iškvies paaiškinimus"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: foninis darbo režimas šioje operacijų sistemoje negalimas."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Skaitoma konfigūracija iš %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Tvarkytojas"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Pradžia: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr "Nepavyko atverti duomenų bazės: %s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Gal būt kita %s sesija jį naudoja?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Perspėjimas: nerasta reportlab biblioteka.\n"
+"PDF palaikymas išjungtas."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Perspėjimas: šriftų aplanko '%s' nėra.\n"
+"PDF palaikymas išjungtas."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Perspėjimas: '%s' šrifto nėra.\n"
+"PDF palaikymas išjungtas."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Naudojimas: %s [parametrai]\n"
+"Parametrai:\n"
+"  -c, --config xxx naudoti šį konfiguracijos failą vietoje numatytojo\n"
+"  -h, --help iškviesti šį pagalbos tekstą\n"
+"  -d, --deamon veikti foniniu režimu po paleisties\n"
+"  -r, --restore-manager atstatyti vartotoją manager su numatytuoju "
+"slaptažodžiu\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Nenurodyta saugykla konfigūracijos faile\n"
+"\n"
+"Jei naudojamas numatytasis konfiguracijos failas, reikia jame\n"
+"pašalinti komentaro žymes vienam iš ZODB saugyklos aprašų.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Tai nėra SchoolBell 1.0 duomenų bazės failas.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Tai nėra SchoolBell 1.0 duomenų bazės failas.\n"
+"\n"
+"Įvykdykite atskirai duomenų bazės atnaujinimo programą.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Pavadinimas"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Pastabos antraštė"
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grupė"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Trukmė"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Data"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Resursų indeksas"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Pridėti naują resursą"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Įvesta nepakankamai duomenų"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Būtina nurodyti pavadinimą"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+#, fuzzy
+msgid "Need a course ID."
+msgstr "Pridėti Resursą"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+#, fuzzy
+msgid "Add a Section to ${course}"
+msgstr "Pridėti naują resursą"
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Grupės iki šiol"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Galimos grupės"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Šis mėnuo"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Galimos grupės"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupės"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Grupės iki šiol"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Galimos grupės"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Resursai"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Įkelti Resursus"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Laisvi resursai"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Asmens indeksas"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Naujas asmuo"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Resurso pavadinimas"
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Resurso aprašymas"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Grupės aprašymas"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Svetainė"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Atšaukti"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Keisti ${user} duomenis"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Keisti Narystę"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Pakeisti ${user} parinktis"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Pakeisti ${user} kontaktinius duomenis"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Pakeisti ${user} kontaktinius duomenis"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Kontaktiniai duomenys"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Vartotojo vardas"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Slaptažodis"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Šis vardas jau naudojamas!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Taikyti"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Pagrindinis telefonas"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Ankstesnis"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+#, fuzzy
+msgid "Enrollment date"
+msgstr "Išskyrus datas"
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Įvykio info"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Pravardė"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Prasideda"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Št"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Laiko juosta"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Papildomas telefonas"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Pastabos"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Toliau"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Įvykių  kiekis"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "keisti vardą"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "keisti vardą"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "keisti vardą"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Mano parinktys"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Vardas ir pavardė"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Nuotrauka"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Nuotrauka (JPEG formatu)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nauja Pastaba"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV tekstas sėkmingai įkeltas."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Slaptažodis sėkmingai pakeistas!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Slaptažodis sėkmingai pakeistas!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Pavyzdys:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Informacija apie asmenį"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Grupės indeksas"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Pridėti naują grupę"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "${title} grupės"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "${title} nariai"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Esantys nariai"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Pridėti narius"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Grupės pavadinimas"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Grupės aprašymas"
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Resursų rodykė"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Naujas asmuo"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Praėjusi savaitė"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV tekstas sėkmingai įkeltas."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Slaptažodis sėkmingai pakeistas!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Ši savaitė"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Slaptažodis sėkmingai pakeistas!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Vartotojas"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Resurso pavadinimas"
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Resurso aprašymas"
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Prasideda"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Pastabos antraštė"
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Kita savaitė"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Pastabos antraštė"
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Dienai"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Pastabos antraštė"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Tekstas"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Pastabos tekstas"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Privatumas"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "neįvestas vartotojo vardas"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Nenurodytas pilnas vardas ir pavardė"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Toks vartotojo vardas jau yra: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Naujas slaptažodis"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Pakeisti slaptažodį"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Laiko juosta"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Laiko juosta, pagal kurią rodyti jūsų kalendorių"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Laiko formatas"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datos formatas"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/YY"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "YYYY-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Diena, Mėnuo, Metai"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Savaitės pirmoji diena:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Savaites rodyti pradedant sekmadieniu ar pirmadieniu"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Rodyti kalendorių"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Tai, kas bus rodoma formose"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Resursų rodykė"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Naujas asmuo"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Resursų rodykė"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Pridėti naują resursą"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Resurso pavadinimas"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Resurso aprašymas"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Tai patalpa"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Nurodo, kad resursas yra patalpa, pvz. kabinetas"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Įvesta nepakankamai duomenų"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Įvesta nepakankamai duomenų"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Įvesta nepakankamai duomenų"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Mano kalendorius"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Daugiau..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendoriai"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Jus sveikina SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Nuotrauka"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Vartotojo vardas"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "keisti vardą"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Keisti šio asmens vardą, nuotrauką ar slaptažodį"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Asmens info: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Tvarkyti šio asmens narystę grupėse"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "redaguoti grupes"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Tai nėra SchoolBell 1.0 duomenų bazės failas.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Tai nėra SchoolBell 1.0 duomenų bazės failas.\n"
+"\n"
+"Įvykdykite atskirai duomenų bazės atnaujinimo programą.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "viršus"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Paketimai išsaugoti."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+#, fuzzy
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "Netinkama data. Nurodyti YYYY-MM-DD formatu, po vieną eilutėje"
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Keisti Elementus"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nauja Pastaba"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "vienetų"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Naujas asmuo"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Prasideda"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Išskyrus datas"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Netinkama data. Nurodyti YYYY-MM-DD formatu, po vieną eilutėje"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Pridėti naują resursą"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} asmenys(ų)"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+#, fuzzy
+msgid "Period ${number}"
+msgstr "${number} asmenys(ų)"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Pastabos tekstas"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "ta pati savaitės diena"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "keisti vardą"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Pastaba"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Nežinoma koduotė"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+#, fuzzy
+msgid "Unknown period id: %r"
+msgstr "Nežinoma koduotė"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Person index"
+#~ msgstr "Asmens indeksas"
+
+#~ msgid "Add a new person"
+#~ msgstr "Naujas asmuo"
+
+#~ msgid "New photo"
+#~ msgstr "Nauja nuotrauka"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Paveikslėlis (maždaug 48x48 dydžio, JPEG formato)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Ištrinti nuotrauką"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Pažymėkite čia, jei norite ištrinti nuotrauką"
+
+#~ msgid "Verify password"
+#~ msgstr "Patvirtinti slaptažodį"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Slaptažodžiai nesutampa"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Slaptažodžiai nesutampa!"
+
+#~ msgid "View"
+#~ msgstr "Rodyti"
+
+#~ msgid "Edit"
+#~ msgstr "Taisyti"
+
+#~ msgid "Create new objects"
+#~ msgstr "Sukurti naują objektą"
+
+#~ msgid "Add events"
+#~ msgstr "Pridėti įvykius"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Redaguoti/pašalinti įvykius"
+
+#~ msgid "Control access"
+#~ msgstr "Prieeigos valdymas"
+
+#~ msgid "Manage membership"
+#~ msgstr "Tvarkyti narystę"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Registruoti vartotojai"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Neregistruoti vartotojai"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Nustatyti Prieeigą"
+
+#~ msgid "New Note"
+#~ msgstr "Nauja Pastaba"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Keisti Nustatymus"
+
+#~ msgid "Change Details"
+#~ msgstr "Keisti kontaktinius duom."
+
+#~ msgid "New Person"
+#~ msgstr "Naujas Asmuo"
+
+#~ msgid "Import Persons"
+#~ msgstr "Įkelti Asmenis"
+
+#~ msgid "Add a Group"
+#~ msgstr "Pridėti Grupę"
+
+#~ msgid "New Group"
+#~ msgstr "Nauja Grupė"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Redaguoti Grupės duomenis"
+
+#~ msgid "A Group"
+#~ msgstr "Grupė"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell Grupė"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Pridėti/Šalinti Narius"
+
+#~ msgid "Import Groups"
+#~ msgstr "Įkelti Grupes"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Pridėti Resursą"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Redaguoti duomenis apie Resursą"
+
+#~ msgid "New Resource"
+#~ msgstr "Naujas Resursas"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell Resursas"
+
+#~ msgid "A Resource"
+#~ msgstr "Resursas"
+
+#~ msgid "Actions"
+#~ msgstr "Veiksmai"
+
+#~ msgid "View Calendar"
+#~ msgstr "Rodyti Kalendorių"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalendorius (Dienos)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Kalendorius (Dienomis, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalendorius (Savaitėmis)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalendorius (Savaitėmis, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalendorius (Mėnesiais)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalendorius (Mėnesiais, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalendorius (Metais)"
+
+#~ msgid "Atom View"
+#~ msgstr "Rodyti elementus"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Laisva/Užimta"
+
+#~ msgid "New Event"
+#~ msgstr "Naujas Įvykis"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Atverti su iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Redaguoti Įvykį"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Keisti bendrus nustatymus"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Suteikia galimybę matyti vardus, pavadinimus, nuotraukas, objektų sąrašus "
+#~ "ir kitą informaciją."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr ""
+#~ "Suteikia galimybę keisti vardus, pavadinimus, aprašymus, nuotraukas, ir t."
+#~ "t."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Suteikia vartotojui teisę įvesti asmenis, grupes, resursus"
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Leisti matyti asmenų, grupių ir įvykių kalendorius."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Leisti pridėti įvykius kalendoriuose."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Leisti redaguoti ir šalinti įvykius kalendoriuose."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "${title} prieeigos valdymas"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Leisti vartotojui naudoti šią formą (Prieeigos valdymas)"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Leisti vartotojui pridėti asmenis, grupes, resursus grupėms. Keičiant "
+#~ "vartotojui grupės elementus, reikalingas tik leidimas grupei. "
+#~ "Nepamirškite, kad sujungiant grupes, galimos saugumo komplikacijos."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Leidimai Grupėms"
+
+#~ msgid "Access control"
+#~ msgstr "Prieeigos valdymas"
+
+#~ msgid "Set Access"
+#~ msgstr "Nustatyti prieigą"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Leidimai vartotojams"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Leidimai yra paveldimi turinio hierarchijos atžvilgiu. Pvz. nustačius "
+#~ "View Calendar galimybę vartotojui Asmenų Indekse, nurodytas vartotojas "
+#~ "galės matyti visų asmenų kalendorius. Norint apriboti vartotoją tik tam "
+#~ "tikrų resursų kalendoriumi, galima nustatyti View Calendar galimybę "
+#~ "vartotojui tik tam resursui."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "Žemiau yra sąrašas vardų galimybėms kartu su jų išsamesniais "
+#~ "paaiškinimais."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Keisti bendras parinktis"
+
+#~ msgid "General preferences"
+#~ msgstr "Bendros parinktys"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Redaguoti bendras parinktis"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Scholltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Įvykiai"
+
+#~ msgid "atom_description"
+#~ msgstr "smulkus aprašymas (atom description)"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Patalpa: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Išrinkti papildomus kalendorius rodymui"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Laikykite nuspaudę Ctrl arba Shift, kad išrinkti keletą kalendorių"
+
+#~ msgid "Public Calendar"
+#~ msgstr "Viešas kalendorius"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "Bendras visiems kalendorius"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Išrinkti kalendorius rodymui"
+
+#~ msgid "People"
+#~ msgstr "Asmenys"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Nėra asmenų, kurių kalendorius būtų prieinamas"
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Nėra grupių, kurių kalendorius būtų prieinamas"
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Nėra resursų, kurių kalendorius būtų prieeinamas"
+
+#~ msgid "Showing"
+#~ msgstr "Rodoma"
+
+#~ msgid "of"
+#~ msgstr "iš"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Tikrai norite pašalinti pažymėtus elementus?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Nepažymėtas joks elementas"
+
+#~ msgid "delete-button"
+#~ msgstr "Pašalinti"
+
+#~ msgid "Exception"
+#~ msgstr "Išimtis"
+
+#~ msgid "Traceback"
+#~ msgstr "Peržvalga (traceback)"
+
+#~ msgid "Server Error"
+#~ msgstr "Tarnybinės stoties klaida"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Tarnybinės stoties vidinė klaida. Tai greičiausia reiškia, kad aptikote "
+#~ "klaidą SchoolBell programoje. Galite pranešti apie tai <a href=\"http://"
+#~ "issues.schooltool.org\"> klaidų rinktuvėje (issue tracker) </a>."
+
+#~ msgid "All day event"
+#~ msgstr "Visą dieną"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Tai pasikartojantis įvykis"
+
+#~ msgid "Ends"
+#~ msgstr "Baigiasi"
+
+#~ msgid "edit event"
+#~ msgstr "redaguoti įvykį"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Keisti šio įvykio detales"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Įtraukti į tvarkaraščius resursai"
+
+#~ msgid "edit resources"
+#~ msgstr "redaguoti resursus"
+
+#~ msgid "delete event"
+#~ msgstr "šalinti įvykį"
+
+#~ msgid "Event details"
+#~ msgstr "Įvykio detalės"
+
+#~ msgid "Book Resources"
+#~ msgstr "Užsakyti resursus"
+
+#~ msgid "Update form"
+#~ msgstr "Atnaujinti formą"
+
+#~ msgid "day"
+#~ msgstr "diena"
+
+#~ msgid "week"
+#~ msgstr "savaitė"
+
+#~ msgid "month"
+#~ msgstr "mėnuo"
+
+#~ msgid "year"
+#~ msgstr "metai"
+
+#~ msgid "Weekly"
+#~ msgstr "Kas savaitę"
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Kiekvieno mėnesio ${monthday} dieną"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "Kiekvieno mėnesio ${weekday} savaitės dieną"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "Kiekvieno mėnesio ${DYNAMIC CONTENT}"
+
+#~ msgid "Repeat"
+#~ msgstr "Kartoti"
+
+#~ msgid "times"
+#~ msgstr "kartų(-us)"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Kartoti amžinai"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Užsakyti resursus"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "${title} resursų užsakymas"
+
+#~ msgid "Title:"
+#~ msgstr "Pavadinimas:"
+
+#~ msgid "Starts:"
+#~ msgstr "Prasideda:"
+
+#~ msgid "Ends:"
+#~ msgstr "Baigiasi"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Tai pasikartojantis įvykis!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Resursų užsakymas"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Susikertantys įvykiai"
+
+#~ msgid "Book"
+#~ msgstr "Užsakyti"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "CSV duomenyse <strong> būtinas </strong> grupės vardo laukas ir <strong> "
+#~ "galimas </strong> (eilutėje po pirmojo kablelio) neprivalomas grupės "
+#~ "aprašymo laukas. Simboliai po antrojo kablelio eilutėje bus pašalinti."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LVG, Linux Vartotojų Grupė\n"
+#~ "Šachmatų Klubas\n"
+#~ "Sporto Klubas, Popamokinis sporto klubas, <em>tekstas po antrojo "
+#~ "kablelio</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Pavyzdys, kaip sukuriamos 3 grupės vardu 'LVG', 'Šachmatų Klubas' ir "
+#~ "'Sporto Klubas'. Pirmoji ir trečioji grupė turi aprašymo laukus 'Linux "
+#~ "Vartotojų Grupė' ir 'Popamokinis sporto klubas' atitinkamai. Grupė "
+#~ "'Šachmatų klubas' neturi aprašymo, o trečioje eilutėje \"tekstas po "
+#~ "antrojo kablelio\" ingnoruojamas"
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Įkelti schooltool grupes CSV formatu"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Įkelti CSV failą"
+
+#~ msgid "CSV File"
+#~ msgstr "CSV failas"
+
+#~ msgid "Charset:"
+#~ msgstr "Simbolių lentelė:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unikodas (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Vakarų (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Vakarų (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Vakarų (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Kita (nurodykite, prašau)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Kita simbolių lentelė: ${other charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "CSV duomenų įvedimas"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV duomenys"
+
+#~ msgid "Members"
+#~ msgstr "Nariai"
+
+#~ msgid "edit members"
+#~ msgstr "keisti narius"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Keisti asmenis, priklausančius šiai grupei"
+
+#~ msgid "Remove"
+#~ msgstr "Pašalinti"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Nėra suteikta galimybė atverti šį puslapį. Grįžkite į ankstesnį puslapį "
+#~ "arba paprašykite kito vartotojo, kuriam šis puslapis prienamas, "
+#~ "įsiregistruoti."
+
+#~ msgid "Please log in"
+#~ msgstr "Prašome įsiregistruoti"
+
+#~ msgid "Login"
+#~ msgstr "Įsiregistruoti"
+
+#~ msgid "User Information"
+#~ msgstr "Vartotojo duomenys"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Išseko įsiregistravimo galiojimo laikas"
+
+#~ msgid "There are none."
+#~ msgstr "Nėra nė vieno"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "Išsiųsti"
+
+#~ msgid "There are none to add."
+#~ msgstr "Nėra nė vieno"
+
+#~ msgid "Find Now"
+#~ msgstr "Paieška"
+
+#~ msgid "Clear"
+#~ msgstr "Išvalyti"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "Atšaukti"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Kam prienama ši pastaba"
+
+#~ msgid "Private"
+#~ msgstr "Asmeninė"
+
+#~ msgid "Public"
+#~ msgstr "Vieša"
+
+#~ msgid "Add note"
+#~ msgstr "Pridėti pastabą"
+
+#~ msgid "add-button"
+#~ msgstr "Pridėti"
+
+#~ msgid "Delete"
+#~ msgstr "Pašalinti"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "P"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Gal klaidingai surinkote adresą?"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Nėra puslapio tokiu adresu"
+
+#~ msgid "Not Found"
+#~ msgstr "Nerasta"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "Puslapis neprienamas"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "CSV duomenyse <strong> būtinas </strong> vartotojo vardas ir pilnas "
+#~ "vardas. Taip pat <strong> gali</strong> būti įrašytas neprivalomas "
+#~ "slaptažodžio laukas"
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jonas, Jonas Pytonas\n"
+#~ "Bitė Baltaritė, Bitė-Marija Baltaritė, 342552\n"
+#~ "scile, Sicilija\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "Pavyzdys, kaip sukuriami trys vartotojai, 'jonas', 'Bitė Baltaritė' ir "
+#~ "'scile'. Iš jų tik 'Bitė Baltaritė' turi slaptažodį ir galės "
+#~ "įsiregistruoti sistemoje. Slaptažodis turi būti siunčiamas paprastu "
+#~ "tekstu."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Išsiųsti schooltool asmenų įrašus CSV formatu"
+
+#~ msgid "Details"
+#~ msgstr "Kontaktai"
+
+#~ msgid "edit details"
+#~ msgstr "redaguoti kontaktinius duomenis"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Taisyti šio asmens kontaktinius duomenis"
+
+#~ msgid "Add person"
+#~ msgstr "Pridėti asmenį"
+
+#~ msgid "Add to groups"
+#~ msgstr "Papildyti grupes"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Deja, jūs negalite ištrinti savo paties registracijos"
+
+#~ msgid "Edit contact information"
+#~ msgstr "Redaguoti kontaktinius duomenis"
+
+#~ msgid "Edit person"
+#~ msgstr "Redaguoti asmenį"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Kalendoriaus parinktys"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Taisyti asmens parinktis"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Norite pašalinti pasikartojantį įvykį"
+
+#~ msgid "Current"
+#~ msgstr "Ligšiolinis"
+
+#~ msgid "Future"
+#~ msgstr "Būsimas"
+
+#~ msgid "All"
+#~ msgstr "Visi"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Šalinamas pasikartojantis įvykis (${event title}"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "CSV duomenyse <strong> būtinas </strong> resurso vardas ir <strong> "
+#~ "galima </strong> įtraukti nebūtiną resurso aprašymą. Perteklinė (po "
+#~ "antrojo kablelio) informacija eilutėje bus pašalinta."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Multimedia projektorius #302\n"
+#~ "Sporto Salė\n"
+#~ "LC-01, Nešiojamas kompiuteris #01, <em> tekstas po antrojo kablelio </"
+#~ "em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Pavyzdys, kaip sukuriami 3 resursai vardu 'PRJ302', 'Sporto Salė' ir 'LC-"
+#~ "301'. Pirmas ir trečiasis dar turi aprašymus, 'Multimedia projektorius "
+#~ "#302' ir 'Nešiojamas kompiuteris #01' atitinkamai, 'Sporto Salė' neturi "
+#~ "aprašymo lauko, o \"tekstas po antrojo kablelio\" trečioje eilutėje bus "
+#~ "atmestas"
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Išsiųsti schooltool resursų įrašus CSV formatu"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "Yra ${num_errors} įvedimo klaidų."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identifikatorius (nebūtinas)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; Shuttleworth Fondas 2003 - <span>2005</span>: Visuomeninių "
+#~ "inovacijų palaikymas. </p> <p> SchoolTool&trade; yra Shuttleworth Fondo "
+#~ "prekinis ženklas. </p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Versija spausdinimui"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Rodyti kalendorių dienai"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Rodyti kalendorių savaitei"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Rodyti kalendorių menesiui"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Rodyti kalendorių metams"
+
+#~ msgid "Yearly"
+#~ msgstr "Metams"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "${title} kalendorius - ${calendar title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Pereiti į ..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Kitos dienos įvykiai"
+
+#~ msgid "Log in"
+#~ msgstr "Įsiregistruoti"
+
+#~ msgid "User:"
+#~ msgstr "Vartotojas:"
+
+#~ msgid "Log Out"
+#~ msgstr "Išsiregistruoti"
+
+#~ msgid "Edit Info"
+#~ msgstr "Taisyti duomenis"
+
+#~ msgid "Add Event"
+#~ msgstr "Pridėti įvykį"
+
+#~ msgid "Modify Event"
+#~ msgstr "Taisyti įvykį"
+
+#~ msgid "Set up access"
+#~ msgstr "Nustatyti prieeigą"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Neidentifikuoti vartotojai"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Neidentifikuotas vartotojas"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Registruoti vartotojai"
+
+#~ msgid "All Users"
+#~ msgstr "Visi vartotojai"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: dėmesio: konfigūracijos nustatymas '%s' atmestas"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/lt/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5248 @@
+# Lithuanian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-07-29 09:55+0000\n"
+"Last-Translator: Saulius Šopaga <saulius.shopaga at gmail.com>\n"
+"Language-Team: Lithuanian <lt at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Pravardė"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Trumpa šio asmens pravardė"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "E-pašto adresas"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Papildomas e-pašto adresas"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telefono nr."
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Rekomenduojamas telefono numeris."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Papildomas telefonas"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Papildomas, kitas telefono numeris"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Svetainė"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Internetinė svetainė ar internetinis dienoraštis"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Pašto adresas"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Asmenys"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 asmuo"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} asmenys(ų)"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Vardas arba slaptažodis klaidingi"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Kovas"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Sausis"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Vasaris"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Birželis"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Gegužė"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Balandis"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Rugpjūtis"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Rugsėjis"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Liepa"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Kita diena"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Ši diena"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Diena prieš"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Spalis"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Gruodis"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Lapkritis"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Pirmadienis"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Antradienis"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Trečiadienis"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Ketvirtadienis"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Sekmadienis"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Šeštadienis"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Penktadienis"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Pr"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "An"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Tr"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Kt"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pn"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Št"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Sk"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Pavadinimas"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Visą dieną"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Laikas"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Pradžia 24 val. formatu"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Trukmė"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Trukmės tipas"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minutės"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Valandos"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dienos"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Patalpa"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Aprašymas"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Periodinis"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Vyksta kiekvieną"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Diena"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Savaitė"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Mėnuo"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Metai"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Kartoti kiekvieną"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Sritis"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Kiekis"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Kol"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "visada"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Viso renginių"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Kartoti kol"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Savaitės dienos"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Savaitės diena"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Kas mėnesį"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Iškyrus datas"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "ta pati savaitės diena"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1-as"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4-tas"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3-ias"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2-as"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5-as"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "paskutinė savaitės diena"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Paskutinis ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Klaida"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Netinkamas laikas"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Pabaiga ankstesnė už pradžią"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Netinkama data. Įrašykite formatu YYYY-MM-DD, po vieną eilutėje."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Įtraukti renginį"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Pridėti"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Redaguoti renginį"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Atnaujinti"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Atnaujintas ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalendorius"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Kita savaitė"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Ši savaitė"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Ankstesnė savaitė"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (${week} savaitė)"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Kitas mėnuo"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Šis mėnuo"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Ankstesnis mėnuo"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Savaitė ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Kiti metai"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Šie metai"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Ankstesni metai"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Veiksmai"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalendorius"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalendorius"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalendorius"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalendorius"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Rodymas"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalendorius"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Įtraukti renginį"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Redaguoti renginį"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Prisijungti"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Veiksmai"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalendorius"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nepateikti duomenys"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Klaida konvertuojant į Unikodą (klaidinga simbolių lentelė?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV failo duomenys sėkmingai įkelti."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Klaida įkeliant CSV failo duomenis."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV tekstas sėkmingai įkeltas"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Klaida įkeliant CSV formato tekstą"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Nenurodyta simbolių lentelė"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Nežinoma simbolių lentelė"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Klaida CSV duomenyse, eilutėje ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Nepavyko konvertuoti į unikodą, eilutė ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "2-a eilutė netuščia"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr "Klaida eilutėje ${line_no} (reikia dienos id ir pamokos id)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Nepilnas kurso aprašymas ${line} eilutėje"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Pirmoje CSV bylos eilutėje rašome semestro id ir tvarkaraščio schemos id"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Nėra tokio ${term} semestro."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Nėra tokios tvarkaraščio schemos: ${schema}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Klaida tvarkaraščio CSV duomenyse, eilutė ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Neaprašytų pažymėtoje schemoje dienų ID: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Langai pažymėtose dienose: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Nėrasta šių asmenų: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Nėrasta šių dalykų: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Nėra tokių kursų: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Netinkami įrašai: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Paketimai išsaugoti."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "Visą dieną"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Patalpa: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Užsakyti resursai: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "periodinis"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "$s perdenginys"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Dienos kalendorius %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Savaitės kalendorius %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Savaitė %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Mėnesio kalendorius %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"PDF galimybės atjungtos. Teirautis tarnybinės stoties administratoriaus."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Pakeisti Nustatymus"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Kalendoriaus Parinktys"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Kalendoriaus Parinktys"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Keisti parinktis asmeniui"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Keisti parinktis asmeniui"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Aprašymas"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+#, fuzzy
+msgid "atom_enabled"
+msgstr "nacionalinis"
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Pereiti į ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Rytojaus Įvykiai"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Versija spausdinimui"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Rodyti kalendorių dienai"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Diena po dienos"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Rodyti kalendorių savaitei"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Savaitė po savaitės"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Rodyti kalendorių mėnesiui"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Rodyti kalendorių metais"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Metai po metų"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "${title} - ${calendar_title} kalendorius"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Mano kalendorius"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Tvarkaraščio kalendorius"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Mano Kalendorius"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendoriai"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Daugiau..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalendorius"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Rodyti kalendorių"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Savaitės kalendorius %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "pašalinti"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "Atšaukti"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Šalinti"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Nėra nė vieno"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Surasti"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Išvalyti"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Nėra ko įtraukti"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Įtraukti renginį"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Kontaktiniai duomenys"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Št"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Redaguoti renginį"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Keisti mokytojus šiam kursui"
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Užsakyti resursai: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "Redaguoti grupes"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Keisti/ištrinti įvykius"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Keisti Kurso duomenis"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "Redaguoti kontaktinius duomenis"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Resursai"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Atnaujinti"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Ši diena"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Savaitė"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Mėnuo"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Metai"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Kartoti kol"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Laikas"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Rodyti kalendorių"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Kartoti kiekvieną"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Užsakyti resursai: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Asmens info: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Pavadinimas"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Št"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Resurso indeksas"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "Pakeisti patalpą"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Dalykai"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+#, fuzzy
+msgid "Levels"
+msgstr "Kitas lygmuo"
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Jus sveikina SchollTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Keisti Kurso duomenis"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Prisijungti"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "periodinis"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Visą dieną"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Kita (įrašykite)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Kita simbolių lentelė: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Įvesti CSV Duomenis"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV Duomenys"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "patvirtinti"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Įkelti tvarkaraštį"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"CSV formato duomenis galima paruošti skaičiuoklės programa, išsaugant failą "
+"CSV formatu (Comma-Separated Values - kableliu atskirtos reikšmės). Lentelės "
+"laukai aprašyti žemiau."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"Pirmoji failo eilutė - <strong> semestro </strong> pavadinimas ir <strong> "
+"tvarkaraščio schema </strong>, kuri bus naudojama naujiems tvarkaraščiams. "
+"Antroji eilutė turi būti tuščia. Toliau rašomi kursų komponentai, kursai "
+"atskiriami tuščia eilute."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+#, fuzzy
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+"Kiekvieno kurso aprašyme pirmoje eilutėje rašomas <strong>dalyko id </"
+"strong> ir <strong>mokytojo id</strong> kursui. Po to kiekvienoje eilutėje: "
+"<strong>dienos id</strong>, <strong>pamokos numeris</strong> ir nebūtinas "
+"<strong>patalpos id</strong>. Eilučių skaičius atitiks kurso pamokų skaičių "
+"duotoje tvarkaraščio schemoje. Kurso aprašymas baigiamas trijų žvaigždučių "
+"seka atskiroje eilutėje ('***'). Po to dar gali sekti <strong>asmens id</"
+"strong> sąrašas, reiškiantis mokinius kurse."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Išsiųsti SchoolTool tvarkaraštį CSV formatu"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Pavyzdys:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-pavasaris\",\"savaitinis\"\n"
+"\"\",\"\",\"\"\n"
+"\"Biologija_11B\",\"Petraitis_J\"\n"
+"\"Pr\",\"2\",\"K010\"\n"
+"\"Kt\",\"4\",\"K010\"\n"
+"\"***\"\n"
+"\"mok_012\"\n"
+"\"mok_045\"\n"
+"\"\"\n"
+"\"Fizika_12A\",\"Jonaitis_P\"\n"
+"\"Tr\",\"1\",\"K221\"\n"
+"\"Pn\",\"6\",\"K221\"\n"
+"\"***\"\n"
+"\"mok_122\"\n"
+"\"mok_332\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"Pavyzdyje aukščiau bus sukurti du nauji kursai, vienas Biologijos pamokoms, "
+"kitas fizikos pamokoms. Biologijos kursas įtraukia moksleivius, kurių id "
+"atitinkamai \"mok_012\" ir \"mok_045\", ir jų tvarkaraščiuose bus dvi "
+"savaitinės pamokos - pirmadienį antra pamoka ir ketvirtadienį 4-a pamoka."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Rašomi ne komponentų vardai, o jų ID. Jei eilutė baigiasi tuščiu langeliu "
+"(pvz. <em>\"Lietuvių kalba\",\"J.Petraitis\",\"\",\"\"</em>), tai toks "
+"įrašas bus pašalintas. Kursų aprašymus gali skirti daugiau nei viena tuščia "
+"eilutė. Mokinių sąraše įtraukiami po vieną eilutėje. Tuos pačius duomenis "
+"galima įkelti kiek norima kartų nekeičiant prieš tai įkeltų duomenų."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Įkelti CSV failą"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV rinkmena"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Koduotė:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unikodas (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Vakarų (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "%s kalendorius"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Užsakyti resursai: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Mokyklos ar įstaigos pavadinimas, kurioje dirba\n"
+"            ši tarnybinė stotis. Tai bus atvaizduota viešame kalendoriuje, \n"
+"            puslapių apačioje ir puslapio antraštėje."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Pradinio puslapio kalendorius"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Rodyti visos svetainės kalendorių kaip pradinį puslapį\n"
+"            svetainei."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr "Rodyti tvarkaraščius"
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+"\n"
+"            Parinktis, valdanti šio kalendoriaus savininko\n"
+"            tvarkaraščio rodymą kalendoriuje.\n"
+"            "
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Nenurodytas reikiamas įvedimas."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Formos įvedimas nėra failas"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Netinkamas sveikas duomuo"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Netinkamas tekstinis duomuo"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Netinkamas teksto duomuo"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Netinkamas unikodinis duomuo"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Netinkamas dešimtainis duomuo"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Netinkama laiko reikšmė"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Pereinama į foninį režimą, proceso id %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "%s -h iškvies paaiškinimus."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: foninis darbo režimas šioje operacinėje sistemje nagalimas."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Skaitoma konfigūracija iš %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Tvarkytojas"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Pradžia: %.3f sek real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr "Nepavyko atverti duomenų bazės: %s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Gal būt kita %s sesija jį naudoja?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Perspėjimas: nerasta reportlab biblioteka.\n"
+"PDF palaikymas išjungtas."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Perspėjimas: šriftų aplanko '%s' nėra.\n"
+"PDF palaikymas išjungtas."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Perspėjimas: '%s' šrifto nėra.\n"
+"PDF palaikymas išjungtas."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Nenurodyta saugykla konfigūracijos faile\n"
+"\n"
+"Jei naudojamas numatytasis konfiguracijos failas, reikia jame\n"
+"pašalinti komentaro žymes vienam iš ZODB saugyklos aprašų.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Tai ne SchoolTool 0.11 duomenų bazės rinkmena, todėl sustota.\n"
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Tai nėra SchoolTool 0.10 duomenų bazės byla.\n"
+"\n"
+"Įvykdykite atskirą duomenų bazės atnaujinimo programą.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Jus sveikina SchoolTool tarnybinė stotis"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr "Pasiaiškinimas priimtas."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr "Dar nėra pasiaiškinimo."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr "Vėluota į ${section} (${mins} min.)"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr "Nedalyvavo ${section}."
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+"Jūsų įvestą atvykimo laiką reikia taisyti. Teisingas formatas yra HH:MM"
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr "Atvykimo laikas nurodomas tik pavėlavusiems"
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr "Pridėtas pasiaiškinimas $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr "Išsiaiškintas $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr "Atmestas $absence paaiškinimas"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr "Laikyti $absence pavėlavimu"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+"Neleidžiama įtraukti naują paaiškinimą $absence: ankstesnis paaiškinimas "
+"nepriimtas ar atmestas"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr "Nėra neperžiūrėtų $absence paaiškinimų patvirtinimui"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr "Nėra neperžiūrėtų $absence paaiškinimų atmetimui"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+"$absence nėra sąšaukos praleidimas, tik sąšaukos praleidimai gali būti "
+"pakeisti į pavėlavimus"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr "Negalimas $absence praleidimo pakeitimas į vėlavimą sąšaukon"
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr "sąšauka"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr "$date $time: praleista $section"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr "$date $time: pavėlavimas $section, atvykimo laikas $late_arrival"
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+#, fuzzy
+msgid "Attendance"
+msgstr "Lankomumo žymių kodai"
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Kalendoriaus Parinktys"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Keisti parinktis asmeniui"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+#, fuzzy
+msgid "Students with unresolved absences"
+msgstr "Išsiaiškintas $absence"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Asmenys"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "${section} tvarkaraštis"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Legenda:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minutės"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "Pristatymas"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+#, fuzzy
+msgid "Absent"
+msgstr "Užduotis"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Sekmadienis"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Nėra ko įtraukti"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "Įvesta data nepriklauso šiam semestrui."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Nėra ko įtraukti"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "${person} darbotvarkė"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+#, fuzzy
+msgid "Unresolved explained absences"
+msgstr "Išsiaiškintas $absence"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+#, fuzzy
+msgid "Unresolved unexplained absences"
+msgstr "Išsiaiškintas $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr "$title"
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr "Lankomumo žymių kodai"
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr "Lankomumo žymių kodų santrumpų žodynas"
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr "Lankomumo pratęsimo laikas"
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+"\n"
+"            Laiko tarpas minutėmis, turintis praeiti po to, kai baigėsi\n"
+"            kurso pamoka, kad lankomumo forma pasikeistų\n"
+"            iš \"realaus laiko\" į \"praėjusio įvykio\" būseną."
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr "Sąšaukos leistina vėlavimo trukmė"
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Ankstesni metai"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Toliau"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr "<nežinomas>"
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "nacionalinis"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Pridėti Kursą"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr "Pagyrimo antraštė"
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr "Pagyrimo smulkus aprašymas"
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr "Sritis"
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr "Pagyrimo sritis"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr "Mokyklos mąstu"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr "grupė"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr "bendruomenė"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr "visuotinas"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr "nacionalinis"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr "rajono"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr "rašto išdavimo data"
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr "Suteikėjas"
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Rodymas"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Redaguoti renginį"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Pridėti Kursą"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Keisti Kurso duomenis"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Įkelti Dalykus"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Pridėti naują dalyką"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Naujas Dalykas"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Dalyko indeksas"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Pridėti naują dalyką"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Nepakanka duomenų."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Neįrašyti pavadinimai"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Nėra tokio dalyko"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Neįvestas dalyko ID"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Pridėti kursą dalykui: ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Mokytojai"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Dirba mokytojai"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Laisvi mokytojai"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Mokiniai"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr "Mokiniai"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr "Galimi mokiniai"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grupės"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Esamos grupės"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Galimos grupės"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Resursai"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr "Dabartiniai resursai"
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr "Laisvi resursai"
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Kurso indeksas"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Pridėti naują kursą"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV duomenyse <strong> būtinas </strong> dalyko pavadinimas ir <strong> "
+"galimas </strong> dalyko aprašymas. Papildomi laukai ignoruojami."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Senovės Istorija, Nuo senovės laikų iki 1000 m. po Kristaus\n"
+"Lietuvos Istorija\n"
+"Pasaulio istorija, nuo  1000-ųjų metų iki 20 amžiaus, tekstas po antrojo "
+"kablelio\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Pavyzdyje aukščiau bus sukurti 3 dalykai: 'Senovės istorija', 'Lietuvos "
+"istorija', 'Pasaulio istorija'. Pirmasis ir trečiasis turės dar ir aprašymus "
+"- 'Nuo senovės laikų iki 1000 m. po Kristaus' ir 'nuo  1000-ųjų metų iki 20 "
+"amžiaus' atitinkamai. Antrasis bus be aprašymo, o trečioje eilutėje "
+"\"tekstas po antrojo kablelio\" bus atmestas."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Įkelti dalykus CSV formatu"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Kursai"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr "nuotrauka"
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "mokiniai"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "${course} kursas -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "Redaguoti vardą"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Pakeisti patalpą arba kurso vardą"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Keisti mokytojus šiam kursui"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Užsakyti resursai: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Keisti mokytojus šiam kursui"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "Redaguoti mokytojus"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "Redaguoti asmenis"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Keisti mokinius šiame kurse po vieną"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Keisti mokinius šiame kurse grupėmis"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "Redaguoti grupes"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Identifikatorius (nebūtinas)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Kursas"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Nustatytas dydis"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Yra ${num_errors} įvedimo klaidų."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Kurso pavadinimas"
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Kurso aprašymas"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Žymė"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Identifikatorius kursui, surinktas iš mokytojo\n"
+"            vardo, dalyko ir pamokos laiko."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Kodas"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "ID kodas kursui"
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Kurso aprašymas"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr "Kategorijos antraštė."
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr "Svoris"
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Asmenys"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Kovas"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Darbo diena"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Avarinė diena"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Avarinė diena"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Avarinė diena"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Taisa"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Atšaukti"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Vartotojo vardas"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Slaptažodis"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Šis vardas jau paskirtas kitam asmeniui!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Pritaikyti"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Diena po dienos"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Nėra nė vieno"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Nėra nė vieno"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr "Vardas"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Pastabos"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr "Titulas"
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr "Asmenvardžio priešdėlis"
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr "Vardas"
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Vardas ir pavardė"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Nuotrauka"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Nuotrauka (JPEG formatu)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Dalykai"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr "Dalyvavimas"
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "pašalinti"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "Pridėti"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+#, fuzzy
+msgid "Manage Activity Categories"
+msgstr "Veiklos kategorija"
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "Atšaukti"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr "Kategorijos"
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr "Nauja Kategorija"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr "Numatytoji Kategorija"
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr "Kategorijos sėkmingai pašalintos"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr "Kategorija sėkmingai pridėta"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr "Numatytoji kategorija sėkmingai pakeista"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+#, fuzzy
+msgid "New Activity"
+msgstr "Dalyvavimas"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Pridėti Kursą"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Redaguoti renginį"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+#, fuzzy
+msgid "Activity Categories"
+msgstr "Veiklos kategorija"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr "Procentinis vidurkis"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr "Mediana"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr "Standartinis nuokrypis"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr "Variantiškumas"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr "nėra"
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr "Įvertinimas $value veiklai $name negalimas."
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr "Įvertinimas $value $name negalimas."
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr "Vidurkis"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Mokiniai"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+#, fuzzy
+msgid "Activity Name"
+msgstr "Dalyvavimas"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "pašalinti"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Pamoka ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+#, fuzzy
+msgid "Activity"
+msgstr "Dalyvavimas"
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr "Užduotis"
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr "Esė"
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr "Egzaminas"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr "Namų darbas"
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr "Dienoraštis"
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr "Laboratorinis"
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr "Pristatymas"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr "Projektas"
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr "Smulkus veiklos aprašymas"
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr "Kategorija"
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr "Veiklos kategorija"
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr "Vertinimo sistema"
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr "Veiklos vertinimo sistema"
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr "Veiklos sukūrimo data"
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr "Veiklos šioje pažymių knygelėje"
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Įkelti Grupes"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Pridėti naują grupę"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Keisti Kurso duomenis"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Tvarkyti narystę"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupės"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupės"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"CSV duomenyse <strong> būtinas </strong> grupės vardo laukas ir <strong> "
+"galimas </strong> (eilutėje po pirmojo kablelio) neprivalomas grupės "
+"aprašymo laukas. Simboliai po antrojo kablelio eilutėje bus pašalinti."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"11a_an, Anglų kalba 11a klasei\n"
+"Programavimo būrelis\n"
+"Rankinis, Merginų rankinio būrelis, <em> tekstas po antrojo kablelio </em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Pavyzdyje aukščiau bus sukurtos 3 grupės: '11a_an', 'Programavimo būrelis' "
+"ir 'Rankinis'. Pirmoji ir trečioji turės dar ir aprašymus, antroji bus be "
+"aprašymo, o 3-ioje eilutėje tekstas po antrojo kablelio bus atmestas."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Įkelti SchoolTool grupes CSV formatu"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Lapkritis"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "Redaguoti vardą"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Pakeisti patalpą arba kurso vardą"
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Grupės indeksas"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Pridėti naują grupę"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Grupės pavadinimas"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Grupės aprašymas"
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Private_calendar"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Pridėti lygmenį"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Redaguoti renginį"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+#, fuzzy
+msgid "This is an initial level."
+msgstr "Tai pradinis lygmuo"
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "joks"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr "Klasės indeksas"
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr "Pridėti lygmenį"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr "Ankstesnis lygmuo"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr "Ankstesnis lygmuo mokykloje. \"Nėra\", jei tai pradinis lygmuo."
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "Pridėti"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Ši savaitė"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Mokiniai"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "Atšaukti"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+#, fuzzy
+msgid "Initialize Students"
+msgstr "Galimi mokiniai"
+
+#: /src/schooltool/level/browser/promotion.pt:60
+#, fuzzy
+msgid "Inital Level"
+msgstr "Tai pradinis lygmuo"
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "Pridėti"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr "Nepasirinkta nė vieno mokinio"
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr "Mokiniai sėkmingai įtraukti."
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr "Esamas lygmuo: $level"
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "Atšaukti"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr "Statusas sėkmingai atnaujintas"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr "Laiko žyma"
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr "Įrašo sukūrimo data ir laikas"
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Naudotojas"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr "Naudotojo id, atsakingo už įrašus"
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr "Įrašo antraštė"
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr "Įrašo išsamus aprašymas"
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr "lygmens vardas"
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr "Tai pradinis lygmuo"
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr "Tai pradinis mokymosi lygmuo mokykloje"
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr "Kitas lygmuo"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+"Kitas lygmuo, užbaigus šį lygmenį. \"Nėra\", jei tai baigiamasis lygmuo."
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr "neišlaikė"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr "išvyko"
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Naujas semestras"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Pastabos pavadinimas"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Tekstas"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Pastabos tekstas"
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Privatumas"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Pastabos"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Privatumas"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Pridėti semestrą"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Data"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "neįvestas vartotojo vardas"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "nenurodytas pilnas vardas ir pavardė"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Toks vartotojo vardas jau yra:${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Įkelti Asmenis"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CSV duomenyse <strong> būtinas </strong> vartotojo vardas ir pilnas vardas. "
+"Taip pat <strong> gali</strong> būti įrašytas neprivalomas slaptažodžio "
+"laukas"
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jonas, Jonas Jonaitis\n"
+"jonasA, Jonas Antanas Jonaitis, s2m3r2\n"
+"scile, Secilija\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Pavyzdys, kaip sukurti 3 vartotojus, 'jonas', 'jonasA', 'scile'. Antrajam "
+"nurodytas ir slaptažodis ('s2m3r2'), todėl jis galės registruotis sistemoje. "
+"Slaptažodžiai turi būti siunčiamas paprastu tekstu."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Įkelti SchoolTool asmenis CSV formatu"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Keisti nustatymus ${user}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Keisti parinktis asmeniui"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Laiko juosta"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Laiko juosta kalendoriui"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Laiko formatas"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datos formatas"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/YY"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "YYYY-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Diena, Mėnuo, Metai"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Pirmoji savaitės diena:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Savaitės pradžia Sekmadienis arba Pirmadienis"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Rodyti pamokas"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Rodyti pamokos vardą dienos rodinyje"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Rodomas vardas"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Pavaldumo ryšiai"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Pridėti naują Reikalavimą"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Pridėti naują Reikalavimą"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Pridėti naują Reikalavimą"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Rodoma"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "iš"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "elementai"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr "Pridėti naują Reikalavimą"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr "Esanti Vertinimo Sistema"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Įkelti Resursus"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Pridėti naują resursą"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Keisti Kurso duomenis"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Resursai"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Resursai"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV duomenyse <strong> būtinas </strong> resurso ID ir <strong> galimas </"
+"strong> nebūtinas resurso aprašymas. Papildomi įrašai ignoruojami."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, Multimedia projektorius\n"
+"Choreografijos salė\n"
+"LC-805, Nešiojamas kompiuteris, <em> tekstas po antrojo kablelio </em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Duotame pavyzdyje bus sukurti 3 resursai, kurių vardai 'PRJ302', "
+"'Choreografijos salė' ir 'LC-805'. Pirmasis ir trečiasis yra su aprašymais, "
+"antrasis be. Tekstas po antrojo kablelio ignoruojamas"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "Įkelti resursus CSV formatu"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Resurso indeksas"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Pridėti naują resursą"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Resurso pavadinimas"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Resurso aprašymas"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Patalpa"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Pažymėkite, jei resursas yra patalpa, pvz. kabinetas."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Calendar_relationships"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Calendar_ACL"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr "Trūkta asmens duomenų"
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Tai nėra SchoolBell 1.0 duomenų bazės failas.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Tai nėra SchoolBell 1.0 duomenų bazės failas.\n"
+"\n"
+"Įvykdykite atskirai duomenų bazės atnaujinimo programą.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "viršus"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Iškyrus datas"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Prisijungti"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Vartotojas:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Atsijungti"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Naujas Semestras"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Atšaukti pamokas avariniu atveju"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "Įvesta pavadavimo data netinkama"
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+"Dėl avarinių priežasčių pamokos nutrauktos. Perkeltos į dieną $replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "$emergency avarinės dienos perkėlimo data"
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "Įvesta data netinkama. Naudokite YYYY-MM-DD formatą."
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "Įvesta data nepriklauso šiam semestrui."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "Įvesta data nėra diena, kai vyksta pamokos."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"Jūs pažymėjote ${DYNAMIC_CONTENT} kaip avarinę dieną. Dabar nurodykite "
+"dieną, į kurią bus perkeltos pamokos. Sritis žemiau sudaryta iš poilsio "
+"dienų semestre vėlesnių nei avarinė diena ir keletos dienų pasibaigus "
+"semestrui."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Įveskite perkėlimo datą"
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Perkėlimas"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Nurodykite perkėlimą avarinei dienai"
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Ši forma skirta nurodyti avarinėms dienoms ir laikui, į kurį bus nukeltos "
+"tos dienos pamokos semestre."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr "Įveskite avarinės dienos datą žemiau."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Avarinė diena"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Pakeisti Semestrą: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Naujas semestras"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Semestrai"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Pridėti naują semestrą"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Pradžios data"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Pabaigos data"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "${week_number} Savaitė"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Pridėti semestrą"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Išsaugoti"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Pirma įveskite semestro vardą ir trukmę. Nurodoma pradžios ir pabaigos data "
+"imtinai, formatas YYYY-MM-DD, pvz. 2005-09-01 iki 2006-01-15."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "Pradžia ir pabaiga imtinai (pvz., 2005-09-01 iki 2006-01-15)"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Atnaujinti"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr "Nurodykite darbo ir poilsio dienas."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr "Prašom nurodyti darbo ir poilsio dienas."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Darbo diena"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Poilsio diena"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Perjungti šias savaitės dienas:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "${object} tvarkaraštis"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Netikama data. Naudokite YYYY-MM-DD formatą."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Data nepriklauso jokiam semestrui"
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Kai kurios reikšmės netinkamos. Jos išskirtos raudonai."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Pakeisti tvarkaraštį vienai dienai"
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Naujas Tvarkaraštis"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Rodyti Tvarkaraščius"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Tvarkaraštis"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Naudokite HH:MM formatą pamokos pradžiai ir pabaigai nurodyti"
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Būtina apibrėžti bent vieną pamoką"
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Šablonai tvarkaraščiui"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Pridėti tvarkaraščio periodiškumo schemą"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Prašau, parinkite reikšmę"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "${number} diena"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Pamoka 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Pamoka ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Tvarkaraščio schema ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Tvarkaraštyje dienos atitinka savaitės dienas, t.y. pirmadieniais - pirmoji "
+"tvarkaraščio diena, antradieniais - antroji ir t.t."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Tvarkaraščio dienų seką sudaro tik darbo dienos, peršokant poilsio dienas."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Trečia, nurodykite laiką ir trukmę pamokoms, kurių laikas keičiasi tam "
+"tikromis savaitės dienomis. Naudikite formatą <tt>HH:MM</tt> (nepamirštant "
+"nurodyti trukmę žemiau esančiame teksto lauke) arba <tt>HH:MM-HH:MM</tt> "
+"(jei norite nurodyti pradžią ir pabaigą, pvz. 9:50-10:35). Nebūtina nurodyti "
+"visas savaitės dienų pamokas, nenurodžius pamoka bus praleista, jei ji "
+"patenka į tą savaitės dieną. Naudokite mygtuką Atnaujinti, jei pamokų "
+"sąrašas neatitinka jūsų atliktų pakeitimų."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Nurodykite vardą kuriamai tvarkaraščio schemai."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr "Kai kurių pamokų aprašyme klaidos, todėl jos pašalintos."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Galiausiai, įsitikinkite, kad duomenys formoje yra teisingi, nes pataisyti "
+"bus įmanoma tik pašalinant šią tvarkaraščio schemą ir iš naujo sukūrus."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Sukurti tvarkaraščio schemą"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Pirmiausia aprašome tvarkaraščio dienas ir periodus."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Kopijuoti pamokas iš ankstesnės dienos"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Pašalinti šitą dieną"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Pridėti dieną"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Pridėti pamoką"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Antra, pasirinkite būdą, kaip tvarkaraščio dienos atitiks kalendorines dienas"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"Pastaba: jei kursui nurodytos daugiau nei vienas laiko tarpas ir norima "
+"kursą pašalinti, kiekvienam jų būtina nustatyti <em> joks </em>."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Pamokų tvarkaraštis"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Semestras"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Pamokų periodiškumas"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "${person} darbotvarkė"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Parinkti"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Ši forma skirta asmens tvarkaraščio sudarymui įtraukiant ar pašalinant jį iš "
+"kursų"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "kaip dalis"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "joks"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "Kertasi tvarkaraščiai"
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Išsaugoti"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr "Nėra įvestų semestrų arba tvarkaraščio periodiškumo schemų."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Parinkite tvarkaraščio šabloną"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "Semestrui(-ams):"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "${section} tvarkaraštis"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Naudoja tvarkaraštį:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Tai paprasčiausias būdas sukurti savaitinio tvarkaraščio schemą. Pažymėkite "
+"pakankamą eilučių kiekį pamokoms."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Sudėtingesnei schemai galite pasinaudoti <a href=\"add.html\"> tvarkaraščio "
+"periodiškumo schemos sukūrimo vedliu </a>, arba <a href=\"complexadd.html\"> "
+"kompleksinio tvarkaraščio periodiškumo schemos sukūrimo forma </a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Pamokos eilės vardas (nebūtinas)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Pamokos pradžios laikas"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "Pamokos pabaigos laikas"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Sukurti"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"Galite patikslinti pamokų dienoje pradžią ir pabaigą ${DYNAMIC_CONTENT} "
+"formoje žemiau. Norint pašalinti dienos pamoką, pakanka ištrinti pamokos "
+"pradžios ir pabaigos laiką."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Pamokos eilės vardas"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Buvusi pradžia"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Buvusi pabaiga"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Nauja pradžia"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Nauja pabaiga"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Keisti"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Ši forma skirta atskiros dienos pamokų laikui pakeisti ar atšaukti kai "
+"kurias pamokas kartu."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr "Nurodykite datą, kuriai reikia pakeisti pamokų laiką."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Išrinkti atskirą dieną"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Tęsti"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Sukurti tvarkaraščio schemą"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "${object} tvarkaraščiai"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+#, fuzzy
+msgid "Homeroom"
+msgstr "sąšauka"
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Nauja tvarkaraščio schema"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr "Ar mokykla dirba pagal savaitinį grafiką, ar slenkantį grafiką?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Savaitinis"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Slenkantis"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Įveskite ciklo dienų vardų, po vieną eilutėje."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Prašau įveskite bent vienos dienos vardą"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Įsitikinkite prašau, ar dienų vardai skirtingi."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Ar visos pamokos prasideda ir baigiasi kasdien tuo pačiu laiku mokyklos "
+"darbo grafike?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Tuo pačiu laiku kasdien"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Skirtingu laiku"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Įveskite pradžią ir pabaigą kiekvienam laiko tarpui, po vieną laikotarpį (HH:"
+"MM - HH:MM) eilutėje."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Netinkamas laiko tarpas: $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Įveskite prašau bent vieną laiko tarpą"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Nurodykite pradžios ir pabaigos laikus kiekvienam laiko tarpui, kiekvienai "
+"eilutei po laikotarpį (HH:MM - HH:MM)"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Nurodykite bent vieną laikotarpį $day dienai."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr "Ar pamokos dienoje turi vardus, ar tiesiog ženklinamos laiku?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Turi vardus"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Ženklinamos laiku"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Įveskite pamokų vardus, po vieną eilutėje."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Įveskite prašau bent $number pamokas."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Įsitikinkite, ar pamokų vardai skirtingi."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "Ar pamokų seka kasdien ta pati ar skirtinga?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Ta pati"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Skirtinga"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Įveskite pamokas pagal eilę:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Prašau nurodykite visas pamokas"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Šios pamokos buvo pažymėtos daugiau nei kartą: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Įveskite pamokas pagal eilę kiekvienai dienai:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$day dienos $period"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr "Ar yra sąšaukos laikas mokinio dienos lankomumui žymėti?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr "Taip"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr "Ne"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr "Nurodykite sąšaukos laiką(us) kiekvienai dienai:"
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Nėra tokio dienos ID: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Nėra tokio pamokos ID: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Vartotojas:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Pakeisti asmens vardą, nuotrauką ar slaptažodį"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Tvarkyti šio asmens priklausomybę grupėms"
+
+#~ msgid "Import Sections"
+#~ msgstr "Įkelti Kursus"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Klaida eilutėje ${line_no} (joje turi būti dienos ID, pamokos ID ir "
+#~ "galimas patalpos ID)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Nėra tokių patalpų: §{args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Pakeisti šio asmens kontaktinius duomenis"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Moko kursus"
+
+#~ msgid "via group"
+#~ msgstr "grupėms"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} SchoolTool tarnybinė stotis <span>"
+#~ "${DYNAMIC_CONTENT}</span> &copy; Shuttleworth fondas 2003 - <span>2005</"
+#~ "span>: Socialinių inovacijų palaikymas. </p> <p> SchoolTool&trade; yra "
+#~ "prekinis Shuttleworth Fondo ženklas. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Mano Nustatymai"
+
+#~ msgid "Person index"
+#~ msgstr "Asmens indeksas"
+
+#~ msgid "Add a new person"
+#~ msgstr "Pridėti naują asmenį"
+
+#~ msgid "New photo"
+#~ msgstr "Nauja nuotrauka"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Paveikslėlis (maždaug 48x48 dydžio, JPEG formato)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Ištrinti nuotrauką"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Pažymėkite laukelį norėdami ištrinti nuotrauką"
+
+#~ msgid "New password"
+#~ msgstr "Naujas slaptažodis"
+
+#~ msgid "Verify password"
+#~ msgstr "Patvirtinti slaptažodį"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Slaptažodžiai nesutampa"
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Slaptažodis sėkmingai pakeistas!"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Slaptažodžiai nesutampa!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Sukurti naują objektą"
+
+#~ msgid "Add events"
+#~ msgstr "Pridėti įvykius"
+
+#~ msgid "Control access"
+#~ msgstr "Prieeigos valdymas"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Prisijungę naudotojai"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Neregistruoti naudotojai"
+
+#~ msgid "An error occured."
+#~ msgstr "Klaida."
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Neidentifikuoti vartotojai"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Neidentifikuotas vartotojas"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Registruoti vartotojai"
+
+#~ msgid "All Users"
+#~ msgstr "Visi vartotojai"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: dėmesio: konfiguracijos nustatymas '%s' atmestas"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Naudojimas: %s [parametrai]\n"
+#~ "Parametrai:\n"
+#~ "  -c, --config xxx naudoti šį konfiguracijos failą vietoje numatytojo\n"
+#~ "  -h, --help iškviesti šį pagalbos tekstą\n"
+#~ "  -d, --deamon veikti foniniu režimu po paleisties\n"
+#~ "  -r, --restore-manager atstatyti vartotoją manager su numatytuoju "
+#~ "slaptažodžiu\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Jus sveikina SchoolBell tarnybinė stotis"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Tai ne SchoolTool 0.10 duomenų bazės failas.\n"
+
+#~ msgid ""
+#~ "You can create the CSV file in a spreadsheet and export it in CSV (Comma- "
+#~ "Separated Values) format. The structure of the table is described below."
+#~ msgstr ""
+#~ "CSV formato duomenis galima paruošti skaičiuoklės programa, išsaugant "
+#~ "failą CSV formatu (Comma-Separated Values - kableliu atskirtos reikšmės). "
+#~ "Lentelės laukai aprašyti žemiau."
+
+#~ msgid ""
+#~ "Third, define the time and duration of periods when they fall on certain "
+#~ "days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+#~ "don't forget to specify the duration in the text box below) or <tt>HH:MM- "
+#~ "HH:MM</tt> (when you want to specify both endpoints explicitly, e.g., "
+#~ "9:30-10:15). It is not necessary to define all periods for all days of "
+#~ "week, omissions will just cause that period to be skipped if it happens "
+#~ "to fall on that day of week. If the list of periods is not up to date "
+#~ "with the changes you made in the table above, use the Update button to "
+#~ "refresh the form."
+#~ msgstr ""
+#~ "Trečia, nurodykite laiką ir trukmę pamokoms, kurių laikas keičiasi tam "
+#~ "tikromis savaitės dienomis. Naudikite formatą <tt>HH:MM</tt> "
+#~ "(nepamirštant nurodyti trukmę žemiau esančiame teksto lauke) arba <tt>HH:"
+#~ "MM-HH:MM</tt> (jei norite nurodyti pradžią ir pabaigą, pvz. 9:50-10:35). "
+#~ "Nebūtina nurodyti visas savaitės dienų pamokas, nenurodžius pamoka bus "
+#~ "praleista, jei ji patenka į tą savaitės dieną. Naudokite mygtuką "
+#~ "Atnaujinti, jei pamokų sąrašas neatitinka jūsų atliktų pakeitimų."
+
+#~ msgid ""
+#~ "First, please name and define the time period of the term. The date range "
+#~ "is inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in "
+#~ "YYYY- MM-DD format."
+#~ msgstr ""
+#~ "Pirma įveskite semestro vardą ir trukmę. Nurodoma pradžios ir pabaigos "
+#~ "data imtinai, formatas YYYY-MM-DD, pvz. 2005-09-01 iki 2006-01-15."

Added: schooltool/branches/upstream/current/src/schooltool/locales/lv/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/lv/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/lv/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2385 @@
+# Latvian translation for schoolbell
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-04-24 08:50+0000\n"
+"Last-Translator: Agris Bombiza <agris.bombiza at gmail.com>\n"
+"Language-Team: Latvian <lv at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personas"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Lieotājvārds vai parole nav pareiza"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Esošais gads"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Marts"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Janvāris"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februāris"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Jūnijs"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Maijs"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Aprīlis"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Augusts"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Septembris"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Jūlijs"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Nākamā diena"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Šodiena"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Iepriekšējā diena"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktobris"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Decembris"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Novembris"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Pirmdiena"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Otrdiena"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Trešdiena"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Ceturtdiena"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Svētdiena"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Sestdiena"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Piektdiena"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Pr"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ot"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Tr"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Cet"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pk"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Se"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Sv"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Virsraksts"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Visu dienu"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Datums"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Laiks"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Sākuma laiks 24 stundu formātā"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Ilgums"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minūtes"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Stundas"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dienas"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Atrašanās vieta"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Apraksts"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Periodiks"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Atkārtojas katru"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Diena"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Nedēļa"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mēnesis"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Gads"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Atkārtot katru"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Diapazons"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Skaits"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Līdz"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "Vienmēr"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Notikumu skaits"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Atkārtot līdz"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Nedēļas dienas"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Nedēļas diena"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Ik mēnesi"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Izņēmumu datumi"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Ir notikusi kļūda"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Nepareizs laiks"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Beigu datums ir agrāks kā sākumu datums"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Pievienot"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Atjaunot"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Apskatīt kalendāru"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Nākamā nedēļa"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Šī nedēļa"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Iepriekšējā nedēļa"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Nākamais mēnesis"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Esošais mēnesis"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Iepriekšējais mēnesis"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Nākamais gads"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Esošais gads"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Iepriekšējais gads"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV fails veiksmīgi tika importēts."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Nevarēja importēt CSV failu"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV teksts tika veiksmīgi importēts."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Nevarēja importēt CSV tekstu"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Saglabātās izmaiņas."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "visu dienu"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Vieta: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Virsraksts"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Ilgums"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Datums"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Resursu indekss"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Pievienot jaunu resursu"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Virsraksti nedrīkst būt tukši"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Esošais mēnesis"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Esošais mēnesis"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importēt resursus"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Personas indekss"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Pievienot jaunu personu"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Lietotājvārds"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Parole"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Šis lietotājvārds jau tiek izmantots!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Iepriekšējais mēnesis"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Rediģēt grupas informāciju"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Se"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Notikumu skaits"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Pilns vārds"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Pilns vārds"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Pilns vārds"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Attēls"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Attēls (JPEG formātā)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Jauna piezīme"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV teksts tika veiksmīgi importēts."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Parole tika veiksmīgi nomainīta!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Parole tika veiksmīgi nomainīta!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Ilgums"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Grupas indekss"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Pievienot jaunu grupu"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Resursu indekss"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Pievienot jaunu resursu"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Iepriekšējā nedēļa"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV teksts tika veiksmīgi importēts."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Parole tika veiksmīgi nomainīta!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Šī nedēļa"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Parole tika veiksmīgi nomainīta!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Se"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Nākamā nedēļa"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Lietotājvārds nedrīkst būt tukšs"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Jauna parole"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Jauna parole"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Apskatīt kalendāru"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Vārds, kurš tiks parādīts"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Resursu indekss"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Pievienot jaunu resursu"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Resursu indekss"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Pievienot jaunu resursu"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Attēls"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Saglabātās izmaiņas."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Jauna piezīme"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Pievienot jaunu personu"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Izņēmumu datumi"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Pievienot jaunu resursu"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Jauna bilde"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Mazs attēls (apmēram 48x48 px JPEG formātā)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Nodzēst attēlu"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Atzimējiet šo, lai dzēstu attēlu"
+
+#~ msgid "Verify password"
+#~ msgstr "Pārbaudīt paroli"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Paroles nesakrīt"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Paroles nesakrīt!"
+
+#~ msgid "View"
+#~ msgstr "Skatīt"
+
+#~ msgid "Edit"
+#~ msgstr "Rediģēt"
+
+#~ msgid "Create new objects"
+#~ msgstr "Izveidot jaunus objektus"
+
+#~ msgid "Add events"
+#~ msgstr "Pievienot notikumus"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Mainīt/ dzēst notikumus"
+
+#~ msgid "New Person"
+#~ msgstr "Jauna persona"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importēt personas"
+
+#~ msgid "Add a Group"
+#~ msgstr "Pievienot grupu"
+
+#~ msgid "New Group"
+#~ msgstr "Jauna grupa"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Pievienot/ noņemt biedrus"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importēt grupas"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Pievienot resursu"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Rediģēt resursu informāciju"
+
+#~ msgid "New Resource"
+#~ msgstr "Jauns resurs"
+
+#~ msgid "Actions"
+#~ msgstr "Darbības"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalendārs (dienas)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Kalendārs (dienas, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalendārs (nedēļas)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "Skolas zvans"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalendārs (nedēļas, PDf)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalendārs (mēneša)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalendārs (mēneša, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalendārs (gada)"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Brīvs/ aizņemts"
+
+#~ msgid "New Event"
+#~ msgstr "Jauns notikums"
+
+#~ msgid "Edit Event"
+#~ msgstr "Rediģēt notikumu"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Mainīt lapas preferences"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ml/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ml/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ml/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Malayalam translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Malayalam <ml at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/ms/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ms/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ms/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2315 @@
+# Malay translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-05-21 17:17+0000\n"
+"Last-Translator: Low Kian Seong <kianseong at gmail.com>\n"
+"Language-Team: Malay <ms at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 orang"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${bilangan} orang"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nama pengguna atau kata laluan tidak betul"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Tajuk"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Seharian"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Tarikh"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Masa"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Jangka masa"
+
+#: /src/schooltool/app/browser/cal.py:1677
+#, fuzzy
+msgid "Duration Type"
+msgstr "Jenis jangka masa"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minit"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Jam"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Hari"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Lokasi"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Berulang"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Berulang setiap"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Hari"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Minggu"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Bulan"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Tahun"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Berulang setiap"
+
+#: /src/schooltool/app/browser/cal.py:1712
+#, fuzzy
+msgid "Range"
+msgstr "Jangka"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Bilangan"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Sehingga"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "selamanya"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Bilangan peristiwa"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Berulang sehingga"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Hari minggu"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Lihat Kalendar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Tajuk"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Jangka masa"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Tarikh"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Indeks kumpulan"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Tambah kumpulan baru"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Indeks orang"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Tambah kumpulan baru"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nama pengguna"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Kata laluan"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Nama pengguna ini telah berpunya!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Tarikh"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Bilangan peristiwa"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Nama Penuh"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Nama Penuh"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nama Penuh"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Gambar"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Gambar ( dalam format JPEG )"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Kata laluan telah berjaya di tukar !"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Kata laluan telah berjaya di tukar !"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Kata laluan telah berjaya di tukar !"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Jangka masa"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Indeks kumpulan"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Tambah kumpulan baru"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Indeks orang"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Tambah kumpulan baru"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Kata laluan telah berjaya di tukar !"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Kata laluan telah berjaya di tukar !"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Kata Laluan baru"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Kata Laluan baru"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Lihat Kalendar"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nama yang hendak ditunjukkan"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Indeks orang"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Tambah kumpulan baru"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Gambar"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Tambah kumpulan baru"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Tambah kumpulan baru"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${bilangan} orang"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Gambar baru"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Gambar kecil( lebih kurang 48X48 dalam format JPEG )"
+
+#~ msgid "Clear photo"
+#~ msgstr "Gambar jelas"
+
+#~ msgid "Verify password"
+#~ msgstr "Pemastian kata laluan"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Kata laluan tidak berpadanan"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Kata laluan tidak berpadanan !"
+
+#~ msgid "View"
+#~ msgstr "Lihat"
+
+#~ msgid "Edit"
+#~ msgstr "Ubah"
+
+#~ msgid "Create new objects"
+#~ msgstr "Membuat objek baru"
+
+#~ msgid "Add events"
+#~ msgstr "Tambah peristiwa"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Ubah / padam peristiwa"
+
+#~ msgid "Control access"
+#~ msgstr "Mengawal laluan"
+
+#, fuzzy
+#~ msgid "Authenticated users"
+#~ msgstr "Pengguna berdaftar"
+
+#, fuzzy
+#~ msgid "Unauthenticated users"
+#~ msgstr "Pengguna tidak berdaftar"

Added: schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2955 @@
+# Norwegian translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-04-20 04:38+0000\n"
+"Last-Translator: Tor Harald Thorland <linux at strigen.com>\n"
+"Language-Team: Norwegian <no at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Kallenavn"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Et kort kallenavn for denne personen."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Primær e-post"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Alternativ e-postadresse"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Primær telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Anbefalt telefonnummer"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Alternativ telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Alternativt telefonnummer."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Nettsted"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Nettside eller blogg"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personer"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 Person"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personer"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Brukernavn eller passord er ikke korrekt"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Nåværende år"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Tilgjengelige Grupper"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Mars"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februar"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Neste dag"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "I dag"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "I går"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Desember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Mandag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Tirsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Søndag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Lørdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Fredag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Man"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Tir"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Ons"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Tor"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Fre"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Lør"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Søn"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Tittel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Hele dagen"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Dato"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tid"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Start tid i 24-timers format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Varighet"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Varighetstype"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutter"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Timer"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dager"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Lokasjon"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Gjeninntreffer"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Gjeninntreffer hver"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Uke"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Måned"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "År"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Gjenta hver"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Område"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Til"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "for alltid"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Antall hendelser"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Gjenta til"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Ukedager"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Ukedag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Månedlig"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Unntaksdatoer"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "samme ukedag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "siste ukedag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Siste ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "En feil oppstod."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ugyldig tid"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Sluttdato er tidligere en startdato"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Ugyldig dato. Vennligst spesifiser YYYY-MM-DD, en per linje."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Tilføy hendelse"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Legg til"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Endre avtale"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Oppdater"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Oppdatert den $date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalendere"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Neste uke"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Nåværende uke"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Forrige uke"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (uke ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Neste måned"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Nåværende måned"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Forrige måned"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Uke ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Neste år"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Nåværende år"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Forrige år"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Ingen data lagt inn"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Kunne ikke konvertere data til Unicode-tegnsett (feil tegnsett?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV-fil importert."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Importering av CSV-fil feilet."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV-tekst importert."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Import av CSV-tekst feilet"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Ingen tegnsett spesifisert"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Ukjent tegnsett"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Feil i CSV data, linje ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konvertering til unicode-tegnsett feilet i linje {line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Feil i CSV data, linje ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Personinfo: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Endringer lagret."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "hele dagen"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Plassering: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "tilbakevendende"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Daglig kalender for %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Ukentlig kalender for %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Uke %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Månedlig kalender for %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "PDF-støtte er deaktivert. Det kan aktiveres av din administrator."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalender for %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+#, fuzzy
+msgid "Front Page Calendar"
+msgstr "Front Page Kalender"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Ugyldig integer verdi"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Ugyldig tekst data"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Ugyldig dato-tid data"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Kjør %s -h for hjelp."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Leser konfigurasjon fra %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Kunne ikke initialisere databasen:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Kanskje en annen instans av %s bruker den?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, avbryter.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, avbryter.\n"
+"\n"
+"Vennligst kjør det vedlagte oppgraderings skriptet.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Tittel"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Notattittel"
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Gruppe"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Varighet"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Dato"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Ressurs oversikt"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Legg til ny ressurs"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Ikke tilstreklig med data lagt inn."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Tittel kan ikke være tom"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Nåværende Grupper"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Tilgjengelige Grupper"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Nåværende måned"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Tilgjengelige Grupper"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupper"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Nåværende Grupper"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Tilgjengelige Grupper"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Ressurser"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importer Ressurser"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Tilgjengelige Ressurser"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Personoversikt"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Legg til ny person"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Tittel på ressurs"
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Beskrivelse av ressurs"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Beskrivelse av gruppen"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Nettsted"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Avbryt"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Endre informasjon om ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Endre Medlemskap"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Endre valgte innstillinger for ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Endre kontakt detaljer for ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Endre kontakt detaljer for ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Kontaktinformasjon"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Brukernavn"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Passord"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Dette brukernavnet er allerede i bruk!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Bruk"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Primær telefon"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Forrige"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Hendelsesinformasjon"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Kallenavn"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Starter"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Lør"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Tidssone"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Alternativ telefon"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notater"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Neste"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Antall hendelser"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "endre navn"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "endre navn"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "endre navn"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Mitt Oppsett"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Fullt navn"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (i JPEG-format)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nytt Notat"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV-tekst importert."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Passord ble byttet!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Passord ble byttet!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Eksempel:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Person Informasjon"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Gruppe oversikt"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Legg til ny gruppe"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Medlem av ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Nåværende Medlemmer"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Legg til Medlemer"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Gruppetittel."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Beskrivelse av gruppen"
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Ressurs oversikt"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Legg til ny ressurs"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Forrige uke"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV-tekst importert."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Passord ble byttet!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Nåværende uke"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Passord ble byttet!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Bruker"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Tittel på ressurs"
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Beskrivelse av ressurs"
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Starter"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Notattittel"
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Neste uke"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Notattittel"
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Daglig"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Notattittel"
+
+#: /src/schooltool/note/interfaces.py:46
+#, fuzzy
+msgid "Body"
+msgstr "Meldingskropp"
+
+#: /src/schooltool/note/interfaces.py:47
+#, fuzzy
+msgid "Body of the note."
+msgstr "Notatinnhold."
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Personvern"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "brukernavn kan ikke være tomt"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "fullt navn kan ikke være tomt"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Brukernavn eksisterer allerede: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nytt passord"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Endre passord"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Tidssone"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Tidssone for din kalender"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Tidsformat"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "TT:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "TT:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datoformat"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/ÅÅ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "ÅÅÅÅ-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dag Måned, År"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Uken starter på:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Begynn ukevisning med Søndag eller Mandag"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Vis kalender"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Navn som skal vises"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Ressurs oversikt"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Legg til ny ressurs"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Ressurs oversikt"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Legg til ny ressurs"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Tittel på ressurs"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beskrivelse av ressurs"
+
+#: /src/schooltool/resource/interfaces.py:47
+#, fuzzy
+msgid "A Location."
+msgstr "En lokasjon"
+
+#: /src/schooltool/resource/interfaces.py:48
+#, fuzzy
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indikerer at denne ressursen er et sted, som f.eks. et klasserom."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Ikke tilstreklig med data lagt inn."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Ikke tilstreklig med data lagt inn."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Ikke tilstreklig med data lagt inn."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Min Kalender"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Mer..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendere"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Velkommen til SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigering"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Brukernavn:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "endre navn"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Endre navn, bilde eller passord for denne personen"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Personinfo: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "endre grupper"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, avbryter.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, avbryter.\n"
+"\n"
+"Vennligst kjør det vedlagte oppgraderings skriptet.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "topp"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Endringer lagret."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Endre Detaljer"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nytt Notat"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "oppføringer"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Legg til ny person"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Starter"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Unntaksdatoer"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Ugyldig dato. Vennligst spesifiser YYYY-MM-DD, en per linje."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Legg til ny ressurs"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} personer"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Notatinnhold."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "samme ukedag"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "endre navn"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Merknad"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Ukjent tegnsett"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nytt foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Et lite bilde (ca. 48x48 piksler i JPEG-format)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Fjern foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Merk av her for å fjerne foto"
+
+#~ msgid "Verify password"
+#~ msgstr "Bekreft passord"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Passordene er ikke like."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Passord stemmer ikke overens!"
+
+#~ msgid "View"
+#~ msgstr "Vis"
+
+#~ msgid "Edit"
+#~ msgstr "Rediger"
+
+#~ msgid "Create new objects"
+#~ msgstr "Lag nye objekter"
+
+#~ msgid "Add events"
+#~ msgstr "Tilføy avtaler"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modifiser/slett avtaler"
+
+#~ msgid "Control access"
+#~ msgstr "Kontrollere tilgang"
+
+#~ msgid "Manage membership"
+#~ msgstr "Administere medlemskap"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Autentifiserte brukere"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Uautentifiserte brukere"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Sett opp Tilgang"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Endre Brukervalg"
+
+#~ msgid "New Person"
+#~ msgstr "Ny person"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importer Personer"
+
+#~ msgid "Add a Group"
+#~ msgstr "Legg til Gruppe"
+
+#~ msgid "New Group"
+#~ msgstr "Ny Gruppe"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Modifiser Gruppe-Informasjon"
+
+#~ msgid "A Group"
+#~ msgstr "Gruppe"
+
+#, fuzzy
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell-Gruppe"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Legg til/Fjern Medlemmer"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importer Grupper"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Legg til en Ressurs"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Rediger Ressurs Informasjon"
+
+#~ msgid "New Resource"
+#~ msgstr "Ny Ressurs"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell Ressurs"
+
+#~ msgid "A Resource"
+#~ msgstr "En Ressurs"
+
+#~ msgid "Actions"
+#~ msgstr "Handlinger"
+
+#~ msgid "View Calendar"
+#~ msgstr "Vis Kalender"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalender (Daglig)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Kalender (Daglig, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalender (Ukentlig)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalender (Ukentlig, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalender (Månedlig)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalender (Månedlig, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalender (Årlig)"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Ledig/opptatt"
+
+#~ msgid "New Event"
+#~ msgstr "Ny hendelse"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Åpne i iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Rediger hendelse"
+
+#, fuzzy
+#~ msgid "Change Site Preferences"
+#~ msgstr "Endre Område-Brukervalg"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Denne tillatelsen gjør en i stand til å se navn, titler, foto, liter, "
+#~ "objekter og annen informasjon."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Tillater å modifisere navn, titler, beskrivelser, foto, etc."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Lar brukeren lage nye personer, grupper og ressurser."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Tillater kalender-visning av personer, grupper og ressurser."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Tillater tilføyning av nye avtaler til kalendere."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Tillater modifisering og sletting av avtaler i kalendere."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Tilgangs kontroll for ${title}"
+
+#, fuzzy
+#~ msgid "Permissions for Groups"
+#~ msgstr "Tillatelser for Grupper"
+
+#~ msgid "Access control"
+#~ msgstr "Tilgangskontroll"
+
+#~ msgid "Set Access"
+#~ msgstr "Sett Tilgang"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Tillatelser for Brukere"
+
+#, fuzzy
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Tillatelsene er arvet i kontent-hierarkiet. For eksempel, hvis du setter "
+#~ "en Vis Kalender-tillatelse for en bruker på Person-indeks, vil brukeren "
+#~ "bli istand til å se kalendere for alle personer. Hvis du vil at brukeren "
+#~ "skal være i stand til å ha tilgang til bare en kalender for en eller "
+#~ "annen ressurs, kan du sette Vis Kalender-tillatelse for den brukeren på "
+#~ "den ressursen."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "Under er en liste over tillatelse-navn med deres respektive betydninger."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Endre nettstedspreferanser"
+
+#~ msgid "General preferences"
+#~ msgstr "Generelle preferanser"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Modifiser nettstedspreferanser"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Avtaler for"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Velg andre kalendre som skal vises"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Hold Ctrl eller Shift nede for å velge flere kalendre."
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Velg kalendre som skal vises"
+
+#~ msgid "People"
+#~ msgstr "Personer"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Det er ingen personer med kalender tilgjengelig for deg."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Det er ingen gruppe med kalender tilgjengelig for deg."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Det er ingen ressurser med kalender tilgjengelig for deg."
+
+#~ msgid "Showing"
+#~ msgstr "Viser"
+
+#~ msgid "of"
+#~ msgstr "av"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Er du sikker på at du vil slette valgte oppføring?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Du har ikke valgt noen oppføringer."
+
+#~ msgid "delete-button"
+#~ msgstr "slette-knapp"
+
+#~ msgid "Exception"
+#~ msgstr "Unntak"
+
+#~ msgid "Server Error"
+#~ msgstr "Tjener Feil"
+
+#~ msgid "All day event"
+#~ msgstr "Heldags avtale"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Dette er en gjentakende hendelse"
+
+#~ msgid "Ends"
+#~ msgstr "Slutter"
+
+#~ msgid "edit event"
+#~ msgstr "rediger hendelse"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Endre detaljer for denne hendelsen"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Planlagte ressurser"
+
+#~ msgid "edit resources"
+#~ msgstr "rediger ressurser"
+
+#~ msgid "delete event"
+#~ msgstr "slette hendelse"
+
+#~ msgid "Event details"
+#~ msgstr "Hendelses detaljer"
+
+#~ msgid "Update form"
+#~ msgstr "Oppdater skjema"
+
+#~ msgid "day"
+#~ msgstr "dag"
+
+#~ msgid "week"
+#~ msgstr "uke"
+
+#~ msgid "month"
+#~ msgstr "måned"
+
+#~ msgid "year"
+#~ msgstr "år"
+
+#~ msgid "Weekly"
+#~ msgstr "Ukentlig"
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Dag ${monthday} i hver måned"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} i hver måned"
+
+#~ msgid "Repeat"
+#~ msgstr "Gjenta"
+
+#~ msgid "times"
+#~ msgstr "ganger"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Gjenta for alltid"
+
+#~ msgid "Title:"
+#~ msgstr "Tittel:"
+
+#~ msgid "Starts:"
+#~ msgstr "Starter:"
+
+#~ msgid "Ends:"
+#~ msgstr "Slutter:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Dette er en gjentakende hendelse!"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Kolliderende avtale"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Last opp CSV Fil"
+
+#~ msgid "CSV File"
+#~ msgstr "CSV Fil"
+
+#~ msgid "Charset:"
+#~ msgstr "Tegnsett:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Vestlig (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Vestlig (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Vestlig (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Annet (vær vennlig å spesifiser)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Annet tegnsett: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Legg inn CSV Data"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV Data"
+
+#~ msgid "Members"
+#~ msgstr "Medlemmer"
+
+#~ msgid "edit members"
+#~ msgstr "endre medlemmer"
+
+#, fuzzy
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Endre personer som er medlemmer av denne gruppen"
+
+#~ msgid "Remove"
+#~ msgstr "Fjern"
+
+#~ msgid "Please log in"
+#~ msgstr "Vennligst logg inn"
+
+#~ msgid "Login"
+#~ msgstr "Login"
+
+#~ msgid "User Information"
+#~ msgstr "Brukerinformasjon"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Din sesjon har uløpt."
+
+#~ msgid "There are none."
+#~ msgstr "Ingen å finne"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "Legg til-knapp"
+
+#~ msgid "There are none to add."
+#~ msgstr "Ingen å legge til."
+
+#~ msgid "Find Now"
+#~ msgstr "Finn"
+
+#~ msgid "Clear"
+#~ msgstr "Tøm"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "avbryt-knapp"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Hvem som kan se merknad"
+
+#~ msgid "Private"
+#~ msgstr "Privat"
+
+#~ msgid "Public"
+#~ msgstr "Offentlig"
+
+#~ msgid "Add note"
+#~ msgstr "Legg til merknad"
+
+#~ msgid "add-button"
+#~ msgstr "legg til-knapp"
+
+#~ msgid "Delete"
+#~ msgstr "Slett"
+
+#~ msgid "Not Found"
+#~ msgstr "Ikke Funnet"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "Siden du prøver å få tilgang til er ikke tilgjengelig."
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "CSV data <strong>må</strong> inneholde et brukernavn og et fullt navn. "
+#~ "Valgfritt <strong>kan</strong> også passord bli innkludert."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jjensen, Jens Jensen\n"
+#~ "jtjensen, Jens Tom Jensen, r2m45J\n"
+#~ "jens, Jens\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "Ovenstående eksempel oppretter tre brukere, 'jjensen', 'jtjensen', 'jens "
+#~ "'. Av disse tre er det bare jtjensen som har et passord ('r2m45J') og "
+#~ "derved vil kunne logge inn på systemet. Legg merke til at passord må bli "
+#~ "send i ren tekst."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Last opp skoleverktøy personer som CSV"
+
+#~ msgid "Details"
+#~ msgstr "Detaljer"
+
+#~ msgid "edit details"
+#~ msgstr "endre detaljer"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Endre detaljer for denne personen"
+
+#~ msgid "Add person"
+#~ msgstr "Legg til person"
+
+#~ msgid "Add to groups"
+#~ msgstr "Legg til i grupper"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Beklager. du kan ikke slette din egen brukerkonto."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Rediger kontaktinformasjon"
+
+#~ msgid "Edit person"
+#~ msgstr "Rediger person"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Kalender Innstillinger"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Endre person innstillinger"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Du prøver å slette en gjentakende hendelse."
+
+#~ msgid "Current"
+#~ msgstr "Nåværende"
+
+#~ msgid "Future"
+#~ msgstr "Framtiden"
+
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Slett en gjentakende avtale (${event_title})"
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identifikator (valgfri)"
+
+#~ msgid "Printable version"
+#~ msgstr "Utskriftsvennlig versjon"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Vis daglig kalender"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Vis ukentlig kalender"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Vis måneds kalender"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Vis årlig kalender"
+
+#~ msgid "Yearly"
+#~ msgstr "Årlig"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Kalender for ${tittel} - ${kalender_tittel}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Gå til ..."
+
+#, fuzzy
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Morgendagens Hendelser"
+
+#~ msgid "Log in"
+#~ msgstr "Logg inn"
+
+#~ msgid "User:"
+#~ msgstr "Bruker:"
+
+#~ msgid "Log Out"
+#~ msgstr "Logg Ut"
+
+#~ msgid "Edit Info"
+#~ msgstr "Rediger Info"
+
+#~ msgid "Add Event"
+#~ msgstr "Legg til hendelse"
+
+#~ msgid "Modify Event"
+#~ msgstr "Endre hendelse"
+
+#, fuzzy
+#~ msgid "Set up access"
+#~ msgstr "Sette opp tilgang"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Uautoriserte Brukere"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Uautorisert Bruker"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Godkjente Brukere"
+
+#~ msgid "All Users"
+#~ msgstr "Alle Brukere"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: advarsel: ignorerte konfigurasjonsvalg '%s'"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"
+
+#~ msgid "x of every month"
+#~ msgstr "x i hver måned"

Added: schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/nb/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5022 @@
+# Norwegian Bokmål translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-06-13 16:43+0000\n"
+"Last-Translator: Dagfinn Kolstad <dagfinn at area11.se>\n"
+"Language-Team: Norwegian Bokmål <nb at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Kallenavn"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Et kort kallenavn for denne personen."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "E-postadresse"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Alternativ e-postadresse"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Anbefalt telefonnummer"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Alternativ telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Alternativt telefonnummer"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Nettside"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Nettside eller blogg"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "E-postadresse"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personer"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 Person"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personer"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Brukernavn eller passord er ikke korrekt"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "mars"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "januar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "februar"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "april"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "igår"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Desember"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Mandag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Tirsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Søndag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Lørdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Fredag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Man"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Tirs"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Ons"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Tors"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "fredag"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Lør"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "søn"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Tittel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Hele dagen"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Dato"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tid"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Start tid i 24-timers format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Varighet"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Varighetstype"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minutter"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Timer"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dager"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Sted"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Beskrivelse."
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Uke"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Måned"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "År"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Gjenta hver"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Område"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Antall"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Til"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "evig"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Antall hendelser"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Gjenta til"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Ukedager"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Ukedag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Månedlig"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Unntaksdatoer"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "samme ukedag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "siste ukedag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Siste ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ugyldig tid"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Oppdater"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalender"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Neste uke"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Nåværende uke"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Forrige uke"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (uke ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Neste måned"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Nåværende måned"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Forrige måned"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Uke ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Neste år"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Nåværende år"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Forrige år"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Handlinger"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SkoleVerktøy"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Se på"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Legg til avtale"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Legg til avtale"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Logg inn"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigering"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Handlinger"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Ingen data lagt inn"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Kunne ikke konvertere data til Unicode tegnsett (feil tegnsett?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV fil importert."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Importering av CSV-fil feilet."
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV-tekst importert."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Kunne ikke importere CSV-tekst"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Ingen tegnsett spesifisert"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Ukjent tegnsett"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Feil i CSV data, linje ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konvertering til unicode tegnsett feilet i linje ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Rad 2 er ikke tom."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Ufullstendig kursbeskrivelse på linje ${line]"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr "Første rad i CSV-filen må inneholde semester-ID og timeplan-ID"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Semesteret ${term} finnes ikke."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Tidstabell oppsettet ${schema} eksisterer ikke."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Feil i tidstabell CVS data, linje ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Dag id er ikke definert i valgt oppsett: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Ikke definerte perioder i valgte dager: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Personer ikke funnet: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Kurs ikke funnet: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Avsnitt ikke funnet: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Ugyldig innlegg: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Endringer lagret."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "hele dagen"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Plassering: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Bokførte ressurser: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+#, fuzzy
+msgid "recurrent"
+msgstr "tilbakevendende"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Daglig kalender for %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Månedlig kalender for %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Støtte for PDF-filer er slått av. Snakk med administrator for å slå det på."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Endre oppsettsvalg"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Kalender innstillinger"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Kalender innstillinger"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Mitt oppsett"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Kalender innstillinger"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SkoleVerktøy"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SkoleVerktøy"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Beskrivelse."
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Gå til ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Neste dag hendelser"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Utskriftsvennlig versjon"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Se på daglig kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Daglig"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Ukentlig oversikt kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Ukentlig"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Måneds oversikt kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Se på årsoversikt kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Årlig"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Calender for ${tittel} - ${kalender_tittel}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Personal calendar"
+msgstr "Måneds oversikt kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "Timetable calendar"
+msgstr "Se på daglig kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Min kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendre"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Mer..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Se på daglig kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "slette-knapp"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "avbryt-knapp"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Fjern"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Ingen å finne."
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Finn"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Blank ut"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+#, fuzzy
+msgid "There are none to add."
+msgstr "Ingen å finne."
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Hele dagen"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Detaljer"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Lør"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Legg til avtale"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Endre instruktører for denne seksjonen."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Bokførte ressurser: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "endre grupper"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Endre/slett avtale"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Rediger oversikten"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "endre detaljer"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Ressurser"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Oppdater"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Uke"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Måned"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "År"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Gjenta til"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Tid"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Gjenta hver"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Bokførte ressurser: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Personinfo: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Tittel"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Lør"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Ressurs oversikt"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "Plassering: %s"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Kurs"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "Velkommen til SkoleVerktøy serveren"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Rediger oversikten"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Logg inn"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "tilbakevendende"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Hele dagen"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Vestlig (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Annet ( vær vennlig å spesifiser)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Annet tegnsett: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Legg inn CVS data"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CVS data"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "Legg til-knapp"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Timeplan"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Last opp SkoleVerktøy tidstabell som CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Eksempel:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Last opp en CVS fil."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CVS fil"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Karaktersett:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalender for %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Bokførte ressurser: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Ugyldig heltall"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Ugyldig tekst data"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Ugyldig dato-tid data"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Kjør %s -h for hjelp."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: daemon mode ikke støttet av operativsystem."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Leser konfigurasjon fra %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Kunne ikke initialisere databasen:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Kanskje en annen instans av %s bruker den?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SkoleVerktøy 0.10 database fil, avbryter handling.\n"
+"\n"
+"Vær vennlig å kjør verktøyet for oppgradering av frittstående databaser.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Velkommen til SkoleVerktøy serveren"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Kalender innstillinger"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Endre oppsettsvalg"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Personer"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Planlegger for ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Ny slutt"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minutter"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "tilbakevendende"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Søndag"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Ingen å finne."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "Datoen du skrev inn tilhører ikke et semester."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Ingen å finne."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Forrige år"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Neste"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Sted"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Legg til en oversikt"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Se på"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Rediger"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Legg til en oversikt"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Rediger oversikten"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importer kurs"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Legg til et nytt kurs"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Nytt kurs"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Kurs oversikt"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Legg til et nytt kurs"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Ikke tilstreklig med data lagt inn."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Tittel kan ikke være tom"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Kurset finnes ikke"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Trenger en kurs ID"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Legg til en seksjon til ${kurs}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Instruktører"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Nåværende instruktører"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Tilgjengelige instruktører"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Studenter"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grupper"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Ressurser"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Kursoversikt"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Legg til en ny oversikt"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV data <strong>må</strong> inneholde gruppenavn og <strong>kan</strong> "
+"inneholde gruppebeskrivelse. Annen informasjon blir ikke brukt av systemet."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Last opp SchoolTool-fag som CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Seksjoner"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "elever"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+#, fuzzy
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "Endre navn"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Endre instruktører for denne seksjonen."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Endre instruktører for denne seksjonen."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Bokførte ressurser: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Endre instruktører for denne seksjonen."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "endre instruktører"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "endre personer"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Foreta endringer på studenter i denne seksjonen individuelt"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Foreta endringer på studenter i denne seksjonen gruppevis"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "endre grupper"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Identifikator (valgfri)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Seksjon"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Nåværende størrelse"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Det er ${num_errors} feil i inn data."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Tittel på kurset."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Beskrivelse av kurset."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Navn"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Kode"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Beskrivelse av seksjonen."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instruktører}--{kurs}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Personer"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "mars"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Skoledag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Rediger"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Avbryt"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Brukernavn"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Passord"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Utfør endringer"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Daglig"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Ingen å finne."
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Ingen å finne."
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Fullt navn"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (i JPEG-format)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Kurs"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "slette-knapp"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "legg til-knapp"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "avbryt-knapp"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Legg til en oversikt"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr "N/A"
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Studenter"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "slette-knapp"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Periode ${nummer}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importer grupper"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Legg til ny gruppe"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Rediger oversikten"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Administere medlemskap"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupper"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupper"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"CSV data <strong>må</strong> inneholde gruppenavn og <strong>kan</strong> "
+"inneholde gruppebeskrivelse. Annen informasjon blir ikke brukt av systemet."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Last opp SchoolTool-grupper som CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "November"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "Endre navn"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Gruppe oversikt"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Legg til ny gruppe"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Gruppetittel"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Beskrivelse av gruppen"
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Legg til avtale"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "legg til-knapp"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Nåværende uke"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Studenter"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "avbryt-knapp"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "legg til-knapp"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "avbryt-knapp"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nytt semester"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Notattittel"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Innhold"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Notatinnhold"
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Personvern"
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Personvern"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Legg til semester"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Dato"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "brukernavn kan ikke være tomt"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "fullt navn kan ikke være tomt"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Brukernavn eksisterer allerede: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importer Personer"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CVS data <strong>må</strong> inneholde et brukernavn og et fullt navn. "
+"Valgfritt <strong>kan</strong> også passord bli innkludert."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jjensen, Jens Jensen\n"
+"jtjensen, Jens Tom Jensen, r2m45J\n"
+"jens, Jens\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Ovenstående eksempel oppretter tre brukere, 'jjensen', 'jtjensen', 'jens '. "
+"Av disse tre er det bare jtjensen som har et passord ('r2m45J') og derved "
+"vil kunne logge inn på systemet. Legg merke til at passord må bli send i ren "
+"tekst."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Last opp SchoolTool-grupper som CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Endre valgte innstillinger for ${user}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+#, fuzzy
+msgid "Edit person preferences"
+msgstr "Kalender innstillinger"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Tidssone"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Tidssone for din kalender"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Klokkeslettformat"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/ÅÅ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "ÅÅÅÅ-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dag Måned, År"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Uken starter på:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Begynn ukevisning med Søndag eller Mandag"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Vis perioder"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Vis periodens navn i den daglige oversikten"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Navn som skal vises"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Relasjoner"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Legg til et nytt kurs"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Nytt semester"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Viser"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "av"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "elementer"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importer ressurser"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Legg til ny ressurs"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Rediger oversikten"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Ressurser"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Ressurser"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV data <strong>må</strong> inneholde gruppenavn og <strong>kan</strong> "
+"inneholde gruppebeskrivelse. Annen informasjon blir ikke brukt av systemet."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "Last opp SchoolTool-fag som CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Ressurs oversikt"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Legg til ny ressurs"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Tittel på ressurs"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beskrivelse av ressurs"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indikerer at denne ressursen er et sted, som f.eks. et klasserom."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+#, fuzzy
+msgid "Calendar_relationships"
+msgstr "Relasjoner"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Kalender"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, avbryter.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dette er ikke en SchoolBell 1.0 database fil, avbryter.\n"
+"\n"
+"Vennligst kjør det vedlagte oppgraderings skriptet.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "topp"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Unntaksdatoer"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Logg inn"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Bruker:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Logg ut"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Nytt semester"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "Erstatningsdatoen du skrev inn er ugyldig."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "Datoen du skrev inn er ugyldig. Bruk dato i formatet ÅÅÅÅ-MM-DD."
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "Datoen du skrev inn tilhører ikke et semester."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "Datoen du skrev inn er ikke en skoledag."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+#, fuzzy
+msgid "Please enter the replacement date below."
+msgstr "Systemet trenger minst en ukedag."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Erstatning"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+#, fuzzy
+msgid "Please enter the emergency date below."
+msgstr "Systemet trenger minst en ukedag."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Endre semester: $tittel"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Nytt semester"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Semester"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Legg til en ny periode"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Start dato"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Slutt dato"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${måned} ${år}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Uke ${uke_nummer}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Legg til semester"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Lagre endringer"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Først, navngi og definer tids perioden på semesteret. Dato området er "
+"inklusiv (d.v.s 2004-09-01 til 2004-12-31). Datoer må angis på som YYYY.MM."
+"DD."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "Dato områder er inklusiv (d.v.s 2004-09-01 til 2004-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Oppdater"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr "Deretter, vennligst angi hvilke dager som er skoledager og fridager."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr "Vennligst angi hvilke dager som er skoledager og fridager."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Skoledag"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Fridag"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Bytt om på følgende dager i uken:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "${object}'s tidstabell"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Ugyldig dato. Bruk dato i formatet ÅÅÅÅ-MM-DD."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Datoen tilhører ikke et semester."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Noen verdier var ugyldige. De er markert med rødt."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Se på Tidstabeller"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Se på Tidstabeller"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Vennligst velg en verdi"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Dag ${nummer}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Periode 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Periode ${nummer}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Tidstabell oppsett ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Dager i tidstabellen faller alltid sammen med ukens dager (d.v.s mandager er "
+"den første dagen i tidstabellen brukt, tirsdager den andre, og så videre)"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Dager i tidstabellen er brukt fortløpende, dager som ikke er skoledager "
+"hoppes over."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Vennligs velg et navn for tidstabell oppsettet du vil opprette."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr "Enkelte tids definisjoner var feil og ble derfor ikke brukt."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Til slutt, vær sikker på at informasjonen i dette innlegget er korrekt, "
+"eneste mulighet for å endre disse informasjonen vil være å slette oppsette "
+"for denne tidstabellen og ny opprette denne."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Opprett tidstabell oppsett"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Først, definer perioder og dager i tidstabellen."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Kopier perioder fra foregående dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Fjern denne dagen"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Legg til en dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Legg til en periode"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Deretter, velg hvordan dager i tidstabellen er sammordnet mot kalender "
+"dagene i uken."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Timeplan"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "Semester"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Skjema"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+#, fuzzy
+msgid "Scheduling for ${person}"
+msgstr "Planlegger for ${section}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Kurs"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+#, fuzzy
+msgid "Scheduling conflict."
+msgstr "Planlegger for ${section}"
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Lagre"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+#, fuzzy
+msgid "There are no terms or timetable schemas defined."
+msgstr "Opprett tidstabell oppsett"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "For semester:"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Planlegger for ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Bruker timeplan:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+#, fuzzy
+msgid "Period title (optional)"
+msgstr "Identifikator (valgfri)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "Periode ${nummer}"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Opprett"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "Periode 1"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Opprinnelig start"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Opprinnelig slutt"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Ny start"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Ny slutt"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Endre"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Fortsett"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Opprett tidstabell oppsett"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Tidstabeller for ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Nytt oppsett tidstabell"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Ukedager"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Roterende syklus"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Skriv inn ukedagene i syklusen, en per linje."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Systemet trenger minst en ukedag."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Sjekk at ingen ukedag er skrevet flere ganger."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr "Starter og slutter skoletimer til samme tid hver dag?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Samme tid hver dag"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Forskjellig tid"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Skriv inn start- og sluttklokkeslett for hver time, en time (TT:MM - TT:MM) "
+"per linje."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Ugyldig time: $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Samme"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Forskjellig"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Ukjent dags id: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Ukjent periode id: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Brukernavn:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Endre navn, bilde eller passord for denne personen"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importer oversikt"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Sted ikke funnet: ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Endre detaljer for denne personen"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Gjennomførte seksjoner"
+
+#~ msgid "via group"
+#~ msgstr "via gruppe"
+
+#~ msgid "Person index"
+#~ msgstr "Personoversikt"
+
+#~ msgid "New photo"
+#~ msgstr "Nytt foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Et lite bilde (ca. 48x48 piksler i JPEG-format)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Fjern foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Merk av her for å fjerne foto"
+
+#~ msgid "New password"
+#~ msgstr "Nytt passord"
+
+#~ msgid "Verify password"
+#~ msgstr "Bekreft passord"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Passordene er ikke like."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Passord stemmer ikke overens!"
+
+#~ msgid "Control access"
+#~ msgstr "Kontrollere tilgang"
+
+#~ msgid "An error occured."
+#~ msgstr "En feil oppsto."
+
+#, fuzzy
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Uautoriserte brukere"
+
+#, fuzzy
+#~ msgid "Unauthenticated User"
+#~ msgstr "Uautorisert bruker"
+
+#, fuzzy
+#~ msgid "Authenticated Users"
+#~ msgstr "Godkjente brukere"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: advarsel: ignorerte konfigurasjonsvalg '%s'"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Dette er ikke en SkoleVerktøy 0.10 database fil, avbryter handling.\n"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ne/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ne/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ne/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4765 @@
+# Nepali translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-08-23 06:06+0000\n"
+"Last-Translator: ashik <ashikm26 at gmail.com>\n"
+"Language-Team: Nepali <ne at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "व्यक्तिहरू"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "१ व्यक्ति"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} व्यक्तिहरू"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "प्रयोगकर्ता अथवा पासवर्ड गलत छ"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "व्यक्तिहरू"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "व्यक्तिहरू"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+#, fuzzy
+msgid "Import Persons"
+msgstr "व्यक्तिहरू"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3175 @@
+# Dutch translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-11-25 11:58+0000\n"
+"Last-Translator: Ronald van Engelen <ubuntu-users at lacocina.nl>\n"
+"Language-Team: Dutch <nl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Gebruikersnaam"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Een korte gebruikersnaam voor deze persoon."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Primaire e-mail"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Secundaire e-mail"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Primair telnr."
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Aanbevolen telefoonnummer."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Secundair telnr."
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Secundair telefoonnummer"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Website"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Website of weblog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Postadres"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personen"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 persoon"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personen"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Gebruikersnaam of wachtwoord is niet correct"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Dit jaar"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Beschikbare Groepen"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Maart"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januari"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februari"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mei"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Augustus"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "De volgende dag"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Vandaag"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "De vorige dag"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "December"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Maandag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Dinsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Woensdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Donderdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Zondag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Zaterdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Vrijdag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Ma"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Di"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Wo"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Do"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Vr"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Za"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Zo"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "De hele dag"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tijd"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Aanvangstijd in 24-uursformaat"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duur"
+
+#: /src/schooltool/app/browser/cal.py:1677
+#, fuzzy
+msgid "Duration Type"
+msgstr "Tijdseenheid"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuten"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Uren"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dagen"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Locatie"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Beschrijving"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Herhalend"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Herhaalt zich elke"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Week"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Maand"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Jaar"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Herhaal elke"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Bereik"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Aantal"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Tot"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "eeuwig"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Aantal gebeurtenissen"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Herhaal tot"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Weekdagen"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Dag van de week"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Maandelijks"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Uitzonderingsdata"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "Zelfde dag van de week"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1e"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4e"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3e"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2e"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5e"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "laatste dag van de week"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Laatste ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Er is een fout opgetreden."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ongeldige tijd"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Einddatum valt eerder dan startdatum"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Ongeldige datum. Voer YYYY-MM-DD in, één per regel."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Gebeurtenis toevoegen"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Toevoegen"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Gebeurtenis bewerken"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Bijwerken"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Bijgewerkt op ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Agenda's"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Volgende week"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Deze week"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Vorige week"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Volgende maand"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Deze maand"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Vorige maand"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Week ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Volgend jaar"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Dit jaar"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Vorig jaar"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Geen gegevens opgegeven"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Gegevens kunnen niet worden omgezet naar Unicode (ongeldige tekenset?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV-bestand met succes geïmporteerd"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Importeren van CSV-bestand mislukt"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV-tekst met succes geïmporteerd"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Importeren CSV-tekst mislukt"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Geen tekenset aangegeven"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Onbekende tekenset"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Fout in CSV-gegevens, regel ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Omzetting naar unicode mislukt in regel ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Fout in CSV-gegevens, regel ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Persoonsinformatie: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Wijzigingen opgeslagen"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "de hele dag"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Locatie: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Geboekte voorzieningen: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "terugkerend"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "overgenomen van %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Dagelijkse agenda voor %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Weekagenda voor %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Week %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Maandagenda voor %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"PDF-ondersteuning is uitgeschakeld. Deze kan door de beheerder worden "
+"ingeschakeld."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Agenda voor %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"De naam van de school of organisatie die deze\n"
+"server beheert. Wordt getoond in de publieke agenda, \n"
+"onderaan alle pagina's en in de titel van de pagina's."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Voorpagina-agenda"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Site-brede agenda weergeven als de voorpagina van de\n"
+"site."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Verplichte invoer mist."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Formulier-invoer is geen bestandsobject"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Ongeldige invoer voor hele getallen"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Ongeldige tekstgegevens"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Ongeldige tekstuele gegevens"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Ongeldige unicode gegevens"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Ongeldige invoer voor gebroken getallen"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Ongeldige datum-/tijdgegevens"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Gaat nu op de achtergrond draaien, daemon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Voer %s -h uit voor hulp."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: daemon mode niet ondersteund op dit besturingssysteem."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Configuratie aan het lezen uit %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Opstarttijd: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Kon de database niet initialiseren:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Misschien wordt het door een andere %s instantie gebruikt?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Waarschuwing: kon de reportlab library niet vinden.\n"
+"PDF-ondersteuning uitgeschakeld."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Waarschuwing: lettertype-directory '%s' bestaat niet.\n"
+"PDF-ondersteuning uitgeschakeld."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Waarschuwing: lettertype '%s' bestaat niet.\n"
+"PDF-ondersteuning uitgeschakeld."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Gebruik: %s [opties]\n"
+"Opties:\n"
+"  -c, --config xxx gebruik dit configuratiebestand i.p.v. de "
+"standaardversie\n"
+"  -h, --help toon dit helpbericht\n"
+"  -d, --daemon ga naar de achtergrond na het starten\n"
+"  -r, --restore-manager managergebruiker herstellen met het standaard "
+"wachtwoord\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Geen opslag gedefinieerd in het configuratiebestand\n"
+"\n"
+"Als u het 'default' configuratiebestand gebruikt, wijzigt u dit a.u.b. en "
+"haal de commentaartekens weg voor één van de ZODB-opslagsecties.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dit is geen SchoolBell 1.0 databasebestand, wordt afgebroken.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dit is geen SchoolBell 1.0 databasebestand, wordt afgebroken.\n"
+"\n"
+"Voer a.u.b. het standalone database upgrade-script uit.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titel"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Titel van de notitie."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Groep"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Duur"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Datum"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Bronnenlijst"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Onvoldoende gegevens opgegeven."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Titels mogen niet leeg zijn"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Huidige Groepen"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Beschikbare Groepen"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Deze maand"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Beschikbare Groepen"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Groepen"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Huidige Groepen"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Beschikbare Groepen"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Voorzieningen"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Voorzieningen Importeren"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Beschikbare Voorzieningen"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Personenlijst"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Een nieuwe persoon toevoegen"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Titel van de voorziening."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Beschrijving van de voorziening."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Besschrijving van de groep."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Website"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Annuleren"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Informatie voor ${user} wijzigen"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Lidmaatchap Veranderen"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Voorkeuren voor ${user} wijzigen"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Contact-details voor ${user} wijzigen"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Contact-details voor ${user} wijzigen"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Contactgegevens"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "De gebruikersnaam is al in gebruik!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Toepassen"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Primair telnr."
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Vorige"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Gebeurtenis-informatie"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Gebruikersnaam"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Begint"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Za"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Tijdzone"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Secundair telnr."
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Aantekeningen"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Volgende"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Aantal gebeurtenissen"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "naam bewerken"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "naam bewerken"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "naam bewerken"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Mijn Voorkeuren"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Volledige naam"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (in JPEG formaat)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nieuwe Notitie"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV-tekst met succes geïmporteerd"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Wachtwoord met succes veranderd!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Wachtwoord met succes veranderd!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Voorbeeld:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Persoonsinformatie"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Groepenlijst"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Een nieuwe groep toevoegen"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Groepen van ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Leden van ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Huidige Leden"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Leden Toevoegen"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Titel van de groep."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Besschrijving van de groep."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Bronnenlijst"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Vorige week"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV-tekst met succes geïmporteerd"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Wachtwoord met succes veranderd!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Deze week"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Wachtwoord met succes veranderd!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Gebruiker"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Titel van de voorziening."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Beschrijving van de voorziening."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Begint"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Titel van de notitie."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Volgende week"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Titel van de notitie."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Dagelijks(e)"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Titel van de notitie."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Inhoud"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Inhoud van de notitie"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Privacy"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "gebruikersnaam mag niet leeg zijn"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "volledige naam mag niet leeg zijn"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Dubbele gebruikersnaam: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nieuw wachtwoord"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Wachtwoord wijzigen"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Tijdzone"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Gebruikte tijdzone om uw agenda weer te geven"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Tijdformaat"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "UU:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "UU:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datumformaat"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/JJ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "JJJJ-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dag Maand, Jaar"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Week begint op:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Geef begin van weken weer op zondag of maandag"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Agenda weergeven"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Weer te geven naam"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Bronnenlijst"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Bronnenlijst"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Titel van de voorziening."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beschrijving van de voorziening."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Een Locatie."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+"Geef aan of deze voorziening een locatie, zoals bijvoorbeeld een klaslokaal "
+"is."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Onvoldoende gegevens opgegeven."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Onvoldoende gegevens opgegeven."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Onvoldoende gegevens opgegeven."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Mijn Agenda"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Meer..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Agenda's"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Welkom bij SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigatie"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "naam bewerken"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Naam, plaatje of wachtwoord van deze persoon wijzigen"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Persoonsinformatie: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Lidmaatschappen van deze persoon beheren"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "groepen bewerken"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dit is geen SchoolBell 1.0 databasebestand, wordt afgebroken.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dit is geen SchoolBell 1.0 databasebestand, wordt afgebroken.\n"
+"\n"
+"Voer a.u.b. het standalone database upgrade-script uit.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "top"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Wijzigingen opgeslagen"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Details Wijzigen"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nieuwe Notitie"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "items"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Een nieuwe persoon toevoegen"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Begint"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Uitzonderingsdata"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Ongeldige datum. Voer YYYY-MM-DD in, één per regel."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} personen"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Inhoud van de notitie"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "Zelfde dag van de week"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "naam bewerken"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Notitie"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Onbekende tekenset"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nieuwe foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Een kleine afbeelding (ongeveer 48x48 pixels in JPEG formaat)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Foto wissen"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Aanvinken om de foto te wissen"
+
+#~ msgid "Verify password"
+#~ msgstr "Wachtwoord bevestigen"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Wachtwoorden komen niet overeen."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Wachtwoorden komen niet overeen!"
+
+#~ msgid "View"
+#~ msgstr "Weergeven"
+
+#~ msgid "Edit"
+#~ msgstr "Bewerken"
+
+#~ msgid "Create new objects"
+#~ msgstr "Nieuwe objecten aanmaken"
+
+#~ msgid "Add events"
+#~ msgstr "Gebeurtenissen toevoegen"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Gebeurtenissen wijzigen/verwijderen"
+
+#~ msgid "Control access"
+#~ msgstr "Toegang beheren"
+
+#~ msgid "Manage membership"
+#~ msgstr "Lidmaatschap beheren"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Geauthenticeerde gebruikers"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Ongeauthenticeerde gebruikers"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Toegang Instellen"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Voorkeuren Wijzigen"
+
+#~ msgid "New Person"
+#~ msgstr "Nieuw Persoon"
+
+#~ msgid "Import Persons"
+#~ msgstr "Personen Importeren"
+
+#~ msgid "Add a Group"
+#~ msgstr "Een Groep Toevoegen"
+
+#~ msgid "New Group"
+#~ msgstr "Nieuwe Groep"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Groepsinformatie Bewerken"
+
+#~ msgid "A Group"
+#~ msgstr "Een Groep"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell-Groep"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Leden Toevoegen/Verwijderen"
+
+#~ msgid "Import Groups"
+#~ msgstr "Groepen Importeren"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Een Voorziening Toevoegen"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Voorzieningsinformatie Bewerken"
+
+#~ msgid "New Resource"
+#~ msgstr "Nieuwe Voorziening"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell-Voorziening"
+
+#~ msgid "A Resource"
+#~ msgstr "Een Voorziening"
+
+#~ msgid "Actions"
+#~ msgstr "Acties"
+
+#~ msgid "View Calendar"
+#~ msgstr "Agenda Bekijken"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Agenda (Dagelijks)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Agenda (Dagelijks, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Agenda (Wekelijks)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Agenda (Wekelijks, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Agenda (Maandelijks)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Agenda (Maandelijks, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Agenda (Jaarlijks)"
+
+#~ msgid "Atom View"
+#~ msgstr "Atom Weergave"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Vrij/Bezet"
+
+#~ msgid "New Event"
+#~ msgstr "Nieuwe Gebeurtenis"
+
+#~ msgid "Open in iCal"
+#~ msgstr "In iCal Openen"
+
+#~ msgid "Edit Event"
+#~ msgstr "Gebeurtenis Bewerken"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Site-Voorkeuren Wijzigen"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Deze permissie staat het bekijken van namen, titels, foto's, lijsten van "
+#~ "objecten en andere informatie toe."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr ""
+#~ "Staat het bewerken van namen, titels, beschrijvingen, foto's, enz. toe."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr ""
+#~ "Staat de gebruiker toe nieuwe personen, groepen en voorzieningen aan te "
+#~ "maken."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr ""
+#~ "Staat het bekijken van agenda's van personen, groepen en voorzieningen "
+#~ "toe."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Staat het toevoegen van nieuwe gebeurtenissen aan agenda's toe."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr ""
+#~ "Staat het bewerken en verwijderen van gebeurtenissen in agenda's toe."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Toegangscontrole voor ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr ""
+#~ "Staat de gebruiker toe dit formulier (Toegangscontrole) te gebruiken"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Staat de gebruiker toe om personen, groepen en voorzieningen aan groepen "
+#~ "toe te voegen. Om iets aan een groep toe te voegen, heeft de gebruiker "
+#~ "deze permissie alleen op de groep nodig. N.B.: het samenvoegen van "
+#~ "groepen is van invloed op de beveiliging."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Permissies voor Groepen"
+
+#~ msgid "Access control"
+#~ msgstr "Toegangscontrole"
+
+#~ msgid "Set Access"
+#~ msgstr "Toegang Instellen"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Permissies voor Gebruikers"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "De permissies worden overgeërfd in de inhoudshiërarchie. Bijvoorbeeld: "
+#~ "als de permissie 'Agenda Bekijken' voor een bepaalde gebruiker wordt "
+#~ "ingesteld op de Persoonsindex, dan kan die gebruiker de agenda's van alle "
+#~ "personen inzien. Als het de bedoeling is dat de gebruiker alleen toegang "
+#~ "heeft tot de agenda van een bepaalde voorziening, kan de permissie "
+#~ "'Agenda Bekijken' voor die gebruiker op die voorziening worden ingesteld."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr "Hieronder staat een lijst van permissie-namen en hun betekenis."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Site-voorkeuren instellen"
+
+#~ msgid "General preferences"
+#~ msgstr "Algemene voorkeuren"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Site-voorkeuren bewerken"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Gebeurtenissen voor"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_description"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_enabled"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_more_info"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Mijn 'Atom feed' valideren"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Geldige Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Locatie: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Extra agenda's selecteren om weer te geven"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Hou Ctrl of Shift ingedrukt om meerdere agenda's te selecteren."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Publieke Agenda"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "site-brede agenda"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Agenda's selecteren om weer te geven"
+
+#~ msgid "People"
+#~ msgstr "Mensen"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Er zijn geen personen met agenda's die voor u toegankelijk zijn."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Er zijn geen groepen met agenda's die voor u toegankelijk zijn."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr ""
+#~ "Er zijn geen voorzieningen met agenda's die voor u toegankelijk zijn."
+
+#~ msgid "Showing"
+#~ msgstr "Toont"
+
+#~ msgid "of"
+#~ msgstr "van"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Weet u zeker dat u de geselecteerde items wilt verwijderen?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Geen items geselecteerd."
+
+#~ msgid "delete-button"
+#~ msgstr "verwijder-knop"
+
+#~ msgid "Exception"
+#~ msgstr "Fout"
+
+#~ msgid "Traceback"
+#~ msgstr "Traceback"
+
+#~ msgid "Server Error"
+#~ msgstr "Serverfout"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Er is een interne server-fout opgetreden. Dit betekent waarschijnlijk dat "
+#~ "u een bug in SchoolBell heeft ontdekt. Raporteer deze alstublieft in <a "
+#~ "href=\"http://issues.schooltool.org\">de issue tracker</a>."
+
+#~ msgid "All day event"
+#~ msgstr "gebeurtenis (hele dag)"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Dit is een terugkerende gebeurtenis."
+
+#~ msgid "Ends"
+#~ msgstr "Eindigt"
+
+#~ msgid "edit event"
+#~ msgstr "gebeurtenis bewerken"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "De details van deze gebeurtenis wijzigen"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Ingeroosterde voorzieningen"
+
+#~ msgid "edit resources"
+#~ msgstr "voorzieningen bewerken"
+
+#~ msgid "delete event"
+#~ msgstr "gebeurtenis verwijderen"
+
+#~ msgid "Event details"
+#~ msgstr "Details gebeurtenis"
+
+#~ msgid "Book Resources"
+#~ msgstr "Voorzieningen boeken"
+
+#~ msgid "Update form"
+#~ msgstr "Formulier bijwerken"
+
+#~ msgid "day"
+#~ msgstr "dag"
+
+#~ msgid "week"
+#~ msgstr "week"
+
+#~ msgid "month"
+#~ msgstr "maand"
+
+#~ msgid "year"
+#~ msgstr "jaar"
+
+#~ msgid "Weekly"
+#~ msgstr "Wekelijks"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr ""
+#~ "Dit gedeelte is alleen van toepassing als voor wekelijks terugkerend is "
+#~ "gekozen."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr ""
+#~ "Dit gedeelte is alleen van toepassing als voor maandelijks terugkerend is "
+#~ "gekozen."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Dag ${monthday} van elke maand"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} van elke maand"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} van elke maand"
+
+#~ msgid "Repeat"
+#~ msgstr "Herhalen"
+
+#~ msgid "times"
+#~ msgstr "maal"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Eeuwig herhalen"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Voorzieningen boeken"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Boeking Voorziening voor ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Titel:"
+
+#~ msgid "Starts:"
+#~ msgstr "Begint:"
+
+#~ msgid "Ends:"
+#~ msgstr "Eindigt:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Dit is een terugkerende gebeurtenis!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Boeking Voorzieningen"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Conflicterende gebeurtenissen"
+
+#~ msgid "Book"
+#~ msgstr "Boeken"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "CSV-gegevens <strong>moeten</strong> een groepstitel  en <strong>mogen</"
+#~ "strong> een optionele groepsbeschrijving bevatten. Alle verdere "
+#~ "informatie zal worden weggegooid."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LGG, Linux Gebruikers Groep\n"
+#~ "Schaakclub\n"
+#~ "Sportclub, Naschoolse sportclub, <em>tekst na de tweede komma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "In het bovenstaande voorbeeld zouden 3 groepen worden aangemaakt, "
+#~ "getiteld 'LGG', 'Schaakclub' en 'Sportclub'. De eerste en laatste groep "
+#~ "zouden als beschrijving respectievelijk 'Linux Gebruikers Groep' en "
+#~ "'Naschoolse sportclub' hebben. De 'Schaakclub' zou geen beschrijving "
+#~ "hebben, en de extra \"tekst na de tweede komma\" bij de derde groep zou "
+#~ "worden genegeerd."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Schooltool groepen als CSV uploaden"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "CSV-bestand uploaden"
+
+#~ msgid "CSV File"
+#~ msgstr "CSV-bestand"
+
+#~ msgid "Charset:"
+#~ msgstr "Tekenset:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Westers (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Westers (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Westers (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Anders (geef aan)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Andere tekenset: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "CSV-gegevens invoeren"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV-gegevens"
+
+#~ msgid "Members"
+#~ msgstr "Leden"
+
+#~ msgid "edit members"
+#~ msgstr "leden bewerken"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Mensen die lid zijn van deze groep wijzigen."
+
+#~ msgid "Remove"
+#~ msgstr "Verwijderen"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "U heeft geen toegang tot deze pagina. Klik op de vorige knop in uw "
+#~ "browser om terug te gaan, of vraag een gebruiker met meer rechten om in "
+#~ "te loggen."
+
+#~ msgid "Please log in"
+#~ msgstr "Log a.u.b. in"
+
+#~ msgid "Login"
+#~ msgstr "Inloggen"
+
+#~ msgid "User Information"
+#~ msgstr "Gebruikersinformatie"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Uw sessie is verlopen."
+
+#~ msgid "There are none."
+#~ msgstr "Er zijn er geen."
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "verzend-knop"
+
+#~ msgid "There are none to add."
+#~ msgstr "Er zijn er geen om toe te voegen."
+
+#~ msgid "Find Now"
+#~ msgstr "Nu Zoeken"
+
+#~ msgid "Clear"
+#~ msgstr "Leegmaken"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "annuleer-knop"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Wie de notitie kunnen bekijken"
+
+#~ msgid "Private"
+#~ msgstr "Privé"
+
+#~ msgid "Public"
+#~ msgstr "Publiek"
+
+#~ msgid "Add note"
+#~ msgstr "Notitie toevoegen"
+
+#~ msgid "add-button"
+#~ msgstr "toevoeg-knop"
+
+#~ msgid "Delete"
+#~ msgstr "Wissen"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "N.B.:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Mogelijk bevat de url een typfout"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Mogelijk probeert u een niet bestaande pagina te bezoeken"
+
+#~ msgid "Not Found"
+#~ msgstr "Niet Gevonden"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "De pagina die u probeert te bezoeken is niet beschikbaar"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "CSV-gegevens <strong>moeten</strong> een gebruikersnaam en een volledige "
+#~ "naam bevatten. Een optioneel wachtwoord <strong>mag</strong> meegegeven "
+#~ "worden."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jjansen, Janita Jansen\n"
+#~ "jpbalkenende, Jan Peter Balkenende, r2m45J\n"
+#~ "kees, Kees\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "Het bovenstaande voorbeeld zou drie gebruikers, 'jjansen', 'jpbalkenende' "
+#~ "en 'kees' aanmaken. Van de drie zou alleen 'jpbalkenende' een wachtwoord "
+#~ "('r2m45J') hebben en zou in het systeem in kunnen loggen. N.B.: "
+#~ "Wachtwoorden moeten in 'plain text' verzonden worden."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Schooltool-personen als CSV uploaden."
+
+#~ msgid "Details"
+#~ msgstr "Details"
+
+#~ msgid "edit details"
+#~ msgstr "details bewerken"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Details van deze persoon wijzigen"
+
+#~ msgid "Add person"
+#~ msgstr "Persoon toevoegen"
+
+#~ msgid "Add to groups"
+#~ msgstr "Aan groepen toevoegen"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Sorry, u kunt uw eigen account niet verwijderen."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Contactgegevens bewerken"
+
+#~ msgid "Edit person"
+#~ msgstr "Persoon bewerken"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Agenda-voorkeuren"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Persoonsvoorkeuren bewerken"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "U probeert een herhalende gebeurtenis te verwijderen."
+
+#~ msgid "Current"
+#~ msgstr "Huidig(e)"
+
+#~ msgid "Future"
+#~ msgstr "Toekomstig(e)"
+
+#~ msgid "All"
+#~ msgstr "Alle"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Een herhalende gebeurtenis (${event_title}) verwijderen"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "CSV-gegevens <strong>moeten</strong> de titel van de voorziening en "
+#~ "<strong>mogen</strong> een optionele beschrijving van de voorziening "
+#~ "bevatten. Alle verdere informatie zal worden weggegooid."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Overhead-projector #302\n"
+#~ "Aula\n"
+#~ "LC-805, Laptop Computer #805, <em>tekst na de tweede komma</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Het bovenstaande voorbeeld zou 3 voorzieningen, getiteld 'PRJ302', 'Aula' "
+#~ "en 'LC-805' aanmaken. De eerste en laatste voorziening zouden "
+#~ "respectievelijk de beschrijving 'Overhead-projector #302' en 'Laptop "
+#~ "Computer #805' krijgen. De voorziening \"Aula\" zou geen beschrijving "
+#~ "krijgen, en de \"tekst na de tweede komma\" bij de derde voorziening zou "
+#~ "worden genegeerd."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Schooltool-voorzieningen als CSV uploaden"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "Er zijn ${num_errors} invoerfouten."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "ID (optioneel)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Waarop SchoolBell Draait<span>"
+#~ "${DYNAMIC_CONTENT}</span> &copy; The Shuttleworth Foundation 2003 - "
+#~ "<span>2005</span>: Supporter van Sociale Innovatie. </p> <p> "
+#~ "SchoolTool&trade; is een Handelsmerk van The Shuttleworth Foundation.</p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Afdrukbare versie"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Dagelijkse agenda bekijken"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Week-agenda bekijken"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Maand-agenda bekijken"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Jaar-agenda bekijken"
+
+#~ msgid "Yearly"
+#~ msgstr "Jaarlijks(e)"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Agenda voor ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Springen Naar ..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Gebeurtenissen Morgen"
+
+#~ msgid "Log in"
+#~ msgstr "Inloggen"
+
+#~ msgid "User:"
+#~ msgstr "Gebruiker:"
+
+#~ msgid "Log Out"
+#~ msgstr "Uitloggen"
+
+#~ msgid "Edit Info"
+#~ msgstr "Informatie bewerken"
+
+#~ msgid "Add Event"
+#~ msgstr "Gebeurtenis Toevoegen"
+
+#~ msgid "Modify Event"
+#~ msgstr "Gebeurtenis Wijzigen"
+
+#~ msgid "Set up access"
+#~ msgstr "Toegang instellen"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Ongeauthenticeerde Gebruikers"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Ongeauthenticeerde Gebruiker"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Geauthenticeerde Gebruikers"
+
+#~ msgid "All Users"
+#~ msgstr "Alle Gebruikers"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: waarschuwing: configuratie-optie '%s' genegeerd"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/nl/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5345 @@
+# Dutch translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-06-22 21:50+0000\n"
+"Last-Translator: Ronald van Engelen <ubuntu at ronaldvanengelen.nl>\n"
+"Language-Team: Dutch <nl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Bijnaam"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Een korte bijnaam voor deze persoon."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Primaire e-mail"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Secundaire e-mail"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Primair telnr."
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Aanbevolen telefoonnummer."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Secundair telnr."
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Secundair telefoonnummer"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Website"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Website of weblog."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Postadres"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personen"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 persoon"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personen"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Gebruikersnaam of wachtwoord is niet correct"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Maart"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januari"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februari"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mei"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Augustus"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "De volgende dag"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Vandaag"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "De vorige dag"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "December"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Maandag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Dinsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Woensdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Donderdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Zondag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Zaterdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Vrijdag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Maa"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Din"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Woe"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Don"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Vrij"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Zat"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Zon"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "De hele dag"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tijd"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Begintijd in 24u-formaat"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duur"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Soort Duur"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuten"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Uren"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dagen"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Locatie"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Omschrijving"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Terugkerend"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Herhaalt zich elke"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Week"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Maand"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Jaar"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Herhaal elke"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Bereik"
+
+#: /src/schooltool/app/browser/cal.py:1715
+#, fuzzy
+msgid "Count"
+msgstr "Aantal"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Tot"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "altijd"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Aantal gebeurtenissen"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Herhaal tot"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Weekdagen"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Weekdag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Maandelijks"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Uitzonderingsdata"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "zelfde weekdag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1e"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4e"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3e"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2e"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5e"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "laatste dag van de week"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Laatste ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Er is een fout opgetreden."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ongeldige tijd"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Einddatum valt eerder dan begindatum"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Ongeldige datum.  Invoeren als JJJJ-MM-DD, één per regel."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Gebeurtenis toevoegen"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Toevoegen"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Gebeurtenis bewerken"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Bijwerken"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Bijgewerkt op ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Agenda"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Volgende week"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Deze week"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Vorige week"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Volgende maand"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Deze maand"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Vorige maand"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Week ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Volgend jaar"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Dit jaar"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Vorig jaar"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Acties"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Agenda"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Agenda"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Agenda"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Agenda"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Bekijk"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Agenda"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Gebeurtenis toevoegen"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Gebeurtenis bewerken"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Inloggen"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigatie"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Acties"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Agenda"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Geen gegevens geleverd"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Kon gegevens niet naar Unicode omzetten (verkeerde karakterset?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV-bestand met succes geïmporteerd"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Importeren van CSV-bestand mislukt"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV-tekst met succes geïmporteerd"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Importeren CSV-tekst mislukt"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Geen tekenset aangegeven"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Onbekende tekenset"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Fout in CSV-gegevens, regel ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Omzetting naar unicode mislukt in regel ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Rij/Regel 2 is niet leeg"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+"Verkeerde invoer in regel ${line_no} (moet 'n dag ID en 'n periode ID "
+"bevatten)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Onvolledige sectiebeschrijving op regel ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+#, fuzzy
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"De eerste rij van het CSV bestand moet een semester-id en rooster-id "
+"bevatten."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+#, fuzzy
+msgid "The term ${term} does not exist."
+msgstr "Semester ${term} bestaat niet."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Het roosterschema ${schema} bestaat niet."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Fout in rooster-CSV-gegevens, regel ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Dag-ID's niet gedefinieerd in geselecteerd schema: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Perioden niet gedefinieerd in geselecteerde dagen: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Personen niet gevonden: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Vakken niet gevonden: {args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Secties niet gevonden: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Ongeldige records: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Wijzigingen opgeslagen."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "de hele dag"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Locatie: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Geboekte voorzieningen: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "terugkerend"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "overgenomen van %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Dagelijkse agenda van %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Weekagenda van %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Week %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Maandagenda van %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"PDF-ondersteuning is uitgeschakeld. Dit kan door de beheerder worden "
+"ingeschakeld."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Voorkeuren Wijzigen"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Agenda-voorkeuren"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Agenda-voorkeuren"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Persoonlijke voorkeuren bewerken"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Persoonlijke voorkeuren bewerken"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Omschrijving"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+#, fuzzy
+msgid "atom_enabled"
+msgstr "nationaal"
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Ga naar ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Gebeurtenissen van morgen"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Printvriendelijke versie"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Toon dagelijkse agenda"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Dagelijks"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Toon wekelijkse agenda"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Wekelijks"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Toon maandelijkse agenda"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Toon jaarlijkse agenda"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Jaarlijks"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Agenda voor ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Agenda"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Persoonlijke agenda"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Roosteragenda"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "Roosters"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Mijn Agenda"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Agenda's"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Meer..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Agenda"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Agenda bekijken"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Weekagenda van %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "verwijder-knop"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "annuleer-knop"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Er zijn er geen."
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Nu Zoeken"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Wissen"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Er is niets om toe te voegen"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Gebeurtenis toevoegen"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Bijzonderheden"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Status"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Gebeurtenis bewerken"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Docenten voor deze sectie wijzigen."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Geboekte voorzieningen: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "groepen bewerken"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Gebeurtenissen wijzigen/verwijderen"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Sectie-informatie Bewerken"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "details bewerken"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Voorzieningen"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Bijwerken"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Vandaag"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Week"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Maand"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Jaar"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Herhaal tot"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Tijd"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Agenda bekijken"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Herhaal elke"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Geboekte voorzieningen: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Persoonsgegevens: ${titel}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Status"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Voorzieningsindex"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "locatie wijzigen"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Vakken"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+#, fuzzy
+msgid "Levels"
+msgstr "Nivo"
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Welkom bij SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Sectie-informatie Bewerken"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Inloggen"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "terugkerend"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "De hele dag"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Anders (geef aan)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Andere tekenset: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "CSV-gegevens invoeren"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV-gegevens"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "verzend-knop"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Rooster Importeren"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"U kunt het CSV-bestand in een spreadsheet aanmaken en het vervolgens "
+"exporteren als CSV- (Comma Separated Values) bestand. De structuur van de "
+"tabel wordt hieronder beschreven."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+#, fuzzy
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"De eerste regel van het bestand moet de naam van het <strong>semester</"
+"strong> en het <strong>roosterschema</strong> bevatten, die gebruikt zullen "
+"worden voor de nieuwe roosters. De tweede regel moet leeg zijn. Vervolgens "
+"kunnen één of meer beschrijvingen van secties volgen, die van elkaar worden "
+"gescheiden door een lege regel."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Upload SchoolTool rooster als CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Voorbeeld:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-hersft\",\"driedaags\"\n"
+"\"\",\"\",\"\"\n"
+"\"filosofie\",\"jansen\"\n"
+"\"Maandag\",\"A\",\"lokaal137\"\n"
+"\"Maandag\",\"B\"\n"
+"\"Dinsdag\",\"C\",\"lokaal138\"\n"
+"\"***\"\n"
+"\"jantje\"\n"
+"\"pietje\"\n"
+"\"\"\n"
+"\"literatuur\",\"pietersen\"\n"
+"\"Woensdag\",\"B\"\n"
+"\"Woensdag\",\"C\",\"lokaal139\"\n"
+"\"***\"\n"
+"\"jantje\"\n"
+"\"marietje\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"In het bovenstaande voorbeeld zouden twee nieuwe secties worden aangemaakt, "
+"één voor de filosofieles en de andere voor de literatuurles. De sectie voor "
+"de filosofieles zou personen met de ids 'jantje' en 'pietje' als leerlingen "
+"hebben, en het rooster zou drie rooster-activiteiten bevatten, twee op "
+"maandag (één die plaatsvindt op de locatie met id `lokaal137`, en één zonder "
+"gespecificeerde locatie.) De literatuursectie zou op een dergelijke manier "
+"worden verwerkt."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"N.B.: alleen de id's van objecten mogen worden gebruikt in de bestanden, "
+"niet de titels. Als een regel eindigt met lege cellen (bijv., <em>\"filosofie"
+"\",\"jansen\",\"\",\"\"</em>), dan worden die cellen genegeerd. Sectie-"
+"beschrijvingen mogen door meer dan één regel worden gescheiden. In de lijst "
+"van leerlingen wordt alleen de eerste kolom, met de id's van de personen, "
+"verwerkt. De andere kolommen worden genegeerd. Dezelfde gegevens kunnen "
+"meermalen worden geïmporteerd zonder neveneffecten."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Upload CSV-bestand"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV-bestand"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Tekenset:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+#, fuzzy
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Agenda van %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Geboekte voorzieningen: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"De naam van de school of organisatie die deze\n"
+"                      server beheert. Wordt getoond in de publieke agenda,\n"
+"                      onderaan alle pagina's en in de titel van de pagina's."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Agenda als startpagina"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Schoolagenda weergeven als de startpagina van de\n"
+"                  website."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr "Toon roosters"
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+"\n"
+"            Een optie die bepaalt of het rooster van de eigenaar van deze "
+"agenda\n"
+"            wordt getoond in het agenda-overzicht.\n"
+"            "
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Verplichte invoer ontbreekt."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Formulier-invoer is geen bestandsobject"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Ongeldige gegevens voor hele getallen"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Ongeldige tekstgegevens"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Ongeldige tekstuele gegevens"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Ongeldige unicode gegevens"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Ongeldige gegevens voor decimale getallen"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Ongeldige datum/tijd-gegevens"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Gaat nu op de achtergrond draaien, daemon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Voer %s -h uit voor hulp."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: daemon modus wordt niet ondersteund door uw besturingssysteem."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Configuratie wordt gelezen uit %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Opstarttijd: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Kon de database niet initialiseren:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Misschien wordt het door een ander %s proces gebruikt?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Waarschuwing: kon de reportlab-bilbiotheek niet vinden.\n"
+"PDF-ondersteuning uitgeschakeld."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Waarschuwing: lettertype-map '%s' bestaat niet.\n"
+"PDF-ondersteuning uitgeschakeld."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Waarschuwing: lettertype '%s' bestaat niet.\n"
+"PDF-ondersteuning uitgeschakeld."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Geen opslag gedefinieerd in het configuratiebestand\n"
+"\n"
+"Als u het standaard configuratiebestand gebruikt, wijzigt u dit dan en\n"
+"haal de commentaartekens weg voor één van de ZODB-opslagsecties.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dit is geen SchoolTool 0.11 database-bestand; de bewerking wordt "
+"afgebroken.\n"
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dit is geen SchoolTool 0.10 database. Bewerking wordt afgebroken.\n"
+"\n"
+"Voer het upgrade script voor de standalone database uit.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Welkom op de SchoolTool server"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr "Uitleg geaccepteerd."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr "Is nog niet uitgelegd."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr "Was (${mins} minuten) te laat voor ${section}."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr "Ontbrak aan ${section}."
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr "De ingevoerde aankomsttijd is ongeldig. Gebruik UU:MM formaat."
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr "Aankomsttijden zijn alleen van toepassing op telaatkomende studenten"
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr "Uitleg toegevoegd voor $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr "$absence opgelost"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr "Uitleg voor $absence geweigerd"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr "$absence gewijzigd in \"telaatkomen\""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+"Kan geen nieuwe uitleg voor $absence toevoegen: oude uitleg niet "
+"geaccepteerd/geweigerd"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr "Er zijn geen openstaande verklaringen om $absence te accepterren"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr "Er zijn geen openstaande verklaringen om $absence te weigeren"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+"$absence is geen \"thuisklas\" afwezigheid; alleen \"thuisklas\" afwezigheid "
+"kan in telaatkomen veranderd worden"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr "Kan $absence niet wijzigen in telaatkomen voor \"thuisklas\""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr "\"thuisklas\""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr "$date $time: afwezig van $section"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr "$date $time: te laat voor $section, gearriveerd om $late_arrival"
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+#, fuzzy
+msgid "Attendance"
+msgstr "Presentie status codes"
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Agenda-voorkeuren"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Persoonlijke voorkeuren bewerken"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+#, fuzzy
+msgid "Students with unresolved absences"
+msgstr "$absence opgelost"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Personen"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Roosteren voor ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Legende:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuten"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "Presentatie"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+#, fuzzy
+msgid "Absent"
+msgstr ""
+"(cannot be translated without knowing context) Huiswerk/Taak/Toewijzing"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Zondag"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Er is niets om toe te voegen"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "De ingevoerde dag hoort niet in dit semester thuis."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Er is niets om toe te voegen"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Schema voor ${person}"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+#, fuzzy
+msgid "Unresolved explained absences"
+msgstr "$absence opgelost"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+#, fuzzy
+msgid "Unresolved unexplained absences"
+msgstr "$absence opgelost"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr "$title"
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr "Presentie status codes"
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr "Woordenlijst van afgekorte presentie status codes"
+
+#: /src/schooltool/attendance/interfaces.py:44
+#, fuzzy
+msgid "Retroactive attendance timeout"
+msgstr "(this cannot be explained without knowing the context or action)"
+
+#: /src/schooltool/attendance/interfaces.py:45
+#, fuzzy
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+"\n"
+"            (this cannot be explained without knowing the context or action)"
+
+#: /src/schooltool/attendance/interfaces.py:52
+#, fuzzy
+msgid "Homeroom tardy grace period"
+msgstr "Telaatkom-marge voor \"thuisklas\""
+
+#: /src/schooltool/attendance/interfaces.py:53
+#, fuzzy
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+"\n"
+"            De tijd in minuten die je te laat kunt komen voor een sectie, "
+"nadat je al te laat bent voor een \"thuisklas\" periode/lesuur, zonder een "
+"aparte uitleg te geven."
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Vorig jaar"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Volgende"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr "<onbekend>"
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "nationaal"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Een Sectie Toevoegen"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr "Titel van de aanbeveling"
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr "Een gedetailleerde beschrijving van de aanbeveling"
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr "Bereik"
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr "Het bereik van de aanbeveling"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr "de gehele school omvattend"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr "groep"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr "gemeenschap"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr "wereldwijd"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr "nationaal"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr "staat"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr "De datum dat deze aanbeveling werd verstrekt."
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr "Verstrekker"
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr "De verstrekker van de aanbeveling."
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+#, fuzzy
+msgid "View"
+msgstr "Bekijk"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Gebeurtenis bewerken"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Een Sectie Toevoegen"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Sectie-informatie Bewerken"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Vakken Importeren"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Een nieuw vak toevoegen"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Nieuw Vak"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Vakken-index"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Een nieuw vak toevoegen"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Onvoldoende gegevens verstrekt."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Titels mogen niet leeg zijn"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Onbekend vak."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Vak-ID nodig."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Sectie aan ${course} toevoegen"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Docenten"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Huidige Docenten"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Beschikbare Docenten"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Studenten"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr "Huidige studenten"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr "Beschikbare studenten"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Groepen"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Huidige groepen"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Beschikbare groepen"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Voorzieningen"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr "Huidige bronnen/hulpmiddelen"
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr "Beschikbare bronnen/hulpmiddelen"
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Sectie-index"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Een nieuwe sectie toevoegen"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV-gegevens <strong>moeten</strong> een vaktitel en <strong>kunnen</strong> "
+"een optionele vakbeschrijving bevatten. Alle verdere informatie wordt "
+"genegeerd."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Vroege Geschiedenis, Prehistorie tot en met 1000 na Chr.\n"
+"Geschiedenis VS\n"
+"Wereldgeschiedenis, 1000 na Chr. tot en met de 20e eeuw, tekst na de tweede "
+"komma\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"In bovenstaand voorbeeld worden drie vakken aangemaakt, genaamd 'Vroege "
+"Geschiedenis', 'Geschiedenis VS' en 'Wereldgeschiedenis'. Het eerste en "
+"laatste vak krijgen respectievelijk de beschrijvingen 'Prehistorie tot en "
+"met 1000 na Chr.' en '1000 na Chr. tot en met de 20e eeuw'. Het tweede vak "
+"krijgt geen beschrijving, en de extra tekst: \"tekst na de tweede komma\" "
+"van het derde vak wordt genegeerd."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Schooltool-vakken als CSV uploaden"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Secties"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr "foto"
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "leerlingen"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Sectie van ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "naam bewerken"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "De locatie of naam van deze sectie wijzigen."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Docenten voor deze sectie wijzigen."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Geboekte voorzieningen: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Docenten voor deze sectie wijzigen."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "docenten bewerken"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "individuen bewerken"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Studenten binnen deze sectie individueel wijzigen"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Studenten binnen deze sectie per groep wijzigen"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "groepen bewerken"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "ID (optioneel)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Sectie"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Huidige Grootte"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Er zijn ${num_errors} invoerfouten"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Title van de cursus."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Beschrijving van de cursus."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Opschrift"
+
+#: /src/schooltool/course/interfaces.py:67
+#, fuzzy
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Een kenmerk voor een sectie, bestaande uit een docent\n"
+"            namen, cursussen en tijd van bijeenkomst."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Code"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "ID code voor de sectie"
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Omschrijving van de sectie"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr "Categorie Titel"
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr "Gewicht"
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Personen"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Maart"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Schooldag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Bijzondere Uitvaldag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Bijzondere Uitvaldag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Bijzondere Uitvaldag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+#, fuzzy
+msgid "Edit"
+msgstr "Bewerk"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Annuleren"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Deze gebruikersnaam is al in gebruik!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Toepassen"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Dagelijks"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Er zijn er geen."
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Er zijn er geen."
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr "Naam"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Notities"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr "Titel"
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr "Titel zoals Dhr., Mevr."
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr "Voornaam"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr ""
+"You can't ask this in the Netherlands, instead ask for \"all names\" or "
+"\"all initials\""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr "Achternaam"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr "Achtervoegsel"
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Voorkeursnaam"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr "Naam waarmee de student wenst te worden aangesproken"
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Volledige naam"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (in JPEG-formaat)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Vakken"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr "Activiteiten"
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "verwijder-knop"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "toevoeg-knop"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+#, fuzzy
+msgid "Manage Activity Categories"
+msgstr "De activiteit-categorie"
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "annuleer-knop"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr "Categorieën"
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr "Nieuwe categorie"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr "Standaard categorie"
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr "Met succes verwijderde categorieën."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr "Categorie met succes toegevoegd."
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr "Standaardcategorie met succes gewijzigd."
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+#, fuzzy
+msgid "New Activity"
+msgstr "Activiteiten"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Een Sectie Toevoegen"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Gebeurtenis bewerken"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+#, fuzzy
+msgid "Activity Categories"
+msgstr "De activiteit-categorie"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+#, fuzzy
+msgid "Percent Average"
+msgstr "Gemiddeld percentage"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+#, fuzzy
+msgid "Median"
+msgstr "Gewogen gemiddelde"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr "Standaardafwijking"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr "Variantie"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr "n.v.t."
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr "Het punt $value voor activiteit $name is niet geldig."
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr "Het punt $value voor $name is niet geldig."
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr "Gemiddeld"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+#, fuzzy
+msgid "Grade"
+msgstr "Afgestudeerd"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Studenten"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+#, fuzzy
+msgid "Activity Name"
+msgstr "Activiteiten"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "verwijder-knop"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Periode ${number} / Lesuur ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+#, fuzzy
+msgid "Activity"
+msgstr "Activiteiten"
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+"(cannot be translated without knowing context) Huiswerk/Taak/Toewijzing"
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr "Essay"
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr "Examen"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr "Huiswerk"
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr "(cannot be translated without knowing context) Dagboek/Journaal"
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr "Lab"
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr "Presentatie"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr "Proejct"
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr "Een gedetailleerde omschrijving van de activiteit."
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr "Categorie"
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr "De activiteit-categorie"
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr "Scoresysteem"
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr "Het activiteiten-scoresysteem"
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr "De datum dat de activiteit werd gecreëerd."
+
+#: /src/schooltool/gradebook/interfaces.py:72
+#, fuzzy
+msgid "Activities in this gradebook."
+msgstr "Activiteiten in dit puntenboek / puntenlijst"
+
+#: /src/schooltool/gradebook/interfaces.py:76
+#, fuzzy
+msgid "Students in this gradebook."
+msgstr "Studenten in dit puntenboek / deze puntenlijst"
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Groepen Importeren"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Een nieuwe groep toevoegen"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Sectie-informatie Bewerken"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Lidmaatschap beheren"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Groepen"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Groepen"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"CSV-gegevens <strong>moeten</strong> een groepstitel en <strong>mogen</"
+"strong> een optionele groepsbeschrijving bevatten. Alle verdere informatie "
+"wordt genegeerd."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"LGG, Linux Gebruikersgroep\n"
+"Schaakclub\n"
+"Sportclub, Naschoolse sportclub, <em>tekst na de tweede komma</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"In het bovenstaande voorbeeld zouden 3 groepen worden aangemaakt, getiteld "
+"'LGG', 'Schaakclub' en 'Sportclub'. De eerste en laatste groep zouden als "
+"beschrijving respectievelijk 'Linux Gebruikers Groep' en 'Naschoolse "
+"sportclub' hebben. De 'Schaakclub' zou geen beschrijving hebben, en de extra "
+"\"tekst na de tweede komma\" bij de derde groep zou worden genegeerd."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "SchoolTool groepen als CSV uploaden"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "November"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "naam bewerken"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "De locatie of naam van deze sectie wijzigen."
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Groepsindex"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Een nieuwe groep toevoegen"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Titel van de groep."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Omschrijving van de groep."
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Private_calendar"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Voeg een nieuw nivo toe"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Gebeurtenis bewerken"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+#, fuzzy
+msgid "Academic Record"
+msgstr "Academische Staat"
+
+#: /src/schooltool/level/browser/level.pt:15
+#, fuzzy
+msgid "This is an initial level."
+msgstr "Is Beginnivo"
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "geen"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr "Nivo Index"
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr "Voeg een nieuw nivo toe"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr "Vorig nivo"
+
+#: /src/schooltool/level/browser/level.py:61
+#, fuzzy
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+"Het vorige nivo in de school. Indien \"Geen\", dan  is er geen vorig nivo"
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "toevoeg-knop"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Deze week"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Studenten"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "annuleer-knop"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+#, fuzzy
+msgid "Initialize Students"
+msgstr "Beschikbare studenten"
+
+#: /src/schooltool/level/browser/promotion.pt:60
+#, fuzzy
+msgid "Inital Level"
+msgstr "Is Beginnivo"
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "toevoeg-knop"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+#, fuzzy
+msgid "Level Outcome"
+msgstr "Resultaat"
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr "Er zijn geen studenten geselecteerd."
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr "Studenten met succes ingeschreven."
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr "Studentenprocessen met succes geüpdate."
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr "Werk Item met succes beëindigd."
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr "Hudig Nivo: $level"
+
+#: /src/schooltool/level/browser/record.pt:107
+#, fuzzy
+msgid "History"
+msgstr "Academische Staat"
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "annuleer-knop"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr "De status is met succes geüpdate."
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr "Het Nivo Proces is met succes geïnitialiseerd."
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr "Het Nivo Proces is met succes verwijderd."
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr "Tijdstempel"
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr "Het datum- en tijd-bestand is gecreëerd."
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Gebruiker"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr "Het hoofd-ID van de gebruiker die het bestand aanmaakt."
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr "Titel van het bestand."
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr "Een gedetailleerde beschrijving van het bestand."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr "Academische Staat"
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr "De academische geschiedenis van een student."
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr "Status"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr "Het huidige nivo van de student in de school."
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr "Afgestudeerd"
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr "Teruggetrokken"
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr "Ingeschreven"
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr "Nivo Proces"
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr "Het werkschema-proces van het nivo dat de student nu volgt."
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr "Titel van het nivo."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr "Is Beginnivo"
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr "Is dit nivo een beginnivo voor de school."
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr "Volgend nivo"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+"Het volgend nivo in de school. Indien \"Geen\", dan is er geen volgend nivo."
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr "Resultaat"
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr "Resultaat van het nivo."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "doubleren (=student has to repeat or \"double\" the year)"
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "withdraw"
+msgstr "terugtrekken"
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+#, fuzzy
+msgid "pass"
+msgstr "slagen (=student passes his exams and goes to next year)"
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr "Nivo"
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr "Het beginnivo van de student op de school."
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nieuw semester"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Titel van de notitie."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Inhoud"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Inhoud van de notitie."
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Privacy"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Notities"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Privacy"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Voeg semester toe"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Datum"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "gebruikersnaam mag niet leeg zijn"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "volledige naam mag niet leeg zijn"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Dubbele gebruikersnaam: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Personen Importeren"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CSV gegevens <strong>moeten</strong> een gebruikersnaam en vollenaam "
+"bevatten. Een optioneel paswoord  <strong>mag</strong> ook meegegeven worden."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"dpeeters, Dave Peeters\n"
+"dfpeeters, David Frank Peeters, r2m45J\n"
+"koen, Koen\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Het voorbeeld hierboven maakt drie gebruikers aan, 'dpeeters', 'dfpeeters' "
+"en 'koen'. Alleen 'dfpeeters' heeft een paswoord ('r2m45J') en zal in het "
+"systeem kunnen inloggen. NB: de paswoorden moeten onversleuteld meegezonden "
+"worden."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "SchoolTool personen als CSV uploaden"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Voorkeuren voor ${user} wijzigen"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Persoonlijke voorkeuren bewerken"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Tijdzone"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Gebruikte tijdzone om je agenda weer te geven"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Tijdnotatie"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "UU:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+#, fuzzy
+msgid "HH:MM am/pm"
+msgstr "UU:MM vm/nm   The Netherlands generally use 24-hrs format !!!!!"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datumnotatie"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/JJ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "JJJJ-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dag Maand, Jaar"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Week begint op:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Geef aan of de week op zondag of maandag begint"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Toon periodes"
+
+#: /src/schooltool/person/interfaces.py:188
+#, fuzzy
+msgid "Show period names in daily view"
+msgstr "Toon periodenaam in dagoverzicht"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Weer te geven naam"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Relaties"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Toevoegen vereiste/benodigdheid"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Toevoegen vereiste/benodigdheid"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Toevoegen vereiste/benodigdheid"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Toont"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "van"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "items"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Index van vereisten/benodigdheden"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr "Toevoegen vereiste/benodigdheid"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr "Bestaand scoresysteem"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr "Speciaal scoresysteem"
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "Bronnen/Hulpmiddelen Importeren"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Sectie-informatie Bewerken"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Voorzieningen"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Voorzieningen"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV-gegevens <strong>moeten</strong> een titel van de voorziening en "
+"<strong>mogen</strong> een optionele beschrijving van de voorziening "
+"bevatten. Alle verdere informatie wordt weggegooid."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Aula\n"
+"LC-805, Laptop Computer #805, <em>tekst na de tweede komma</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"In bovenstaand voorbeeld zouden drie voorzieningen, genaamd 'PRJ302', 'Aula' "
+"en 'LC-805' worden aangemaakt. De eerste en de laatste voozieninge zouden "
+"respectievelijk de beschrijvingen 'Overhead Projector #302' en 'Laptop "
+"Computer #805' krijgen. De voorziening \"Aula\" zou geen beschrijving "
+"hebben, en de tekst: \"tekst na de tweede komma\" van de derde voorziening "
+"zou worden genegeerd."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "SchoolTool voorzieningen als CSV uploaden"
+
+#: /src/schooltool/resource/browser/resource.py:39
+#, fuzzy
+msgid "Resource index"
+msgstr "Voorzieningsindex"
+
+#: /src/schooltool/resource/browser/resource.py:40
+#, fuzzy
+msgid "Add a new resource"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Titel van de voorziening."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beschrijving van de voorziening."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Een locatie."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Geef aan of deze voorziening een locatie, zoals een klaslokaal is."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Calendar_relationships"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Calendar_ACL"
+
+#: /src/schooltool/restclient/restclient.py:644
+#, fuzzy
+msgid "Could not parse relationship list"
+msgstr "De lijst met relaties kon niet opgedeeld worden"
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr "Onvoldoende data in de persoonsinformatie"
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr "Onvoldoende data in de groepsinformatie"
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr "Onvoldoende data in de nivo-informatie"
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Dit is geen SchoolBell 1.0 database bestand. De bewerking wordt afgebroken.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Dit is geen SchoolBell 1.0 database bestand. De bewerking wordt afgebroken.\n"
+"\n"
+"Voer het op zichzelf staande database upgradescript uit.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "boven"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Uitzonderingsdata"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Inloggen"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Gebruiker:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Uitloggen"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Nieuwe Periode"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+#, fuzzy
+msgid "Cancel School in Emergency"
+msgstr "Annuleer School in Bijzondere Situatie"
+
+#: /src/schooltool/term/browser/emergency.py:100
+#, fuzzy
+msgid "The replacement date you entered is invalid."
+msgstr "De vervangende datum die u invoerde is ongeldig."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+#, fuzzy
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+"School geannuleerd tengevolge van een bijzondere situatie. Vervangende dag:  "
+"$replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+#, fuzzy
+msgid "Replacement day for emergency day $emergency."
+msgstr "Vervangende dag voor bijzondere situatie: $emergency"
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "De ingevoerde datum is ongeldig. Gebruik aub het JJJJ-MM-DD formaat"
+
+#: /src/schooltool/term/browser/emergency.py:88
+#, fuzzy
+msgid "The date you entered does not belong to this term."
+msgstr "De ingevoerde dag hoort niet in dit semester thuis."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "De ingevoerde datum is geen schooldag."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+#, fuzzy
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"U heeft ${DYNAMIC_CONTENT} geselecteerd voor een Bijzondere Uitvaldag. "
+"Selecteer nu de vervangende dag. In onderstaande selectie staan niet-"
+"schooldagen in dit semester ná de bijzondere dag en enkele dagen ná het "
+"einde van het semester."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Voer hieronder de vervangende dag in."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Vervanging"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+#, fuzzy
+msgid "Choose a replacement for the emergency day."
+msgstr "Kies een vervangende dag voor de bijzondere uitvaldag."
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+#, fuzzy
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Dit formulier stelt u in staat om een datum te markeren als een bijzondere "
+"niet-schooldag en om een vervangende dag aan het semester toe te voegen."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+#, fuzzy
+msgid "Please enter the emergency date below."
+msgstr "Voer hieronder de bijzondere uitvaldag in."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+#, fuzzy
+msgid "Emergency day"
+msgstr "Bijzondere Uitvaldag"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Wijzig semester: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nieuw semester"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr ""
+"Semesters   (there are two \"semesters\" in a schoolyear, each lasting \"six"
+"\" months, hence the name)"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Voeg een nieuw semester toe"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Begindatum"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Einddatum"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Week ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+#, fuzzy
+msgid "Add term"
+msgstr "Voeg semester toe"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Bewaar wijzigingen"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+#, fuzzy
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Voer eerst de naam en tijdsduur van het semester in. Het datumbereik is in "
+"tot-en-met formaat (bijv. 2004-09-01 tot en met 2004-12-31). Data moeten als "
+"JJJJ-MM-DD opgegeven worden."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+#, fuzzy
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+"Het datum bereik is in tot-en-met formaat. (bijv. 2004-09-01 tot en met 2004-"
+"12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Vernieuwen"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"Ten tweede, geef op welke dagen schooldagen zijn en welke vakantiedagen."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr "Geef op welke dagen schooldagen zijn en welke vakantiedagen."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Legende:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Schooldag"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Feestdag / Vrije Dag"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Dagen van de week aan/uit schakelen"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+#, fuzzy
+msgid "${object}'s timetable"
+msgstr "${object}'s rooster"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Ongeldige datum. Gebruik het formaat JJJJ-MM-DD."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+#, fuzzy
+msgid "The date does not belong to any term."
+msgstr "De datum hoort niet in een semester thuis."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Een aantal waardes waren ongeldig. Deze zijn in rood aangegeven."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Pas rooster voor één dag aan."
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Nieuw rooster"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Roosters Bekijken"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+#, fuzzy
+msgid "Schedule"
+msgstr "Schema / Rooster"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Gebruik het UU:MM formaat voor de start- en eindtijden"
+
+#: /src/schooltool/timetable/browser/schema.py:196
+#, fuzzy
+msgid "You must specify at least one period."
+msgstr "U moet tenminste één periode/lesuur ingeven."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Schoolroosters"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Voeg een nieuw schema toe"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Selecteer een waarde"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Dag ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+#, fuzzy
+msgid "Period 1"
+msgstr "Periode 1 / Lesuur 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+#, fuzzy
+msgid "Period ${number}"
+msgstr "Periode ${number} / Lesuur ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+#, fuzzy
+msgid "Timetable schema ${schema}"
+msgstr "Lesrooster"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+#, fuzzy
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Roosterdagen vallen altijd samen met de dag van de week (dus op maandag "
+"wordt de eerste roosterdag gebruikt, op dinsdag de tweede, enzovoort)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+#, fuzzy
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Roosterdagen worden opeenvolgend gebruikt, ze springen over niet-schooldagen "
+"heen."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+#, fuzzy
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Ten derde, bepaal de tijd en duur van periodes/lesuren als ze op bepaalde "
+"dagen van de week vallen. Gebruik een van de volgende formaten: <tt>UU:MM</"
+"tt> (vergeet niet de tijdsduur in onderstaand tekstveld te specificeren) of "
+"<tt>UU:MM-UU:MM</tt> (als u beide eindtijden expliciet wilt opgeven, bijv. "
+"9:30-10:15). Het is niet nodig alle periodes/lesuren voor elke weekdag op te "
+"geven, niet-opegegeven periodes/lesuren worden overgeslagen als ze op die "
+"bepaalde weekdag vallen. Als de lijst met periodes/lesuren niet gelijkloopt "
+"met de wijzigingen die u juist heeft aangebracht on bovenstaande tabel, "
+"gebruik dan de Update/Verversen-knop om het formulier bij te werken."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+#, fuzzy
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Kies een naam voor het roosterschema dat u wilt maken."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+#, fuzzy
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+"Bepaalde specificaties van periodes/lesuren waren incorrect en zijn daarom "
+"weggelaten."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+#, fuzzy
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Tenslotte, controleer of de informatie in dit formulier correct is. De enieg "
+"manier om deze informatie te corrigeren is het roosterschema te verwijderen "
+"en helemaal opnieuw te beginnen."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+#, fuzzy
+msgid "Create timetable schema"
+msgstr "Aanmaken Roosterschema"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+#, fuzzy
+msgid "First, please define the days and periods of the timetable."
+msgstr "Ten eerste, definieer de dagen en periodes/lesuren van het rooster."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Kopieer periodes/lesuren van de vorige dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Verwijder deze dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Dag toevoegen"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Periode/Lesuur toevoegen"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+#, fuzzy
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Ten tweede, selecteer hoe de roosterdagen overeenkomen met kalenderdagen."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"NOTA BENE: als een sectie op meer dan één plaats voorkomt, moeten alle "
+"vermeldingen op <em>GEEN</EM> gezet worden om deze te verwijderen."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Tijdschema"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "Semester"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Schema"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Schema voor ${person}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Kiezen"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+#, fuzzy
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Met dit formulier kunt u het rooster voor een persoon opstellen door de "
+"persoon toe te voegen of te verwijderen van secties die lessen in hun "
+"rooster hebben."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "als deel van"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "geen"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+#, fuzzy
+msgid "Scheduling conflict."
+msgstr "Rooster conflict."
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Opslaan"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+#, fuzzy
+msgid "There are no terms or timetable schemas defined."
+msgstr "Er zijn geen semesters of roosterschema's gedefinieerd."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Kies rooster-sjabloon"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+#, fuzzy
+msgid "For term(s):"
+msgstr "Voor semester(s):"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#, fuzzy
+msgid "Scheduling for ${section}"
+msgstr "Roosteren voor ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Gebruik rooster:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+#, fuzzy
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Dit is een eenvoudige manier om een wekelijks roosterschema te maken. Vul "
+"een voldoende aantal regels in voor uw periodes/lesuren."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+#, fuzzy
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Als u meer flexibiliteit nodig heeft, kunt u <a href=\"add.html\">timetable "
+"schema creation wizard</a> gebruiken, of <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+#, fuzzy
+msgid "Period title (optional)"
+msgstr "Periode-naam / Lesuur-naam (optioneel)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+#, fuzzy
+msgid "Period start time"
+msgstr "Starttijd periode/lesuur"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "Eindtijd periode/Lesuur"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Aanmaken"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+#, fuzzy
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"U kunt de start- en eindtijden van periodes/lesuren voor ${DYNAMIC_CONTENT} "
+"wijzigen in onderstaand formulier. Om een periode/lesuur van de dag te "
+"verwijderen, verwijdert u eenvoudig de start- en eindtijden van de periode/"
+"het lesuur."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "Periode-naam / Lesuur-naam"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Oorspronkelijke start"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Oorspronkelijk einde"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Nieuw begin"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Nieuw einde"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Wijzigen"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+#, fuzzy
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Met dit formulier kunt u de start- en eindtijden wijzigen voor periodes/"
+"lesuren op een bepaalde datum, of periodes/lesuren geheel laten vervallen."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+#, fuzzy
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+"Geef hieronder de datum in waarop de periodes/lesuren gewijzigd moeten "
+"worden."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Kies een speciale dag"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Doorgaan"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Aanmaken Roosterschema"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Uurrooster voor ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+#, fuzzy
+msgid "Homeroom"
+msgstr "\"thuisklas\""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Nieuw roosterschema"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+#, fuzzy
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+"Gebruikt de roostercyclus van uw school dagen van de week, of is het een "
+"roterende cyclus?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Dagen van de week."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Roterende cyclus"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Voer de namen van de dagen in de cyclus in, één dag per regel."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Voer tenminste één naam van een dag in."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Zorg ervoor dat de namen van de dagen uniek zijn."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Beginnen en eindigen de lessen in het rooster van uw school elke dag op "
+"dezelfde tijd?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Elke dag dezelfde tijd"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Verschillende tijden"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+"Variëren start- en eindtijden gebaseerd op de dag van de week (maandag-"
+"vrijdag) of op de dag in de cyclus?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr "Dag van de week"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr "Dag van de cyclus"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+#, fuzzy
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Voer de begin- en eindtijden in voor elke tijdsinterval, één interval (UU:MM "
+"- UU:MM) per regel."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+#, fuzzy
+msgid "Not a valid time slot: $slot."
+msgstr "Geen geldig tijdsinterval"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+#, fuzzy
+msgid "Please enter at least one time slot."
+msgstr "Vul tenminste één tijdsinterval in."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+#, fuzzy
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Vul de begin- en eindtijd voor ieder interval voor elke dag in. Eén interval "
+"(UU:MM-UU:MM) per regel."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Vul tenminste één tijdsinterval in voor $day."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+#, fuzzy
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+"Aangezien u een roterende roostercyclus heeft geselecteerd en "
+"tijdsintervallen gebaseerd op weekdagen, moeten alle dagen het zelfde aantal "
+"periodes/lesuren hebben."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+#, fuzzy
+msgid "Do periods have names or are they simply designated by time?"
+msgstr "Hebben perioden/lesuren een naam of worden ze aangeduid met de tijd?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Ze hebben namen"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Ze worden aangeduid met de tijd"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+#, fuzzy
+msgid "Enter names of periods, one per line."
+msgstr "Vul de namen van de perioden/lesuren in, één per regel."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+#, fuzzy
+msgid "Please enter at least $number periods."
+msgstr "Vul tenminste $number periodes/lesuren in."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+#, fuzzy
+msgid "Please make sure the period names are unique."
+msgstr "Zorg voor unieke namen voor periodes/lesuren."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+#, fuzzy
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+"Is de volgorde van periodes/lesuren elke dag hetzelfde of verschillend?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Hetzelfde"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Verschillend"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+#, fuzzy
+msgid "Please put the periods in order:"
+msgstr "Zet de periodes/lesuren in de juiste volgorde:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+#, fuzzy
+msgid "Please provide all periods."
+msgstr "Geef alle periodes/lesuren op."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+#, fuzzy
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+"De volgende periodes/lesuren zijn meer dan één keer geselecteerd: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+#, fuzzy
+msgid "Please put the periods in order for each day:"
+msgstr "Zet de perodes/lesuren op volgorde voor elke dag:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+#, fuzzy
+msgid "$period on day $day"
+msgstr "$period op $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+#, fuzzy
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+"Controleert u de presentie van studenten voor de gehele dag in een "
+"\"thuisklas\"-periode/lesuur of het equivalent daarvan?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr "Ja"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr "Nee"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+#, fuzzy
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr "Geef de \"thuisklas\" periodes/lesuren aan voor elke dag:"
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Onbekende dag id: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+#, fuzzy
+msgid "Unknown period id: %r"
+msgstr "Onbekende periode/lesuur id: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Gebruikersnaam:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Naam, foto of wachtwoord van deze persoon wijzigen"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Beheer de lidmaatschappen van deze persoon"
+
+#~ msgid "Import Sections"
+#~ msgstr "Secties Importeren"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Misvormde regel ${line_no} (moet een dag-id, een periode-id en optioneel "
+#~ "een locatie-id bevatten)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Locaties niet gevonden: ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "details vand deze persoon wijzigen"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Onderwezen Secties"
+
+#~ msgid "via group"
+#~ msgstr "via groep"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server die SchoolTool Draait<span>"
+#~ "${DYNAMIC_CONTENT}</span> &copy; The Shuttleworth Foundation 2003 - "
+#~ "<span>2005</span>: Supporter van Sociale Innovatie. </p> <p> "
+#~ "SchoolTool&trade; is een Handelsmerk van The Shuttleworth Foundation. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Mijn Voorkeuren"
+
+#~ msgid "Person index"
+#~ msgstr "Persoonsindex"
+
+#~ msgid "Add a new person"
+#~ msgstr "Een nieuw persoon toevoegen"
+
+#~ msgid "New photo"
+#~ msgstr "Nieuwe foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Een klein plaatje (ongeveer 48x48 pixels in JPEG-formaat)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Foto wissen"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Vink dit aan om de foto te wissen"
+
+#~ msgid "New password"
+#~ msgstr "Nieuw wachtwoord"
+
+#~ msgid "Verify password"
+#~ msgstr "Wachtwoord verifiëren"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Wachtwoorden komen niet overeen."
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Wachtwoord met succes gewijzigd!"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Wachtwoorden komen niet overeen!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Nieuwe objecten aanmaken"
+
+#~ msgid "Add events"
+#~ msgstr "Gebeurtenissen toevoegen"
+
+#~ msgid "Control access"
+#~ msgstr "Toegang bepalen"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Geauthenticeerde gebruikers"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Ongeauthenticeerde gebruikers"
+
+#~ msgid "An error occured."
+#~ msgstr "Er is een fout opgetreden."
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Gebruik: %s [opties]\n"
+#~ "Opties:\n"
+#~ "  -c, --config xxx gebruik dit configuratiebestand i.p.v. het standaard "
+#~ "bestand\n"
+#~ "  -h, --help toon deze hulptekst\n"
+#~ "  -d, --daemon ga naar de achtergrond na het starten\n"
+#~ "  -r, --restore-manager gebruiker manager herstellen met het standaard "
+#~ "wachtwoord\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Welkom op de SchoolBell server"

Added: schooltool/branches/upstream/current/src/schooltool/locales/nl_NL/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/nl_NL/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/nl_NL/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2305 @@
+# Dutch (Netherlands) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-05-14 12:01+0000\n"
+"Last-Translator: Koen <k.ubbink at gmail.com>\n"
+"Language-Team: Dutch (Netherlands) <nl_NL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personen"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 persoon"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personen"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Gebruikersnaam of wachtwoord is onjuist"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Woensdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalender bekijken"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Bronnenlijst"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Personenlijst"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Een nieuw persoon toevoegen"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Gebruikersnaam"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Deze gebruikersnaam is al in gebruik!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Volledige naam"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Volledige naam"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Volledige naam"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (in JPEG-formaat)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Wachtwoord succesvol gewijzigd!"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Wachtwoord succesvol gewijzigd!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Wachtwoord succesvol gewijzigd!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Groepenlijst"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Een nieuwe groep toevoegen"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Bronnenlijst"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Wachtwoord succesvol gewijzigd!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Wachtwoord succesvol gewijzigd!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nieuw wachtwoord"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Nieuw wachtwoord"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Kalender bekijken"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Weer te geven naam"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Bronnenlijst"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Bronnenlijst"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Een nieuw persoon toevoegen"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Een nieuwe voorziening toevoegen"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} personen"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nieuwe foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Een klein plaatje (ongeveer 48x48 pixels in JPEG-formaat)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Foto wissen"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Vink dit aan om de foto te wissen"
+
+#~ msgid "Verify password"
+#~ msgstr "Wachtwoord bevestigen"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Wachtwoorden komen niet overeen"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Wachtwoorden komen niet overeen!"
+
+#~ msgid "View"
+#~ msgstr "Bekijken"
+
+#~ msgid "Edit"
+#~ msgstr "Bewerken"
+
+#~ msgid "Create new objects"
+#~ msgstr "Nieuwe objecten aanmaken"
+
+#~ msgid "Add events"
+#~ msgstr "Gebeurtenissen toevoegen"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Gebeurtenissen wijzigen/verwijderen"
+
+#~ msgid "Control access"
+#~ msgstr "Toegang beheren"
+
+#~ msgid "Manage membership"
+#~ msgstr "Lidmaatschap beheren"

Added: schooltool/branches/upstream/current/src/schooltool/locales/nn/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/nn/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/nn/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Norwegian Nynorsk translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Norwegian Nynorsk <nn at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/no/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/no/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/no/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Norwegian translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-05-01 15:00+0000\n"
+"Last-Translator: Inge Rønstad <ingear at enter.vg>\n"
+"Language-Team: Norwegian <no at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/pa/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/pa/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/pa/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4882 @@
+# Punjabi translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:39+0000\n"
+"Last-Translator: Amanpreet Singh Alam <apbrar at gmail.com>\n"
+"Language-Team: Punjabi <pa at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "ਵਿਅਕਤੀ"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "ਸੋਮਵਾਰ"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "ਮੰਗਲਵਾਰ"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "ਬੁੱਧਵਾਰ"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "ਵੀਰਵਾਰ"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "ਐਤਵਾਰ"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "ਸਨਿੱਚਰਵਾਰ"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "ਸ਼ੁੱਕਰਵਾਰ"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "ਨਾਂ"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "ਵੇਰਵਾ"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "ਮਹੀਨਾ"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "ਸਾਲ"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "ਮਹੀਨਾਵਾਰੀ"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "ਨਵੀਨੀਕਰਨ"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "ਕਾਰਵਾਈ"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "ਸਕੂਲ-ਸੰਦ"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "ਮੇਰਾ ਕੈਲੰਡਰ"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "ਦਾਖਲ"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "ਏਧਰ-ਓਧਰ"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "ਕਾਰਵਾਈ"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "ਮੇਰਾ ਕੈਲੰਡਰ"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "ਕੋਈ ਡਾਟਾ ਨਹੀਂ ਦਿੱਤਾ ਹੈ"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "ਯੂਨੀਕੋਡ ਲਈ ਤਬਦੀਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ (ਗਲਤ ਡਾਟਾ)।"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "ਕੋਈ ਅੱਖਰ ਸਮੂਹ ਨਹੀਂ ਦਿੱਤਾ"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "ਅਣਜਾਣ ਅੱਖਰ ਸਮੂਹ"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "ਸਤਰ ${line_no} ਵਿੱਚ ਯੂਨੀਕੋਡ ਲਈ ਤਬਦੀਲੀ ਅਸਫਲ ਹੈ"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ${schema} ਮੌਜੂਦ ਨਹੀਂ ਹੈ।"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ CSV ਡਾਟਾ ਵਿੱਚ ਸਤਰ ${line_no} 'ਤੇ ਗਲਤੀ"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "ਚੁਣੀ ਸਕੀਮ ਵਿੱਚ ਦਿਨ ID ਨਹੀਂ ਦਿੱਤਾ ਹੈ:${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "ਚੁਣੇ ਦਿਨਾਂ ਵਿੱਚ ਕੋਈ ਪੀਰੀਅਡ ਨਹੀਂ ਦਿੱਤੇ ਹਨ: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "ਵਿਅਕਤੀ ਨਹੀਂ ਮਿਲਿਆ: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "ਕੋਰਸ ਨਹੀਂ ਲੱਭਿਆ: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "ਸ਼ੈਕਸ਼ਨ ਨਹੀਂ ਲੱਭਿਆ: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "ਗਲਤ ਰਿਕਾਰਡ: ${args}"
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "ਤਬਦੀਲੀਆਂ ਸੰਭਾਲੋ।"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "ਪਸੰਦ ਤਬਦੀਲ"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "ਕੈਲੰਡਰ ਪਸੰਦ"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "ਕੈਲੰਡਰ ਪਸੰਦ"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "ਕੈਲੰਡਰ ਪਸੰਦ"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "ਸਕੂਲ-ਸੰਦ"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "ਸਕੂਲ-ਸੰਦ"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "ਵੇਰਵਾ"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "ਜਾਓ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "ਕੱਲ੍ਹ ਦਾ ਦਿਨ"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "ਦਿਨ ਕੈਲੰਡਰ ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "ਰੋਜ਼"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "ਹਫ਼ਤਾਵਾਰੀ ਕੈਲੰਡਰ ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "ਹਫ਼ਤਾਵਾਰੀ"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "ਮਹੀਨਾਵਾਰੀ ਕੈਲੰਡਰ ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "ਸਾਲਨਾ ਕੈਲੰਡਰ ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "ਸਾਲਨਾ"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "${title} ਲਈ ਕੈਲੰਡਰ - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Personal calendar"
+msgstr "ਮਹੀਨਾਵਾਰੀ ਕੈਲੰਡਰ ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "Timetable calendar"
+msgstr "ਦਿਨ ਕੈਲੰਡਰ ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "ਮੇਰਾ ਕੈਲੰਡਰ"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "ਮੇਰਾ ਕੈਲੰਡਰ"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "ਦਿਨ ਕੈਲੰਡਰ ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "ਹਟਾਉਣ-ਬਟਨ"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "ਰੱਦ ਕਰੋ-ਬਟਨ"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "ਕੋਈ ਵੀ ਨਹੀਂ ਹੈ।"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "ਸਾਲ"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+#, fuzzy
+msgid "There are none to add."
+msgstr "ਕੋਈ ਵੀ ਨਹੀਂ ਹੈ।"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+#, fuzzy
+msgid "Details"
+msgstr "ਰੋਜ਼"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "ਸ਼ੁਰੂਆਤੀ ਮਿਤੀ"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "ਇਸ ਸ਼ੈਕਸ਼ਨ ਦਾ ਅਧਿਆਪਕ ਤਬਦੀਲ ਕਰੋ।"
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "ਗਰੁੱਪ ਸੋਧ"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "ਸਰੋਤ"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "ਨਵੀਨੀਕਰਨ"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "ਸ਼ੁੱਕਰਵਾਰ"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "ਹਫ਼ਤਾਵਾਰੀ"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "ਮਹੀਨਾ"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "ਸਾਲ"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "ਸਰੋਤ"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "ਨਾਂ"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "ਸਰੋਤ"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "ਕੋਰਸ"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "ਸਕੂਲ ਸੰਦ ਸਰਵਰ 'ਤੇ ਜੀ ਆਇਆਂ ਨੂੰ"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "ਦਾਖਲ"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "ਪੱਛਮੀ (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "ਪੱਛਮੀ (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "ਹੋਰ (ਕਿਰਪਾ ਕਰਕੇ ਲਿਖੋ)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "ਪੇਸ਼-ਕਰੋ ਬਟਨ"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਵੇਖਾਓ"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "ਸਕੂਲ-ਸੰਦ ਸਮਾਂ-ਸਾਰਣੀ ਨੂੰ CSV ਦੇ ਤੌਰ 'ਤੇ ਅੱਪਲੋਡ"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "ਅੱਖਰ ਸਮੂਹ:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "ਯੂਨੀਕੋਡ (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "ਪੱਛਮੀ (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "ਸਰੋਤ"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "ਸਕੂਲ ਸੰਦ ਸਰਵਰ 'ਤੇ ਜੀ ਆਇਆਂ ਨੂੰ"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "ਕੈਲੰਡਰ ਪਸੰਦ"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "ਪਸੰਦ ਤਬਦੀਲ"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "ਵਿਅਕਤੀ"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "ਸੰਕੇਤ:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "ਐਤਵਾਰ"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "ਕੋਈ ਵੀ ਨਹੀਂ ਹੈ।"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "ਕੋਈ ਵੀ ਨਹੀਂ ਹੈ।"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "ਅੱਗੇ"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "ਨਵਾਂ ਸ਼ੈਕਸ਼ਨ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "ਵੇਖਾਓ"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "ਸੋਧ"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "ਨਵਾਂ ਸ਼ੈਕਸ਼ਨ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "ਕੋਰਸ ਆਯਾਤ"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "ਇੱਕ ਨਵਾਂ ਕੋਰਸ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "ਨਵਾਂ ਕੋਰਸ"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "ਕੋਰਸ ਤਤਕਰਾ"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "ਇੱਕ ਨਵਾਂ ਕੋਰਸ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "ਕੋਈ ਸਰੋਤ ਨਹੀਂ ਹੈ।"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "ਕੋਰਸ ID ਦੀ ਲੋੜ ਹੈ।"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "${course} ਤੋਂ ਸ਼ੈਕਸ਼ਨ ਸ਼ਾਮਿਲ ਕਰੋ"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "ਅਧਿਆਪਕ"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "ਵਿਦਿਆਰਥੀ"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "ਗਰੁੱਪ"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "ਸਰੋਤ"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "ਭਾਗ ਤਤਕਰਾ"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "ਇੱਕ ਨਵਾਂ ਸ਼ੈਕਸ਼ਨ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool courses as CSV"
+msgstr "ਸਕੂਲ-ਸੰਦ ਸਮਾਂ-ਸਾਰਣੀ ਨੂੰ CSV ਦੇ ਤੌਰ 'ਤੇ ਅੱਪਲੋਡ"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "ਸ਼ੈਕਸ਼ਨ"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+#, fuzzy
+msgid "students"
+msgstr "ਵਿਦਿਆਰਥੀ"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "ਅਧਿਆਪਕ ਸੋਧ"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "ਇਸ ਸ਼ੈਕਸ਼ਨ ਦਾ ਅਧਿਆਪਕ ਤਬਦੀਲ ਕਰੋ।"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "ਇਸ ਸ਼ੈਕਸ਼ਨ ਦਾ ਅਧਿਆਪਕ ਤਬਦੀਲ ਕਰੋ।"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "ਸਰੋਤ"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "ਇਸ ਸ਼ੈਕਸ਼ਨ ਦਾ ਅਧਿਆਪਕ ਤਬਦੀਲ ਕਰੋ।"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "ਅਧਿਆਪਕ ਸੋਧ"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "ਇੱਕਲਾ ਸੋਧ"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "ਇਸ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਇੱਕਲੇ ਇੱਕਲੇ ਵਿਦਿਆਰਥੀ ਲਈ ਸੋਧ"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "ਇਸ ਸ਼ੈਕਸ਼ਨ ਵਿੱਚ ਵਿਦਿਆਰਥੀਆਂ ਲਈ ਤਬਦੀਲੀ"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "ਗਰੁੱਪ ਸੋਧ"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "ਪਛਾਣ (ਚੋਣਵਾਂ)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "ਸ਼ੈਕਸ਼ਨ"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "${num_errors} ਇੰਪੁੱਟ ਗਲਤੀਆਂ ਹਨ।"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "ਕੋਰਸ ਦਾ ਨਾਂ ਹੈ।"
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "ਕੋਰਸ ਦਾ ਵੇਰਵਾ ਹੈ।"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "ਲੇਬਲ"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "ਸ਼ੈਕਸ਼ਨ ਬਾਰੇ ਵੇਰਵਾ ਹੈ।"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "ਵਿਅਕਤੀ"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "ਸਾਲ"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "ਸਕੂਲ ਦਿਨ"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "ਸੋਧ"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "ਰੋਜ਼"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "ਕੋਈ ਵੀ ਨਹੀਂ ਹੈ।"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "ਕੋਈ ਵੀ ਨਹੀਂ ਹੈ।"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "ਕੋਰਸ"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "ਹਟਾਉਣ-ਬਟਨ"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "ਸ਼ਾਮਿਲ-ਬਟਨ"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "ਰੱਦ ਕਰੋ-ਬਟਨ"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "ਨਵਾਂ ਸ਼ੈਕਸ਼ਨ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "ਵਿਦਿਆਰਥੀ"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "ਹਟਾਉਣ-ਬਟਨ"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "ਪੀਰੀਅਡ ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+#, fuzzy
+msgid "Import Groups"
+msgstr "ਕੋਰਸ ਆਯਾਤ"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "ਪਸੰਦ ਤਬਦੀਲ"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "ਗਰੁੱਪ"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "ਗਰੁੱਪ"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "ਸਕੂਲ-ਸੰਦ ਸਮਾਂ-ਸਾਰਣੀ ਨੂੰ CSV ਦੇ ਤੌਰ 'ਤੇ ਅੱਪਲੋਡ"
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "ਗਰੁੱਪ ਸੋਧ"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "ਇੱਕ ਨਵੀਂ ਵਾਰੀ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "ਸ਼ਾਮਿਲ-ਬਟਨ"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "ਵਿਦਿਆਰਥੀ"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "ਰੱਦ ਕਰੋ-ਬਟਨ"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "ਸ਼ਾਮਿਲ-ਬਟਨ"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "ਰੱਦ ਕਰੋ-ਬਟਨ"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "ਨਵਾਂ ਸ਼ਬਦ"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "ਵਾਰੀ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+#, fuzzy
+msgid "Import Persons"
+msgstr "ਕੋਰਸ ਆਯਾਤ"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool persons as CSV"
+msgstr "ਸਕੂਲ-ਸੰਦ ਸਮਾਂ-ਸਾਰਣੀ ਨੂੰ CSV ਦੇ ਤੌਰ 'ਤੇ ਅੱਪਲੋਡ"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "${user} ਲਈ ਪਸੰਦ ਤਬਦੀਲ"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+#, fuzzy
+msgid "Edit person preferences"
+msgstr "ਕੈਲੰਡਰ ਪਸੰਦ"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "ਪੀਰੀਅਡ ਵੇਖਾਓ"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "ਦਿਨ ਝਲਕ ਵਿੱਚ ਪੀਰੀਅਡ ਨਾਂ ਵੇਖਾਓ"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "ਸਬੰਧ"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "ਇੱਕ ਨਵਾਂ ਕੋਰਸ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "ਨਵਾਂ ਸ਼ਬਦ"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "ਵਾਰੀ"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "ਕੋਰਸ ਆਯਾਤ"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "ਇੱਕ ਨਵਾਂ ਕੋਰਸ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "ਸਰੋਤ"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "ਸਰੋਤ"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "ਸਕੂਲ-ਸੰਦ ਸਮਾਂ-ਸਾਰਣੀ ਨੂੰ CSV ਦੇ ਤੌਰ 'ਤੇ ਅੱਪਲੋਡ"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+#, fuzzy
+msgid "Calendar_relationships"
+msgstr "ਸਬੰਧ"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "ਮੇਰਾ ਕੈਲੰਡਰ"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "ਉੱਪਰ"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "ਕਾਰਵਾਈ"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "ਦਾਖਲ"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "ਉਪਭੋਗੀ:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "ਬਾਹਰ"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "ਨਵੀਂ ਵਾਰੀ"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "ਸ਼ਬਦ ਤਬਦੀਲ: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "ਨਵਾਂ ਸ਼ਬਦ"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "ਵਾਰੀ"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "ਇੱਕ ਨਵੀਂ ਵਾਰੀ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "ਸ਼ੁਰੂਆਤੀ ਮਿਤੀ"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "ਅੰਤ ਮਿਤੀ"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "ਹਫ਼ਤਾ ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "ਵਾਰੀ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "ਤਬਦੀਲੀਆਂ ਸੰਭਾਲੋ"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"ਪਹਿਲਾਂ ਕਿਰਪਾ ਕਰਕੇ ਵਾਰੀ ਦੇ ਪੀਰੀਅਡ ਲਈ ਨਾਂ\n"
+"ਅਤੇ ਸਮਾਂ ਦਿਓ। ਮਿਤੀ ਸੀਮਾ ਖਾਸ ਹੋਵੇ (ਜਿਵੇਂ ਕਿ 2004-09-01 ਤੋਂ 2004-12-31)। ਮਿਤੀ ਨੂੰ\n"
+"ਸਸਸਸ-ਮਮ-ਦਦ ਦੇ ਰੂਪ ਵਿੱਚ ਦਿਓ।"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "ਮਿਤੀ ਸੀਮਾ ਖਾਸ ਹੋਵੇ (ਜਿਵੇਂ ਕਿ 2004-09-01 ਤੋਂ 2004-12-31)।"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "ਤਾਜ਼ਾ"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"ਦੂਜਾ, ਕਿਰਪਾ ਕਰਕੇ ਦੱਸੋ ਕਿ ਕਿਹੜੇ ਦਿਨ ਸਕੂਲ ਚਾਲੂ\n"
+"ਰਹਿੰਦਾ ਹੈ ਅਤੇ ਕਿਹੜੇ ਦਿਨ ਛੁੱਟੀ ਹੁੰਦੀ ਹੈ।"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+"ਕਿਰਪਾ ਕਰਕੇ ਦੱਸੋ ਕਿ ਕਿਹੜੇ ਦਿਨ ਸਕੂਲ ਚਾਲੂ\n"
+"ਰਹਿੰਦਾ ਹੈ ਅਤੇ ਕਿਹੜੇ ਦਿਨ ਛੁੱਟੀ ਹੁੰਦੀ ਹੈ।"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "ਸੰਕੇਤ:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "ਸਕੂਲ ਦਿਨ"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "ਛੁੱਟੀ"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "ਹਫ਼ਤੇ ਦੇ ਹੇਠ ਦਿੱਤੇ ਦਿਨ ਤਬਦੀਲ:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "${object} ਦੀ ਸਮਾਂ-ਸਾਰਣੀ"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਵੇਖਾਓ"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਵੇਖਾਓ"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਮੁੱਲ ਦੀ ਚੋਣ ਕਰੋ"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "ਦਿਨ ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "ਪੀਰੀਅਡ 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "ਪੀਰੀਅਡ ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਸਕੀਮ ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "ਕਿਰਪਾ ਕਰਕੇ ਸਮਾਂ-ਸਾਰਣੀ ਬਣਾਉਣ ਲਈ ਇੱਕ ਨਾਂ ਦੀ ਚੋਣ ਕਰੋ।"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਸਕੀਮ ਬਣਾਓ"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "ਪਿਛਲੇ ਦਿਨ ਤੋਂ ਪੀਰੀਅਡਾਂ ਤੋਂ ਨਕਲ"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "ਇਹ ਦਿਨ ਹਟਾਓ"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "ਦਿਨ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "ਪੀਰੀਅਡ ਸ਼ਾਮਿਲ"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਵੇਖਾਓ"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "ਵਾਰੀ"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "ਕੋਰਸ"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+#, fuzzy
+msgid "There are no terms or timetable schemas defined."
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਸਕੀਮ ਬਣਾਓ"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਵੇਖਾਓ"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+#, fuzzy
+msgid "Period title (optional)"
+msgstr "ਪਛਾਣ (ਚੋਣਵਾਂ)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "ਪੀਰੀਅਡ ${number}"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "ਪੀਰੀਅਡ 1"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+#, fuzzy
+msgid "New start"
+msgstr "ਨਵਾਂ ਸ਼ਬਦ"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "ਨਵੀਂ ਵਾਰੀ"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "ਸੋਮਵਾਰ"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "ਸਮਾਂ-ਸਾਰਣੀ ਸਕੀਮ ਬਣਾਓ"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "${object} ਲਈ ਸਮਾਂ-ਸਾਰਣੀ"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "ਨਵੀਂ ਸਮਾਂ-ਸਾਰਣੀ ਸਕੀਮ"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "ਟਿਕਾਣਾ ਨਹੀਂ ਲੱਭਿਆ: ${args}"
+
+#~ msgid "An error occured."
+#~ msgstr "ਇੱਕ ਗਲਤੀ ਆਈ ਹੈ।"

Added: schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3018 @@
+# Polish translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-04-30 10:25+0000\n"
+"Last-Translator: Tomasz Dominikowski <dominikowski at gmail.com>\n"
+"Language-Team: Polish <pl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Główny Email"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Dodatkowy Email"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Główny telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Rekomendowny numer telefonu."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Dodatkowy telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Dodatkowy numer telefonu."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Strona"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Strona albo blog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Adres"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Osoby"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 osoba"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} osób"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nazwa użytkownika lub hasło jest niepoprawne"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Obecny rok"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Dostępne Grupy"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Marzec"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Styczeń"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Luty"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Czerwiec"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Maj"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Kwiecień"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Sierpień"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Wrzesień"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Lipiec"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Następny dzień"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Dzisiaj"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Poprzedni dzień"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Październik"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Grudzień"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Listopad"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Poniedziałek"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Wtorek"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Środa"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Czwartek"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Niedziela"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Sobota"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Piątek"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Pn"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Wt"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Śr"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Cz"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pt"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "So"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "N"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Tytuł"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Cały dzień"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Czas"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Czas początkowy w formacie 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Czas Trwania"
+
+#: /src/schooltool/app/browser/cal.py:1677
+#, fuzzy
+msgid "Duration Type"
+msgstr "Rodzaj trwania"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuty"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Godziny"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dni"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Adres"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Opis"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Okresowe"
+
+#: /src/schooltool/app/browser/cal.py:1698
+#, fuzzy
+msgid "Recurs every"
+msgstr "Powtarzające się ciągle"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dzień"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Tydzień"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Miesiąc"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Rok"
+
+#: /src/schooltool/app/browser/cal.py:1707
+#, fuzzy
+msgid "Repeat every"
+msgstr "Powtarzaj w każdy"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Zakres"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Policz"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Dopóki"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "na zawsze"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Ilość zdarzeń"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Powdarzaj dopóki"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Dni tygodnia"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Dzień tygodnia"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Miesięcznie"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Daty wyjątków"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "ten sam dzień tygodnia"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "ostatni dzień tygodnia"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Ostatni/a ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Wystąpił błąd."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Niepoprawny czas"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Data końcowa jest wcześniejsza niż data początkowa"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Niepoprawna data. Proszą podać RRRR-MM-DD po jednej w linii."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Dodaj zdarzenie"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Dodaj"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Edytuj zdarzenie"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Aktualizuj"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Zaktualizowano dnia ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalendarze"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week},${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Następny tydzień"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Obecny tydzień"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Poprzedni tydzień"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month},${year} (tydzień ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Następny miesiąc"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Obecny miesiąc"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Poprzedni miesiąc"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month},${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Tydzień ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Następny rok"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Obecny rok"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Poprzedni rok"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nie wprowadzono danych"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Nie można skonwertować danych do Unicode (nie poprawny zestaw znaków?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Import pliku CSV pomyślny."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Błąd importu danych CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Tekst CSV importowano"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Błąd importu tekstu CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Nie wybrano kodowania znaków"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Nieznane kodoowanie znaków"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Błąd danych CSV, linia ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konwersja do Unicode nieudana, linia ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Błąd danych CSV, linia ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Dane osoby: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Zmiany zapisane."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "cały dzień"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Położenie: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Zasoby zarezerwowane: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Dzienny kalenadz dla %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Tygodniowy kalendarz dla %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Tydzień %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Mieśieczny kalędarz dla %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Wsparcie dla plików PDF jest wyłączone. Jśli chcesz je włączyć zwróć się do "
+"administratora."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalendarz dla %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Brakuje wymaganych danych."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Uruchom %s -h o pomoc."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: tryp demona nie wspierany na twoim systemie operacyjnym."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s menedżer"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Czas staru: %.3f sek, %.3f sek CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Nie można zainicjalizować bazy danych:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Może inna instacja %s używja jej?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Użycie: %s [opcje]\n"
+"Opcje:\n"
+"  -c, --config xxx użyj tego pliku konfiguracyjnego zamiast domyślnego\n"
+"  -h, --help pokazuje ten komunikat\n"
+"  -d, --deamon przechodzi do pracy w tle po uruchomieniu\n"
+"  -r, --restore-manager przywraca użytkownika menadżera z domyślnym hasłem\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Brak zdefioniowanego schowka w tym pliku konfiguracyjny.\n"
+"\n"
+"Jeśli uzywasz domyślnego pliku konfiguracyjnego, proszę odytuj do teraz i\n"
+"odkomentuj jedną z sekcji ZODB.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Tytuł"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Tytuł notatki."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grupa"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Czas Trwania"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Data"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Indeks zasobu"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Dodaj nowy zasób"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Niewystarczające dane"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Pole tytułu nie może być puste"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Obecne Grupy"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Dostępne Grupy"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Obecny miesiąc"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Dostępne Grupy"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupy"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Obecne Grupy"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Dostępne Grupy"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Zasoby"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importuj Zasoby"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Dostępne Zasoby"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Indeks osoby"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Dodaj nową osobę"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Tytuł zasobu."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Opis zasobu."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Opis grupy."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Strona"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Anuluj"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Zmien informacje o ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Zmień Członkowstwo"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Zmień dane kontaktowe dla {$user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Zmień dane kontaktowe dla {$user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Zmień dane kontaktowe dla {$user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Dane kontaktowe"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Użytkownik"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Hasło"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Ta nazwa użytkownika jest już zajęta!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Zastosuj"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Główny telefon"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Poprzedni miesiąc"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Inforamcje o wydarzeniu"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Zaczyna się"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "So"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Strefa czasowa"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Dodatkowy telefon"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notatki"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Następny"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Ilość zdarzeń"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "edytuj imię"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "edytuj imię"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "edytuj imię"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Moje Ustawienia"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Imię i nazwisko"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Zdjęcie"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Zdjęcie (w formacie JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nowa Notatka"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Tekst CSV importowano"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Hasło zostało zmienione!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Hasło zostało zmienione!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Przykład:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Dane Osobowe"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Indeks Grupy"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Dodaj nową grupę"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Grupy ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Członek ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Obecni Członkowie"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Dodaj Członków"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Tytuł grupy."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Opis grupy."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Indeks zasobu"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Dodaj nowy zasób"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Poprzedni tydzień"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "Tekst CSV importowano"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Hasło zostało zmienione!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Obecny tydzień"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Hasło zostało zmienione!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Użytkownik"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Tytuł zasobu."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Opis zasobu."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Zaczyna się"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Tytuł notatki."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Następny tydzień"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Tytuł notatki."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Dzienne"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Tytuł notatki."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Treść"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Treść notatki"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Prywatność"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Nazwa użytkownika nie może być pusta"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Imię i nazwisko nie może być puste"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Duplikuj nazwę użytkownika: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nowe hasło"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Zmień hasło"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Strefa czasowa"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Format czasu"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "GG:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "GG:MM rano/wieczór"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Format daty"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/RR"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "RRRR-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dzień Miesiąc, Rok"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Tudzień zaczyna się:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Zacznij wyświetlać tygodnie w Niedziele lub Poniedziałek"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Pokaż kalendarz"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nazwa która powinna być wyświetlana"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Indeks zasobu"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Dodaj nowy zasób"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Indeks zasobu"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Dodaj nowy zasób"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Tytuł zasobu."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Opis zasobu."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Miejsce"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Niewystarczające dane"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Niewystarczające dane"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Niewystarczające dane"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Mój Kalendarz"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Więcej..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendarze"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Witamy w SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Nawigacja"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Zdjęcie"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Nazwa użytkownika:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "edytuj imię"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Zmień imię tej osoby, zdjęcie, lub hasło"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Dane osoby: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "edytuj grupy"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "góra"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Zmiany zapisane."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Zmień Detale"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nowa Notatka"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "elementy"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Dodaj nową osobę"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Zaczyna się"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Daty wyjątków"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Niepoprawna data. Proszą podać RRRR-MM-DD po jednej w linii."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Dodaj nowy zasób"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} osób"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Treść notatki"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "ten sam dzień tygodnia"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "edytuj imię"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Notatka"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Nieznane kodoowanie znaków"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nowe zdjęcie"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Mały obrazek (około 48x48 pikseli w formacie JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Wyczyść zdjęcie"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Zaznacz aby wyczyścić zdjęcie"
+
+#~ msgid "Verify password"
+#~ msgstr "Weryfikuj hasło"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Hasła nie pasują do siebie."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Hasła nie pasują!"
+
+#~ msgid "View"
+#~ msgstr "Widok"
+
+#~ msgid "Edit"
+#~ msgstr "Edytuj"
+
+#~ msgid "Create new objects"
+#~ msgstr "Utwórz nowe obiekty"
+
+#~ msgid "Add events"
+#~ msgstr "Dodaj wydarzenia"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modyfikuj/usuń wydarzenia"
+
+#~ msgid "Control access"
+#~ msgstr "Kontrola dostępu"
+
+#~ msgid "Manage membership"
+#~ msgstr "Zarządzaj członkostwem"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Uwierzytelnieni użytkownicy"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Nie uwierzytelnieni użytkownicy"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Zmień preferencje"
+
+#~ msgid "New Person"
+#~ msgstr "Nowa osoba"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importuj osoby"
+
+#~ msgid "Add a Group"
+#~ msgstr "Dodaj grupę"
+
+#, fuzzy
+#~ msgid "New Group"
+#~ msgstr "Nowa grupa"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Edytuj opis grupy"
+
+#~ msgid "A Group"
+#~ msgstr "Grupa"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Grupa SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Dodaj/Usuń Członków"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importuj Grupy"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Dodaj Zasób"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Edytuj Informacje o Zasobie"
+
+#~ msgid "New Resource"
+#~ msgstr "Nowy Zasób"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Zasób SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Zasób"
+
+#~ msgid "Actions"
+#~ msgstr "Akcje"
+
+#~ msgid "View Calendar"
+#~ msgstr "Pokaż Kalendarz"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalendarz (Dni)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Klendarz (Dni, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalendarz (Tygodnie)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalendarz (Tygodnie, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalendarz (Miesiące)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalendarz (Miesiące, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalendarz (Roczny)"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Wolny/Zajęty"
+
+#~ msgid "New Event"
+#~ msgstr "Nwe zdarzenie"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Otwórz w iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Edytuj zdarzenie"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Zmień Właściwości Strony"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "To uprawnienie pozwola na oglądanie imion, tytułów, zdjęć, list obiektów "
+#~ "i innych informacji."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Pozwala edytować imiona, tytuły, opisy, zdjęcia itp."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Pozwala użytkownikowi tworzyć nowe osoby, grupy i zasoby."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Pozwala na oglądanie kalendarzy osób, grup i zasobów."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Pozwala dodawać nowe wydarzenia do kalendarzy."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Pozwala edytować i kasować wydarzenia w kalendarzach."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Kontrola dostępu dla ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Pozwala użytkownikowi używać tego formularza (Kontrola dostępu)"
+
+#, fuzzy
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Pozwala użytkownikowi dodawać osoby, grupy i zasoby do grup. Żeby coś "
+#~ "dodać do grupy, użytkownik potrzebuje uprawnień tylko do tej grupy. "
+#~ "Pamiętaj, że zapisywanie się do grup ma konsekwencje związane z "
+#~ "bezpieczeństwem."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Uprawnienia dla Grup"
+
+#~ msgid "Access control"
+#~ msgstr "Kontrola dostępu"
+
+#~ msgid "Set Access"
+#~ msgstr "Ustaw dostęp"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Uprawnienia dla Użytkowników"
+
+#, fuzzy
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Uprawnienia są dziedziczone w hierarchii powstrzymywania. Na przykład, "
+#~ "jeśli ustawisz uprawnienie Pokazuj Kalendarz użytkownikowi w Indeksie "
+#~ "Osób, użytkownik ten będzie mógł zobaczyć kalendarze wszystkich osób. "
+#~ "Jeśli chcesz aby użytkownik mógł oglądać kalendarze niektórych zasobów, "
+#~ "ustawiasz uprawnienie Pokazuj Kalendarz dla tego użytkownika na tych "
+#~ "zasobach."
+
+#, fuzzy
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr "Poniżej jest lista nazw uprawnień z ich odpowiednimi znaczeniami."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Zmień"
+
+#~ msgid "General preferences"
+#~ msgstr "Preferencje ogólne"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Edytuj ustawienia strony"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Wydarzenia dla"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_opis"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_właczony"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_wiecej_informacji"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Weryfikuj mój Atom"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Poprawny Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Miejsce:${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Wybierz dodatkowe kalendarze do wyświetlenia"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Przytrzymaj Ctrl lub Shift aby wybrać wiele kalendarzy."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Kalendarz Publiczny"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Wybierz kalendarze do wyświetlenia"
+
+#~ msgid "People"
+#~ msgstr "Ludzie"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Nie ma osób z kalendarzami dostępnymi dla ciebie."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Nie ma grup z kalendarzami dostępnymi dla ciebie."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Nie ma zasobów z kalendarzami dostępnymi dla ciebie."
+
+#~ msgid "Showing"
+#~ msgstr "Pokazuje"
+
+#~ msgid "of"
+#~ msgstr "z"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Czy jesteś pewien, że chcesz usunąć wybrane elementy?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Nie wybrałeś żadnych elemntów."
+
+#~ msgid "delete-button"
+#~ msgstr "przycisk-usuwania"
+
+#~ msgid "Exception"
+#~ msgstr "Wyjątek"
+
+#~ msgid "Server Error"
+#~ msgstr "Błąd serwera"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Wystąpił wewnętrzny błąd serwera. Oznacza to prawdopodobnie, że znalazłeś "
+#~ "błąd w SchoolBell. Zaraportuj go na <a href=\"http://issues.schooltool.org"
+#~ "\">stronie śledzenia błędów</a>."
+
+#~ msgid "All day event"
+#~ msgstr "Wydarzenie całodniowe"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "To jest powtarzające się wydarzenie"
+
+#, fuzzy
+#~ msgid "Ends"
+#~ msgstr "Kończy się"
+
+#~ msgid "edit event"
+#~ msgstr "edytuj wydarzenie"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Zmień szczegóły tego wydarzenia"
+
+#~ msgid "edit resources"
+#~ msgstr "edytuj zasoby"
+
+#~ msgid "delete event"
+#~ msgstr "skasuj wydarzenie"
+
+#~ msgid "Event details"
+#~ msgstr "Szczegóły Zdarzenia"
+
+#, fuzzy
+#~ msgid "Book Resources"
+#~ msgstr "Zamów zasoby"
+
+#~ msgid "Update form"
+#~ msgstr "Aktualizuj formularz"
+
+#~ msgid "day"
+#~ msgstr "dzień"
+
+#~ msgid "week"
+#~ msgstr "tydzień"
+
+#~ msgid "month"
+#~ msgstr "miesiąc"
+
+#~ msgid "year"
+#~ msgstr "rok"
+
+#~ msgid "Weekly"
+#~ msgstr "Tygodniowo"
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Dzień ${monthday} każdego miesiąca"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} każdego miesiąca"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMI_CONTENT} każdego miesiąca"
+
+#~ msgid "Repeat"
+#~ msgstr "Powtórz"
+
+#, fuzzy
+#~ msgid "times"
+#~ msgstr "razy"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Powtarzaj zawsze"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Zasoby książkowe"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Zasoby Zarezerwowane dla ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Tytuł:"
+
+#~ msgid "Starts:"
+#~ msgstr "Początek:"
+
+#~ msgid "Ends:"
+#~ msgstr "Koniec:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "To jest powtarzające się wydarzenie"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Rezerwacja Zasobu"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Konflikt zdarzeń"
+
+#~ msgid "Book"
+#~ msgstr "Rezerwuj"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "Dane CSV <strong>muszą</stron> zawierać tytuł grupy i <strong>mogą</"
+#~ "strong> zawierać ocjonalny opis grupy. Wszystkie dodatkowe informacje "
+#~ "będą odrzucone."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LUG, Koło Użytkoników Linuksa\n"
+#~ "Koło Szachowe\n"
+#~ "SKA, Szkolny Klub Sportowy, <em>tekst po drugim przecinku</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Powyższy przykład utworzy 3 grupy nazwane 'LUG', 'Koło Szachowe' i 'SKS'. "
+#~ "Pierwsza i ostatnia grupa będą miały opisy odpowiednio 'Koło Użytkoników "
+#~ "Linuksa' oraz 'Szkolny Klub Sportowy'. Grupa 'Koło Szachowe' nie będzie "
+#~ "miała opisu oraz słowa \"tekst po drugim przecinku\" w opisie trzeciej "
+#~ "grupie zostanie zignorowany."
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Dodaj plik CSV"
+
+#~ msgid "CSV File"
+#~ msgstr "Plik CSV"
+
+#~ msgid "Charset:"
+#~ msgstr "Kodowanie:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Zachodnie (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Zachodnie (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Zachodni (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Inny (proszę określ)"
+
+#~ msgid "Members"
+#~ msgstr "Członkowie"
+
+#~ msgid "edit members"
+#~ msgstr "edytuj członków"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Zmień lubdzi którzy są członkami tej grupy."
+
+#~ msgid "Remove"
+#~ msgstr "Usuń"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Nie jesteś uprawniony do wejścia na tą stronę. Możesz nacosnąc przycisk "
+#~ "wstecz twojej przeglądarki, lub poprosić użytkownika o większych "
+#~ "uprawnieniach aby się zalogował."
+
+#~ msgid "Please log in"
+#~ msgstr "Prosze zaloguj się"
+
+#~ msgid "Login"
+#~ msgstr "Użytkownik"
+
+#~ msgid "User Information"
+#~ msgstr "Informacje Użytkownika"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Twoja sesja wygasła."
+
+#~ msgid "There are none."
+#~ msgstr "Nic nie ma."
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "przycisk wyślij"
+
+#~ msgid "There are none to add."
+#~ msgstr "Nie ma nikogo do dodania."
+
+#~ msgid "Find Now"
+#~ msgstr "Znajdź"
+
+#~ msgid "Clear"
+#~ msgstr "Wyczyść"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "Private"
+#~ msgstr "Prywatne"
+
+#~ msgid "Public"
+#~ msgstr "Publiczne"
+
+#~ msgid "Add note"
+#~ msgstr "Dodaj notatkę"
+
+#~ msgid "Delete"
+#~ msgstr "Skasuj"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Prawdopodobnie strona której szukasz nie istnieje"
+
+#~ msgid "Not Found"
+#~ msgstr "Nie Znaleziono"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "Strona niedostępna"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "Dane CSV <strong>muszą</strong> zawierać nazę użytkownika i pełne imię. "
+#~ "Opcjonalne hasło <strong>może</strong> być również dołączone."
+
+#~ msgid "Details"
+#~ msgstr "Szczegóły"
+
+#~ msgid "edit details"
+#~ msgstr "edycja szczegułów"
+
+#~ msgid "Add person"
+#~ msgstr "Dodaj osobę"
+
+#~ msgid "Add to groups"
+#~ msgstr "Dodaj do grup"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Przepraszam, ale nie możesz skasować własnego konta"
+
+#~ msgid "Edit contact information"
+#~ msgstr "Edytuj dane kontaktowe"
+
+#~ msgid "Edit person"
+#~ msgstr "Edytuj osobę"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Preferencje kalendarza"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Próbujesz skasować powtarzające się wydarzenie"
+
+#~ msgid "Current"
+#~ msgstr "Obecne"
+
+#~ msgid "Future"
+#~ msgstr "Przyszłe"
+
+#~ msgid "All"
+#~ msgstr "Wszystkie"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Usuwam powtarzające się zdarzenie (${event_title})"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "Dane CSV <strong>muszą</strong> zweirać nazwę zasobu i <strong>mogą</"
+#~ "strong> zwierać opcjonalny opis zasobu. Dodatkowe informacje zostaną "
+#~ "odrzucone."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Projektor #302\n"
+#~ "Główna Aula\n"
+#~ "LC-805, Laptop #805, <em> tekst po drugim przecinku</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Powyższy przykład utworzy 3 zasoby nazwane 'PRJ302', 'Główna Aula' oraz "
+#~ "'LC-805'. Pierwszy i ostatni zasób będą miały opisy, odpowiednio "
+#~ "'Projektor #302' oraz 'Laptop #805'. Zasób \"Główna Aula\" nie będzie "
+#~ "miał opisu, oraz słowa \"tekst po drugim przecinku\" zostaną zignorowane."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identyfikator (opcjonalny)"
+
+#~ msgid "Printable version"
+#~ msgstr "Wersja do druku"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Pokarz kalendarz tygodniowy"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Pokarz miesięczny kalendarz"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Pokarz roczny kalendarz"
+
+#~ msgid "Yearly"
+#~ msgstr "Rocznie"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Kalendarz dla ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Przeskocz Do..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Jutrzejsze Wydarzenia"
+
+#~ msgid "Log in"
+#~ msgstr "Zaloguj się"
+
+#~ msgid "User:"
+#~ msgstr "Użytkownik:"
+
+#~ msgid "Log Out"
+#~ msgstr "Wyloguj"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Użytkownicy nieautoryzowani"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Użytkownik nieautoryzowany"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Użytkownicy autoryzowani"
+
+#~ msgid "All Users"
+#~ msgstr "Wszyscy użytkownicy"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: ostrzeżenia: zignorowane opcje konfiguracyjne '%s'"

Added: schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/pl/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5023 @@
+# Polish translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:39+0000\n"
+"Last-Translator: MichalS <gandalfx at gmail.com>\n"
+"Language-Team: Polish <pl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Osoby"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 osoba"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} osób"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Marzec"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Styczeń"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Luty"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Następny dzień"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Dziś"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Poprzedni dzień"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Poniedziałek"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Wtorek"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Środa"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Czwartek"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Niedziela"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Piątek"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Cały dzień"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Czas"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Okres"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Typ okresu"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuty"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Godziny"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dni"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Miejsce"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "zawsze"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Dni tygodnia"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Dzień tygodnia"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Miesięcznie"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "ten sam dzień tygodnia"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "ostatni dzień tygodnia"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Ostatni  ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Niewłaściwy czas"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Początek jest później niż zakończenie"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Niewłaściwy czas. Podaj w formie RRRR-MM-DD, po jednym na linię"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Dodaj wydarzenie"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Dodaj"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Edytuj wydarzenie"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Aktualizuj"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Tydzień ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Następny rok"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Obecny rok"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Poprzedni rok"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Działy"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalendarze"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalendarze"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalendarze"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalendarze"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Dodaj wydarzenie"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Edytuj wydarzenie"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Zaloguj"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Nawigacja"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Miejsce"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalendarze"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nie wprowadzono danych"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Konwersja danych do Unicode nieudana (niewłaściwe kodowanie?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Nieznane kodowanie"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Błąd w danych CSV, linia  ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konwersja do Unicode nieudana, linia ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Wiersz 2 nie jest pusty"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+#, fuzzy
+msgid "Incomplete section description on line ${line}"
+msgstr "Niekompletny opis w linii ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+#, fuzzy
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Pierwszy wiersz pliku CSV musi zawierać identyfikator przedmiotu i "
+"identyfikator planu lekcji"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Semestr ${term} nie istnieje"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Schemat rozkładu zajęć ${schema} nie istnieje"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+"Błąd w danych CSV planu, linia Error in timetable CSV data, line ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Identyfikatory dni nie zdefiniowany w wybranym schemacie: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Okresy nie zdefiniowane w wybranych dniach: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Osób nie znaleziono: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Programów nie znaleziono:Courses not found: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Sekcji nie znaleziono: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Niewłaściwe rekordy: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Zmień preferencje"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Preferencje kalendarza"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Preferencje kalendarza"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Edytuj preferencje osoby"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Edytuj preferencje osoby"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Wersja do druku"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "Kalendarz planów"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#, fuzzy
+msgid "Daily"
+msgstr "Szczegóły"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+#, fuzzy
+msgid "View weekly calendar"
+msgstr "Kalendarz planów"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+#, fuzzy
+msgid "Weekly"
+msgstr "Dzień tygodnia"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "Kalendarz osobisty"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+#, fuzzy
+msgid "View yearly calendar"
+msgstr "Kalendarz planów"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kalendarz"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Kalendarz osobisty"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Kalendarz planów"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Mój kalendarz"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendarze"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Więcej..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Mój kalendarz"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Kalendarz planów"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+#, fuzzy
+msgid "delete-button"
+msgstr "przycisk-dodaj"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+#, fuzzy
+msgid "cancel-button"
+msgstr "przycisk-dodaj"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Wyczyść"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Dodaj wydarzenie"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Szczegóły"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Edytuj wydarzenie"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Zmień instrukcje dla tego działu"
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "edytuj grupy"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Edytuj wydarzenie"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Edytuj informację działu"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "edytuj szczegóły"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Zasoby"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Aktualizuj"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Dziś"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Miesięcznie"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Wyczyść"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Czas"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Kalendarz osobisty"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "zawsze"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Zasoby"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Informacja o osobie: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Czas"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Zasoby"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "zmien lokalizację"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Przedmioty"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Witaj w SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${DYNAMIC_CONTENT}"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Edytuj informację działu"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Zaloguj"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "Obecny rok"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Cały dzień"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+#, fuzzy
+msgid "Western (ISO-8859-15)"
+msgstr "Zachodnia Europa (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+#, fuzzy
+msgid "Western (Windows-1252)"
+msgstr "Zachodnia Europa (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Inny (wymień)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Inne kodowanie: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Wprowadź dane CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "Dane CSV"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#, fuzzy
+msgid "submit-button"
+msgstr "przycisk wyślij"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Pokaż plany lekcji"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Możesz utworzyć plik CSV w arkuszu kalkulacyjnym i wyeksportować go w "
+"formacie CSV (Comma-Separated Values). Strukturę tabeli opisano poniżej."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Wyslij osoby SchoolTool jako CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Przykład:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Dodaj plik CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+#, fuzzy
+msgid "CSV File"
+msgstr "Plik CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Kodowanie:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+#, fuzzy
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+#, fuzzy
+msgid "Western (ISO-8859-1)"
+msgstr "Zachodnia Europa (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Zasoby"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+#, fuzzy
+msgid "Welcome to the SchoolTool server"
+msgstr "Witaj w SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Preferencje kalendarza"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Edytuj preferencje osoby"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Osoby"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuty"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Niedziela"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Poprzedni rok"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+#, fuzzy
+msgid "Next"
+msgstr "Następny rok"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Miejsce"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Dodaj dział"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Edytuj wydarzenie"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Dodaj dział"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+#, fuzzy
+msgid "Edit Section Information"
+msgstr "Edytuj informację działu"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importuj kursy"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Dodaj nowy kurs"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Nowy kurs"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Spis kursów"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Dodaj nowy kurs"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Niewystarczające dane"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Tytuły nie mogą być puste"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Nie ma takiego kursu"
+
+#: /src/schooltool/course/browser/section.py:113
+#, fuzzy
+msgid "Need a course ID."
+msgstr "Podaj identyfikator kursu"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+#, fuzzy
+msgid "Add a Section to ${course}"
+msgstr "Dodaj dział do ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Instrukcje"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Uczniowie"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+#, fuzzy
+msgid "Groups"
+msgstr "Grupy"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+#, fuzzy
+msgid "Resources"
+msgstr "Zasoby"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Spis działów"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Dodaj dział"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"Dane CSV <strong>muszą</strong> zawierać nazwę przedmiotu i <strong>mogą</"
+"strong> zawierać opcjonalny opis przedmiotu. Wszytko poza tym zostanie "
+"odrzucone"
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"↵\n"
+"Historia starożytna, od czasów prehistorycznych do średniowiecza↵\n"
+"Historia Polski↵\n"
+"Historia Europy,  od średniowiecza do współczesności, tekst po drugim "
+"przecinku↵\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"W powyższym przykładzie zostały utworzone trzy programy nauczania: "
+"\"Historia starożytna\", \"Historia Polski\" i \"Historia Europy\". Pierwszy "
+"ma dodatkowy opis \"od czasów prehistorycznych do średniowiecza\", a ostatni "
+"dodatkowy opis \"od średniowiecza do współczesności\". Drugi program nie "
+"będzie miał opisu, a słowa \"tekst po drugim przecinku\" zostaną zignorowane"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Dodaj programy Schooltool jako CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Działy"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "uczniowie"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Dział ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "edytuj nazwę"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Zmień lokalizację lub nazwę tego działu"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Zmień instrukcje dla tego działu"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Zasoby"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Zmień instrukcje dla tego działu"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "edutuj instrukcje"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "edytuj osoby"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "Change the students in this section individually"
+msgstr "Zmień instrukcje dla tego działu"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+#, fuzzy
+msgid "Change the students in this section by groups"
+msgstr "Zmień instrukcje dla tego działu"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "edytuj grupy"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Działy"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+#, fuzzy
+msgid "Current Size"
+msgstr "Obecny rok"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+#, fuzzy
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Osoby"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Marzec"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Użytkownik"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Hasło"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Zastosuj"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Zdjęcie"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Zdjęcie (w formacie JPG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Przedmioty"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "przycisk wyślij"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "przycisk-dodaj"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "przycisk-dodaj"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Dodaj dział"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Edytuj wydarzenie"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Uczniowie"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "przycisk-dodaj"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+#, fuzzy
+msgid "Import Groups"
+msgstr "Importuj grupy"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "przez grupę"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Edytuj informację działu"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Zarfządzaj członkostwem"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupy"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupy"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"Dane CSV <strong>muszą</strong> zawierać nazwę grupy u i <strong>mogą</"
+"strong> zawierać opcjonalny opis grupy. Wszytko poza tym zostanie odrzucone"
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"↵\n"
+"LUG, Koło Użytkowników Linuksa↵\n"
+"Klub szachowy↵\n"
+"SKS, Szkolny Klub Sportowy, <em>tekst po drugim przecinku</em>↵\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"W powyższym przykładzie utworzono 3 grupy: 'LUG', 'Klub szachowy' i 'SKS'. "
+"Pierwsza i ostatnia grupa posiadają opisy, odpowiednio \"Koło Użytkowników "
+"Linuksa\" i \"Szkolny Klub Sportowy\". Grupa \"Klub szachowy\" nie ma opisu, "
+"a słowa \"tekst po drugim przecinku\" w opisie trzeciej grupy zostaną "
+"zignorowane."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Dodaj grupy SchoolTool jako CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "edytuj nazwę"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Zmień lokalizację lub nazwę tego działu"
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Kalendarz osobisty"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Dodaj wydarzenie"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Edytuj wydarzenie"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "przycisk-dodaj"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Obecny rok"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Uczniowie"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "przycisk-dodaj"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "przycisk-dodaj"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "przycisk wyślij"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nowy kurs"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Prywatność"
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Prywatność"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Dodaj wydarzenie"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Data"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "nazwa użytkownika nie może być pusta"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Nazwisko nie może być puste"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Podwójna nazwa użytkownika: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importuj osoby"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"Plik CSV <strong>musi</strong> nazwę użytkownika oraz jego imię i nazwisko. "
+"Opcjonalne hasło <strong>może</strong> rownież byc w nim umieszczone"
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"jkowalski, Jan Kowalski\n"
+"jckowalski, Jan Chryzosotom Kowalski, r2m45J\n"
+"adam, Adam\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Powyższy przykład stworzy trzech użytkowników, jkowalski,jckowalski i adam. "
+"Tylko jckowalski ma ustawione hasło i będzie mógł się zalogować do systemu. "
+"Uwaga: hasła muszą byc przesłane czytym tekstem."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Wyslij osoby SchoolTool jako CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Zmień preferencje dla ${user}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Edytuj preferencje osoby"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Dodaj wydarzenie"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Edytuj wydarzenie"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Pokazywane"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "z"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "elementy"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importuj źródła"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Dodaj nowy kurs"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Edytuj informację działu"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Zasoby"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Zasoby"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"Dane CSV <strong>muszą</strong> zawierać nazwę zasobu i <strong>mogą</"
+"strong> zawierać dodatkowy opis zasobu. Wszelkie inne informacje zostaną "
+"odrzucone."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"↵\n"
+"PRJ302, rzutnik przezroczy #302↵\n"
+"Sala gimnastyczna↵\n"
+"LC-805, komputer osobisty #805, <em>tekst po drugim przecinku</em>↵\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"W powyższym przykładzie utworzono 3 zasoby: 'PRJ302', 'Sala gimnastyczna' i "
+"'LC-805'. Pierwszy i ostatni zasób posiadają opisy, odpowiednio \"rzutnik "
+"przezroczy\" i \"komputer osobisty\". Zasób \"Sala gimnastyczna\" nie ma "
+"opisu, a słowa \"tekst po drugim przecinku\" w opisie trzeciego zasobu  "
+"zostaną zignorowane."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "Dodaj zasoby SchoolTool jako CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Kalendarze"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Zaloguj"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Użytkownik:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Wyloguj"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+#, fuzzy
+msgid "Please enter the replacement date below."
+msgstr "Podaj przynajmniej jedną nazwę dnia"
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+#, fuzzy
+msgid "Please enter the emergency date below."
+msgstr "Podaj przynajmniej jedną nazwę dnia"
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+#, fuzzy
+msgid "Week ${week_number}"
+msgstr "Tydzień ${week_no}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+#, fuzzy
+msgid "Refresh"
+msgstr "Zasoby"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Dziś"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Pokaż plany lekcji"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Pokaż plany lekcji"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Poprzedni dzień"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "Cały dzień"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Dodaj dział"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Pokaż plany lekcji"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Przedmioty"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Pokaż plany lekcji"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "Różne godziny"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Data"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "Informacja o osobie: ${title}"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Poniedziałek"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Kalendarz planów"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Pokaż plany lekcji"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+"Czy plan zajęć twojej szkoły używa dni tygodnia czy cyklu powtarzalnego?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Dni tygodnia"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Cykl powtarzalny"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Podaj nazwy dni w cyklu, jedna na linię"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Podaj przynajmniej jedną nazwę dnia"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Upewnij się, że nazwy dni nie powtarzają się"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Czy w planie zajęć twojej szkoły zajęcia zaczynają się o tej samej godzinie "
+"każdego dnia?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Ta sama godzina każdego dnia"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Różne godziny"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Podaj początek i koniec każdej gfodziny lekcyjnej, jedna godzina (GG:MM - GG:"
+"MM) na linię."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Użytkownik:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Znień nazłę, obrazek lub hasło tej osoby"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Zarządzaj uprawnieniami tej osoby"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importuj działy"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Nieprawidłowa linia numer ${line_no} (Powinna zawierac identyfikator "
+#~ "dnia, okresu i opcjonalnie miejsca)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Lokalizacji nie znaleziono: ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Zmien szczegóły tej osoby"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Przedmioty wykładane"
+
+#~ msgid "My Preferences"
+#~ msgstr "Moje preferencje"
+
+#~ msgid "Person index"
+#~ msgstr "Indeks osób"
+
+#~ msgid "Clear photo"
+#~ msgstr "Wyczyść zdjęcie"
+
+#~ msgid "New password"
+#~ msgstr "Nowe hasło"
+
+#~ msgid "Verify password"
+#~ msgstr "Sprawdź hasło"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Hasła nie pasują"
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Hasło zmienione!"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Użytkownicy zweryfikowani"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Użytkownicy niezweryfikowani"
+
+#~ msgid "An error occured."
+#~ msgstr "Błąd"

Added: schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Portuguese translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Portuguese <pt at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/pt/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4905 @@
+# Portuguese translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-07-03 10:24+0000\n"
+"Last-Translator: nuno_santos <nuno.diniz.santos at gmail.com>\n"
+"Language-Team: Portuguese <pt at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Indivíduos"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 pessoa"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} pessoas"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nome de utilizador ou password incorrecta"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Março"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Janeiro"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Fevereiro"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Junho"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Maio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Setembro"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Julho"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Dia seguinte"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hoje"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Dia anterior"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Outubro"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Dezembro"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Novembro"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Segunda-Feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Terça-Feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Quarta-Feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Quinta-Feira"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Domingo"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Sábado"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Sexta-Feira"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Seg"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ter"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Qua"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Qui"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Sex"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+#, fuzzy
+msgid "Sun"
+msgstr "Dom"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Título"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Todo o dia"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Mostrar as horas em formato 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Secções"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Visualização"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Adicionar eventos"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Adicionar eventos"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navegação"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Conjunto de caractéres não especificado."
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Conjunto de caractéres desconhecido."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "A Linha 2 não está vazia"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Descrição de Secção incompleta na linha ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "O termo ${term} não existe."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "O schema de horário ${schema} não existe."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "IDs de dia não definidos no schema seleccionado: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Períodos não definidos nos dias seleccionados: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Individuos não encontrados: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Cursos não encontrados: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Secções não encontradas: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Entradas inválidas: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Mudar Preferências"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Mudar Preferências"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Mudar Preferências"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Mudar Preferências"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Mudar Preferências"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#, fuzzy
+msgid "Daily"
+msgstr "Detalhes"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+#, fuzzy
+msgid "View weekly calendar"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+#, fuzzy
+msgid "View yearly calendar"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Cal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Calendário pessoal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "Timetable calendar"
+msgstr "Calendário Horário"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Mais..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Todo o dia"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Detalhes"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Adicionar eventos"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "Recursos"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Modificar / apagar eventos"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Editar Informação de Secção"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "editar detalhes"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Hoje"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Recursos"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Título"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Recursos"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Cursos"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Bemvindo a Ferramenta Escolar"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Editar Informação de Secção"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Todo o dia"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Outro (especifique por favor)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Ver Horário"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Exemplo:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+#, fuzzy
+msgid "Welcome to the SchoolTool server"
+msgstr "Bemvindo a Ferramenta Escolar"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Mudar Preferências"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Mudar Preferências"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Indivíduos"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Domingo"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Adicionar uma Secção"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Visualização"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Editar"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Adicionar uma Secção"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Editar Informação de Secção"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importar Cursos"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Adicionar novo curso"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Novo Curso"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Índice de cursos"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Adicionar novo curso"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Curso inexistente."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Requer um ID de curso."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Adicionar uma Secção a ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grupos"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Índice de Seções"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Adicionar nova Seção"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"História Antiga, Pré-história até 1000 A.C.\n"
+"História de Portugal\n"
+"História Mundial, 1000 A.C. até ao século XX, texto após a segunda vírgula\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"O exemplo acima irá criar 3 cursos com os títulos 'História Antiga', "
+"'História de Portugal' e 'História Mundial'. O primeiro e o último curso "
+"terão como descrição 'Pré-história até 1000 A.C.' e '1000 A.D. through the "
+"20th century', respectivamente. O segundo curso não terá descrição e o "
+"\"texto após a segunda vírgula\" no terceiro curso será ignorado."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Secções"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "alunos"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "edit individuals"
+msgstr "editar detalhes"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Secções"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Indivíduos"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Março"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Editar"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Aplicar"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Cursos"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Adicionar uma Secção"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "alunos"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importar Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Editar Informação de Secção"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Gerir membros"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+#, fuzzy
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"O exemplo acima irá criar 3 cursos com os títulos 'História Antiga', "
+"'História de Portugal' e 'História Mundial'. O primeiro e o último curso "
+"terão como descrição 'Pré-história até 1000 A.C.' e '1000 A.D. through the "
+"20th century', respectivamente. O segundo curso não terá descrição e o "
+"\"texto após a segunda vírgula\" no terceiro curso será ignorado."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Novembro"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "Setembro"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Adicionar eventos"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "alunos"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Novo Curso"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Adicionar eventos"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Data"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importar Individuos"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Mudar Preferências"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Adicionar novo curso"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Novo Período"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Visualizando"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "de"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "Items"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importar Recursos"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Adicionar novo curso"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Editar Informação de Secção"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Recursos"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Recursos"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"O exemplo acima irá criar 3 cursos com os títulos 'História Antiga', "
+"'História de Portugal' e 'História Mundial'. O primeiro e o último curso "
+"terão como descrição 'Pré-história até 1000 A.C.' e '1000 A.D. through the "
+"20th century', respectivamente. O segundo curso não terá descrição e o "
+"\"texto após a segunda vírgula\" no terceiro curso será ignorado."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Calendários"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Novo Período"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+#, fuzzy
+msgid "Refresh"
+msgstr "Recursos"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Hoje"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Ver Horário"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Ver Horário"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Dia anterior"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "Todo o dia"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Adicionar uma Secção"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Ver Horário"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "Novo Período"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Cursos"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Ver Horário"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Data"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Novo Período"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Segunda-Feira"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Calendário Horário"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Ver Horário"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Import Sections"
+#~ msgstr "Importar Secções"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Locais não encontrados: ${args}."
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modifique os detalhes deste individuo"
+
+#~ msgid "Create new objects"
+#~ msgstr "Criar novos objectos"
+
+#~ msgid "Control access"
+#~ msgstr "Controlar acessos"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Utilizadores autenticados"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Utilizadores não autenticados"
+
+#~ msgid "An error occured."
+#~ msgstr "Um erro ocorreu."

Added: schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3103 @@
+# Portuguese (Brazil) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-10-23 03:19+0000\n"
+"Last-Translator: Goedson Teixeira Paixão <goedson at debian.org>\n"
+"Language-Team: Portuguese (Brazil) <pt_BR at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Apelido"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Um apelido curto para esta pessoa."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Email Primário"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Email Secundário"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telefone Primário"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Número de telefone recomendado."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Telefone secundário"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Número de telefone secundário."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Website"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Website ou weblog."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Endereço"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Pessoas"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 pessoa"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} pessoas"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nome de usuário ou senha incorreto"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Ano atual"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Grupos Disponíveis"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Março"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Janeiro"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Fevereiro"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Junho"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Maio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Setembro"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Julho"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Dia seguinte"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hoje"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Dia anterior"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Outubro"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Dezembro"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Novembro"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Segunda-feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Terça-feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Quarta-feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Quinta-feira"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Domingo"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Sábado"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Sexta-feira"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Seg"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ter"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Qua"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Qui"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Sex"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Dom"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Título"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Dia inteiro"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Hora de início em formato 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duração"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipo de duração"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutos"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Horas"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dias"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Local"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Descrição"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Recorrente"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Repete a cada"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dia"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mês"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Ano"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repetir a cada"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Faixa"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Contar"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Até"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "para sempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Número de eventos"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Repetir até"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Dias da semana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Dia da semana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Mensalmente"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Datas de exceção"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "mesmo dia da semana"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1º de"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4 de"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3 de"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2 de"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5 de"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "último dia da semana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Último ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Um erro aconteceu."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Tempo inválido"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Data final anterior à data inicial"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Data inválida. Por favor, especifique AAAA-MM--DD, uma por linha."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Adicionar evento"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Adicionar"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Atualizar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Atualizado em ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Calendários"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Próxima semana"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Semana atual"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Semana anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (semana ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Próximo mês"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mês atual"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mês anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Semana ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Próximo ano"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Ano atual"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Ano anterior"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nenhum dado fornecido"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Não foi possível converter os dados para Unicode (conjunto de caracteres "
+"errado?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Arquivo CSV importado com sucesso."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Falha ao importar arquivo CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Texto CSV importado com sucesso."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Falha ao importar texto CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Nenhum conjunto de caracteres especificado"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Conjunto de caracteres desconhecido"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Erros nos cados CSV, linha ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Conversão para unicode falhou na linha ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Erros nos cados CSV, linha ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Informações da pessoa: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Alterações gravadas."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "todo o dia"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Local: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Recursos alocados: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "recorrente"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "sobreposto de %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendário diário para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendário semanal para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Semana %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendário mensal para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"O suporte a PDF está desativado. Ele pode ser ativado pelo seu administrador."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendário de %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"O nome da escola ou organização executando\n"
+"            este servidor. Isto será mostrado no calendário público, no\n"
+"            final de todas as páginas e no título da página."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Calendário Inicial"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Mostrar calendário público como a página inicial do\n"
+"            site."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Entrada requerida está faltando."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "A entrada do formulário não é um objeto do tipo arquivo"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Dados inteiros inválidos"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Dados de texto inválidos"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Dados textuais inválidos"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Dados unicode inválidos"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Dados de ponto flutuante inválidos"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Dados de hora e data inválidos"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Indo para segundo plano, identificador do processo %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Execute %s -h para ajuda."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: modo daemon não é suportado no seu sistema operacional."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Lendo configuração de %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Tempo de execução: %.3f seg real, %.3f seg CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Não foi possível iniciar banco de dados:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Será que outra instância de %s está usando-o?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Aviso: não pude encontrar a biblioteca reportlab.\n"
+"Suporte PDf desativado."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Aviso: o diretório de fontes '%s' não existe.\n"
+"Suporte a PDF desativado."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Aviso: a fonte '%s' não existe.\n"
+"Suporte a PDF desativado."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Uso: %s [opções]\n"
+"Opções:\n"
+"  -c, --config xxx usa este arquivo de configuração no lugar do padrão\n"
+"  -h, --help mostra essa mensagem de ajuda\n"
+"  -d, --daemon vai para segundo plano após iniciar\n"
+"  -r, --restore-manager restaurar usuário manager com a senha padrão\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Nenhum armazenamento definido no arquivo de configuração.\n"
+"Se você está usando o arquivo de configuração padrão, edite-o agora e\n"
+"descomente uma das seções de armazenamento ZODB.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Este não é um banco de dados SchoolBell 1.0, abortando.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Este não é um banco de dados SchoolBell 1.0, abortando.\n"
+"Por favor, execute o script de atualização de banco de dados.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Título"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Título da anotação."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grupo"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Duração"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Data"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Dados fornecidos são insuficientes."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Títulos não podem ser vazios"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Grupos Atuais"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Grupos Disponíveis"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Mês atual"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Grupos Disponíveis"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupos"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Grupos Atuais"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Grupos Disponíveis"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importar Recursos"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Recursos disponíveis"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Índice de pessoas"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Adicionar uma nova pessoa"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Título do recurso."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Descrição do recurso."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Descrição do grupo."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Website"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Cancelar"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Alterar informações de ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Alterar membros"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Alterar preferências de ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Alterar detalhes de contato para ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Alterar detalhes de contato para ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Informações de contato"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nome de usuário"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Senha"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Este nome de usuário não está disponível!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Aplicar"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Telefone Primário"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Anterior"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Informação do evento"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Apelido"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Início"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sáb"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Fuso Horário"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Telefone secundário"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Anotações"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Próximo"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Número de eventos"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "editar nome"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "editar nome"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "editar nome"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Minhas Preferências"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nome completo"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Retrato"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Retrato (em formato JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nova Anotação"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Texto CSV importado com sucesso."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "A senha foi alterada com sucesso!"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "A senha foi alterada com sucesso!"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Exemplo:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Informação da Pessoa"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Índice de grupos"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Adicionar um novo grupo"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Grupos de ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Membros de ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Membros Atuais"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Adicionar Membros"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Título do grupo."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Descrição do grupo."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Semana anterior"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "Texto CSV importado com sucesso."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "A senha foi alterada com sucesso!"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Semana atual"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "A senha foi alterada com sucesso!"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Usuário"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Título do recurso."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Descrição do recurso."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Início"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Título da anotação."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Próxima semana"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Título da anotação."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Diariamente"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Título da anotação."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Corpo"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Corpo da anotação."
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Privacidade"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "nome de usuário não pode ser vazio"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "nome completo não pode ser vazio"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Nome de usuário duplicado: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nova senha"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Alterar senha"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Fuso Horário"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Fuso Horátio usado para mostrar o seu calendário"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formato da Hora"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formato da Data"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "DD/MM/YY"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "DD-MM-YYYY"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dia Mês, Ano"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Semana inicia em:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Inicia a exibição das semanas no Domingo ou Segunda-feira"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Ver calendário"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nome que deve ser mostrado"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Título do recurso."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Descrição do recurso."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Um Local."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indica que este recurso é um local, como uma sala de aula."
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Dados fornecidos são insuficientes."
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Dados fornecidos são insuficientes."
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Dados fornecidos são insuficientes."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Meu Calendário"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Mais..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendários"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Bem-vindo ao SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navegação"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Retrato"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Nome de usuário:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "editar nome"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Alterar o nome, foto ou senha desta pessoa"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Informações da pessoa: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Gerenciar as participações desta pessoa"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "editar grupos"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Este não é um banco de dados SchoolBell 1.0, abortando.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Este não é um banco de dados SchoolBell 1.0, abortando.\n"
+"Por favor, execute o script de atualização de banco de dados.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "topo"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Alterações gravadas."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Alterar Detalhes"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nova Anotação"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "ítens"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Adicionar uma nova pessoa"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Início"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Datas de exceção"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Data inválida. Por favor, especifique AAAA-MM--DD, uma por linha."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} pessoas"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Corpo da anotação."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "mesmo dia da semana"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "editar nome"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Anotação"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Conjunto de caracteres desconhecido"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Novo retrato"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Uma imagem pequena (aproximadamente 48x48 pixels em formato JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Excluir retrato"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Marque para excluir o retrato"
+
+#~ msgid "Verify password"
+#~ msgstr "Verificar senha"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Senhas não conferem."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Senhas não coincidem!"
+
+#~ msgid "View"
+#~ msgstr "Ver"
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "Create new objects"
+#~ msgstr "Criar novos objetos"
+
+#~ msgid "Add events"
+#~ msgstr "Adicionar eventos"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modificar/excluir eventos"
+
+#~ msgid "Control access"
+#~ msgstr "Controlar acesso"
+
+#~ msgid "Manage membership"
+#~ msgstr "Administrar membros"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Usuários autenticados"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Usuários não autenticados"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Configurar Acesso"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Alterar Preferências"
+
+#~ msgid "New Person"
+#~ msgstr "Nova Pessoa"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importar Pessoas"
+
+#~ msgid "Add a Group"
+#~ msgstr "Adicionar um Grupo"
+
+#~ msgid "New Group"
+#~ msgstr "Novo Grupo"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Editar Informação de Grupo"
+
+#~ msgid "A Group"
+#~ msgstr "Um Grupo"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Grupo do SChoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Adicionar/Remover Membros"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importar Grupos"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Adicionar um Recurso"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Editar Informações do Recurso"
+
+#~ msgid "New Resource"
+#~ msgstr "Novo Recurso"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Recurso do SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Um Recurso"
+
+#~ msgid "Actions"
+#~ msgstr "Ações"
+
+#~ msgid "View Calendar"
+#~ msgstr "Ver Calendário"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Calendário (Diário)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Calendário (Diário, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Calendário (Semanal)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Calendário (Semanal, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Calendário (Mensal)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Calendário (Mensal, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Calendário (Anual)"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Livre/Ocupado"
+
+#~ msgid "New Event"
+#~ msgstr "Novo Evento"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Abrir no iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Editar Evento"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Alterar Preferências do Site"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Esta permissão permite ver nomes, títulos, fotos, listas de objetos e "
+#~ "outras informações."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Permite editar nomes, títulos, descrições, fotos etc."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Permite que o usuário crie novas pessoas grupos e recursos."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Permite ver calendários de pessoas, grupos e recursos."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Permite adicionar novos eventos a calendários."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Permite editar e excluir eventos em calendários."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Controle de acesso para ${title}"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Permite ao usuário usar este formulário (Controle de acesso)"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Permite que o usuário adicione pessoas, grupos e recursos aos grupos. "
+#~ "Para adicionar algo a um grupo, o usuário precisa ter essa permissão "
+#~ "apenas naquele grupo. Tenha em mente que participar de um grupo tem "
+#~ "implicações na segurança."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Permisões para Grupos"
+
+#~ msgid "Access control"
+#~ msgstr "Controle de acesso"
+
+#~ msgid "Set Access"
+#~ msgstr "Definir Acesso"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Permissões para Usuários"
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "Abaixo está uma lista de nomes de permissão com os seus respectivos "
+#~ "significados."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Alterar preferências do site"
+
+#~ msgid "General preferences"
+#~ msgstr "Preferências gerais"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Editar preferências do site"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Eventos para"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Local: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Escolha calendários adicionais para exibir"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr ""
+#~ "Mantenha Ctrl ou Shift pressionado para selecionar múltiplos calendários."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Calendário Público"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "calendário para todo o site"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Escolha calendários a exibir"
+
+#~ msgid "People"
+#~ msgstr "Pessoas"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Não há pessoas com calendários que você possa acessar."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Não há grupos com calendários que você possa acessar."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Não há recursos com calendários que você possa acessar."
+
+#~ msgid "Showing"
+#~ msgstr "Mostrando"
+
+#~ msgid "of"
+#~ msgstr "de"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Você deseja realmente excluir os ítens selecionados?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Você não escolheu nenhum item."
+
+#~ msgid "delete-button"
+#~ msgstr "Excluir"
+
+#~ msgid "Exception"
+#~ msgstr "Exceção"
+
+#~ msgid "Server Error"
+#~ msgstr "Erro no Servidor"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Aconteceu um erro interno no servidor. Isto, provavelmente, significa que "
+#~ "você encontrou um bug no SchoolBell. Por favor, relate o no <a href="
+#~ "\"http://issues.schooltool.org\">acompanhamento de problemas</a>."
+
+#~ msgid "All day event"
+#~ msgstr "Evento de dia inteiro"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Este é um evento recorrente."
+
+#~ msgid "Ends"
+#~ msgstr "Término"
+
+#~ msgid "edit event"
+#~ msgstr "editar evento"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Alterar os detalhes deste evento"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Recursos agendados"
+
+#~ msgid "edit resources"
+#~ msgstr "editar recursos"
+
+#~ msgid "delete event"
+#~ msgstr "excluir evento"
+
+#~ msgid "Event details"
+#~ msgstr "Detalhes do evento"
+
+#~ msgid "Book Resources"
+#~ msgstr "Alocar Recursos"
+
+#~ msgid "Update form"
+#~ msgstr "Atualizar formulário"
+
+#~ msgid "day"
+#~ msgstr "dia"
+
+#~ msgid "week"
+#~ msgstr "semana"
+
+#~ msgid "month"
+#~ msgstr "mês"
+
+#~ msgid "year"
+#~ msgstr "ano"
+
+#~ msgid "Weekly"
+#~ msgstr "Semanalmente"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr "Esta seção só se aplica quando a recorrência semanal é selecionada."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr "Esta seção só se aplica quando a recorrência mensal é selecionada."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Dia ${monthday} de todo mês"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} de todo mês"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} de todo mês"
+
+#~ msgid "Repeat"
+#~ msgstr "Repetir"
+
+#~ msgid "times"
+#~ msgstr "vezes"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Repetir para sempre"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Alocar recursos"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Alocação de recursos para ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Título:"
+
+#~ msgid "Starts:"
+#~ msgstr "Início:"
+
+#~ msgid "Ends:"
+#~ msgstr "Término:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Este é  um evento recorrente!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Alocação de recursos"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Eventos conflitantes"
+
+#~ msgid "Book"
+#~ msgstr "Agendar"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "Dados CSV <strong>devem</strong> incluir um título de grupo e "
+#~ "<strong>podem</strong> incluir uma descrição de grupo opcional. Qualquer "
+#~ "informação extra será descartada."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GUL, Grupo de Usuários Linux\n"
+#~ "Clube de Xadrez\n"
+#~ "Clube de Esportes, Clube de esportes após a aula, <em> texto após a "
+#~ "segunda vírgula</em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "O exemplo acima criará 3 grupos com títulos 'GUL', 'Clube de Xadrez' e "
+#~ "'Clube de Esportes'. O primeiro e o último terão as descrições 'Grupo de "
+#~ "Usuários Linux' e 'Clube de esportes após a aula', respectivamente. O "
+#~ "'Clube de Xadrez' não terá descrição e o texto extra \"texto após a "
+#~ "segunda vírgula\" no terceiro grupo será ignorado."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Enviar grupos schooltool como CSV"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Enviar Arquivo CSV"
+
+#~ msgid "CSV File"
+#~ msgstr "Arquivo CSV"
+
+#~ msgid "Charset:"
+#~ msgstr "Conjunto de caracteres:"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Ocidental (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Ocidental (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Ocidental (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Outros (por favor especifique)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Outro conjunto de caracteres: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Entrar Dados CSV"
+
+#~ msgid "CSV Data"
+#~ msgstr "Dados CSV"
+
+#~ msgid "Members"
+#~ msgstr "Membros"
+
+#~ msgid "edit members"
+#~ msgstr "editar membros"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Alteras as pessoas que são membros deste grupo."
+
+#~ msgid "Remove"
+#~ msgstr "Remover"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Você não pode acessar esta página. Você pode clicar no botão voltar do "
+#~ "seu navegador ou pedir uma pessoa com mais privilégios para acessar."
+
+#~ msgid "Please log in"
+#~ msgstr "Por favor, autentique-se"
+
+#~ msgid "Login"
+#~ msgstr "Acessar"
+
+#~ msgid "User Information"
+#~ msgstr "Informação de Usuário"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Sua sessão expirou."
+
+#~ msgid "There are none."
+#~ msgstr "Não há nenhum."
+
+#~ msgid "submit-button"
+#~ msgstr "Enviar"
+
+#~ msgid "There are none to add."
+#~ msgstr "Não há nada a adicionar."
+
+#~ msgid "Find Now"
+#~ msgstr "Encontrar Agora"
+
+#~ msgid "Clear"
+#~ msgstr "Limpar"
+
+#~ msgid "cancel-button"
+#~ msgstr "Cancelar"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Quem pode ver a anotação"
+
+#~ msgid "Private"
+#~ msgstr "Particular"
+
+#~ msgid "Public"
+#~ msgstr "Público"
+
+#~ msgid "Add note"
+#~ msgstr "Adicionar anotação"
+
+#~ msgid "add-button"
+#~ msgstr "Adicionar"
+
+#~ msgid "Delete"
+#~ msgstr "Excluir"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Por favor, note o seguinte:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "Você pode ter errado a digitação da URL"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Você pode estar tentando acerrar uma página inexistente"
+
+#~ msgid "Not Found"
+#~ msgstr "Não Encontrado"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "A página que você está tentando acessar não está disponível"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "Dados CSV <strong>devem</strong> conter um nome de usuário e um nome "
+#~ "completo. Uma senha opcional <strong>pode</strong> ser incluída também."
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "O exemplo acima criará três usuários, , 'jjones', 'jbjones' e 'howard'. "
+#~ "Dos três, somente 'jbjones' tem uma senha ('r2m45J') e será capaz de "
+#~ "acessar o sistema. Note que a senha deve ser enviada em texto sem "
+#~ "criptografia."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Enviar pessoas do schooltool como CSV"
+
+#~ msgid "Details"
+#~ msgstr "Detalhes"
+
+#~ msgid "edit details"
+#~ msgstr "editar detalhes"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modificar os detalhes desta pessoa"
+
+#~ msgid "Add person"
+#~ msgstr "Adicionar pessoa"
+
+#~ msgid "Add to groups"
+#~ msgstr "Adicionar aos grupos"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Desculpe, você não pode excluir sua própria conta de usuário."
+
+#~ msgid "Edit contact information"
+#~ msgstr "Editar informações de contato"
+
+#~ msgid "Edit person"
+#~ msgstr "Editar pessoa"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Preferências de Calendário"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Editar preferências da pessoa"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Você está tentando remover um evento recorrente."
+
+#~ msgid "Current"
+#~ msgstr "Atual"
+
+#~ msgid "Future"
+#~ msgstr "Futuro"
+
+#~ msgid "All"
+#~ msgstr "Todos"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Excluindo um evento que se repete (${event_title})"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "Dados CSV <strong>devem</strong> incluir um título de recur e "
+#~ "<strong>podem</strong> incluir uma descrição de recurso opcional. "
+#~ "Qualquer informação extra será descartada."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Projetor #302\n"
+#~ "Auditório Principal\n"
+#~ "L805, Laptop #805, <em>texto após a segunda vírgula</em>↵\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "O exemplo acima criará 3 recursos chamados 'PRJ302', 'Auditório "
+#~ "Principal' e 'L805'. O primeiro e o último recursos, terão as descrições "
+#~ "'Projetor #302' e 'Laptop #805', respectivamente. O recurso 'Auditório "
+#~ "Principal' não terá descrição e o texto \"texto após a segunda vírgula\" "
+#~ "no terceiro recurso será ignorado."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Enviar recursos do schooltool como CSV"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "Há ${num_errors} erros na entrada."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identificador (opcional)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Servidor Executando SchoolBell<span>"
+#~ "${DYNAMIC_CONTENT}</span> &copy; The Shuttleworth Foundation 2003 - "
+#~ "<span>2005</span>: Dando Suporte à Inovação Social. </p> <p> "
+#~ "SchoolTool&trade; é uma marca registrada de The Shuttleworth Foundation. "
+#~ "</p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Versão imprimível"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Ver calendário diário"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Ver calendário semanal"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Ver calendário mensal"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Visualizar calendário anual"
+
+#~ msgid "Yearly"
+#~ msgstr "Anual"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Calendário para ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Pular Para ..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Eventos de Amanhã"
+
+#~ msgid "Log in"
+#~ msgstr "Acessar"
+
+#~ msgid "User:"
+#~ msgstr "Usuário:"
+
+#~ msgid "Log Out"
+#~ msgstr "Sair"
+
+#~ msgid "Edit Info"
+#~ msgstr "Editar Informações"
+
+#~ msgid "Add Event"
+#~ msgstr "Adicionar Evento"
+
+#~ msgid "Modify Event"
+#~ msgstr "Modificar Evento"
+
+#~ msgid "Set up access"
+#~ msgstr "Configurar acesso"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Usuários Não Autenticados"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Usuário Não Autenticado"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Usuários Autenticados"
+
+#~ msgid "All Users"
+#~ msgstr "Todos Usuários"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: aviso: opção de configuração '%s' ignorada"

Added: schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/pt_BR/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5252 @@
+# Portuguese (Brazil) translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-06-22 16:18+0000\n"
+"Last-Translator: Marcelo Mendes <marcelomendes at gmail.com>\n"
+"Language-Team: Portuguese (Brazil) <pt_BR at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Apelido"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Apelido curto para esta pessoa"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "E-mail principal"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "E-mail secundário"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Telefone principal"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Número de telefone recomendado."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Telefone secundário"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Número de telefone secundário."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Website"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Website ou blog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Endereço para correspondências"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Pessoas"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 pessoa"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} pessoas"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nome de usuário ou senha estão incorretos"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Março"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Janeiro"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Fevereiro"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Junho"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Maio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Setembro"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Julho"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Próximo dia"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hoje"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "O dia anterior"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Outubro"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Dezembro"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Novembro"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Segunda"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Terça"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Quarta"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Quinta"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Domingo"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Sábado"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Sexta"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Seg"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ter"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Qua"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Qui"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Sex"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Dom"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Título"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Dia inteiro"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Hora inicial no formato 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duração"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipo de Duração"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minutos"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Horas"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dias"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Localização"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Descrição"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Repetindo"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Repete todo"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dia"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Mês"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Ano"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repete a cada"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Intervalo"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Contagem"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Até"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "para sempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Número de eventos"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Repetir até"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Dias da semana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Dia da semana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Mensalmente"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Exceção de datas"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "mesmo dia da semana"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2º"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5º"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "último dia da semana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Último ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Um error ocorreu."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Hora inválida"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Data de término é anterior à data de início"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Data inválida. Por favor use AAAA-MM-DD, uma por linha."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Adicionar evento"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Adicionar"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Atualizar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Atualizado em ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Calendário"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Próxima semana"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Semana atual"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Semana anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (semana ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Próximo mês"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mês atual"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mês anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Semana ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Próximo ano"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Ano atual"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Ano anterior"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Ações"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Calendário"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Calendário"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Calendário"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Calendário"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Visualizar"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Calendário"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Adicionar evento"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Entrar"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navegação"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Ações"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Calendário"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nenhum dado foi fornecido"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+"Não foi possível converter dados para Unicode (mapa de caracteres "
+"incorreto?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Arquivo CSV importado com sucesso."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Falha ao importar arquivo CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Texto CSV importando com sucesso."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Falha ao importar texto CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Nenhum mapa de caracteres for especificado"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Mapa de caracteres desconhecido"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Erros nos cados CSV, linha ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Conversão para unicode falhou na linha ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Linha 2 não está vazia"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+"Linha ${line_no} não informada corretamente (deve conter a identificação do "
+"dia ou a identificação do período)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Descrição de seção incompleta na linha ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"A primeira linha do arquivo CSV deve contêr a identificação do termo e a "
+"identificação do esquema da tabela de horários."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "O termo ${term} não existe"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "A tabela de horário do esquema ${schema} não existe"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Erro na tabela de horários nos dados CSV, linha ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Identificação do dia não definido no esquema selecionado: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Períodos não definidos nos dias selecionados: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Pessoas: ${args} não encontrada(s)."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Cursos: ${args} não encontrado(s)."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Seções não encontradas: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Registros inválido: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Modificações salvas."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "dia inteiro"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Local: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Recursos alocados: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "repete"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "sobreposto de %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Calendário diário para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Calendário semanal para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Semana %d(%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Calendário mensal para %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"Suporte a PDF está desabilitado. Ele pode ser habilitado pelo administrador "
+"do sistema."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Modificar Preferências"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Preferências do Calendário"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Preferências do Calendário"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Editar preferências desta pessoa"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Editar preferências desta pessoa"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Descrição"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Ir para ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Eventos de Amanhã"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Versão para Impressão"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Ver calendário diário"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Diariamente"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Ver calendário semanal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Semanalmente"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Ver calendário mensal"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Ver calendário anual"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Anualmente"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Calendário para ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Calendário Pessoal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Calendário da tabela de horários"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Meu Calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Calendários"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Mais..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Calendário semanal para %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "Apagar"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "Botão-cancelar"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "E"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Excluir"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Não há nenhum"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Procurar"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Limpar"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Não há nada a ser adicionado"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Adicionar evento"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Detalhes"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Mudar os instrutores para esta sessão"
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Recursos alocados: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "editar grupos"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Modificar/Apagar eventos"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Editar Informações da Sessão"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "editar detalhes"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Atualizar"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Hoje"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Semana"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Mês"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Ano"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Repetir até"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Visualizar calendário"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Repete a cada"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Recursos alocados: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Informações dessa pessoa: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Título"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Índice de Recursos"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "mudar localização"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Cursos"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Bem-Vindo(a) ao SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Editar Informações da Sessão"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Entrar"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "repete"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Dia inteiro"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Ocidental (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Ocidental (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Outro (por favor especifique)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Outra codificação: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Entrar de dados CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "Dados CSV"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "Enviar"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Importar Tabela de Horários"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Você pode criar o arquivo CVS em uma planilha eletrônica e exportá-la no "
+"formato CVS (Valores Separados por Vírgula - do inglês Comma Separated "
+"Values). A estrutura da tabela é descrita abaixo."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"A primeira linha do arquivo deve conter o nome do <strong>período</strong> e "
+"a <strong>estrutura da tabela</strong> que será usada para as novas tabelas "
+"de horário. A segunda linha deve ficar em branco. Após, podem ser inseridas "
+"descrições para as turmas. Separe-as por linhas em branco."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+#, fuzzy
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+"A primeira linha da descrição de cada seção contêm a <strong>identificação "
+"do curso</strong> e a <strong>identificação do instrutor</strong> para a "
+"nova seção. Portanto um número de linhas, cada um contêm uma "
+"<strong>identificação do dia</strong>, uma <strong>identificação do período</"
+"strong> e uma opcional <strong>identificação de localização</strong>, "
+"seguidamente. A lista de descrições do período é terminada por três "
+"astericos ('***') na primeira coluna. Após o terminador, algum número de "
+"<strong>identificação de pessoa</strong> talvez apareça, as pessoas "
+"denotadas serão adicionadas a seção como estudantes."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Carregar tabela de horários do SchoolTool no formato CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Exemplo:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\n"
+"\"\",\"\",\"\"\n"
+"\n"
+"\"philosophy\",\"lorch\"\n"
+"\n"
+"\"Segunda\",\"A\",\"sala137\"\n"
+"\n"
+"\"Segunda\",\"B\"\n"
+"\n"
+"\"Terça\",\"C\",\"sala138\"\n"
+"\n"
+"\"***\"\n"
+"\n"
+"\"johnny\"\n"
+"\n"
+"\"billy\"\n"
+"\n"
+"\"\"\n"
+"\n"
+"\"literatura\",\"guzman\"\n"
+"\n"
+"\"Quarta\",\"B\"\n"
+"\n"
+"\"Quarta\",\"C\",\"sala139\"\n"
+"\n"
+"\"***\"\n"
+"\n"
+"\"johnny\"\n"
+"\n"
+"\"pete\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+#, fuzzy
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+"O exemplo acima irá criar duas novas seções, uma para palestra filosófica e "
+"o outra para palestra literária. A seção para palestra filosófica irá ter "
+"pessoas com identificação 'carlos' e 'roberto' como estudantes, e a tabela "
+"de horários irá contêr três atividades, dois na segunda(um ocorrendo no "
+"lugar da posição denotada pelo a identificação 'sala137',um sem uma "
+"especificação de localização) A seção literária iré ser processada de uma "
+"maneira similar."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Note que somente ids de objetos são para serem usados no arquivo, não "
+"títulos. Se uma linha termina com células vazias (ex.: <em>\"philosofy\","
+"\"lorch\",\"\",\"\"</em>), estas células serão descartadas. Você pode "
+"separar descrições de seção para mais de uma linha. Nesta lista de "
+"iniciantes, somente a primeira coluna contendo o ids da pessoa é processada, "
+"as outras colunas serão ignoradas. Você pode importar o mesmo dado várias "
+"vezes sem nenhum afetar nenhum lado"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Carregar arquivo CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "Arquivos CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Mapa de caracteres:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Ocidental (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Calendário para %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Recursos alocados: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"O nome da escola ou organização executando\n"
+"            este servidor. Isto será mostrado no calendário público, no\n"
+"            final de todas as páginas e no título da página."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Página inicial do Calendário"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Mostrar calendário público como a página inicial do\n"
+"            site."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Entrada requerida está faltando."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Entrada do formulário não é um arquivo de objeto"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Inteiro inválido"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Texto inválido"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Dados textuais inválidos"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Unicode inválido"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Dados de ponto flutuante inválidos"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Dados de data e hora inválidos"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Indo para background, o número de processo do daemon é %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Execute %s -h para obter ajuda"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: modo daemon não suportado pelo seu sistema operacional"
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Lendo configuração de %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Administrador"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Tempo desde inicialização: %.3f seg real, %.3f seg CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Banco de dados não pode ser inicializado:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Uma outra instância de %s está usando-o?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Aviso: biblioteca reportlab não foi encontrada.\n"
+"Suporte à PDF foi desabilitado."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Aviso: diretório de fonte '%s' não existe.\n"
+"Suporte à PDF foi desabilitado."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr "Aviso: a fonte '%s' não existe."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Nenhum  armazenamento definido no arquivo de configuração.\n"
+"\n"
+"Se  você está usando o arquivo de configuração padrão, por favor edit-o "
+"agora e\n"
+"descomente uma das seções de armazenamento ZODB.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Este não é um arquivo de banco de dados do SchoolTool 0.10, abortando.\n"
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Este não é um arquivo de banco de dados do SchoolTool 0.10, abortando.\n"
+"\n"
+"Por favor, execute o script de atualização do banco de dados.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Bem-Vindo ao servidor do SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr "Explicação foi aceita"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr "Não explicado ainda"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr "Estava atrasado para ${section} (${mins} minutes)."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr "Estava ausente para ${section}."
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+"O horário de chegada que você definiu é inválido. Por favor use o formato HH:"
+"MM"
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr "Horário de chegada somente é aplicado aos estudantes vespertinos"
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr "Adicionado uma explicação por $abasence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr "Resolvido $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr "Explicação regeitado para $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr "Tornar $absense vespertino"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+"Não é possível adicionar uma nova explicação para $absence: explicação "
+"antiga não aceita/rejeitada"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+#, fuzzy
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr "Não existem explicações proeminentes para aceitar por $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr "Não existem explicações proeminentes para rejeitar por $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Preferências do Calendário"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Editar preferências desta pessoa"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+#, fuzzy
+msgid "Students with unresolved absences"
+msgstr "Resolvido $absence"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Pessoas"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Agendamento para ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Legenda:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minutos"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "repete"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Domingo"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Não há nada a ser adicionado"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "A data inserida não pertence a este termo."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Não há nada a ser adicionado"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Agendamento para ${person}"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+#, fuzzy
+msgid "Unresolved explained absences"
+msgstr "Resolvido $absence"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+#, fuzzy
+msgid "Unresolved unexplained absences"
+msgstr "Resolvido $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Ano anterior"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Próximo"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Localização"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Adicionar Sessão"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Visualizar"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Editar evento"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Adicionar Sessão"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Editar Informações da Sessão"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importar Cursos"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Adicionar novo curso"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Novo Curso"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Índice de cursos"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Adicionar novo curso"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Os dados fornecidos são insuficientes."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Títulos não podem ficar em branco"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Curso não encontrado"
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Necessário ID do curso"
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Adicionar uma seção a ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Instrutores"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Instrutores Atuais"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Instrutores disponíveis"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Estudantes"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grupos"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Índice de sessões"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Adicionar nova sessão"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"Os dados CSV (Valores separados por vírgula -  do inglês Comma Separeted "
+"Values)<strong>devem</strong> incluir um título para o curso e "
+"<strong>podem</strong> incluir uma descrição opcional para ele. Qualquer "
+"informação extra (ou seja, após a segunda vírgula) será descartada."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"História antiga, Pré-história com 1000 A.D.\n"
+"História do Brasil\n"
+"História Mundial, 1000 A.D. com a 20th century, texto após a segunda "
+"vírgula\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"O exemplo acima criará 3 cursos entitulados 'História Antiga', 'História dos "
+"EUA' e 'História Geral'. O primeiro e o último curso terão como descrição "
+"'Da Pré-História até 1000 d.C.' e 'De 1000 d.C. até o século XX' "
+"respectivamente. O segundo curso não conterá descrição e o texto extra "
+"digitado no terceiro curso 'texto depois da segunda vírgula' será ignorado."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Carregar cursos do schooltool no formato CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Sessões"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "estudantes"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Seção do ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "editar nome"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Mudar a localização ou nome desta sessão"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Mudar os instrutores para esta sessão"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Recursos alocados: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Mudar os instrutores para esta sessão"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "editar instrutores"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "edição individual"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Mudar estudantes desta sessão separados individualmente"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Mudar estudantes desta sessão separados por grupo"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "editar grupos"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Identificador (opcional)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Turma"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Tamanho Atual"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Há ${num_errors} erro(s) na entrada dos dados"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Título do curso."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Descrição do curso;"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Etiqueta"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Um identificador para uma seção, foi feito do instrutor\n"
+"              nomes,cursos e tempo de encontro."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Código"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "Código de identificação da sessão."
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Descrição da sessão."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Pessoas"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Março"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Dia da Escola"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Dia de emergência"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Dia de emergência"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Dia de emergência"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Editar"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Cancelar"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Nome de usuário"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Senha"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Este nome de usuário já está sendo utilizado!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Aplicar"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Diariamente"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Não há nenhum"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Não há nenhum"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Notas"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nome completo"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (no formato JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Cursos"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "Apagar"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "Adicionar"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "Botão-cancelar"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Adicionar Sessão"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Editar evento"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Estudantes"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "Apagar"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Período ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importar Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Adicionar novo grupo"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Editar Informações da Sessão"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Gerenciar membros"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupos"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"Os dados CSV (Valores separados por vírgula -  do inglês Comma Separeted "
+"Values) <strong>devem</strong> incluir um título para o grupo e "
+"<strong>podem</strong> incluir uma descrição opcional para ele. Qualquer "
+"informação extra (ou seja, após a segunda vírgula) será descartada."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"GUL, Grupo de Usuários Linux\n"
+"Clube de Xadrez\n"
+"Clube de Esportes, Clube de esportes após a aula, <em> texto após a segunda "
+"vírgula</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"O exemplo acima irá criar 3 grupos entitulados 'GUL', 'Clube de Xadrez' e "
+"'Clube de Esportes'. O primeiro e o último grupo irão ter as descrições "
+"'Grupo de Usuários Linux' e 'Pós-escola Esporte Clube' respectivamente. O "
+"grupo 'Clube de Xadrez' irá ter uma descrição, e o texto extra \"texto após "
+"uma segunda vírgula\" no terceiro grupo será ignorado."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Enviar grupos do SchoolTool com CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Novembro"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "editar nome"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Mudar a localização ou nome desta sessão"
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Índice de grupos"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Adicionar novo grupo"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Título do grupo."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Descrição do grupo."
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Calendário privado"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Adicionar evento"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Editar evento"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "nenhum"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "Adicionar"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Semana atual"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Estudantes"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "Botão-cancelar"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "Adicionar"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "Botão-cancelar"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Novo termo"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Título da nota"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Corpo"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Corpo da nota"
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Privacidade"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Notas"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Privacidade"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Adicionar termo"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Data"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Nome de usuário não pode ficar em branco"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Nome completo não pode ficar em branco"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Nome de usuário duplicado: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importar Pessoas"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"Os dados CVS (Valores Separados por Vírgula - do inglês Comma Separeted "
+"Values) <strong>devem</strong> conter nome de usuário e nome completo. Uma "
+"senha <strong>pode</strong> ser incluída também opcionalmente."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"JJones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"O exemplo acima criará três usuários: 'jjones', 'jbjones' e 'howard'. Dos "
+"três, apenas 'jbjones' tem senha ('r2m45j') e está habilitado a fazer login "
+"no sistema. Observe que senhas devem ser enviadas em formato de texto comum "
+"(plain text)."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Carregar pessoa do SchoolTool no formato CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "Modificar preferências de ${user}"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr "Editar preferências desta pessoa"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Fuso Horário"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Fuso Horário usado para visualizar seu calendário"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formato de Hora"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formato de Data"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/AA"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "AAAA-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dia Mês, Ano"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Semana começam em:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Começar visualização de semanas no Domingo ou Segunda"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Mostrar períodos"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Mostrar nome dos períodos na visão diária"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nome a ser mostrado"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Relacionamentos"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Adicionar evento"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Editar evento"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Novo termo"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Mostrando"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "de"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "ítens"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importar Recursos"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Adicionar novo recurso"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Editar Informações da Sessão"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Recursos"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Recursos"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"Os dados CVS (Valores separados por vírgula - do inglês Comma Separated "
+"Values) <strong>devem</strong>   incluir nome do recurso e <strong>podem</"
+"strong>, opcionalmente, conter uma descrição para o mesmo. Qualquer "
+"informação extra (ou seja, depois da segunda vírgula) será descartada."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"PRJ302, Projetor #302\n"
+"Auditório Principal\n"
+"LC-805, Laptop Computer #805, <em>texto após a segundo vírgula</em>\n"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"O exemplo acima criará 3 recursos entitulados 'PRJ302', 'Auditório "
+"Principal' e 'LC-805'. O primeiro e o último recurso conterão as descrições "
+"'Retroprojetor #302\" e 'Notebook #805' respectivamente. O recurso "
+"'Auditório Principal' não terá descrição e o texto extra no terceiro recurso "
+"'texto depois da segunda vírgula' será ignorado."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr "Carregar recursos do schooltool no formato CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Índice de Recursos"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Adicionar novo recurso"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Título do recurso."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Descrição do recurso."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Local."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indica que este recurso é um local, como uma sala de aula."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Relacionamentos_do_calendário"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "ACL_do_Calendário"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Este não é um arquivo de banco de dados do SchoolBell 1.0, abortando.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Este não é um arquivo de banco de dados do SchoolBell 1.0, abortando.\n"
+"\n"
+"Por favor, execute o script de atualização do banco de dados.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "topo"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Exceção de datas"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Entrar"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Usuário:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Sair"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Novo Termo"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Cancelar aula por emergência"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "A data substituta inserida é inválida."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+"Aula cancelada por motivos de emergência. Data substituta: $replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Data substituta para dia de emergência: $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "A data inserida é inválida. Por favor, use o formato AAAA-MM-DD"
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "A data inserida não pertence a este termo."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "A data inserida não é um dia de aula."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"Você selecionou ${DYNAMIC_CONTENT} como o dia de emergência. Agora por favor "
+"selecione o dia de substituição. A seleção abaixo consiste de dias não-"
+"escolares neste período seguindo o dia de emergência e vários outros dias "
+"após o período."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Por favor coloque a data substituta abaixo."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Recolocação"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Escolha uma recolocação para o dia de emergência."
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Este formulário lhe permite marcar um dia sem escola como uma emergência e "
+"adicionar um dia de recolocação ao termo."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr "Pro favor entre a data de emergência abaixo"
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Dia de emergência"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Mudar termo: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Novo termo"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Termos"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Adicionar novo termo"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Data de início"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Data de término"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Semana ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Adicionar termo"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Salvar alterações"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Primeiro, por favor nomeie e defina o período de tempo do termo. O escopo da "
+"data está inclusa (e.g., 2004-09-01 até 2004-12-31). Datas devem ser "
+"específicadas no formato AAAA-MM-DD (A Ano, M Mês, D Dia )"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "O escopo da data está inclusa (e.g., 2004-09-01 até 2004-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Atualizar"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"Segundo, por favor especifique quais dias são dias de escola, e quais dias "
+"são feríados."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+"Por favor especifique quais dias são dias de escola, e quais dias são "
+"feríados."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Legenda:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Dia da Escola"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Feriado"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Trocar os seguintes dias da semana"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "Tabela de Horários de ${object}"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Data inválida. Por favor, use o formato AAAA-MM-DD."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Data não pertence a nenhum termo."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+"Alguns valores eram inválidos. Estes valores estão marcados em vermelho."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Mudar Tabela de Horários por um dia"
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Nova Tabela de Horários"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Ver Tabelas de Horários"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Agendamento"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+"Por favor, use o formato HH:MM para horário de início e término do período"
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Você precisa especificar pelo menos um período."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Tabela de Horários de Aula"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Adicionar novo esquema"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Por favor, selecione um valor"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Dia ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Período 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Período ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Tabela de Horários do esquema ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Dias da Tabela de Horários sempre coincidem com os dias da semana (ex: às "
+"Segunda-Feiras a primeira tabela é usada, às Terça-Feiras a segunda, e assim "
+"prossegue)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"dias da Grades de horário são usados sequencialmente, pulando os dias que "
+"não são dias de aula."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Terceiro, define o tempo e duração dos períodos quando eles caem em certos "
+"dias da semana. Use um dos seguintes formatos: <tt>HH:MM</tr> (também, não "
+"esqueça de especificar a duração na caixa de texto abaixo) ou <tt>HH:MM-HH:"
+"MM</tt> (quando você quer especificar ambos os finais explicitamente, ex: "
+"9:30-10:15). Não é necessário definir todos os períodos para todos os dias "
+"da semana, omissões irão apenas fazer com que o período seja pulado se ele "
+"acontecer de cair naquele dia da semana. Se a lista de períodos não estiver "
+"atualizada com as mudanças que você fez na tabela acima, use o botão "
+"Atualizar para atualizar o formulário."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+"Por favor escolha um nome para a tabela de horários que você deseja criar."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+"Determinadas especificações de período estavam incorretas, e "
+"conseqüentemente foram rejeitadas."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Finalmente, esteja certo de que a informação neste formulário esta correta, "
+"porque o único modo de corrigir será remover este esquema de tabela de "
+"horários e recriá-la"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Criar esquema de tabela de horários"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr "Primeiro, por favor defina os dias e os períodos da tabela de horários"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Copiar períodos do dia anterior"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "REmover este dia"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Adicionar dia"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Adicionar período"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"Segundo, selecione o modo que os dias da tabela de horários são alinhados "
+"com o calendário de dias."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"Nota: se a seção aparecer em mais de um intervalo, todos eles tem que ser "
+"definidos para <em>nenhum</em> para remov-los."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Grade de horários"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Período"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Esquema"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Agendamento para ${person}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Escolha"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Este formulário permite a voc definir a grade de horário de uma pessoa "
+"adicionando e removendo a pessoa para e de outras seções que tenha turmas na "
+"grade de horário"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "como parte de"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "nenhum"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "Conflito de agendamento"
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Salvar"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr "Não existem períodos ou esquemas de grades de horário definidos."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Escolha esquema de agenda"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "Para o(s) período(s):"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Agendamento para ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Usando tabela e horários:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Este é um modo simples de criar um esquema de tabela de horário semanal. "
+"Apenas preencha um número suficiente de linhas para seus períodos"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Se você precisa de mais flexibilidade, você pode usar o <a href=\"add.html"
+"\">Ajudante de criação do esquema de grades de horários</a>, ou um <a href="
+"\"cmplexadd.html\">formulário complexo de criação do esquema de grades de "
+"horário."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Título do período (opcional)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Tempo inicial do período"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "Tempo final do período"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Criar"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"Você pode ajustar o tempos iniciais e finais dos  períodos para "
+"${DYNAMIC_CONTENT} no formulário abaixo. A fim de remover um período do dia, "
+"apenas delete o tempo inicial e final do período."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Título do período"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Início original"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Fim original"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Novo inicio"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Novo final"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Modificar"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Este formulário permite você mudar os horários iniciais e finais dos "
+"períodos numa data certa, ou cancelar alguns períodos completamente."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+"Por favor coloque a data quando os períodos precisam ser alterados abaixo."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Escolha um dia especial"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Prosseguir"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Criar esquema de tabela de horários"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Grade de horários para ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Novo esquema de tabela de horários"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+"O ciclo da grade de horários da sua escola usa dias da semana, ou um ciclo "
+"rotativo:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Dias da semana"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Ciclo rotativo"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Coloque os nomes dos dias em ciclo, um por linha"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Por favor entre ao menos um dia."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Por favor esteja certo que os nomes dos dias são únicos"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Criar início e final das turmas ao mesmo tempo cada dia na grade de horários "
+"da sua escola?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Mesmo horário a cada dia"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Horários diferentes"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Entre com o período de início e final para cada intervalo, um intervalo (HH:"
+"MM - HH:MM) por linha."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Não é um vaga de tempo válido: $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Por favor coloque no final uma vaga de tempo."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Entre com o período de início e final para cada intervalo em cada dia, um "
+"intervalo (HH:MM - HH:MM) por linha."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Por favor entre ao menos um intervalo de tempo para $dat"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr "Os períodos tem nomes ou são simplesmente designados por tempo?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Ter nomes"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Designado pelo tempo"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Coloque nomes dos períodos, um por linha"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Por favor entre ao menos $number períodos"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Por favor esteja certo que os nomes de período são únicos"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "A sequência de períodos cada dia é a mesma ou é diferente ?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Mesmo"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Diferente"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Por favor ponha os períodos em ordem:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Por favor informe todos os períodos"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Os seguintes períodos foram selecionados mais de uma vez: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Por favor ponha os períodos em ordem para cada dia:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period no dia $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Dia desconhecido identificação: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Período desconhecido identificação: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Nome de Usuário:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Modifique nome, foto ou senha desta pessoa"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Administrar a assinatura desse usuário"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importar Sessões"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Linha ${line_no} mal-formada (ela deve conter um ID de dia, um ID de "
+#~ "período e, opcionalmente, um ID de local)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Localização não encontrada: ${args}"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Modificar os detalhes desta pessoa"
+
+#~ msgid "Sections Taught"
+#~ msgstr "Seções ministradas"
+
+#~ msgid "via group"
+#~ msgstr "através do grupo"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolTool <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Servidor Rodando SchoolTool <span>"
+#~ "${DYNAMIC_CONTENT}</span> &copy; The Shuttleworth Foundation 2003 - "
+#~ "<span>2005</span>: Supporting Social Innovation. </p> <p> "
+#~ "SchoolTool&trade; é Marca Registrada da The Shuttleworth Foundation. </p>"
+
+#~ msgid "My Preferences"
+#~ msgstr "Minhas Preferências"
+
+#~ msgid "Person index"
+#~ msgstr "Índice de pessoas"
+
+#~ msgid "Add a new person"
+#~ msgstr "Adicionar nova pessoa"
+
+#~ msgid "New photo"
+#~ msgstr "Nova foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Figura pequena (aproximadamente 48x48 pixels no formato JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Limpar foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Marque para excluir a foto"
+
+#~ msgid "New password"
+#~ msgstr "Nova senha"
+
+#~ msgid "Verify password"
+#~ msgstr "Verificar senha"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Senhas não conferem."
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "A senha foi alterada com sucesso!"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Senhas não conferem!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Criar novos objetos"
+
+#~ msgid "Add events"
+#~ msgstr "Adicionar eventos"
+
+#~ msgid "Control access"
+#~ msgstr "Controle de acesso"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Usuários autenticados"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Usuários não autenticados"
+
+#~ msgid "An error occured."
+#~ msgstr "Ocorreu um erro."
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Usuários não autenticados"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Usuário não autenticado"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Usuários autenticados"
+
+#~ msgid "All Users"
+#~ msgstr "Todos usuários"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: aviso: a opção de configuração '%s' foi ignorada"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Uso: %s [opções]\n"
+#~ "Opções:\n"
+#~ "  -c, --config xxx use este arquivo de configuração ao invés do padrão\n"
+#~ "  -h, --help mostra esta mensagem de ajuda\n"
+#~ "  -d, --daemon excuta em segundo plano após o início\n"
+#~ "  -r, --restore-manager restaura o usuário manager com a senha padrão\n"
+
+#~ msgid "Welcome to the SchoolBell server"
+#~ msgstr "Bem-Vindo ao servidor do SchoolBell"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Este não é um arquivo de banco de dados do SchoolTool 0.10, abortando.\n"

Added: schooltool/branches/upstream/current/src/schooltool/locales/pt_PT/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/pt_PT/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/pt_PT/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2424 @@
+# Portuguese (Portugal) translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-05-23 22:07+0000\n"
+"Last-Translator: Nuno Donato <nunodonato at gmail.com>\n"
+"Language-Team: Portuguese (Portugal) <pt_PT at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Pessoas"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 pessoa"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} pessoas"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nome de utilizador ou password incorrecta"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Ano actual"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Março"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Janeiro"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Fevereiro"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Junho"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Maio"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Abril"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Agosto"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Setembro"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Julho"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Próximo dia"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hoje"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Dia anterior"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Outubro"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Dezembro"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Novembro"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Segunda-feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Terça-feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Quarta-feira"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Quinta-feira"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Domingo"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Sábado"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Sexta-feira"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Seg"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ter"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Qua"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Qui"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Sex"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sáb"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Dom"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Título"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Todo o dia"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Hora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Duração"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipo de duração"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minutos"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Horas"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dias"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Local"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Descrição"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Repetição"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Repete a cada"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dia"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Semana"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Mês"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Ano"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repetir a cada"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Alcance"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Contador"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Até"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "para sempre"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Número de eventos"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Repetir até"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Dias da semana"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Dia da semana"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Mensalmente"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Datas a excluir"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "mesmo dia da semana"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3º"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2º"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5º"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "último dia da semana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Último ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Ocorreu um erro"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Hora inválida"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "A data do fim é anterior à data do início"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Data inválida. Especifique como AAAA-MM-DD, uma por linha"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Adicionar evento"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Adicionar"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Editar evento"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Actualizar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Actualizar em ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "iCalendar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Próxima semana"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Semana actual"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Semana anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Próximo mês"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Mês actual"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Mês anterior"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "${week_no}ª Semana"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Próximo ano"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Ano actual"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Ano anterior"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Título"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grupos"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Duração"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Data"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Mês actual"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Mês actual"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupos"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Recursos"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importar Recursos"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Indíce de pessoas"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Adicionar uma nova pessoa"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Mudar detalhes"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nome de Utilizador"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Senha"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Este nome de utilizador já está a ser utilizado"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Mês anterior"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Editar as Informações do Grupo"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Sáb"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notas"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Número de eventos"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Nome completo"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Nome completo"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Nome completo"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (no formato JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Nova nota"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "A senha foi alterada com sucesso"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "A senha foi alterada com sucesso"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "A senha foi alterada com sucesso"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Duração"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Índice de grupos"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Adicionar um novo grupo"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Semana anterior"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "A senha foi alterada com sucesso"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Semana actual"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "A senha foi alterada com sucesso"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Utilizador"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Sáb"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Próxima semana"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nova password"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Nova password"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Ver calendário"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Nome a ser mostrado"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Índice de recursos"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Mudar detalhes"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Nova nota"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Adicionar uma nova pessoa"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Datas a excluir"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Data inválida. Especifique como AAAA-MM-DD, uma por linha"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Adicionar um novo recurso"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} pessoas"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "mesmo dia da semana"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Nota"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nova foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Uma pequena foto (cerca de 48x48 pixels em formato JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Remover foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Seleccione para remover a foto"
+
+#~ msgid "Verify password"
+#~ msgstr "Verificar password"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "As senhas não coincidem"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "As senhas não coincidem!"
+
+#~ msgid "View"
+#~ msgstr "Ver"
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "Create new objects"
+#~ msgstr "Criar novo objectos"
+
+#~ msgid "Add events"
+#~ msgstr "Adicionar eventos"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modificar/apagar eventos"
+
+#~ msgid "Control access"
+#~ msgstr "Controlar acessos"
+
+#~ msgid "Manage membership"
+#~ msgstr "Gerir membros"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Utilizadores autenticados"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Utilizadores não autenticados"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Configurar Acesso"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Mudar opções"
+
+#~ msgid "New Person"
+#~ msgstr "Nova pessoa"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importar Pessoas"
+
+#~ msgid "Add a Group"
+#~ msgstr "Adicionar um Grupo"
+
+#~ msgid "New Group"
+#~ msgstr "Novo Grupo"
+
+#~ msgid "A Group"
+#~ msgstr "Um Grupo"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Grupo SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Adicionar/Remover Membros"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importar Grupos"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Adicionar um Recurso"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Editar Informações do Recurso"
+
+#~ msgid "New Resource"
+#~ msgstr "Novo Recurso"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Recurso SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Um Recurso"
+
+#~ msgid "Actions"
+#~ msgstr "Acções"
+
+#~ msgid "View Calendar"
+#~ msgstr "Ver Calendário"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Calendário (Diário)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Calendário (Semanal)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Calendário (Mensal)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Calendário (Anual)"
+
+#~ msgid "Atom View"
+#~ msgstr "Vista Atom"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Livre/Ocupado"
+
+#~ msgid "New Event"
+#~ msgstr "Novo Evento"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Abrir no iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Editar Evento"
+
+#~ msgid "Public"
+#~ msgstr "Público"
+
+#~ msgid "Add note"
+#~ msgstr "Adicionar nota"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2429 @@
+# Romanian translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-11-12 12:55+0000\n"
+"Last-Translator: liberty <obvi84 at virgilio.it>\n"
+"Language-Team: Romanian <ro at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"100 > 19) || ((n % 100 == 0) && (n != 0))) ? 2: 1))\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Persoane"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "o persoana"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "persoane"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Nume de utilizator sau parola sint gresite"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Anul in curs"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Martie"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Ianuarie"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februarie"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Iunie"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Aprilie"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Septembrie"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Iulie"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Ziua urmatoare"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Astazi"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Ieri"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Octombrie"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Decembrie"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Noiembrie"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Luni"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Marti"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Miercuri"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Joi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Duminica"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Simbata"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Vineri"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Luni"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Marti"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Miercuri"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Joi"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Vineri"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Simbata"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Duminica"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titlu"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Toata ziua"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Data"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Ora"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Ora de incepere in format 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Durata"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Tipul de durata"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minute"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Ore"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Zile"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Locatie"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Descriere"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Are loc"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Are loc in fiecare"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Zi"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Saptamina"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Luna"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "An"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Se repeta la fiecare"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Durata"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Pina la"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "mereu"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Numar de evenimente"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Se repeta pina la"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "In zile lucratoare"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "in zi lucratoare"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Lunar"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Zile excluse"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "aceeasi zi a saptaminii"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "prima"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "a patra"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "a treia"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "a doua"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "a cincea"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "ultima zi lucratoare"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Ultma"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Eroare"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Orariu invalid"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Ziua de inchidere e mai devreme decit ziua de incepere"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Data invalida. Va rugam sa specificati AAAA-LL-DD, una pe fiecare linie"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Adauga eveniment"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Adauga"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Editeaza eveniment"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Reinnoire"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Reinnoire pe"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "iCalendar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Saptamina viitoare"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Saptamina actuala"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Saptamina trecuta"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Luna viitoare"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Luna in curs"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Luna trecuta"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Saptamina"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Anul viitor"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Anul in curs"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Anul trecut"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nu ati oferit nici un fel de date"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Nu am putut converti la Unicode ( set de caractere incorect ? )"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Fisier CSV importat cu succes"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Nu am reusit sa import fisierul CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Text CSV importat cu succes"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Nu am reusit sa import textul CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Nici un set de caractere specificat"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Set de caractere necunoscut"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Eroare in data CSV, linia"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Conversiunea la uncode a esuat la linia"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Eroare in data CSV, linia"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Schimbarile au fost salvate"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "toata ziua"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Locatie : %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Resurse rezervate : %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titlu"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Un grup"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Durata"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Data"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Indice de resurse"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Adauga o noua resursa"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Date insuficiente"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Titlul nu poate in alb"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Luna in curs"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Luna in curs"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importeaza resurse"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Indice personal"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Adauga o noua persoana"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Schimba apartenenta"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Nume utilizator"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Parola"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Acest nume de utilizator este deja activ"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Luna trecuta"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Editeaza detaliile grupului"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Simbata"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Numar de evenimente"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Numele complet"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Numele complet"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Numele complet"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Fotografie"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Fotografie ( in format JPEG )"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Noua notita"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Text CSV importat cu succes"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Parola a fost schimbata cu succes"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Parola a fost schimbata cu succes"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Durata"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Indice de grup"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Adauga un nou grup"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Indice de resurse"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Adauga o noua resursa"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Saptamina trecuta"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "Text CSV importat cu succes"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Parola a fost schimbata cu succes"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Saptamina actuala"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Parola a fost schimbata cu succes"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Simbata"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Saptamina viitoare"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "numele de utilizator nu  poate fi in alb"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "numele nu  poate fi in alb"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Duplicat dupa numele utilizator"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Parola noua"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Parola noua"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Vezi calendar"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Numele de afisat"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Indice de resurse"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Adauga o noua resursa"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Indice de resurse"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Adauga o noua resursa"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Date insuficiente"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Date insuficiente"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Date insuficiente"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Fotografie"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Schimbarile au fost salvate"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Schimba detalii"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Noua notita"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Adauga o noua persoana"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Zile excluse"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+"Data invalida. Va rugam sa specificati AAAA-LL-DD, una pe fiecare linie"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Adauga o noua resursa"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "persoane"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "aceeasi zi a saptaminii"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Set de caractere necunoscut"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "o noua fotografie"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "O mica fotografie ( in jur de 48x48 de pixels in format JPEG )"
+
+#~ msgid "Clear photo"
+#~ msgstr "Curata fotografie"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Click aici pentru a sterge"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifica parola"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Parolele nu sint identice"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Parolele nu sint identice"
+
+#~ msgid "View"
+#~ msgstr "Vezi"
+
+#~ msgid "Edit"
+#~ msgstr "Editeaza"
+
+#~ msgid "Create new objects"
+#~ msgstr "Crearea unui nou obiect"
+
+#~ msgid "Add events"
+#~ msgstr "Adauga un eveniment"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Modifica/Sterge un eveniment"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Utilizatori autentificati"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Utilizatori neautentificati"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Configuratie de acces"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Schimba preferinte"
+
+#~ msgid "New Person"
+#~ msgstr "Noua persoana"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importa persoane"
+
+#~ msgid "Add a Group"
+#~ msgstr "Adauga grup"
+
+#~ msgid "New Group"
+#~ msgstr "Nou grup"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Grup SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Adauga/Sterge membri"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importa grupuri"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Adauga resursa"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Editeaza resursa"
+
+#~ msgid "New Resource"
+#~ msgstr "Noua resursa"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Resursa SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "O resursa"
+
+#~ msgid "Actions"
+#~ msgstr "Actiuni"
+
+#~ msgid "View Calendar"
+#~ msgstr "Vezi calendar"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Calendar ( Zilnic )"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Calendar ( Zilnic, PDF )"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Calendar ( Saptaminal )"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Calendar ( Saptaminal, PDF )"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Calendar ( Lunar )"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Calendar ( Lunar, PDF )"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Calendar ( Anual )"
+
+#~ msgid "Atom View"
+#~ msgstr "Atom"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Liber/Ocupat"
+
+#~ msgid "New Event"
+#~ msgstr "Nou eveniment"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Deschide iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Editeaza eveniment"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Schimba preferintele site-ului"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ro/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4763 @@
+# Romanian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Romanian <ro at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2521 @@
+# Russian translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-12-25 19:01+0000\n"
+"Last-Translator: zzr <izzr.net at gmail.com>\n"
+"Language-Team: Russian <ru at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Люди"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 человек"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+#, fuzzy
+msgid "${number} persons"
+msgstr "${number} человек(-а)"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Имя пользователя или пароль не верны"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Текущий год"
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Март"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Январь"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Февраль"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Июнь"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Май"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Апрель"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Август"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Сентябрь"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Июль"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Следующий день"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Сегодня"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Предыдущий день"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Октябрь"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Декабрь"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Ноябрь"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Понедельник"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Вторник"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Среда"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Четверг"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Воскресенье"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Суббота"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Птяница"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Пн"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Вт"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Ср"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Чт"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Пт"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Сб"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Вс"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+#, fuzzy
+msgid "Title"
+msgstr "Название"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Весь день"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Дата"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Время"
+
+#: /src/schooltool/app/browser/cal.py:1668
+#, fuzzy
+msgid "Start time in 24h format"
+msgstr "Начало"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Продолжительность"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#, fuzzy
+msgid "Minutes"
+msgstr "Минут"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#, fuzzy
+msgid "Hours"
+msgstr "Часов"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#, fuzzy
+msgid "Days"
+msgstr "Дней"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#, fuzzy
+msgid "Location"
+msgstr "Место"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Описание"
+
+#: /src/schooltool/app/browser/cal.py:1694
+#, fuzzy
+msgid "Recurring"
+msgstr "Повторяемость"
+
+#: /src/schooltool/app/browser/cal.py:1698
+#, fuzzy
+msgid "Recurs every"
+msgstr "Повторяется каждые"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "День"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Неделя"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Месяц"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Год"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Повторять каждые"
+
+#: /src/schooltool/app/browser/cal.py:1712
+#, fuzzy
+msgid "Range"
+msgstr "Диапазон"
+
+#: /src/schooltool/app/browser/cal.py:1715
+#, fuzzy
+msgid "Count"
+msgstr "Число"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "До"
+
+#: /src/schooltool/app/browser/cal.py:1717
+#, fuzzy
+msgid "forever"
+msgstr "всегда"
+
+#: /src/schooltool/app/browser/cal.py:1720
+#, fuzzy
+msgid "Number of events"
+msgstr "Число событий"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Повторять до"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Дни недели"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "День недели"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "1st"
+msgstr "1"
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "4th"
+msgstr "4-ый"
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "3rd"
+msgstr "3-ий"
+
+#: /src/schooltool/app/browser/cal.py:1833
+#, fuzzy
+msgid "2nd"
+msgstr "2-ой"
+
+#: /src/schooltool/app/browser/cal.py:1834
+#, fuzzy
+msgid "5th"
+msgstr "5-ый"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Произошла ошибка."
+
+#: /src/schooltool/app/browser/cal.py:1914
+#, fuzzy
+msgid "Invalid time"
+msgstr "Недопустимое время"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Дата окончания меньше даты начала"
+
+#: /src/schooltool/app/browser/cal.py:1944
+#, fuzzy
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Недопустимая дата. Пожалуйста, укажите даты в формате ГГГГ-ММ-ДД, по одной "
+"на строку."
+
+#: /src/schooltool/app/browser/cal.py:1992
+#, fuzzy
+msgid "Add event"
+msgstr "Добавить событие"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Добавить"
+
+#: /src/schooltool/app/browser/cal.py:2062
+#, fuzzy
+msgid "Edit event"
+msgstr "Редактировать событие"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Обновить"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Обновлено ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "iCalendar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+#, fuzzy
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Следующая неделя"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Текущая неделя"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Пердыдущая неделя"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+#, fuzzy
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (${week} неделя)"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Следующий месяц"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Текущий месяц"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Предыдущий месяц"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "${week_no} неделя"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Следующий год"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Текущий год"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Предыдущий год"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+#, fuzzy
+msgid "No data provided"
+msgstr "Нет источника данных"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Не могу сконвертировать данные в Юникод (некорректная кодировка?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Файл CSV успешно импортирован"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Невозможно импортировать файл CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+#, fuzzy
+msgid "CSV text imported successfully."
+msgstr "Текст CSV успешно импортирован."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+#, fuzzy
+msgid "Failed to import CSV text"
+msgstr "Невозможно импортировать текст CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Не указана кодировка"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Неизвестная кодировка"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Ошибка в данных CSV, строка ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+#, fuzzy
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Ошибка при преобразование в Юникод в строке ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Ошибка в данных CSV, строка ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+#, fuzzy
+msgid "Saved changes."
+msgstr "Изменения сохранены."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "весь день"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Место: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+#, fuzzy
+msgid "Booked resources: %s"
+msgstr "Закрепленные ресурсы: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Календарь на день для %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Календарь на неделю для %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Календарь на месяц для %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "Поддержка PDF отключена. Она может быть включена администратором."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Название"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Группы"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Продолжительность"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Дата"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Список ресурсов"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Добавить ресурс"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+#, fuzzy
+msgid "Titles may not be empty"
+msgstr "Название не может быть пустым"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Текущий месяц"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Текущий месяц"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Группы"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Импортировать ресурсы"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Список людей"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Добавить человека"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Ищменить членство"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Имя пользователя"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Пароль"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+#, fuzzy
+msgid "This username is already used!"
+msgstr "Такое имя пользователя уже используется!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Предыдущий месяц"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Редактировать информацию о группе"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Сб"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Число событий"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "Полное имя"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "Полное имя"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Полное имя"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Фото"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Фото (в формате JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Новая заметка"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Текст CSV успешно импортирован."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Пароль успешно изменен"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Пароль успешно изменен"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Продолжительность"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Список групп"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Добавить группу"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Список ресурсов"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Добавить ресурс"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Пердыдущая неделя"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "Текст CSV успешно импортирован."
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Пароль успешно изменен"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Текущая неделя"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Пароль успешно изменен"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Сб"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Следующая неделя"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "имя пользователя не может быть пустым"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "полное имя не может быть пустым"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+#, fuzzy
+msgid "Duplicate username: ${username}"
+msgstr "Повторяющееся имя пользователя: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Новый пароль"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Новый пароль"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Просмотреть календарь"
+
+#: /src/schooltool/person/interfaces.py:70
+#, fuzzy
+msgid "Name that should be displayed"
+msgstr "Имя для отображения"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Список ресурсов"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Добавить ресурс"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Список ресурсов"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Добавить ресурс"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Фото"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Изменения сохранены."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Изменить детали"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Новая заметка"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Добавить человека"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+"Недопустимая дата. Пожалуйста, укажите даты в формате ГГГГ-ММ-ДД, по одной "
+"на строку."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Добавить ресурс"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} человек(-а)"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Неизвестная кодировка"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Новое фото"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Маленькая картинка (примерно 48x48 пикселей в формате in JPEG)"
+
+#, fuzzy
+#~ msgid "Clear photo"
+#~ msgstr "Удалить фото"
+
+#, fuzzy
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Отметьте, чтобы удалить фото"
+
+#~ msgid "Verify password"
+#~ msgstr "Повтор пароля"
+
+#, fuzzy
+#~ msgid "Passwords do not match."
+#~ msgstr "Пароль не совпадает с повтором"
+
+#, fuzzy
+#~ msgid "Passwords do not match!"
+#~ msgstr "Пароль не совпадает!"
+
+#, fuzzy
+#~ msgid "View"
+#~ msgstr "Просмотр"
+
+#~ msgid "Edit"
+#~ msgstr "Редактирование"
+
+#, fuzzy
+#~ msgid "Create new objects"
+#~ msgstr "Создать новые объекты"
+
+#~ msgid "Add events"
+#~ msgstr "Добавить события"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Модифицировать/удалить события"
+
+#, fuzzy
+#~ msgid "Control access"
+#~ msgstr "Управление доступом"
+
+#, fuzzy
+#~ msgid "Manage membership"
+#~ msgstr "Управление членством"
+
+#, fuzzy
+#~ msgid "Authenticated users"
+#~ msgstr "Авторизированные пользователи"
+
+#, fuzzy
+#~ msgid "Unauthenticated users"
+#~ msgstr "Неавторизированные пользователи"
+
+#, fuzzy
+#~ msgid "Set Up Access"
+#~ msgstr "Настроить доступ"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Изменить настройки"
+
+#~ msgid "New Person"
+#~ msgstr "Новый человек"
+
+#, fuzzy
+#~ msgid "Import Persons"
+#~ msgstr "Импортировать людей"
+
+#~ msgid "Add a Group"
+#~ msgstr "Добавить группу"
+
+#~ msgid "New Group"
+#~ msgstr "Новая группа"
+
+#~ msgid "A Group"
+#~ msgstr "Группа"
+
+#, fuzzy
+#~ msgid "SchoolBell Group"
+#~ msgstr "Группа SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Добавить/удалить членов"
+
+#~ msgid "Import Groups"
+#~ msgstr "Импортировать группы"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Добавить ресурс"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Редактировать информацию о ресурсе"
+
+#~ msgid "New Resource"
+#~ msgstr "Новый ресурс"
+
+#, fuzzy
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Ресурс SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Ресурс"
+
+#, fuzzy
+#~ msgid "Actions"
+#~ msgstr "Действия"
+
+#~ msgid "View Calendar"
+#~ msgstr "Просмотреть календарь"
+
+#, fuzzy
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Календарь (ежедневный)"
+
+#, fuzzy
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Календарь (ежедневный, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Календарь (еженедельный)"
+
+#, fuzzy
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#, fuzzy
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Календарь (еженедельный, PDF)"
+
+#, fuzzy
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Календарь (ежемесячный)"
+
+#, fuzzy
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Календарь (ежемесячный, PDF)"
+
+#, fuzzy
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Календарь (ежегодный)"
+
+#, fuzzy
+#~ msgid "Atom View"
+#~ msgstr "Порказать как поток Atom"
+
+#, fuzzy
+#~ msgid "Free/Busy"
+#~ msgstr "Свободен/занят"
+
+#~ msgid "New Event"
+#~ msgstr "Новое событие"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Открыть в iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Редактировать событие"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Изменить настройки сайта"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Разрешает просмотр имен, названий, фото, списков объектов и прочей "
+#~ "информации."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr ""
+#~ "Разрешает редактирование имен, названий, фото, списков объектов и прочей "
+#~ "информации."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Позволяет пользователю создавать новых людей, группы, ресурсы."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Разрешает просмотр календарей людей, групп и ресрусов."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Разрешает добоваление новых событий в календари."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Разрешает удаление событий из календарей."
+
+#, fuzzy
+#~ msgid "Access control for ${title}"
+#~ msgstr "Управление доступом для ${title}"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ru/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4899 @@
+# Russian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-15 13:29+0000\n"
+"Last-Translator: Duyunoff V <duyunoff at vovan.ru>\n"
+"Language-Team: Russian <ru at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Март"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Январь"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Фераль"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Июнь"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Май"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Апрель"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Август"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Сентябрь"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Июль"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Следующий день"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Сегодня"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Предыдущий день"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Октябрь"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Декабрь"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Ноябрь"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Понедельник"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Вторник"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Среда"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Четверг"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Воскресенье"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Суббота"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Пятница"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Пн"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Вт"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Ср"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Чт"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Пт"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Сб"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Вс"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Дата"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Время"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Длительность"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Единица длительности"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Минуты"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Часы"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Дни"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "День"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Неделя"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Месяц"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Год"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Повторять каждые"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Пока"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Повторять пока"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Дни недели"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "День недели"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Исключая даты"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "в те же дни недели"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "прошлый день недели"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Произошла ошибка."
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Неверное время"
+
+#: /src/schooltool/app/browser/cal.py:1935
+#, fuzzy
+msgid "End date is earlier than start date"
+msgstr "Дата завершения раньше даты начала"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Добавить"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Обновить"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Следующая неделя"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Текущая неделя"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Предыдущая неделя"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Следующий месяц"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Текущий месяц"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Прошедший месяц"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Следующий год"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Текущий год"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Предыдущий год"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Действия"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "СкулТул"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Календарь для %s"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Календарь для %s"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Мой календарь"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Действия"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Мой календарь"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Строка 2 не пуста"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+"Недосформированная строка ${line_no} (она должна содержать id дня и id "
+"периода)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Неполное описание секции по строке ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Первая строка CSV-файла должна содержать id семестра (четверти) и id схемы "
+"расписания."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Семестр ${term} не существует."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Схема расписания ${schema} не существует."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Ошибка в CSV-данных расписания, строка ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Идентификаторы Дня не определены в выбранной схеме: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Периоды не определены в выбранных днях: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Люди не найдены: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Курсы не найдены: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Секции не найдены: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Неправильные записи: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Сохранить изменения."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "периодически"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Неделя %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Календарь для %s"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "СкулТул"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "СкулТул"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Перейти к..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Завтрашние события"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Версия для печати"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Посмотреть календарь на день"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Ежедневно"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Посмотреть календарь на неделю"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Еженедельно"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Посмотреть календарь на месяц"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Посмотреть календарь на год"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Ежегодно"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Календарь для ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Личный календарь"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Календарь расписания"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Мой календарь"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Далее..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Мой календарь"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Посмотреть календарь на день"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Очистить"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+#, fuzzy
+msgid "Details"
+msgstr "Ежедневно"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Сб"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "редактировать имя"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Изменить местоположение или имя данной секции."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Изменить/удалить события"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Обновить"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Сегодня"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Неделя"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Месяц"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Год"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Повторять пока"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Время"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Личный календарь"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Повторять каждые"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Время"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Сб"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "изменить местоположение"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Курсы"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Добро пожаловать в SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Выйти"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "периодически"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Другое (укажите)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Другая кодировка: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Ввести CSV-данные"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV-данные"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Импортировать Расписание"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Вы можете создать CSV-файл в таблице и экспортировать его в формат CSV "
+"(Значения, Разделённые Запятыми). Ниже описывается структура таблицы."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"Первая строка файла должна содержать имя <strong>семестра</strong> и "
+"<strong>схемы расписания</strong>, которая будет использоваться для нового "
+"расписания. Вторая строка остаётся пустой. После этого могут идти несколько "
+"описывающих разделов, разделяющихся пустой строкой."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Передать расписание СкулТул, как CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Например:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+"Обратите внимание, что в файле используются только id объектов, но не "
+"заголовки. Если строка оканчивается пустыми секциями (напр., <em>\"philosophy"
+"\",\"lorch\",\"\",\"\"</em>), то эти секции будут откинуты. Вы можете "
+"разделить описывающие разделы более, чем одной строкой. В списке учащихся "
+"будет принята только первая колонка, содержащая id людей, а остальные "
+"колонки будут игнорированы. Вы можете импортировать одни и те же данные "
+"несколько раз без побочных эффектов."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Передать CSV-файл"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV-файл"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Календарь для %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+#, fuzzy
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Название школы или организации running this server. Оно будет отображаться в "
+"общем календаре, внизу всех страниц, и в заголовке страницы."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr "Показать расписания"
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "Управление %s"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Файл не является базой данных SchoolTool 0.11, отмена.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Файл не является базой данных SchoolTool 0.11, отмена. Please run the "
+"standalone database upgrade script.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Добро пожаловать на сервер SchoolTool"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Минуты"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "периодически"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Воскресенье"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Предыдущий год"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+#, fuzzy
+msgid "Next"
+msgstr "Следующая неделя"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "Действия"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+#, fuzzy
+msgid "Import Courses"
+msgstr "Курсы"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Курсы"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+#, fuzzy
+msgid "New Course"
+msgstr "Курсы"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Инструкторы"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Студенты"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Группы"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool courses as CSV"
+msgstr "Передать расписание СкулТул, как CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "Действия"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+#, fuzzy
+msgid "students"
+msgstr "Студенты"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "редактировать имя"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Изменить местоположение или имя данной секции."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Изменить местоположение или имя данной секции."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+#, fuzzy
+msgid "Change the instructors for this section."
+msgstr "Изменить местоположение или имя данной секции."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+#, fuzzy
+msgid "edit instructors"
+msgstr "Инструкторы"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+#, fuzzy
+msgid "Change the students in this section individually"
+msgstr "Изменить местоположение или имя данной секции."
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+#, fuzzy
+msgid "Change the students in this section by groups"
+msgstr "Изменить местоположение или имя данной секции."
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Действия"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Текущий размер"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Март"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Имя пользователя"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Пароль"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Это имя пользователя уже используется."
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Ежедневно"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Заметки"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Фотография"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Фотография (в формате JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Курсы"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "изменить местоположение"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Студенты"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+#, fuzzy
+msgid "Import Groups"
+msgstr "Группы"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Группы"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Группы"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Передать расписание СкулТул, как CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "Ноябрь"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "редактировать имя"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "Change the people who are members of this group."
+msgstr "Изменить местоположение или имя данной секции."
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Личный календарь"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "Заметки"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Текущая неделя"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Студенты"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Новая фотография"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Заметки"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Дата"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Передать расписание СкулТул, как CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "Минуты"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "Передать расписание СкулТул, как CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Мой календарь"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Исключая даты"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+#, fuzzy
+msgid "Log In"
+msgstr "Выйти"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Пользователь:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Выйти"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+#, fuzzy
+msgid "Save changes"
+msgstr "Сохранить изменения."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "СкулТул"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Сегодня"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Показать расписания"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+#, fuzzy
+msgid "View Timetables"
+msgstr "Показать расписания"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Предыдущий день"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "Добавить"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Импортировать Расписание"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Курсы"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Показать расписания"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Дата"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Понедельник"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Календарь расписания"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Показать расписания"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Clear photo"
+#~ msgstr "Удалить фотографию"
+
+#~ msgid "New password"
+#~ msgstr "Новый пароль"
+
+#~ msgid "Verify password"
+#~ msgstr "Проверка пароля"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Пароль не верный."
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Пароль не верный!"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Авторизованные пользователи"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Неавторизованные пользователи"

Added: schooltool/branches/upstream/current/src/schooltool/locales/sk/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/sk/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/sk/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5013 @@
+# Slovak translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-06-15 21:07+0000\n"
+"Last-Translator: Dalibor Kollar <dkollar at pobox.sk>\n"
+"Language-Team: Slovak <sk at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Prezývka"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Krátka prezývka tejto osoby."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Primárny e-mail"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Sekundárny e-mail"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Primárny telefón"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Odporúčané telefónne číslo."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Sekundárny telefón"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Číslo sekundárneho telefónu."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Web stránka"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Web stránka alebo web blog."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Mailová adresa"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Osoby"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 osoba"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} osôb"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Užívateľské meno alebo heslo je nesprávne"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Marec"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Január"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Február"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Jún"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Máj"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Apríl"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "August"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Júl"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Nasledujúci deň"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Dnes"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Predchádzajúci deň"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Október"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "December"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Pondelok"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Utorok"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Streda"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Štvrtok"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Nedeľa"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Sobota"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Piatok"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Pon"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Ut"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Str"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Štv"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Pia"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Sob"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Ned"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titulok"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Celý deň"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Dátum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Čas"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Počiatočný čas vo formáte 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Trvanie"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Druh trvania"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minúty"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Hodiny"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dni"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Umiestnenie"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Popis"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Opakujúci sa"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Opakuje sa každých"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Deň"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Týždeň"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Mesiac"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Rok"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Opakuj každých"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Rozpetie"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Počet"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Do"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "navždy"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Počet udalostí"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Opakuj do"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Voľné dni"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Voľný deň"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Mesačne"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Výnimky z dátumov"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "rovnako víkendy"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "Prvý"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "Štvrtý"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "Tretí"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "Druhý"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "Piaty"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "Posledný voľný deň"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Posledný ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Vyskytla sa chyba"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Neplatný čas"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Koncový čas je skorší než počiatočný"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Neplatný dátum. Prosím zadajte RRRR-MM-DD, jeden na riadok."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Pridaj udalosť"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Pridaj"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Zmeň udalosť"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Aktualizácia"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Aktualizované ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalendár"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Nasledujúci týždeň"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Aktuálny týždeň"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Predchádzajúci týždeň"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Nasledujúci mesiac"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Tento mesiac"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Predchádzajúci mesiac"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Týždeň ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Nasledujúci rok"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Tento rok"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Predchádzajúci rok"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Umiesnenie."
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalendár"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalendár"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalendár"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalendár"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalendár"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Pridaj udalosť"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Zmeň udalosť"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Umiestnenie"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigácia"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Umiesnenie."
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalendár"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Žiadne dáta k dispozícii"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Dáta nebolo možné konvertovať do Unicode (nesprávna znaková sada?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Súbor CSV bol úspešne importovaný"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Zlyhal import CSV súboru"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Import CSV textu prebehol úspešne"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Zlyhal import CSV textu"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Nie je špecifikované kódovanie"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Neznéme kódovanie"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Chyba v CSV dátach, riadok ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konverzia so Unicode zlyhala v riadku ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Stĺpec 2 nie je prázdny"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr "Nesprávny formát riadku ${line_no} (mal by obsahovať id dňa a periódy)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Nekompletný popis sekcie v riadku ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Prvý stĺpec CSV súboru musí obsahovať term id a id schémy časovej tabuľky."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Obdobie ${term} neexistuje."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Schéma časovej tabuľky ${schema}neexistuje."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Chyba v dátach CSV tabuľky, riadok ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Deň nie je definovaný vo vyznacenej schéme: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Periódy nie sú definované vo vyzačené dni: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Osoby nenájdené: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Nenájdené kurzy: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Nenájdené sekcie: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Neplatné záznamy: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Uložené zmeny"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "každý deň"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Umiestnenie: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Vyhradené zdroje: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "opakujúci sa"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "prekrytý od %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Denný kalendár pre %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Týždenný kalendár pre %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Týždeň %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Mesačný kalendár pre %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "Podpora PDF je vypnutá. Zapnutá môže byť vašim správcom."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Kalendár pre %s"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Popis"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+#, fuzzy
+msgid "atom_enabled"
+msgstr "národný"
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "Denný kalendár pre %s"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#, fuzzy
+msgid "Daily"
+msgstr "Deň"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+#, fuzzy
+msgid "View weekly calendar"
+msgstr "Týždenný kalendár pre %s"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+#, fuzzy
+msgid "Weekly"
+msgstr "Týždeň"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "Mesačný kalendár pre %s"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+#, fuzzy
+msgid "View yearly calendar"
+msgstr "Týždenný kalendár pre %s"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+#, fuzzy
+msgid "Yearly"
+msgstr "Rok"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Cal"
+msgstr "Zrušiť"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Personal calendar"
+msgstr "Front Page Calendar"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "Timetable calendar"
+msgstr "Schéma časovej tabuľky ${schema}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Môj kalendár"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendáre"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Viac..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalendár"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Týždenný kalendár pre %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Kalendár"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Pridaj udalosť"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Stav"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Zmeň udalosť"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Vyhradené zdroje: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "uprav skupiny"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Zmeň udalosť"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Zdroje"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Aktualizácia"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Dnes"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Týždeň"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Mesiac"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Rok"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Opakuj do"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Čas"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Opakuj každých"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Vyhradené zdroje: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Info o osobe: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Titulok"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Stav"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Index zdrojov"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "Umiestnenie: %s"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "Hodiny"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+#, fuzzy
+msgid "Levels"
+msgstr "Úroveň"
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "opakujúci sa"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Celý deň"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Školské časové tabuľky"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Školské časové tabuľky"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+#, fuzzy
+msgid "Example:"
+msgstr "Skúška"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalendár pre %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Vyhradené zdroje: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Meno školy alebo organizácie prevádzkujúcej↵\n"
+"            tento server. Toto bude zobrazené vo verejnom kalendári,↵\n"
+"            na spodku každej strany a v titulku strán."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Front Page Calendar"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Zobraz celostránkový kalendár ako prednú stranu↵\n"
+"            stránky."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr "Ukáž časové tabuľky"
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+"\n"
+"            ↵\n"
+"            Voľba určujúca, či bude časová tabuľka vlastníka tohto "
+"kalendára↵\n"
+"            zobrazená medzi pohľadmi kalendára.↵\n"
+"            "
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Požadovaný vstup chýba"
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Form input is not a file object"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Neplatné integer data"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Neplatné textové dáta"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Neplatné textual data"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Neplatné dáta kódovania"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Neplatné floating point dáta"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Neplatné datetime dáta"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Prechod do backgroundu, daemon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Pre pomoc spusti %s -h ."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: daemon mód nie je podporovaný vašim operačným systémom."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Načítavam konfiguráciu z %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Manager"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Startup time: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Nebolo možné inicializovať databázu:↵\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Možno to používa iná inštancia %s?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Pozor:nebolo možné nájsť knižnicu reportlab.↵\n"
+"Podpora PDF zrušená."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Upozornenie: adresár fontov %s' neexistuje.↵\n"
+"Podpora PDF zrušená."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Upozornenie: font '%s' neexistuje.↵\n"
+"Podpora PDF zrušená."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"↵\n"
+"V konfiguračnom súbore nie je definovaná ukladacia lokácia.↵\n"
+"↵\n"
+"Ak používate aktuálny konfiguračný súbor upravte ho prosím a↵\n"
+"odkomentujte jednu z ZODB ukladacích sekcií.↵\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Toto nie je databázový súbor SchoolTool 0.11, prerušuje sa.↵\n"
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"↵\n"
+"Toto nie je SchoolTool 0.10 databáza, prerušuje sa.↵\n"
+"↵\n"
+"Prosím spustite samostatný skript pre upgrade databázy.↵\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr "Vysvetlenie bolo prijaté."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr "Doteraz nevysvetlené."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr "Meškal na ${section} (${mins} minutes)."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr "Chýbal na ${section}."
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+"Čas príchodu ktorý ste vložili je neplatný. Použite prosím formát HH:MM"
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr "Časy príchodov aplikované len na oneskorených žiakov."
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr "Pridané ospravedlnenie pre $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr "Vyriešené $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr "Zamietnuté ospravedlnenie pre $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr "$absence zmenená na oneskorený príchod."
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+"Nie je možné pridať nové ospravedlnenie pre $absence: staré ospravedlnenie "
+"ešte nebolo prijaté/zamietnuté."
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr "Nie je výnimočné ospravedlnenie pre prijatie $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr "Nie je výnimočné ospravedlnenie pre zamietnutie $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+"$absence nie je triednou absenciou, len triedne absencie môžu byť zmenené na "
+"oneskorený príchod."
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+"Nebolo možné konvertovať $absence absenciu na oneskorený príchod do triedy."
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr "školská trieda"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr "$date $time: chýbal na $section"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr "$date $time: meškal na $section, prišiel $late_arrival"
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+#, fuzzy
+msgid "Attendance"
+msgstr "Kódy dochádzkových stavov"
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Kódy dochádzkových stavov"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+#, fuzzy
+msgid "Students with unresolved absences"
+msgstr "Vyriešené $absence"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Osoby"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Retroactive attendance timeout"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minúty"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "Prezentácia"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+#, fuzzy
+msgid "Absent"
+msgstr "Priradenie"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Nedeľa"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "Vložený dátum nespadá do tohto obdobia."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Vyriešené $absence"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Kódy dochádzkových stavov"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+#, fuzzy
+msgid "Unresolved explained absences"
+msgstr "Vyriešené $absence"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+#, fuzzy
+msgid "Unresolved unexplained absences"
+msgstr "Vyriešené $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr "$title"
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr "Kódy dochádzkových stavov"
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr "Dictionary of abbreviated attendance status codes"
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr "Retroactive attendance timeout"
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+"\n"
+"            ↵\n"
+"            The period of time in minutes that must pass after the↵\n"
+"            section meeting is completed before the attendance form↵\n"
+"            changes from realtime to retroactive."
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr "Homeroom tardy grace period"
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+"\n"
+"            ↵\n"
+"            The period of time in minutes you can be late for section "
+"after↵\n"
+"            beeing late for homeroom period without giving separate↵\n"
+"            explanation."
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Predchádzajúci rok"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+#, fuzzy
+msgid "Next"
+msgstr "Nasledujúci týždeň"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr "<neznámy>"
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "národný"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr "Názov pochvaly"
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr "Detailný popis pochvaly"
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr "Rozsah"
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr "Rozsah pochvaly"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr "celoškolský/á"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr "skupina"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr "komunita"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr "globálny"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr "národný"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr "stav"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr "Dátum vydania pochvaly."
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr "Prideľovateľ"
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr "Prideľovateľ pochvaly."
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Zmeň udalosť"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "Pridaj sekciu"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Pridaj kurz"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+#, fuzzy
+msgid "New Course"
+msgstr "Nová kategória"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Index kurzu"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Pridaj kurz"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Poskytnutý nedostatok dát."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Titulok nemôže byť prázdny"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Taký kurz neexistuje."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Potreba zadať ID kurzu."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Pridaj Sekciu ku ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Inštruktori"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Súčasný inštruktori"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Prítomný inštruktori"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Žiaci"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr "Súčasní študenti"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr "Dostupní žiaci"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Skupiny"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Súčasné skupiny"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Dostupné skupiny"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Zdroje"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr "Súčasné zdroje"
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr "Dostupné zdroje"
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Zoznam sekcií"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Pridaj sekciu"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "Zoznam sekcií"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr "fotka"
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+#, fuzzy
+msgid "students"
+msgstr "Žiaci"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "uprav meno"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Popis sekcie."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "ID kód pre sekciu."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Vyhradené zdroje: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+#, fuzzy
+msgid "edit instructors"
+msgstr "Súčasný inštruktori"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "uprav skupiny"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Zoznam sekcií"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+#, fuzzy
+msgid "Current Size"
+msgstr "Aktuálny týždeň"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Nadpis kurzu."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Popis kurzu."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Označenie"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"Identifikátor sekcie pozostávajúci z mien↵\n"
+"            učiteľov, kurzov a časov stretnutí."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Kód"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "ID kód pre sekciu."
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Popis sekcie."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr "Nadpis kategórie."
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr "Váha"
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Osoby"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Marec"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "celoškolský/á"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Zrušiť"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Užívateľské meno"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Heslo"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Toto užívateľské meno sa už používa!"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Použiť"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Deň"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr "Meno"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Poznámky"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr "Predpona"
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr "Oslovenie, napr. pán alebo pani"
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr "Meno"
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr "Stredné meno"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr "Priezvisko"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr "Prípona"
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr "Preferované meno"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr "Meno uprednostňované študentom"
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Celé meno"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Fotka"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Fotka (vo formáte JPEG)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr "Aktivity"
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+#, fuzzy
+msgid "Manage Activity Categories"
+msgstr "Kategória aktivity"
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr "Kategórie"
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr "Nová kategória"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr "Aktuálna kategória"
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr "Kategórie úspešne zmazané."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr "Kategória úspešne pridaná."
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr "Aktuálna kategória úspešne zmenená."
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+#, fuzzy
+msgid "New Activity"
+msgstr "Aktivity"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Pridaj sekciu"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Zmeň udalosť"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+#, fuzzy
+msgid "Activity Categories"
+msgstr "Kategória aktivity"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr "Percentuálny priemer"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr "Stredný"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr "Štandardná odchýlka"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr "Variácia"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr "Nie je k dispozícii"
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr "Známka $value pre aktivitu $name nie je platná."
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr "Známka $value pre $name nie je platná."
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr "Priemer"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+#, fuzzy
+msgid "Grade"
+msgstr "Graduated"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Žiaci"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+#, fuzzy
+msgid "Activity Name"
+msgstr "Aktivity"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Obdobie ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+#, fuzzy
+msgid "Activity"
+msgstr "Aktivity"
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr "Priradenie"
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr "Esej"
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr "Skúška"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr "Domáca úloha"
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr "Denník"
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr "Lab"
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr "Prezentácia"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr "Projekt"
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr "Detailný popis aktivity."
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr "Kategória"
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr "Kategória aktivity"
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr "Systém bodovania"
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr "Systém bodovania aktivít."
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr "Dátum vytvorenia aktivity."
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr "Aktivity v tejto klasifikačnej knihe."
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr "Žiaci v tejto klasifikačnej knihe."
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+#, fuzzy
+msgid "Import Groups"
+msgstr "Súčasné skupiny"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Pridaj novú skupinu"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Skupiny"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Skupiny"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "November"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "uprav meno"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Index skupiny"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Pridaj novú skupinu"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Titulok skupiny."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Popis skupiny."
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Pridať úroveň"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Zmeň udalosť"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+#, fuzzy
+msgid "Academic Record"
+msgstr "Akademická minulosť"
+
+#: /src/schooltool/level/browser/level.pt:15
+#, fuzzy
+msgid "This is an initial level."
+msgstr "Je počiatočná Úroveň"
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "Nie"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr "Index úrovne"
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr "Pridať úroveň"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr "Predchádzajúca úroveň"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+"Predchádzajúca úroveň v škole. Ak tu nie je žiadna, tak žiadna ani nebola."
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Aktuálny týždeň"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Žiaci"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+#, fuzzy
+msgid "Initialize Students"
+msgstr "Dostupní žiaci"
+
+#: /src/schooltool/level/browser/promotion.pt:60
+#, fuzzy
+msgid "Inital Level"
+msgstr "Je počiatočná Úroveň"
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+#, fuzzy
+msgid "Level Outcome"
+msgstr "Výstup"
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr "Neboli označený žiadny žiaci."
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr "Žiaci úspešne zapísaný."
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr "Procesy žiakov úspešne obnovené."
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr "Pracovná položka úspešne ukončená."
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr "Súčasná úroveň: $level"
+
+#: /src/schooltool/level/browser/record.pt:107
+#, fuzzy
+msgid "History"
+msgstr "Akademická minulosť"
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr "Stav bol úspešne obnovený."
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr "Proces úrovne bol úspešne inicializovaný."
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr "Proces úrovne bol úspešne odstránený."
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr "Časová nálepka"
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr "Čas a dátum vytvorenia záznamu."
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Užívateľ"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr "Hlavné id užívateľa ktorý vytvoril záznam."
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr "Titulok záznamu."
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr "Detailný popis záznamu."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr "Akademická minulosť"
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr "Akademická minulosť žiaka."
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr "Stav"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr "Súčasné postavenie žiaka v škole."
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr "Graduated"
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr "Stiahnutý"
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr "Zapísaný"
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr "Level Process"
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr "Postup prác na úrovni ktorú žiak momentálne dokončuje."
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr "Nadpis úrovne."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr "Je počiatočná Úroveň"
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr "Is this level an initial level for the school."
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr "Ďalšia úroveň"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+"Ďalšia úroveň na škole. Ak tu žiadna nie je, tak nasledujúca úroveň "
+"neexistuje."
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr "Výstup"
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr "Výstup úrovne."
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr "chyba"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr "odvolať"
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr "prejsť"
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr "Úroveň"
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr "Počiatočná úroveň žiaka v škole."
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Nové obdobie"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Titulok poznámky"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Telo"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Telo poznámky."
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Súkromie"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Poznámky"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Súkromie"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Pridaj udalosť"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Dátum"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Užívateľské meno nesmie byť prázdne"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Plné meno nesmie byť prázdne"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Duplikuj užívateľské meno: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+#, fuzzy
+msgid "Import Persons"
+msgstr "Osoby"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Časové pásmo"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Časové pásmo pre zobrazenie tvojho kalendára"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Formát času"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Formát dátumu"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/RR"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "RRRR-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Deň Mesiac, Rok"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Týždeň začína:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Ako prvý deň týždňa zobrazovať pondelok alebo nedeľu"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Ukáž periódy"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Ukáž názvy periód v dennom prehľade"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Meno ktoré má byť zobrazené"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Pridaj požiadavku"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Pridaj požiadavku"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Pridaj požiadavku"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "Minúty"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr "Index požiadavky"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr "Pridaj požiadavku"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr "Existujúci bodový systém"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr "Vlastný bodový systém"
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "Súčasné zdroje"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Pridaj nový zdroj"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Zdroje"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Zdroje"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Index zdrojov"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Pridaj nový zdroj"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Titulok zdroja."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Popis zdroja."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Umiesnenie."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indikuj tento zdroj ako miesto, napríklad učebňu."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+#, fuzzy
+msgid "Calendar_relationships"
+msgstr "Nebolo možné analyzovať zoznam vzťahov."
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Kalendár"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr "Nebolo možné analyzovať zoznam vzťahov."
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr "Nedostatočné dáta v informáciach osoby"
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr "Nedostatočné dáta v informáciach skupiny"
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr "Nedostatočné dáta v informáciach úrovne"
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"↵\n"
+"Toto nie je SchoolBell 1.0 databáza, prerušuje sa.↵\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"↵\n"
+"Toto nie je databázový súbor SchoolBell 1.0, prerušuje sa.↵\n"
+"↵\n"
+"Prosím spustite samostatný skript pre upgrade databázy.↵\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "hore"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Výnimky z dátumov"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+#, fuzzy
+msgid "User:"
+msgstr "Užívateľ"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+#, fuzzy
+msgid "New Term"
+msgstr "Nové obdobie"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "Vložený náhradný čas je neplatný."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr "Škola prerušená kvôli krízovému stavu. Náhradný deň $replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Náhradný deň za krízový deň $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr "Vložený dátum je neplatný. Prosím použite formát RRRR-MM-DD."
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "Vložený dátum nespadá do tohto obdobia."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "Vložený dátum nie je školský deň."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+#, fuzzy
+msgid "Please enter the replacement date below."
+msgstr "Prosím zadajte aspoň jeden časový slot."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+#, fuzzy
+msgid "Choose a replacement for the emergency day."
+msgstr "Náhradný deň za krízový deň $emergency."
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+#, fuzzy
+msgid "Please enter the emergency date below."
+msgstr "Prosím zadajte aspoň jeden časový slot."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Zmeniť obdobie: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Nové obdobie"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Obdobia"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Pridaj nové obdobie"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Počiatočný dátum"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Koncový dátum"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${month} ${year}"
+msgstr "${month}, ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+#, fuzzy
+msgid "Week ${week_number}"
+msgstr "Týždeň ${week_no}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+#, fuzzy
+msgid "Add term"
+msgstr "Pridaj nové obdobie"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+#, fuzzy
+msgid "Save changes"
+msgstr "Uložené zmeny"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+#, fuzzy
+msgid "Refresh"
+msgstr "Zdroje"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "celoškolský/á"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Dnes"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "Časocá tabuľka pre ${object}"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Neplatný dátum. Prosím použite formát RRRR-MM-DD."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Dátum nespadá do žiadneho obdobia."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Niektoré hodnoty sú neplatné. Sú zvýraznené červeno."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Ukáž časové tabuľky"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+#, fuzzy
+msgid "View Timetables"
+msgstr "Ukáž časové tabuľky"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Prosím použite formát HH:MM pre začiatok a koniec periódy."
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Musíte špecifikovať aspoň jednu periódu."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Školské časové tabuľky"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Pridaj schému"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Prosím zadaj hodnotu"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Deň ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Perióda 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Obdobie ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Schéma časovej tabuľky ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+#, fuzzy
+msgid "Create timetable schema"
+msgstr "Schéma časovej tabuľky ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Predchádzajúci deň"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "Celý deň"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Ukáž periódy"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Titulok"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "Obdobia"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Kód"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+#, fuzzy
+msgid "Save"
+msgstr "Rovnako"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#, fuzzy
+msgid "Scheduling for ${section}"
+msgstr "Chýbal na ${section}."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Ukáž časové tabuľky"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "Obdobie ${number}"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Dátum"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "Perióda 1"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+#, fuzzy
+msgid "New start"
+msgstr "Nové obdobie"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Nové obdobie"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "Pondelok"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+#, fuzzy
+msgid "Timetables for ${object}"
+msgstr "Schéma časovej tabuľky ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+#, fuzzy
+msgid "Homeroom"
+msgstr "školská trieda"
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Ukáž časové tabuľky"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+"Je vo vašej školskej časovej tabuľke použitý cyklus dní v mesiaci, alebo "
+"rotačný cyklus?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Dni týždňa"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Rotačný cyklus"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Zadaj mená dní v cykle, jedno na riadok."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Prosím zadajte aspoň jedno meno dňa."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Prosím uistite sa, že mená dní sú rozdielne."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Začínajú a končia sa vyučovacie hodiny vo vašej školskej časovej tabuľke v "
+"rovnaký čas každý deň?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "V rovnaký čas každý deň"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Rôzne časy"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+"Závisia začiatky a konce na dni v týždni (Pondelok - Piatok), alebo na "
+"pozícii dňa v cykle?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr "Deň v týždni"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr "Deň v cykle"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Zadaj začiatok a koniec pre každý slot, jeden slot (HH:MM - HH:MM) na riadok."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Neplatný časový slot: $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Prosím zadajte aspoň jeden časový slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Zadajte začiatok a koniec pre každý slot každého dňa, jeden slot (HH:MM - HH:"
+"MM) na riadok."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Prosím zadajte aspoň jeden časový slot pre $day."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr "Majú periódy názvy, alebo sú jednoducho určované podľa času?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Have names"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Časovo určený"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Zadaj mená periód, jednu na riadok"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Prosím zadaj aspoň $number periód(u)"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Prosím uisti sa že mená periód sa neopakujú."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "Je postupnosť periód každý deň rovnaká, alebo sa mení?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Rovnako"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Rôzne"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Prosím usporiadaj periódy:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Prosím poskytni všetky periódy."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Nasledujúce peródy boli vybraté viac než raz: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Prosím usporiadaj periódy pre každý deň:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period dňa $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr "Áno"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr "Nie"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr "Prosím zadaj triedne periódy pre každý deň:"
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Neznáme id dňa: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Neznáme id periódy: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Užívateľské meno:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Uprav meno, obrázok alebo heslo tejto osoby"

Added: schooltool/branches/upstream/current/src/schooltool/locales/sq/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/sq/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/sq/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4762 @@
+# Albanian translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Albanian <sq at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/sr/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/sr/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/sr/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4879 @@
+# Serbian translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-08-16 06:53+0000\n"
+"Last-Translator: djura <djura at apolo.co.yu>\n"
+"Language-Team: Serbian <sr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Osobe"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 osoba"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} osoba"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Pogrešno korisničko ime ili lozinka"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "mart"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "januar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "februar"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "jun"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "maj"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "april"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "avgust"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "septembar"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "jul"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Naredni dan"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Danas"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Prethodni dan"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "oktobar"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "decembar"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "novembar"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "ponedeljak"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "utorak"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "sreda"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "četvrtak"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "nedelja"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "subota"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "petak"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "pon"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "uto"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "sre"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "čet"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "pet"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "sub"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "ned"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Naslov"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Ceo dan"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Vreme"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Vreme početka u 24h formatu"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Trajanje"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Vrsta trajanja"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuta"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Sati"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dana"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Lokacija"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Opis"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Ponavljanje"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Ponavlja se svakog"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dan"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Sedmica"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Mesec"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Godina"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Ponovi na"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Opseg"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Broj"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Do"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "zauvek"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Broj događaja"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Ponavljaj do"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Radnim danima"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Radni dan"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Mesečno"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Izuzev datuma"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "isti radni dan"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3."
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2."
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5."
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "poslednji radni dan"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Poslednji ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Došlo je do greške"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Pogrešno vreme"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Datum završetka je pre datuma početka"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Pogrešan datum. Molimo navedite GGGG-MM-DD, po jedan u liniji."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Dodaj događaj"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Dodaj"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Izmeni događaj"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Sačuvaj"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Izmenjeno ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalendar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Sledeća sedmica"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Tekuća sedmica"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Prethodna sedmica"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Sledeći mesec"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Tekući mesec"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Prethodni mesec"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Week ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Sledeća godina"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Tekuća godina"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Prethodna godina"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Lokacija"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalendar"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalendar"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalendar"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalendar"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalendar"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Dodaj događaj"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Izmeni događaj"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Lokacija"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigacija"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Lokacija"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalendar"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Nisu dobijeni podaci"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV datoteka uspešno učitana."
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Neuspešno učitavanje CSV datoteke"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV tekst uspešnp učitan."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Neuspešno učitavanje CSV teksta"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Nepoznat karakter set"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Greška u CSV datoteci, linija ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Red 2 nije prazan"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Nepotpun opis sekcije na liniji ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Prvi red CSV datoteke mora da sadrži šifru termina i šifru šeme rasporeda"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Semestar ${term} ne postoji"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Šema rasporeda ${schema} ne postoji"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Greška u CSV podacima rasporeda, linija ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Šifre datuma nisu definisane u odabranoj šemi: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Osobe nisu pronađene: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Kursevi nisu pronađeni: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Sekcije nisu nađene: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Invalid records: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Izmene sačuvane."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "ceo dan"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Lokacija: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Zauzeti resursi: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Dnevni kalendar za %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Nedeljni kalendar za %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Mesečni kalendar za %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "PDF podrška onemogućena. Vaš administrator je može omogućiti."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Kalendar za %s"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Opis"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "Dnevni kalendar za %s"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#, fuzzy
+msgid "Daily"
+msgstr "Dan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+#, fuzzy
+msgid "View weekly calendar"
+msgstr "Nedeljni kalendar za %s"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+#, fuzzy
+msgid "Weekly"
+msgstr "Sedmica"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "Mesečni kalendar za %s"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+#, fuzzy
+msgid "View yearly calendar"
+msgstr "Nedeljni kalendar za %s"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+#, fuzzy
+msgid "Yearly"
+msgstr "Godina"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Cal"
+msgstr "Otkaži"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Personal calendar"
+msgstr "Kalendar na naslovnoj strani"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Moj kalendar"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendari"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Još..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalendar"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Nedeljni kalendar za %s"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Kalendar"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Dodaj događaj"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "sub"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Izmeni događaj"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Zauzeti resursi: %s"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "izmeni grupe"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Izmeni događaj"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Resursi"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Sačuvaj"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Danas"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Sedmica"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Mesec"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Godina"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Ponavljaj do"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Vreme"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Ponovi na"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Zauzeti resursi: %s"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Naslov"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "sub"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Resursi"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "Lokacija: %s"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "Sati"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "Tekuća godina"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Ceo dan"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+#, fuzzy
+msgid "Example:"
+msgstr "Ispit"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalendar za %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Zauzeti resursi: %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Naziv škole ili organizacije koja koristi\n"
+"            ovaj server. Ovo će biti prikazano na javnom kalendaru,\n"
+"            u dnu svake stranice i u naslovu stranice."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Kalendar na naslovnoj strani"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Osobe"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuta"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "nedelja"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Prethodna godina"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+#, fuzzy
+msgid "Next"
+msgstr "Sledeća sedmica"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Lokacija"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Izmeni događaj"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "Dodaj novu sekciju"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+#, fuzzy
+msgid "New Course"
+msgstr "Nova kategorija"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr "Sadašnji studenti"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr "Dostupni studenti"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grupe"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Trenutne grupe"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Raspoložive grupe"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Resursi"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr "Trenutni resursi"
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr "Raspoloživi resursi"
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Index sekcija"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Dodaj novu sekciju"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "Index sekcija"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "izmeni grupe"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Detaljan opis aktivnosti"
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Zauzeti resursi: %s"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "izmeni grupe"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Index sekcija"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+#, fuzzy
+msgid "Current Size"
+msgstr "Tekuća sedmica"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Naziv kursa"
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Opis kursa"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Oznaka"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Osobe"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "mart"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Otkaži"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Primeni"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Dan"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr "Ime"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Napomene"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr "Aktivnosti"
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr "Kategorije"
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr "Nova kategorija"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr "Osnovna kategorija"
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr "Kategorije su uspešno obrisane."
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr "Kategorija je uspešno dodata."
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+#, fuzzy
+msgid "New Activity"
+msgstr "Aktivnosti"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Dodaj novu sekciju"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Izmeni događaj"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+#, fuzzy
+msgid "Activity Categories"
+msgstr "Aktivnosti"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+#, fuzzy
+msgid "Activity Name"
+msgstr "Aktivnosti"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+#, fuzzy
+msgid "Activity"
+msgstr "Aktivnosti"
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr "Ispit"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr "Detaljan opis aktivnosti"
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr "Kategorija"
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+#, fuzzy
+msgid "Import Groups"
+msgstr "Trenutne grupe"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupe"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupe"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "novembar"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "septembar"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Dodaj novi nivo"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Izmeni događaj"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "Ne"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr "Index nivoa"
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr "Dodaj novi nivo"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr "Prethodni nivo,"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Tekuća sedmica"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Dostupni studenti"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+#, fuzzy
+msgid "Initialize Students"
+msgstr "Dostupni studenti"
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Napomene"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Napomene"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Dodaj događaj"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Datum"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+#, fuzzy
+msgid "Import Persons"
+msgstr "Osobe"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Dodaj događaj"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Izmeni događaj"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "Minuta"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "Trenutni resursi"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Resursi"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Resursi"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Resursi"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Kalendar"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Izuzev datuma"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+#, fuzzy
+msgid "New Term"
+msgstr "Nova kategorija"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${month} ${year}"
+msgstr "${month}, ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+#, fuzzy
+msgid "Week ${week_number}"
+msgstr "Week ${week_no}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+#, fuzzy
+msgid "Save changes"
+msgstr "Izmene sačuvane."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+#, fuzzy
+msgid "Refresh"
+msgstr "Resursi"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "Danas"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "Prethodni dan"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "Ceo dan"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Naslov"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+#, fuzzy
+msgid "Save"
+msgstr "Isto"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "Različito vreme"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "Datum"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "ponedeljak"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Dani u sedmici"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Proverite da li se nazivi dana ponavljaju"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Da li časovi u rasporedu počinju i završavaju u isto vreme svakog dana?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Svakodnevno u isto vreme"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Različito vreme"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr "Dan u sedmici"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Isto"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Različito"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr "Da"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr "Ne"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Nepoznata šifra dana: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/st/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/st/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/st/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4763 @@
+# Sotho, Southern translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Sotho, Southern <st at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2979 @@
+# Swedish translation for SchoolBell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the SchoolBell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolBell 1.2.3-2\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-12-19 19:36+0000\n"
+"Last-Translator: Daniel Nylander <po at danielnylander.se>\n"
+"Language-Team: Swedish <tp-sv at listor.tp-sv.se>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Smeknamn"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Ett kort smeknamn för denna person"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Primär e-postadress"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Sekundär e-postadress"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Primär telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Rekommenderat telefonnummer."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Sekundär telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Sekundärt telefonnummer."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Webbplats"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Webbplats eller blogg."
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Postadress"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personer"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 person"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personer"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Användarnamn eller lösenord stämmer inte"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Nuvarande år"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Tillgängliga grupper"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Mars"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januari"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februari"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "may"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "april"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "augusti"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "september"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Nästa dag"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Idag"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Föregående dag"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "december"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "november"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "måndag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "tisdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "onsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "torsdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "söndag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "lördag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "fredag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "mån"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "tis"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "ons"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "tor"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "fre"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "lör"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "sön"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Hela dagen"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tid"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Starttid i 24h-format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Varaktighet"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Varaktighetstyp"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Minuter"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Timmar"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Dagar"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Plats"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Beskrivning"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Återkommande"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Återkommer varje"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Vecka"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Månad"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "År"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Repetera varje"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Intervall"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Antal"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Till och med"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "för alltid"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Antal händelser"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Repetera  till och med"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Veckodagar"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Veckodag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Månadsvis"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Undantagsdatum"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "samma veckodag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "först"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "fjärde"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "tredje"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "andra"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "femte"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "sista veckodagen"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Sista ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Ett fel uppstod"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ogiltig tid"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Slutdatumet är före startdatumet"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Ogiltigt datum. V.g. ange år-månad-dag (ÅÅÅ-MM-DD), en per rad."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Lägg till en händelse"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Lägg till"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Ändra en händelse"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Uppdatera"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Uppdaterat den ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Kalendrar"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Nästa vecka"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Denna vecka"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Förra vecka"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Nästa månad"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Denna månad"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Förrra månad"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Vecka ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Nästa år"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Nuvarande år"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Föregående år"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Ingen data angiven"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Kunde inte konvertera data till Unicode (felaktig teckenuppsättning)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV-fil importerades korrekt"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Misslyckades att importera CSV-filen"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV-texten importerades korrekt"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Misslyckades att importera CSV-texten"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Ingen teckenuppsättning angiven"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Okända teckenuppsättning"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Fel i CSV-data, rad ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konvertering till unicode misslyckade i rad ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Fel i CSV-data, rad ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Personinfo: ${title}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Sparade ändringar."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "hela dagen"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Plats: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Bokade resurser: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "återkommande"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Dagskalender för %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Veckokalender för %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Vecka %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Månadskalender för %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "Stöd för PDF är avstängd. Den kan aktiveras av din administratör."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalender för %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Krävd inmatning saknas."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Kör %s -h för hjälp."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Läser konfiguration från %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Kunde inte initialisera databasen:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Kanske använder en annan %s instans den?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Varning: typsnittskatalog \"%s\" existerar inte.\n"
+"Stöd för PDF är avstängd."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Detta är inte en SchoolBell 1.0 databasfil, avbryter.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Detta är inte en SchoolBell 1.0 databasfil, avbryter.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Titel"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Rubrik för anteckningen"
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grupp"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Varaktighet"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Datum"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Resursindex"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Lägg till en ny resurs"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Otillräcklig information angiven"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Titelraden får ej vara tom"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Nuvarande grupper"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Tillgängliga grupper"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Denna månad"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Tillgängliga grupper"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Grupper"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Nuvarande grupper"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Tillgängliga grupper"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Resurser"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Importera resurser"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Tillgängliga resurser"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Personindex"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Lägg till en ny person"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Titel för resursen."
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Beskrivning av resursen."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Beskrivning av gruppen."
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Webbplats"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "Avbryt"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Ändra information för ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Ändra medlemskap"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Ändra inställningar för ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Ändra kontaktuppgifter för ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Ändra kontaktuppgifter för ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Kontaktinformation"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Användarnamn"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Lösenord"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Tyvärr används användarnamnet redan"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Använd"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Primär telefon"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Föregående"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Händelseinformation"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Smeknamn"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Startar"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "lör"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Tidszon"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "Sekundär telefon"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Anteckningar"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Nästa"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Antal händelser"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "ändra namn"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "ändra namn"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "ändra namn"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Mina inställningar"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Hela namnet"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Bild"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Bild (i JPEG-formatet)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Ny anteckning"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV-texten importerades korrekt"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Lösenordet är framgångsrikt ändrat"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Lösenordet är framgångsrikt ändrat"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Exempel"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Personlig information"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Gruppindex"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Lägg till en ny grupp"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Grupper i ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "Medlemmar av ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Nuvarande medlemmar"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Lägg till medlemmar"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Titel för gruppen."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Beskrivning av gruppen."
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Resursindex"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Lägg till en ny resurs"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Förra vecka"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV-texten importerades korrekt"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Lösenordet är framgångsrikt ändrat"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Denna vecka"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Lösenordet är framgångsrikt ändrat"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Användare"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Titel för resursen."
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Beskrivning av resursen."
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Startar"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Rubrik för anteckningen"
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Nästa vecka"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Rubrik för anteckningen"
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Daglig"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Rubrik för anteckningen"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Brödtext"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Anteckningens brödtext"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "Privat"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "användarnamn får ej vara tom"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "hela namnet får ej vara tom"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Dubblett av användarnamnet: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Nytt lösenord"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Ändra lösenord"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Tidszon"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Tidszon för visning av din kalender"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Tidsformat"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datumformat"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/ÅÅ"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "ÅÅÅÅ-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dag Månad, År"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Veckan börjar på:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Starta visning av vecka på söndag eller måndag"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Visa kalender"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Namn som skall visas"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Resursindex"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Lägg till en ny resurs"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Resursindex"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Lägg till en ny resurs"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Titel för resursen."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beskrivning av resursen."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "En plats."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Otillräcklig information angiven"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Otillräcklig information angiven"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Otillräcklig information angiven"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Min kalender"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Mer..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendrar"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Välkommen till SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigering"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Bild"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Användarnamn:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "ändra namn"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Ändra denna persons namn, bild eller lösenord"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Personinfo: ${title}"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Hantera denna persons medlemsskap"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "redigera grupper"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Detta är inte en SchoolBell 1.0 databasfil, avbryter.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "topp"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Sparade ändringar."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Ändra detaljer"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Ny anteckning"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "poster"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Lägg till en ny person"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Startar"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Undantagsdatum"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Ogiltigt datum. V.g. ange år-månad-dag (ÅÅÅ-MM-DD), en per rad."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Lägg till en ny resurs"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} personer"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Anteckningens brödtext"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "samma veckodag"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "ändra namn"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Anteckning"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Okända teckenuppsättning"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Nytt fotografi"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "En liten bild (ungefär 48x48 bildpunkter i JPEG-formatet)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Radera bilden"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Markera för att radera bilden"
+
+#~ msgid "Verify password"
+#~ msgstr "Upprepa lösenordet"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Lösenorden stämmer inte överens"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Lösenorden stämmer inte överens!"
+
+#~ msgid "View"
+#~ msgstr "Visa"
+
+#~ msgid "Edit"
+#~ msgstr "Editera"
+
+#~ msgid "Create new objects"
+#~ msgstr "Skapa nya objekt"
+
+#~ msgid "Add events"
+#~ msgstr "Lägg till händelser"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Ändra eller radera händelser"
+
+#~ msgid "Control access"
+#~ msgstr "Kontrollera tillgänglighet"
+
+#~ msgid "Manage membership"
+#~ msgstr "Administrera medlemskapet"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Godkända användare"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Icke godkända användare"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Ange tillgång"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Ändra inställningar"
+
+#~ msgid "New Person"
+#~ msgstr "Ny person"
+
+#~ msgid "Import Persons"
+#~ msgstr "Importera personer"
+
+#~ msgid "Add a Group"
+#~ msgstr "Lägg till en grupp"
+
+#~ msgid "New Group"
+#~ msgstr "Ny grupp"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Ändra gruppinformation"
+
+#~ msgid "A Group"
+#~ msgstr "En grupp"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell-grupp"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Lägg till/ta bort medlemmar"
+
+#~ msgid "Import Groups"
+#~ msgstr "Importera grupper"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Lägg till en resurs"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Ändra resursinformation"
+
+#~ msgid "New Resource"
+#~ msgstr "Ny resurs"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell-resurs"
+
+#~ msgid "A Resource"
+#~ msgstr "En resurs"
+
+#~ msgid "Actions"
+#~ msgstr "Händelser"
+
+#~ msgid "View Calendar"
+#~ msgstr "Visa kalendern"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Kalender (dag)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Kalender (Daglig, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Kalender (vecka)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Kalender (Vecka, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Kalender (månad)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Kalender (Månadsvis, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Kalender (år)"
+
+#~ msgid "Atom View"
+#~ msgstr "Atomvy"
+
+#~ msgid "iCalendar"
+#~ msgstr "iCalendar"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Ledig/Upptagen"
+
+#~ msgid "New Event"
+#~ msgstr "Ny händelse"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Öppen i iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Ändra händelse"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Ändra inställningar för webbplatsen"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Denna rättighet tillåter visning av namn, titlar, fotografier, "
+#~ "objektlistor och annan information."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Tillåter ändring av namn, titlar, beskrivningar, fotografier, osv."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Låter användaren skapa nya användare, grupper och resurser."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Tillåter visning av användarkalendrar, grupper och resurser."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "Åtkomstkontroll för ${title}"
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Åtkomst för grupper"
+
+#~ msgid "Access control"
+#~ msgstr "Åtkomstkontroll"
+
+#~ msgid "Set Access"
+#~ msgstr "Ställ in tillgång"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Användarrättigheter"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Rättigheterna ärvs i innehållshierarkin. Till exempel, om du ger en "
+#~ "användare i personindex åtkomst för att se kalendern, då kommer samma "
+#~ "användare att kunna se alla andras kalendrar. Om du vill att användaren "
+#~ "bara skall se en resurs kalender, då kan du sätta kalenderåtkomsten för "
+#~ "denna resurs."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "Nedan finns en lista med rättighetsnamn med respektive förklaringar."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Ändra inställningar för webbplatsen"
+
+#~ msgid "General preferences"
+#~ msgstr "Allmänna inställningar"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Ändra inställningar för webbplatsen"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Händelser för"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_beskrivning"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_aktiverad"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_mer_info"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Validera min Atom feed"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Giltig Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Plats: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Visa fler kalendrar som skall visas"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Håll ned Ctrl eller Shift för att markera flera kalendrar."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Offentlig kalender"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "Kalender för hela webbplatsen"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Markera kalendrar för visning"
+
+#~ msgid "People"
+#~ msgstr "Personer"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Det finns inga personer vars kalendrar du kan se."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Det finns inga grupper med kalendrar som du har tillgång till."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Det finns inga resurser med kalendrar som du har tillgång till."
+
+#~ msgid "Showing"
+#~ msgstr "Visar"
+
+#~ msgid "of"
+#~ msgstr "av"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Är du säker att du vill radera dessa objekt?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Du har inte markerat några objekt."
+
+#~ msgid "delete-button"
+#~ msgstr "Knappen för att radera"
+
+#~ msgid "Exception"
+#~ msgstr "Undantag"
+
+#~ msgid "Server Error"
+#~ msgstr "Serverfel"
+
+#~ msgid "All day event"
+#~ msgstr "Heldagshändelse"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Detta är en återkommande händelse."
+
+#~ msgid "Ends"
+#~ msgstr "Slutar"
+
+#~ msgid "edit event"
+#~ msgstr "redigera händelse"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Ändra detaljer för denna händelse"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Schemalagda resurser"
+
+#~ msgid "edit resources"
+#~ msgstr "ändra resurser"
+
+#~ msgid "delete event"
+#~ msgstr "radera händelse"
+
+#~ msgid "Event details"
+#~ msgstr "Händelsedetaljer"
+
+#~ msgid "Book Resources"
+#~ msgstr "Bokningsresurser"
+
+#~ msgid "Update form"
+#~ msgstr "Uppdatera från"
+
+#~ msgid "day"
+#~ msgstr "dag"
+
+#~ msgid "week"
+#~ msgstr "vecka"
+
+#~ msgid "month"
+#~ msgstr "månad"
+
+#~ msgid "year"
+#~ msgstr "år"
+
+#~ msgid "Weekly"
+#~ msgstr "Veckovis"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr "Denna sektion tillämpas bara när upprepning veckovis är vald."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr "Denna sektion tillämpas bara när upprepning månadsvis är vald."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Dag ${monthday} varje månad"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} av varje månad"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} varje månad"
+
+#~ msgid "Repeat"
+#~ msgstr "Upprepa"
+
+#~ msgid "times"
+#~ msgstr "gånger"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Upprepa för alltid"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DYNAMIC_CONTENT}"
+
+#~ msgid "Book resources"
+#~ msgstr "Bokningsresurser"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Bokningsresurs för ${title}"
+
+#~ msgid "Title:"
+#~ msgstr "Titel:"
+
+#~ msgid "Starts:"
+#~ msgstr "Startar:"
+
+#~ msgid "Ends:"
+#~ msgstr "Slutar:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Detta är en återkommande händelse!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Resursbokning"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Händelser i konflikt"
+
+#~ msgid "Book"
+#~ msgstr "Boka"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "CSV-data <strong>måste</strong> inkludera en grupptitel och <strong>kan</"
+#~ "strong> inkludera en eventuell gruppbeskrivning. All annan information "
+#~ "tas inte med."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LUG, Linux Users Group↵\n"
+#~ "Shackklubb, Idrottsklubb efter skoltid, <em>text efter andra "
+#~ "kommatecknet</em>↵\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Exemplet ovan skapar 3 grupper med titeln 'LUG', 'Shackklubb' och "
+#~ "'Idrottsklubb'. Den första och sista gruppen kommer att ha beskrivningen "
+#~ "'Linux Users Group' respektive 'Idrottsklubb efter skoltid'. Gruppen "
+#~ "'Shackklubb' får ingen beskrivning, samt att texten 'text efter andra "
+#~ "kommatecknet' på tredje gruppen ignoreras."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Ladda upp schooltool-grupper enligt CSV"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Ladda upp CSV-fil"
+
+#~ msgid "CSV File"
+#~ msgstr "CSV-fil"
+
+#~ msgid "Charset:"
+#~ msgstr "Teckentabell"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Västeuropeisk (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Västeuropeisk (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Västeuropeisk (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Annan (vänligen specificera)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Annan teckenuppsättning: ${other_charset}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "Mata in CSV-data"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV-data"
+
+#~ msgid "Members"
+#~ msgstr "Medlemmar"
+
+#~ msgid "edit members"
+#~ msgstr "redigera medlemmar"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Ändra personer som är medlemmar av denna grupp."
+
+#~ msgid "Remove"
+#~ msgstr "Ta bort"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Du har inte tillåtelse att gå till denna sida. Du kan klicka på "
+#~ "tillbakaknappen i din webbläsare för att gå tillbaka, eller be en mer "
+#~ "privilegierad användare att logga in."
+
+#~ msgid "Please log in"
+#~ msgstr "Vänligen logga in"
+
+#~ msgid "Login"
+#~ msgstr "Logga in"
+
+#~ msgid "User Information"
+#~ msgstr "Användarinformation"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Din session har utgått."
+
+#~ msgid "There are none."
+#~ msgstr "Det finns inga."
+
+#~ msgid "There are none to add."
+#~ msgstr "Det finns ingen att lägga till."
+
+#~ msgid "Find Now"
+#~ msgstr "Sök nu"
+
+#~ msgid "Clear"
+#~ msgstr "Rensa"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Vem kan se anteckningen"
+
+#~ msgid "Private"
+#~ msgstr "Privat"
+
+#~ msgid "Public"
+#~ msgstr "Offentlig"
+
+#~ msgid "Add note"
+#~ msgstr "Lägg till anteckning"
+
+#~ msgid "Delete"
+#~ msgstr "Ta bort"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Not Found"
+#~ msgstr "Hittades inte"
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Sänd in schooltool-personer som CSV (kommaseparerade värden)"
+
+#~ msgid "Details"
+#~ msgstr "Detaljer"
+
+#~ msgid "edit details"
+#~ msgstr "ändra detaljer"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Ändra denna persons detaljer"
+
+#~ msgid "Add person"
+#~ msgstr "Lägg till person"
+
+#~ msgid "Add to groups"
+#~ msgstr "Lägg till i grupper"
+
+#~ msgid "Edit contact information"
+#~ msgstr "Redigera kontaktinformation"
+
+#~ msgid "Edit person"
+#~ msgstr "Ändra person"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Inställningar för kalender"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Ändra inställningar för person"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Du försöker ta bort en upprepande händelse"
+
+#~ msgid "Current"
+#~ msgstr "Nuvarande"
+
+#~ msgid "Future"
+#~ msgstr "Framtida"
+
+#~ msgid "All"
+#~ msgstr "Alla"
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Ladda upp resurser från schooltool som CSV"
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "Identifierare (valfri)"
+
+#~ msgid "Printable version"
+#~ msgstr "Version för utskrift"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Se dagskalender"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Se veckokalender"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Se månadskalender"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Se årskalender"
+
+#~ msgid "Yearly"
+#~ msgstr "Årligen"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "Kalender för ${title} - ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Hoppa till..."
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Morgondagens händelser"
+
+#~ msgid "Log in"
+#~ msgstr "Logga in"
+
+#~ msgid "User:"
+#~ msgstr "Användare:"
+
+#~ msgid "Log Out"
+#~ msgstr "Logga ut"
+
+#~ msgid "Edit Info"
+#~ msgstr "Ändra information"
+
+#~ msgid "Add Event"
+#~ msgstr "Lägg till händelse"
+
+#~ msgid "Modify Event"
+#~ msgstr "Ändra händelse"
+
+#~ msgid "Set up access"
+#~ msgstr "Ställ in tillgång"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Autentiserade användare"
+
+#~ msgid "All Users"
+#~ msgstr "Alla användare"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: varning: ignorerar konfigurationsflagga \"%s\""
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/sv/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5122 @@
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005    Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+msgid ""
+msgstr ""
+"Project-Id-Version: SchoolTool Version 0.11.3\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-06-16 17:30+0000\n"
+"Last-Translator: Dagfinn Kolstad <dagfinn at area11.se>\n"
+"Language-Team: Swedish <schooltool-dev at schooltool.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: setup.py\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Smeknamn"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Ett kort smeknamn för denna person."
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Huvudsakliga e-post"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "Annan e-post adress"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Huvudsakliga tel.nr."
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Rekommenderat tel.nr."
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "Annat tel.nr."
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "Annat tel.nr."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Web sida"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Web sida eller Web log"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "E-post adress"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Personer"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 person"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} personer"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Användarnamn eller lösenord är falskt"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Mars"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Januari"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Februari"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Juni"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Maj"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "April"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Augusti"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "September"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Juli"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Nästa dag"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Idag"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Föregående dag"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Oktober"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "December"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "November"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Måndag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Tisdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Söndag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Lördag"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Fredag"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Mån"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Tis"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Ons"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Tors"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Fre"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Lör"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Sön"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "Hela dagen"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "Datum"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Tid"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Start tid i 24t format"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Varaktighet"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Varaktighetstyp"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Minuter"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Timmar"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Dagar"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Plats"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Beskrivning"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Återkommande"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Återkommer varje"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Dag"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "vecka"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Månad"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "År"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Upprepa varje"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Intervall"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Antal"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Till och med"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "för alltid"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Antal händelser"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "Repetera till och med"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Veckodagar"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "veckodag"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Månadsvis"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Undantags datum"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "samma veckodag"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1:a"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4:de"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3:dje"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2:a"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5:te"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "sista veckodag"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Sista ${weekday}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "Ett fel har uppstått"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Ogiltig tid"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Slut datum är tidigare än start datum"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Ogiltigt datum. V.g. ange år-månad-dag (ÅÅÅ-MM-DD), en per rad."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Lägg till händelse"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Lägg till"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Redigera händelse"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Uppdatera"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Uppdaterad den ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Kalender"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Nästa vecka"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Denna vecka"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Förra veckan"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${month}, ${year} (week ${week})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Nästa månad"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Denna månad"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Förra månaden"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Vecka ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Nästa år"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Detta år"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Förra året"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "Åtgärder"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Visa"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Lägg till händelse"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Redigera händelse"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Logga in"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Navigering"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "Åtgärder"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Ingen data angiven"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Kunde inte konvertera data till Unicode (felaktig teckenuppsättning)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Importen av CSV filen lyckades"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Importen av CSV filen misslyckades"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Importen av CSV text lyckades"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Importen av CSV text misslyckades"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Ingen teckenuppsättning angiven"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Okänd teckenuppsättning"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Fel i CSV data, rad ${line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Konvertering till unicode misslyckades i rad ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "Rad 2 är inte tom"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+"Fel formulerad rad ${line_no} (Den skall inte innålla dag id eller period id"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Ofullständig sektionsbeskrivning på rad ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Första raden av CSV-filen måste innehålla terminens id och "
+"tidtabellsschemats id."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Termen ${term} existerar inte."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Tidtabellsschemat ${schema} existerar inte."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Fel i tidtabellens CSV-data, rad ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Dag id inte definierat i det valda schemat: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Perioderna inte definierade i valda dagar: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Hittade inte personer: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Hittade inte kurser: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Hittade inte sektioner: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Ogiltiga poster: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Ändringar sparade."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "hela dagen"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Plats:%"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Reserverade resurser: %"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "återkommande"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "Överskriven från %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Daglig kalender i %"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Veckokalender i %"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Vecka %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Månatlig kalender i %"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"PDF stödet är inaktivt. Detta kan aktiveras av din system administrator"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Ändra inställningar"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Ändra inställningar"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Ändra inställningar"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Mina inställningar"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Ändra inställningar"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Beskrivning"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+#, fuzzy
+msgid "atom_enabled"
+msgstr "nationell"
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "Gå till ..."
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Morgondagens händelser"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Utskriftsvänlig version"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Titta på dagliga kalendern"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Daglig"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Se veckokalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Veckovis"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Se månadskalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Se årskalender"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Årlig"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "Kalender för ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Personlig kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Schemakalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Min kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Kalendrar"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "Mer..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Se kalender"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "Veckokalender i %"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "radera"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "Ångra knapp"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Ta bort"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Det finns inga."
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Sök nu"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr "Rensa"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr "Det finns ingen att lägga till."
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Lägg till händelse"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Detaljer"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Status"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Redigera händelse"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Ändra lärarna för denna sektion."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "Reserverade resurser: %"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "redigera grupper"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Ändra/ta bort händelser"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Redigera sektionsinformation"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "redigera detaljer"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Resurser"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Uppdatera"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Idag"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "vecka"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Månad"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "År"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "Repetera till och med"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "Tid"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Se kalender"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "Upprepa varje"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Reserverade resurser: %"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+#, fuzzy
+msgid "Resource Booking for ${title}"
+msgstr "Personinfo: ${title}"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Titel"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "Status"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Resurs index"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "ändra plats"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Kurser"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+#, fuzzy
+msgid "Levels"
+msgstr "Nivå"
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "Välkommen till SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Redigera sektionsinformation"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Logga in"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "återkommande"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "Hela dagen"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Västeuropeisk (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Västeuropeisk (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Annan (var god specifiera)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Annan teckenuppsättning: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "Mata in CSV-data"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV-data"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "sänd-knapp"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "Importera tidtabell"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+"Du kan skapa CSV-filen i ett kalkylblad och exportera den i CSV (komma-"
+"separerade värden) format. Kalkylbladets struktur är beskriven nedan."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"Första raden i filen måste innehålla namnet på <strong>terminen</strong> och "
+"<strong>tidtabelsschemat</strong> vilket kommer att användas för de nya "
+"tidtabellerna. Andra raden bör vara tom. Efter det kan flera "
+"sektionsbeskrivningar följa. De separeras av en tom rad."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Ladda upp SchoolTool-timplanen som CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Exempel:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "Ladda upp CSV-fil"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV-fil"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Teckenuppsättning:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Västeuropeisk (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Kalender för %s"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Reserverade resurser: %"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Namnet på skolan eller organisationen som uppehåller\n"
+"            denna server. Detta kommer att visas upp på den allmänna "
+"kalendern, på\n"
+"            sidfoten och i sidans titel."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Framsidekalender"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr "Visa tidtabeller"
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+"\n"
+"            En inställning som kontrollerar om denna kalenderns schema\n"
+"            Ägaren visas i kalenderns visnings läge.\n"
+"            "
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Obligatorisk inmatning saknas."
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Blankett indata är inte ett filobjekt"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Felaktig heltalsdata"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Felaktig textdata"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Ogiltig textenlig data"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Ogiltig unicode data"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Felaktig flyttalsdata"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Felaktig datum-tid data"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Går till bakgrunden, daemon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Kör %s -h för hjälp."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: daemon läge stöds inte av ditt operativ system."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Läser konfiguration från %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Hanterare"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Start tid: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Kunde inte initialisera databasen:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Kanske en annan instans av %s använder den?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Varning: Kunde inte hitta reportlab-biblioteket.\n"
+"PDF-stöd avstängt."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Varning: teckensnittskatalogen '%s' existerar inte.\n"
+"PDF-stöd avstängt."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Varning: teckensnittet '%s' existerar inte.\n"
+"PDF-stöd avstängt."
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Ingen lagring definierad i konfigurations filen.\n"
+"\n"
+"Om du använder standard konfigurationen var god redigera nu\n"
+"avkommentera ZODB storage sektionerna.\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Detta är inte en  SchoolTool 0.11 databas fil, avslutar.\n"
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Detta är inte en SchoolTool 0.10 databasfil, avbryter.\n"
+"\n"
+"Var god och kör det fristående databasuppgraderingsscriptet.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "Välkommen till SchoolTool-servern"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr "Förklarningen accepterad."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr "Inte förklarad ännu."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr "Var sen till ${section} (${mins} minuter)."
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr "Var frånvarande från ${section}."
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr "Ankomst tiden du angav var felaktig. Använd formatet TT:MM"
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr "Ankomst tider gäller bara elever"
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr "La till förklarning för $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr "Avslutad $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr "Avslagit förklarningen för $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr "Gjorde $absence till sen ankomst"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+"Kan inte ange ny förklarning för $absence: Förra förklarningen Accepterad/"
+"Avslagen"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr "Det finns inga olästa förklarningar att acceptera för $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr "Det finns inga olästa förklarningar att avslå för $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr "närvarao kontroll"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr "$date $time: Frånvarande från $section"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr "$date $time: Sen till $section, ankom $late_arrival"
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+#, fuzzy
+msgid "Attendance"
+msgstr "Närvaro status koder."
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Ändra inställningar"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Ändra inställningar"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+#, fuzzy
+msgid "Students with unresolved absences"
+msgstr "Avslutad $absence"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Personer"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "Schemaläggning för ${section}"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Förklaring:"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Minuter"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+#, fuzzy
+msgid "Present"
+msgstr "Presentation"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+#, fuzzy
+msgid "Absent"
+msgstr "Tilldelning"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Söndag"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Det finns ingen att lägga till."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+#, fuzzy
+msgid "There were no absences in this term."
+msgstr "Datumet du angav tillhör inte denna termin."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Det finns ingen att lägga till."
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+#, fuzzy
+msgid "Attendance of ${person}"
+msgstr "Schemaläggning för ${person}"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+#, fuzzy
+msgid "Unresolved explained absences"
+msgstr "Avslutad $absence"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+#, fuzzy
+msgid "Unresolved unexplained absences"
+msgstr "Avslutad $absence"
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr "$title"
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr "Närvaro status koder."
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr "Ordbok för förkortade närvarostatus koder."
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Förra året"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Nästa"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr "<ökänd>"
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "nationell"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Lägg till sektion"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr "Titel på lovord"
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr "En detaljerad beskrivning av lovorden"
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr "Omfång"
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr "Grupp"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr "gemensam"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr "global"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr "nationell"
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr "stat"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr "Datum utmärkelsen gavs"
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr "Beviljas av"
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Visa"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Redigera händelse"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Lägg till sektion"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Redigera sektionsinformation"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Importera kurser"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Lägg till en ny kurs"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Ny kurs"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Kurs Index"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Lägg till en ny kurs"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Otillräcklig information angiven"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Titlar får inte vara tomma"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Det finns ingen sådan kurs."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Behöver ett kurs-ID."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Lägg till en sektion till ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Lärare"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Nuvarande lärare"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Tillgängliga lärare"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Elever"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr "Nuvarande elever"
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr "Tillgängliga elever"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Grupper"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Nuvarande grupper"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Tillgängliga grupper"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Resurser"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr "Nuvarande resurser"
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr "Tillgängliga Resurser"
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Sektionslista"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Lägg till en ny sektion"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV-data <strong>måste</strong> innehålla en kurstitel och <strong>kan</"
+"strong> innehålla en valfri kursbeskrivning. Övriga data förkastas."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Histori, Historia T.O.M. 1000 e.kr.\n"
+"Svensk Historia\n"
+"Världs historaia, 1000 e.kr. till modern historia, text efter andra kommat\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Exmplet ovan skapar 3 kurser 'Historia', 'Svensk historia' och 'världs "
+"historia'. Den första och den sista har beskrivningen 'Historia T.O.M. 1000 "
+"e.kr.' och '1000 e.kr. till modern historia'. Den andra kursen har ingen "
+"beskrivning, den extra texten 'text efter andra kommat' på tredje kursen "
+"kommer ignoreras."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "Ladda upp Skolverktygets kurser som CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Sektioner"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr "Foto"
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "Elever"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "Sektion av ${course} -- ${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "redigera namn"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Ändra lärarna för denna sektion."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Ändra lärarna för denna sektion."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Reserverade resurser: %"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Ändra lärarna för denna sektion."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "redigera instruktörer"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "Ändra personer"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Ändra eleverna i denna sektion individuellt"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Ändra eleverna i denna sektion enligt grupper"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "redigera grupper"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Identifierare (valfri)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr "Sektion"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr "Nuvarande storlek"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "Det förekom ${num_errors} inmatningsfel."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Kurs namn."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Kursbeskrivning."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Etikett"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+"En identifikator för sektionen, uppgjord av lärar\n"
+"            namn, kurser och mötestid."
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Kod"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr "Sektionens ID-kod."
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Sektionsbeskrivning"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr "kategori namn."
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr "Vikt"
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Personer"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Mars"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Skoldag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+#, fuzzy
+msgid "emergency1"
+msgstr "Nödsituationsdag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+#, fuzzy
+msgid "emergency2"
+msgstr "Nödsituationsdag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+#, fuzzy
+msgid "emergency3"
+msgstr "Nödsituationsdag"
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Redigera"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Avbryt"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr "Amvändarnamn"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr "Lösenord"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Detta användarnamn finns redan !"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Verkställ"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Daglig"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Det finns inga."
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Det finns inga."
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr "namn"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "Anteckningar"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr "Prefix"
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr "Titel t.ex. Hr., Fru."
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr "Förnamn"
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr "Mellan namn"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr "Efter namn"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr "Suffix"
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr "föredragit namn"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr "Namn som eleven föredrar"
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Namn"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Foto"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Foto (i JPEG format)"
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Kurser"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr "Aktiviteter"
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "radera"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "Lägg till"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+#, fuzzy
+msgid "Manage Activity Categories"
+msgstr "Aktivitets kategori"
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "Ångra knapp"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr "Kategorier"
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr "Ny kategori"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr "Standard kategori"
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr "Kategorin borttagen"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr "Kategorin skapad"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr "Standard kategorin ändrad"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+#, fuzzy
+msgid "New Activity"
+msgstr "Aktiviteter"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Lägg till sektion"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Redigera händelse"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+#, fuzzy
+msgid "Activity Categories"
+msgstr "Aktivitets kategori"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr "Genomsnitts procent"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr "Median"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr "Standardavvikelse"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr "Varians"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr "Inte tillgänglig"
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr "Betyget $value för aktiviteten $name är inte giltigt."
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr "Betyget $value för $name är inte giltigt."
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr "Medel"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+#, fuzzy
+msgid "Grade"
+msgstr "Utgångs år"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Elever"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+#, fuzzy
+msgid "Activity Name"
+msgstr "Aktiviteter"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "radera"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Period ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+#, fuzzy
+msgid "Activity"
+msgstr "Aktiviteter"
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr "Tilldelning"
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr "Uppsats"
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr "Slut prov"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr "Hemläxa"
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr "Journal"
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr "Labb"
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr "Presentation"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr "Projekt"
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr "En detaljerad beskrivning av aktiviteten"
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr "Kategori"
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr "Aktivitets kategori"
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr "Poängsysetm"
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr "Aktivitets poängsystem."
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr "Datum aktiviteten skapades"
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr "Aktiviteter i Betyg."
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr "Elever i denna betygsboken"
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Importera grupper"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+#, fuzzy
+msgid "Add a Group"
+msgstr "Lägg till en grupp"
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Redigera sektionsinformation"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Administrera medlemskap"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Grupper"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Grupper"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"CSV-data <strong>måste</strong> innehålla en kurstitel och <strong>kan</"
+"strong> innehålla en valfri kursbeskrivning. Övriga data förkastas."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+#, fuzzy
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Exmplet ovan skapar 3 kurser 'Historia', 'Svensk historia' och 'världs "
+"historia'. Den första och den sista har beskrivningen 'Historia T.O.M. 1000 "
+"e.kr.' och '1000 e.kr. till modern historia'. Den andra kursen har ingen "
+"beskrivning, den extra texten 'text efter andra kommat' på tredje kursen "
+"kommer ignoreras."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Ladda upp Skolverktygets kurser som CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "November"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "redigera namn"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Grupp index"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Lägg till en grupp"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Gruppens tittel"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Beskrivning av gruppen"
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr "Privat_kalender"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Lägg till ny nivå"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Redigera händelse"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+#, fuzzy
+msgid "Academic Record"
+msgstr "Akademisk bakgrund"
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "ingen"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr "Nivå index"
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr "Lägg till ny nivå"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr "Föregående nivå"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "Lägg till"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Denna vecka"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Elever"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "Ångra knapp"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+#, fuzzy
+msgid "Initialize Students"
+msgstr "Tillgängliga elever"
+
+#: /src/schooltool/level/browser/promotion.pt:60
+#, fuzzy
+msgid "Inital Level"
+msgstr "Nästa nivå"
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "Lägg till"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+#, fuzzy
+msgid "Level Outcome"
+msgstr "utkomst"
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr "Inga elever valda"
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr "Nuvarande nivå : $level"
+
+#: /src/schooltool/level/browser/record.pt:107
+#, fuzzy
+msgid "History"
+msgstr "Akademisk bakgrund"
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "Ångra knapp"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr "ändringen av statusen lyckades"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr "Tidstämpel"
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr "Datum och tid anmärkning skapades"
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Användare"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr "Titel på anmärkningen"
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr "En detaljerad beskrivning på anmärkningen"
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr "Akademisk bakgrund"
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr "Den akademiska historian av eleven."
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr "Status"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr "Utgångs år"
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr "upphävd"
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr "Namn på nivån."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr "Nästa nivå"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr "utkomst"
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr "kuggad"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr "Återkalla"
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr "Godkänd"
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr "Nivå"
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Ny termin"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Anteckningens tittel"
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "Huvudtext"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Anteckningens huvudtext"
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Privat"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Anteckningar"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Privat"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Lägg till termin"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "Datum"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "användarnamn får ej vara tomt"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "hela namnet får ej vara tomt"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Dubblett av användarnamnet: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Importera personer"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Ladda upp Skolverktygets kurser som CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Ändra inställningar"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Tidszon"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Tidszon använd för att visa din kalender"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Tids format"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "TT:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "TT:MM am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Datum Format"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/YY"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "YYYY-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Dag, Månad, År"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Veckan börjar på:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Visa veckorna börjande med Söndag eller Måndag"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Visa perioder"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Visa periodsnamn i dagliga vyn"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Namn som kommer att visas"
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "Relationer"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Lägg till nytt krav"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Lägg till nytt krav"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Lägg till nytt krav"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Visar"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr "av"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr "poster"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr "Krav lista"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr "Lägg till nytt krav"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr "Nuvarande poäng system"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr "Anpassat poäng system"
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Importera resurser"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Lägg till en resurs"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Redigera sektionsinformation"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Resurser"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Resurser"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV-data <strong>måste</strong> innehålla en kurstitel och <strong>kan</"
+"strong> innehålla en valfri kursbeskrivning. Övriga data förkastas."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Exmplet ovan skapar 3 kurser 'Historia', 'Svensk historia' och 'världs "
+"historia'. Den första och den sista har beskrivningen 'Historia T.O.M. 1000 "
+"e.kr.' och '1000 e.kr. till modern historia'. Den andra kursen har ingen "
+"beskrivning, den extra texten 'text efter andra kommat' på tredje kursen "
+"kommer ignoreras."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "Ladda upp Skolverktygets kurser som CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Resurs index"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Lägg till en resurs"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Resursens Tittel"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Beskrivning av resursen"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "En plats"
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Indikerar att denna resurs är en plats, som tex ett klassrum."
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr "Kalender_relationer"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr "Kalender_ACL"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr "Otillräcklig data i person informationen"
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr "Otillräcklig data i grupp informationen"
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr "Otillräcklig data i nivå informationen"
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Detta är inte en Schoolbell 1.0 databasfil, avbryter.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Detta är inte en Schoolbell 1.0 databasfil, avbryter.\n"
+"\n"
+"Var god och kör det fristående databasuppgraderingsscriptet.\n"
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "topp"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "Undantags datum"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Logga in"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Användare:"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Logga ut"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Ny termin"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr "Inställ skolan på grund av nödsituation."
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr "Ersättningsdatumet du angav är felaktigt."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr "Skolan inställd på grund av nödsituation. Ersättningsdag $replacement."
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr "Ersättningsdag för nödsituationsdag $emergency."
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+"Datumet du matade in är ogiltigt. Var god och använd formatet ÅÅÅÅ-MM-DD."
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr "Datumet du angav tillhör inte denna termin."
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr "Datumet du angav är inte en skoldag."
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+"Du har valt ${DYNAMIC_CONTENT} som nödsituationsdag. Var god och välj "
+"ersättningsdag. Urvalet nedan består av ickeskoldagar i denna termin "
+"efterföljande nödsituationsdagen och flera dagar efter terminen."
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr "Var god och mata in ersättningsdatumet nedan."
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr "Ersättning"
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr "Välj en ersättning för nödsituationsdagen."
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+"Denna blankett tillåter dig att bemärka ett datum som ett nödsituationsdatum "
+"och tillägga en ersättningsdag."
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr "Var god och mata in nödsituationsdatumet nedan."
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr "Nödsituationsdag"
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "Byt termin: $title"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Ny termin"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Villkor"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Lägg till en ny termin"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Startdatum"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Slutdatum"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Vecka ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Lägg till termin"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Spara ändringar"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Till att börja med, ange namnet och definiera tidsperioden för terminen. "
+"Datumintervallet är inklusivt (t.ex. 2004-09-01 till 2004-12-31). Datumen "
+"måste specifieras i formatet ÅÅÅÅ-MM-DD."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "Datumintervallet är inklusivt (t.ex. 2006-09-01 till 2006-12-31)."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Uppdatera"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"För det andra, specifiera vilka dagar är skoldagar och vilka är helgdagar."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+"Var god och specifiera vilka dagar är skoldagar och vilka dagar är helgdagar."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Förklaring:"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Skoldag"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Helgdag"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Välj mellan följande veckodagar:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "${object}' timetable"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Ogiltigt datum. Var god och ange datumet i formatet ÅÅÅÅ-MM-DD."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Datumet tillhör ingen termin."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr "Vissa värden var felaktiga. De är framhävda med röd färg."
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr "Byt tidtabell för en dag"
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Ny tidtabell"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Visa tidtabeller"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Schemalägg"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr "Var god och använd formatet TT:MM för periodens start och sluttid."
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "Du måste specifiera åtminstone en period."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr "Skoltidtabeller"
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Lägg till ett nytt schema"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Välj ett värde"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Dag ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Period 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Period ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Tidtabellsschema ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Tidtabelldagen sammanträffar alltid med veckodagen (t.ex. på måndagar "
+"används första tidtabelldagen, tisdagar den andra och så vidare)."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Tidtabelldagar är använda sekventiellt, hoppar över dagar som inte är "
+"skoldagar."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Varg god och välj ett namn för tidtabellsschemat du vill skapa."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr "Vissa periodsspecifikationer var felaktiga och förkastades därav."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Slutligen, granska att informationen i denna tabell är korrekt, för enda "
+"sättet att korrigera det är genom att radera detta schema och skapa det "
+"pånytt."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Skapa tidtabellsschema"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+"Till att börja med, var god och definiera dagarna och perioderna för "
+"tidtabellen."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Kopiera perioderna från föregående dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Ta bort denna dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Lägg till dag"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Lägg till peried"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"För det andra, välj hur tidtabellens dagar arrangeras enligt kalenderdagarna."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+"OBS: Om en sektion uppenbaras i fler än ett fack, måste alla av dem ändras "
+"till <em>ingen</em> för att readera den."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Tidtabell"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Termin"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Schema"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr "Schemaläggning för ${person}"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr "Välj"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+"Denna tabell låter dig inrätta en persons tidsschema genom att lägga till "
+"och ta bort personen till och från sektioner som har lektioner i sina "
+"tidtabeller."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr "som en del av"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr "ingen"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr "Konflikt i schemaläggningen."
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr "Spara"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr "Inga terminer eller tidsscheman definierade."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr "Välj mall för schemat."
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr "För termin(er):"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr "Schemaläggning för ${section}"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr "Använder tidtabell:"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+"Detta är ett enkelt sätt att skapa ett veckoschema. Mata in en tillräcklig "
+"mäng rader för dina första perioder."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+"Om du behöver mera flexibilitet kan du använda dig av <a href=\"add.html"
+"\">konfigurationsguiden för schemaläggning</a> eller <a href=\"complexadd."
+"html\">komplexa schemaläggningsblanketten</a>."
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr "Periodtitel (valfri)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr "Periodens starttid"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr "Periodens sluttid"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr "Skapa"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+"Du kan justera periodernas start och sluttider för ${DYNAMIC_CONTENT} i "
+"blanketten nedan. För att radera en period för dagen, radera periodens start "
+"och sluttid."
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr "Periodtitel"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Ursprunglig start"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Ursprungligt slut"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Ny start"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Nytt slut"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Modifiera"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+"Denna blankett tillåter dig att ändra på start och sluttiderna för perioder "
+"på ett visst datum, eller att annullera perioder helt och hållet."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr "Var god och mata in nedan när perioderna behöver ändras."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr "Välj en speciell dag."
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Fortsätt"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Skapa tidtabellsschema"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "Tidtabeller för ${object}"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+#, fuzzy
+msgid "Homeroom"
+msgstr "närvarao kontroll"
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Ny tidtabellsschema"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr "Dagar i veckan"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr "Roterande Cykel"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr "Mata in namn på dagar i en cykel, en per rad."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr "Mata in åtminstone namnet på en dag."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr "Se till att dagarnsa namn är unika."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+"Börjar och slutar lektionerna samtidigt varje dag i din skolas tidsschema?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr "Samma tid varje dag"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Olika tider"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+"Varierar start och slut tider baserat på vilken dag i veckan det är eller är "
+"dom i cukeln?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr "Dagar i veckan"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr "Dagar i cykeln"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+"Ange start och sluttid för var och en av fickorna (TT:MM - TT:MM) per linje."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr "Inte en giltig tids ficka: $slot."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr "Var god ange minst en tids ficka."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+"Ange start och sluttid för var och en av fickorna  på alla dagarna (TT:MM - "
+"TT:MM) per linje."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr "Var god ange minst en tidsficka för $day."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr "Har perioderna namn eller är de betecknade av tid?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr "Har namn"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr "Betecknad av tid"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr "Mata in periodernas namn, en per rad."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr "Mata in åtminstone $number perioder."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr "Se till att periodnamnen är unika."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr "Är periodssekvensen likadan varje dag?"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Samma"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Olik"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr "Var god och ordna upp perioderna:"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr "Var god och ange alla perioder."
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr "Följande perioder valdes fler än en gång: $periods"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr "Var god och ordna upp perioderna för var dag:"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr "$period på dag $day"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr "Kontrollerar du närvaro för dagen eller under dagen."
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr "Ja"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr "Nej"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr "Var god specifiera närvarakontroll för alla dagar."
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Okänt dag id: %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Okänd period id: %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Användarnamn:"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Ändra denna persons namn, bild eller lösenord"
+
+#~ msgid "Import Sections"
+#~ msgstr "Importera sektioner"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Ändra denna persons detaljer"
+
+#~ msgid "via group"
+#~ msgstr "via grupp"
+
+#~ msgid "Person index"
+#~ msgstr "Person Index"
+
+#~ msgid "Add a new person"
+#~ msgstr "Lägg till en person"
+
+#~ msgid "New photo"
+#~ msgstr "Nytt foto"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "En liten bild (ca 48x48 pixlar i JPEG format)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Ta bort foto"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Kontrollera detta för att ta bort fotot"
+
+#~ msgid "New password"
+#~ msgstr "Nytt lösenord"
+
+#~ msgid "Verify password"
+#~ msgstr "Verifiera lösenordet"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Lösenorden överenstämmer inte med varandra"
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Lösenordet har ändrats"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Lösenorden överenstämmer inte med varandra !"
+
+#~ msgid "Create new objects"
+#~ msgstr "Skapa nya objekt"
+
+#~ msgid "Add events"
+#~ msgstr "Lägg till händelser"
+
+#~ msgid "Control access"
+#~ msgstr "Kontrollera tillgång"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Identifierade användare"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Odientifierade användare"
+
+#~ msgid "All Users"
+#~ msgstr "Alla användare"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Användning: %s [options]\n"
+#~ "Alternativ:\n"
+#~ "  -c, --Konfigurera xxx använd denna konfigurationsfil istället för "
+#~ "standard\n"
+#~ "  -h, --hjälp visar detta meddelande\n"
+#~ "  -d, --deamon gå till bakgrunden efter start\n"
+#~ "  -r, --restore-manager återställer manager användaren med standard "
+#~ "lösenordet\n"

Added: schooltool/branches/upstream/current/src/schooltool/locales/ta/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/ta/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/ta/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2268 @@
+# Tamil translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-08-06 18:24+0000\n"
+"Last-Translator: jojode <kannan at edmetrix.com>\n"
+"Language-Team: Tamil <ta at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+#, fuzzy
+msgid "Persons"
+msgstr "makkal"
+
+#: /src/schooltool/app/browser/__init__.py:259
+#, fuzzy
+msgid "1 person"
+msgstr "oruvan"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+#, fuzzy
+msgid "${number} persons"
+msgstr "palaperu"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "pudiya toguppu"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "pudiya toguppu"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "mulu peyar"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "mulu peyar"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+#, fuzzy
+msgid "Full name"
+msgstr "mulu peyar"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+#, fuzzy
+msgid "Photo"
+msgstr "pogaipadam"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+#, fuzzy
+msgid "Photo (in JPEG format)"
+msgstr "pogaipadam jpeg vadivathil"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "ungal ragasiya aluthu vetrigramaga matrapatthu"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "ungal ragasiya aluthu vetrigramaga matrapatthu"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "ungal ragasiya aluthu vetrigramaga matrapatthu"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+#, fuzzy
+msgid "Add a new group"
+msgstr "pudiya toguppu"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "pudiya toguppu"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "ungal ragasiya aluthu vetrigramaga matrapatthu"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "ungal ragasiya aluthu vetrigramaga matrapatthu"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "pudu ragasiya aluthu"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "pudu ragasiya aluthu"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "pudiya toguppu"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "pogaipadam"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "pudiya toguppu"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "pudiya toguppu"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "palaperu"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Verify password"
+#~ msgstr "ragasiya aluthai sari parkavum"

Added: schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Tagalog translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Tagalog <tl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/tl/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4902 @@
+# Tagalog translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-08 16:41+0000\n"
+"Last-Translator: Eric Pareja <xenos at upm.edu.ph>\n"
+"Language-Team: Tagalog <tl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+#, fuzzy
+msgid "Actions"
+msgstr "Magdagdag ng Seksyon"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Tingnan"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Walang charset na naka-set"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Hindi kilalang charset"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "May laman ang pangalawang hanay"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "Hindi buo ang paglalarawan ng seksyon sa linya ${line}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+"Ang unang hanay ng talaksang CSV ay kinakailangang naglalaman ng id ng term "
+"at id ng timetable schema."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Ang term ${term} ay di nakita."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+#, fuzzy
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Walang ${schema} timetable schema na nakita."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "May mali sa datos ng timetable CSV, linya ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "ID ng Araw ay hindi nakalista sa napiling schema: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Mga period ay hindi nakalista sa napiling mga araw: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Hindi nakita ang mga tao: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Hindi nakita ang mga kurso: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Hindi nakita ang mga pangkat: ${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:554
+#, fuzzy
+msgid "Invalid records: ${args}."
+msgstr "Imbalidong mga rekord."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+#, fuzzy
+msgid "View daily calendar"
+msgstr "Kalendaryong Talaan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+#, fuzzy
+msgid "View weekly calendar"
+msgstr "Kalendaryong Talaan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+#, fuzzy
+msgid "View monthly calendar"
+msgstr "Kalendaryong Pansarili"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+#, fuzzy
+msgid "View yearly calendar"
+msgstr "Kalendaryong Talaan"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Kal"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Personal calendar"
+msgstr "Kalendaryong Pansarili"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "Timetable calendar"
+msgstr "Kalendaryong Talaan"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+#, fuzzy
+msgid "TT"
+msgstr "TT"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+#, fuzzy
+msgid "Calendars"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+#, fuzzy
+msgid "More..."
+msgstr "Meron pa..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Kalendaryong Talaan"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "Mag-angkat ng mga Kagamitan"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Mag-angkat ng mga Kagamitan"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "na mga aytem"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Kalendaryong Pansarili"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Mag-angkat ng mga Kagamitan"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+#, fuzzy
+msgid "Courses"
+msgstr "Bagong Kurso"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+#, fuzzy
+msgid "Welcome to SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Tignan ang talaan ng oras"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "Magpadala ng mga kursong pang-schooltool bilang CSV"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+#, fuzzy
+msgid "Example:"
+msgstr "Halimbawa:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Mag-angkat ng mga Kagamitan"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Mag-angkat ng mga Tao"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Magdagdag ng Seksyon"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Tingnan"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Palitan"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr "Magdagdag ng Seksyon"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Mag-angkat ng mga Kurso"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Mag-dagdag ng bagong kurso"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Bagong Kurso"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Listahan ng Kurso"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Mag-dagdag ng bagong kurso"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Walang ganyang kurso."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Kailangan ng ID ng kurso."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "Mag-dagdag ng Seksyon para sa ${course}"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Listahan ng Seksyon"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Mag-dagdag ng bagong seksyon"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"<strong>Kinakailangan</strong> na kasama ang pangalan ng kurso ang datos ng "
+"CSV at <strong>maaaring</strong> kasama din ang opsyonal na paglalarawan ng "
+"kurso. Mga ekstra na impormasyon ay hindi gagamitin."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+#, fuzzy
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+"\n"
+"Sinaunang Kasaysayan, Kasaysayan bago mag-1000 A.D.\n"
+"Kasaysayan ng Estados Unidos\n"
+"Kasaysayan ng Mundo, 1000 A.D. hanggang ika-20 na siglo, teksto matapos ng "
+"pangalawang kuwit\n"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Ang halimbawa sa itaas ay lilikha ng 3 kurso na nagngangalang 'Sinaunang "
+"Kasaysayan', 'Kasaysayan ng Estados Unidos' at 'Kasaysayan ng Mundo'. Ang "
+"una at huling kurso ay may paglalarawan na 'Kasaysayan bago mag-1000 A.D.' "
+"at '1000 A.D. hanggang ika-20 na siglo'. Ang pangalawang kurso ay walang "
+"paglalarawan, at ang ekstra na 'teksto matapos ng pangalawang kuwit' sa "
+"pangatlong kurso ay hindi gagamitin."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool courses as CSV"
+msgstr "Magpadala ng mga kursong pang-schooltool bilang CSV"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "Mag-angkat ng mga Seksyon"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+#, fuzzy
+msgid "students"
+msgstr "mga mag-aaral"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Mag-angkat ng mga Kagamitan"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Magdagdag ng Seksyon"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Bagong"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+#, fuzzy
+msgid "Edit"
+msgstr "Palitan"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+#, fuzzy
+msgid "Apply"
+msgstr "Gamitin"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Magdagdag ng Seksyon"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "mga mag-aaral"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Mag-angkat ng mga Grupo"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Bagong Kurso"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Mag-angkat ng mga Grupo"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"<strong>Kinakailangan</strong> na may pangalan ng pangkat ang datos na CSV, "
+"at <strong>maaaring</strong> may kasamang opsyonal na paglalarawan ng "
+"pangkat. Anumang ekstra na impormasyon ay hindi gagamitin."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+#, fuzzy
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Ang halimbawa sa itaas ay lilikha ng 3 kurso na nagngangalang 'Sinaunang "
+"Kasaysayan', 'Kasaysayan ng Estados Unidos' at 'Kasaysayan ng Mundo'. Ang "
+"una at huling kurso ay may paglalarawan na 'Kasaysayan bago mag-1000 A.D.' "
+"at '1000 A.D. hanggang ika-20 na siglo'. Ang pangalawang kurso ay walang "
+"paglalarawan, at ang ekstra na 'teksto matapos ng pangalawang kuwit' sa "
+"pangatlong kurso ay hindi gagamitin."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "Magpadala ng mga kursong pang-schooltool bilang CSV"
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Kalendaryong Pansarili"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "mga mag-aaral"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Bagong Kurso"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Mag-angkat ng mga Tao"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool persons as CSV"
+msgstr "Magpadala ng mga kursong pang-schooltool bilang CSV"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+#, fuzzy
+msgid "Change preferences for ${user}"
+msgstr "Mag-palit ng sariling mga settings."
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Mag-dagdag ng bagong kurso"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Bagong"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+#, fuzzy
+msgid "Showing"
+msgstr "Ipinapakita"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+#, fuzzy
+msgid "of"
+msgstr "ng"
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "na mga aytem"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "Mag-angkat ng mga Kagamitan"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Mag-dagdag ng bagong kurso"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Bagong Kurso"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Mag-angkat ng mga Kagamitan"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"<strong>Kinakailangan</strong> na kasama ang pangalan ng kurso ang datos ng "
+"CSV at <strong>maaaring</strong> kasama din ang opsyonal na paglalarawan ng "
+"kurso. Mga ekstra na impormasyon ay hindi gagamitin."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Ang halimbawa sa itaas ay lilikha ng 3 kurso na nagngangalang 'Sinaunang "
+"Kasaysayan', 'Kasaysayan ng Estados Unidos' at 'Kasaysayan ng Mundo'. Ang "
+"una at huling kurso ay may paglalarawan na 'Kasaysayan bago mag-1000 A.D.' "
+"at '1000 A.D. hanggang ika-20 na siglo'. Ang pangalawang kurso ay walang "
+"paglalarawan, at ang ekstra na 'teksto matapos ng pangalawang kuwit' sa "
+"pangatlong kurso ay hindi gagamitin."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "Magpadala ng mga kursong pang-schooltool bilang CSV"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Mga Kalendaryo"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+#, fuzzy
+msgid "New Term"
+msgstr "Bagong"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "Tignan ang talaan ng oras"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Tignan ang talaan ng oras"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+#, fuzzy
+msgid "Add period"
+msgstr "Magdagdag ng Seksyon"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "Tignan ang talaan ng oras"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+#, fuzzy
+msgid "Term"
+msgstr "Bagong"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Tignan ang talaan ng oras"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "Bagong"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Kalendaryong Talaan"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "Tignan ang talaan ng oras"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Mali ang anyo ng linya ${line_no} (dapat naglalaman ng id ng araw, id ng "
+#~ "saklaw at maaaring may id ng lugar)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Hindi nakita ang mga lugar: ${args}"
+
+#~ msgid "An error occured."
+#~ msgstr "May kamaliang nangyari."

Added: schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3164 @@
+# Turkish translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-03-03 22:16+0000\n"
+"Last-Translator: Erdat <erdat at ibu.edu.tr>\n"
+"Language-Team: Turkish <tr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr "Takma adı"
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr "Bu kişi için kısa bir takma ad"
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr "Birinci E-mail"
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr "İkinci E-mail"
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr "Birinci Telefon"
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr "Tavsiye edilen Telefon numarası"
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "İkinci telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "İkinci Telefon Numarası"
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Web Sitesi"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Web Sitesi veya weblog"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Posta adresi"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Kişiler"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 Kişi"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "kişi sayısı"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Kullanıcı ve/veya şifre yalnış"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Geçerli yıl"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Mevcut Gruplar"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Mart"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Ocak"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Şubat"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Haziran"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mayıs"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Nisan"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Ağustos"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Eylül"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Temmuz"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Bir sonraki gün"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Bugün"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Önceki gün"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Ekim"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Aralık"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Kasım"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Pazartesi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Salı"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Çarşamba"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Perşembe"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Pazar"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Cumartesi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Cuma"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Pts"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Sal"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Çar"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Per"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Cum"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Cts"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Pzr"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Ünvan"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Bütün Gün"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Tarih"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Saat"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Saati 24 saatlik formatta başlat"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Süre"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "Süre Tipi"
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Dakikalar"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Saatler"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Günler"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Konum"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Tanımlama"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Yineleme"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Her gün tekrarlar"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Gün"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Hafta"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Ay"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Yıl"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Her gün tekrar et"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Sıra"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Saymak"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "kadar"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "daima"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Olay sayısı"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "kadar tekrar et"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Hafta Günleri"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Hafta Günler"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Aylık"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "İstisna Günler"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "Aynı Haftagünü"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "1nci"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "4üncü"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "3üncü"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "2nci"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "5inci"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "Son Haftagünü"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Son $(haftagünü)"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Bir hata oluştu"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Geçersiz Zaman"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Bitiş tarihi Başlangıç tarihinde öncedir"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+"Geçersiz Tarih. Lütfen her satırda bir tarih YYYY-AA-GG formatında "
+"belirtiniz."
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Olay Ekle"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Ekle"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Olay Düzenle"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Güncelle"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Güncelleme tarihi ${tarih_saat}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Takvimler"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${haftanın_günü}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Bir sonraki hafta"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Geçerli Hafta"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Önceki Hafta"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr "${ay}, ${yıl} (hafta ${hafta})"
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Bir sonraki ay"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Geçerli Ay"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Önceki Ay"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${ay}, ${yıl}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Hafta ${hafta_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Bir sonraki yıl"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Geçerli yıl"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Önceki yıl"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Veri sağlanmamıştır"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Veri Unicode'a dönüştürülemedi {geçersiz karakterkümesi?)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "CSV dosyası başarıyla alınmıştır"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "CSV dosyası alınamamıştır"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV metni başarıyla alınmıştır"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "CSV Metni alınamamıştır"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Fontipi belirtilmemiştir"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Bilinmeyen Fonttipi"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "CSV verisinde hata, satır ${satır_no)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Unicode dönüşümün başarısız Satır no ${satır_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "CSV verisinde hata, satır ${satır_no)"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+#, fuzzy
+msgid "Persons not found: ${args}."
+msgstr "Kişi biligisi: $(title)"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Değişiklikler Kaydedilmiştir"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "bütün gün"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Konum: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Ayrılmış Kaynaklar: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "Yinelenen"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "den süregelmektedr %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Günlük Takvim %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Haftalık Takvim %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Hafta %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Aylık Tavim %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+"PDF desteği etkin değildir. Sistem Yöneticiniz tarafındn etkinleştirilebilir."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "Takvim %s"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"Okulu veya kuruluş          adlı server'de çalışmakta. Bu, genel takvimde, "
+"tüm sayfaların alt kısmında ve sayfa başlıklarında görüntülenecektir."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "Front Page Takvimi"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr "Siteye-özel takvimini          sitesinin Önsayfası olarak görüntüle."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "Gerekli giriş yapılmamıştır"
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "Gorm girişi geçerli bir dosya nesnesi değildir"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "Geçersi tamsayı verisi"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "Geçersiz metin verisi"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "Geçersiz metne bağlı veri"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "Geçersiz unicode verisi"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "Geçersiz değişken nokta verisi"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "Geçersiz tarihsaat verisi"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "Arkaplana geçilmekte, daemon pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "yardim icin -h %s calistir"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s: daemon mode isletim sisteminiz tarafindan desteklenmemektedir."
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "Konfigürasyon okunuyor %s"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Yönetici"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr "Baslangic saati: %.3f sec real, %.3f sec CPU"
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+"Veri tabanı başlatılamadı:\n"
+"%s"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"Belki başka %s bir uygulama tarafından kullanılmaktadır."
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"Dikkat: Reportlab kütüphanesi bulunamadı\n"
+"PDF desteği etkin değildir."
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Dikkat: Font dizini %s'mevcut değildir.\n"
+"PDF desteği etkin değildir."
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"Dikkat: Font%s'mevcut değildir.\n"
+"PDF desteği etkin değildir."
+
+#: /src/schooltool/app/main.py:71
+#, fuzzy
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+"\n"
+"Kullanım: %s [options]\n"
+"Seçenekler:\n"
+"  -c, --config xxx varsayılan dosya yerine bu konfigürasyon dosyasını "
+"kullan\n"
+"  -h, --bu mesajın görüntülenmesine yardım et\n"
+"  -, --daemon başladıktan sonra arka plana geç\n"
+"  -r, --geri yükleme yöneticisini varsayılan şifre ile geri yükle\n"
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"Konfigürasyon dosyasında depolama belirtilmemiştir.\n"
+"\n"
+"Eğer varsayılan konfigürasyon dosyasını kullanıyorsanız, lütfen şimdi "
+"düzenleyiniz\n"
+"ve ZODV depolama bölgesinden birini kullan.\n"
+
+#: /src/schooltool/app/main.py:93
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"Bu bir SchoolBell 1.0 Veri tabanı dosyası değildir, sonlandırılıyor.\n"
+
+#: /src/schooltool/app/main.py:98
+#, fuzzy
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Bu bir SchoolBell 1.0 Veri tabanı dosyası değildir, sonlandırılıyor.\n"
+"Lütfen Database güncelleme script'i çalıştırınız.\n"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Ünvan"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+#, fuzzy
+msgid "Title of the commendation."
+msgstr "Not başlığı."
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Grup"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Süre"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Tarih"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Kaynak Envanteri"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Yeni Kaynak Ekle"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Eksik bilgi girilmiştir"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Başlıklar boş olamaz"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Geçerli Grup"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Mevcut Gruplar"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Geçerli Ay"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Mevcut Gruplar"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Gruplar"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Geçerli Grup"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Mevcut Gruplar"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Kaynaklar Al"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Mevcut Kaynaklar"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Kişi envanteri"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Yeni kişi ekle"
+
+#: /src/schooltool/course/interfaces.py:37
+#, fuzzy
+msgid "Title of the course."
+msgstr "Kaynak başlığı"
+
+#: /src/schooltool/course/interfaces.py:42
+#, fuzzy
+msgid "Description of the course."
+msgstr "Kaynak tanımlaması"
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+#, fuzzy
+msgid "Description of the section."
+msgstr "Grup tanımlaması"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+#, fuzzy
+msgid "Weight"
+msgstr "Web Sitesi"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr "İptal et"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Bilgileri değiştir"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Üyelik Değiştir"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Tercihleri değiştir"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "İrtibat bilgileri değiştir ${kullanıcı}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+#, fuzzy
+msgid "School data"
+msgstr "Schooltool"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "İrtibat bilgileri değiştir ${kullanıcı}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "İrtibat bilgileri"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Kullanıcı Adı"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Parola"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Bu kullanıcı adı daha önce başkası tarafından kullanılmıştır"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Uygula"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+#, fuzzy
+msgid "Primary language"
+msgstr "Birinci Telefon"
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Önceki"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Olay bilgisi"
+
+#: /src/schooltool/demographics/interfaces.py:239
+#, fuzzy
+msgid "Name"
+msgstr "Takma adı"
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Başlar"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Cts"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+#, fuzzy
+msgid "Home phone"
+msgstr "Zaman Dilimi"
+
+#: /src/schooltool/demographics/interfaces.py:275
+#, fuzzy
+msgid "Work phone"
+msgstr "İkinci telefon"
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr "Notlar"
+
+#: /src/schooltool/demographics/interfaces.py:295
+#, fuzzy
+msgid "Text"
+msgstr "Sonraki"
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Olay sayısı"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "isim düzenle"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "isim düzenle"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "isim düzenle"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "Tercihlerim"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Adı Soyadı"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Resim"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Resim (JPEG formatında)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Yeni Not"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "CSV metni başarıyla alınmıştır"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Parola başarıyla değiştirildi"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Parola başarıyla değiştirildi"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Örnek:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Kişi bilgileri"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Grup envanteri"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Yeni Grup ekle"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "ait Gruplar ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+#, fuzzy
+msgid "Members of ${group}"
+msgstr "'nın  Üyeleri ${title}"
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr "Geçerli Üyeler"
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr "Üyeler ekle"
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Grup başlığı"
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Grup tanımlaması"
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Kaynak Envanteri"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Yeni Kaynak Ekle"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Önceki Hafta"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "CSV metni başarıyla alınmıştır"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Parola başarıyla değiştirildi"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Geçerli Hafta"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Parola başarıyla değiştirildi"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Kullanıcı"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+#, fuzzy
+msgid "Title of the record."
+msgstr "Kaynak başlığı"
+
+#: /src/schooltool/level/interfaces.py:148
+#, fuzzy
+msgid "A detailed description of the record."
+msgstr "Kaynak tanımlaması"
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Başlar"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+#, fuzzy
+msgid "Title of the level."
+msgstr "Not başlığı."
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Bir sonraki hafta"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+#, fuzzy
+msgid "Outcome of the level."
+msgstr "Not başlığı."
+
+#: /src/schooltool/level/promotion.py:130
+#, fuzzy
+msgid "fail"
+msgstr "Günlük"
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr "Not başlığı."
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr "İçerik"
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Not içeriği"
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr "gizlilik"
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "kullanıcı adı boş olamaz"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Adı Soyadı boş olamaz"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Mükerrer Kullanıcı Adı: ${kullanıcıadı}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Yeni Parola"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Parolayı değiştir"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Zaman Dilimi"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr "Takviminizi görüntülemek için kullanılan Zaman  Ayarı"
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Saat Formatı"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "HH:MM"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "HH:MM: am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Tarih Formatı"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "MM/DD/YY"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "YYYY-MM-DD"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr "Gün Ay, Yıl"
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr "Haftanın başlangıcı:"
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr "Günleri Pazar veya Pazartesinden başlat"
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Takvimi görüntüle"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Görünen gereken İsim"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Kaynak Envanteri"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Yeni Kaynak Ekle"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Kaynak Envanteri"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Yeni Kaynak Ekle"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Kaynak başlığı"
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Kaynak tanımlaması"
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr "Bir bölge."
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr "Bu kaynağı bir bölge olarak göster, bir okul sınıfı gibi"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Eksik bilgi girilmiştir"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Eksik bilgi girilmiştir"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Eksik bilgi girilmiştir"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr "Takvimim"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Daha..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Takvimler"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "SchoolBell'e Hoşgeldiniz"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Yönlendirme"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Resim"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Kullanıcı adı:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "isim düzenle"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Bu kişinin adını, resmini veya parolasını değiştir."
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr "Kişi biligisi: $(title)"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr "Bu kişinin üyeliğini yönet"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr "grupları düzenle"
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+"\n"
+"Bu bir SchoolBell 1.0 Veri tabanı dosyası değildir, sonlandırılıyor.\n"
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Bu bir SchoolBell 1.0 Veri tabanı dosyası değildir, sonlandırılıyor.\n"
+"Lütfen Database güncelleme script'i çalıştırınız.\n"
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "üst"
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Değişiklikler Kaydedilmiştir"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Detayları Değiştir"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Yeni Not"
+
+#: /src/schooltool/term/browser/term.py:55
+#, fuzzy
+msgid "Terms"
+msgstr "öğeler"
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Yeni kişi ekle"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Başlar"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "İstisna Günler"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+"Geçersiz Tarih. Lütfen her satırda bir tarih YYYY-AA-GG formatında "
+"belirtiniz."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Yeni Kaynak Ekle"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "kişi sayısı"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+#, fuzzy
+msgid "Days of the week"
+msgstr "Not içeriği"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "Aynı Haftagünü"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "isim düzenle"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Not"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "Bilinmeyen Fonttipi"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Yeni Resim"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Küçü Resim (JPEG formatında ve yaklaşık 48x48 piksel çözünürlükte"
+
+#~ msgid "Clear photo"
+#~ msgstr "Resmi Sil"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Resmi silmek için burakı tıklayınız"
+
+#~ msgid "Verify password"
+#~ msgstr "Parolayı Kontrol et"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Parolalar uyuşmadı"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Şifre uyuşmadı"
+
+#~ msgid "View"
+#~ msgstr "Görüntüle"
+
+#~ msgid "Edit"
+#~ msgstr "Düzenle"
+
+#~ msgid "Create new objects"
+#~ msgstr "Yeni bir obje oluştur"
+
+#~ msgid "Add events"
+#~ msgstr "Olay ekle"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Olay Değiştir/Sil"
+
+#~ msgid "Control access"
+#~ msgstr "Kontrol Girişi"
+
+#~ msgid "Manage membership"
+#~ msgstr "Üyeliği yönet"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Yetkili kullanıcı"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Yetkisiz kullanıcı"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Ayar Girişi"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Özellikleri Değiştir"
+
+#~ msgid "New Person"
+#~ msgstr "Yeni Kişi"
+
+#~ msgid "Import Persons"
+#~ msgstr "Kişi Al"
+
+#~ msgid "Add a Group"
+#~ msgstr "Grup Ekle"
+
+#~ msgid "New Group"
+#~ msgstr "Yeni Grup"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Grup Bilgisi Düzenle"
+
+#~ msgid "A Group"
+#~ msgstr "Bir Grup"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "SchoolBell Grup"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Üye Ekle/Kaldır"
+
+#~ msgid "Import Groups"
+#~ msgstr "Grup Al"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Kaynak Ekle"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Kaynak Bilgisi Düzenle"
+
+#~ msgid "New Resource"
+#~ msgstr "Yeni Kaynak"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "SchoolBell Kaynağı"
+
+#~ msgid "A Resource"
+#~ msgstr "Bir Kaynak"
+
+#~ msgid "Actions"
+#~ msgstr "Eylemler"
+
+#~ msgid "View Calendar"
+#~ msgstr "Takvimi Görüntüle"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Takvim (Günlük)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Takvim (Günlük, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Takvim (Haftalık)"
+
+#~ msgid "SchoolBell"
+#~ msgstr "SchoolBell"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Takvim (Haftalık, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Takvim (Aylık)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Takvim (Aylık, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Takvim (Yıllık)"
+
+#~ msgid "Atom View"
+#~ msgstr "Atom Görünüm"
+
+#~ msgid "iCalendar"
+#~ msgstr "iTakvim"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Sebest/Meşgul"
+
+#~ msgid "New Event"
+#~ msgstr "Yeni Olay"
+
+#~ msgid "Open in iCal"
+#~ msgstr "iCal de Aç"
+
+#~ msgid "Edit Event"
+#~ msgstr "Olay Düzenle"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Sayfa Özelliklerini Değiştir"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Bu yetki, isim görüntüleme, ünvanlar, resimler, objelerin listelenmesine "
+#~ "ve diğer bilgiler için izin verir."
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr ""
+#~ "İsimler, Ünvanlar, tanımlamaları, resimleri vs. düzenlenmesine izin verir."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr ""
+#~ "Kullanıcıya, yeni kişiler, gruplar ve kaynaklar oluşturmasına izin verir."
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr ""
+#~ "Kişilerin takvimlerini, gruplarını ve kaynaklarını görüntelemesine izin "
+#~ "verir."
+
+#~ msgid "Allows adding new events to calendars."
+#~ msgstr "Takvime yeni olayların eklenmesine izin verir."
+
+#~ msgid "Allows editing and delete events in calendars."
+#~ msgstr "Takvimdeki olayları düzenlenmesine ve silmesine izin verir."
+
+#~ msgid "Access control for ${title}"
+#~ msgstr "için giriş kontrölü $(title)"
+
+#~ msgid "Allows the user to use this form (Access control)"
+#~ msgstr "Kullanıcıya bu formu kullanmasına izin verir"
+
+#~ msgid ""
+#~ "Allows the user to add persons, groups and resources to groups. In order "
+#~ "to add something to a group, the user needs this permission only on the "
+#~ "group. Keep in mind that joining groups has security implications."
+#~ msgstr ""
+#~ "Kullanıcıya, gruplara kişi, grup ve kaynaklar eklemesine izin verir. "
+#~ "Grup'a herhangi birşey eklemek için kullanıcı bu izine sadece grup'ta "
+#~ "ihtiyaç duyar. Gruplara katılmak güvenlik aşamasından geçtiğini "
+#~ "unutmayınız."
+
+#~ msgid "Permissions for Groups"
+#~ msgstr "Gruplar için izin"
+
+#~ msgid "Access control"
+#~ msgstr "Giriş kontrolü"
+
+#~ msgid "Set Access"
+#~ msgstr "Giriş belirlemek"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Kullanıcı İzinleri"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Yetkiler, hiyerarşi içeriğine dahildir. Örneğin: Bir Kullanıcıya "
+#~ "Kullanıcı dizininde Takvim Görüntüleme yetkisi atadıysanız, bu kullanıcı "
+#~ "tüm kullanıcıların takvimlerini görüntüleyebilir. Eğer, kullanıcın sadece "
+#~ "belirli kaynaklardan Takvim görüntüleme yetkisi vermek istiyorsanız, bu "
+#~ "kullanıcı için bir kaç kaynaktan Takvimin görüntüle yetkisi "
+#~ "atayabilirsiniz."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr ""
+#~ "İlgili açıklamaları ile yeki isimleri gösteren Liste aşağıda "
+#~ "belirtilmiştir."
+
+#~ msgid "Change site preferences"
+#~ msgstr "Sayfa tercilerini değiştir"
+
+#~ msgid "General preferences"
+#~ msgstr "Genel tercihler"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Sayfa tercihlerini düzenle"
+
+#~ msgid "[Schooltool.org]"
+#~ msgstr "[Schooltool.org]"
+
+#~ msgid "Events for"
+#~ msgstr "Olaylar:"
+
+#~ msgid "atom_description"
+#~ msgstr "atom_tanımlama"
+
+#~ msgid "atom_enabled"
+#~ msgstr "atom_etkin"
+
+#~ msgid "atom_more_info"
+#~ msgstr "atom_dahafazla_bilgi"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Atom bilgilerimi onayla"
+
+#~ msgid "[Valid Atom]"
+#~ msgstr "[Gecerli Atom]"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Konum: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Daha fazla Takvimler görüntülemek icin seciniz"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr ""
+#~ "Birden fazla takvimi aynı anda seçmek için Ctrl ve Shift tuşlarını basılı "
+#~ "tutunuz."
+
+#~ msgid "Public Calendar"
+#~ msgstr "Genel Takvim"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "Sayfaya mahsus Takvim"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Görüntülemek istediğiniz Takvimi seçiniz"
+
+#~ msgid "People"
+#~ msgstr "Kişiler"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Görüntüleyebileceğiniz takvimli kişiler yok."
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Görüntüleyebileceğiniz takvimli gruplar yok."
+
+#~ msgid "There are no resources with calendars accessible to you."
+#~ msgstr "Görüntüleyebileceğiniz takvimli kaynaklar yok."
+
+#~ msgid "Showing"
+#~ msgstr "Görüntülenmekte"
+
+#~ msgid "of"
+#~ msgstr "den"
+
+#~ msgid "Are you sure you want to delete selected items?"
+#~ msgstr "Seçtiğiniz nesneyi silmek istediğinizden eminmisiniz?"
+
+#~ msgid "You have not selected any items."
+#~ msgstr "Herhangi bir nesne seçmediniz."
+
+#~ msgid "delete-button"
+#~ msgstr "silme-butonu"
+
+#~ msgid "Exception"
+#~ msgstr "exception"
+
+#~ msgid "Traceback"
+#~ msgstr "Geriye dönük iz sürümü"
+
+#~ msgid "Server Error"
+#~ msgstr "Server Hatası"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Bir iç server hatası oluştu. Bu büyük ihtimalle SchoolBell'de bir bug "
+#~ "buldunuz. Lütfen bu bug'ı <a href=\"http://issues.schooltool.org\"> the "
+#~ "issue tracker bildiriniz."
+
+#~ msgid "All day event"
+#~ msgstr "Günlük olay"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Bu bir yinelenen olaydır."
+
+#~ msgid "Ends"
+#~ msgstr "Biter"
+
+#~ msgid "edit event"
+#~ msgstr "olay düzenle"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Bu olayın detaylarını düzenle"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "zamanlanmış kaynaklar"
+
+#~ msgid "edit resources"
+#~ msgstr "Kaynakları düzenle"
+
+#~ msgid "delete event"
+#~ msgstr "olay sil"
+
+#~ msgid "Event details"
+#~ msgstr "Olay detayları"
+
+#~ msgid "Book Resources"
+#~ msgstr "Kitap Kaynakları"
+
+#~ msgid "Update form"
+#~ msgstr "Güncelleme formu"
+
+#~ msgid "day"
+#~ msgstr "gün"
+
+#~ msgid "week"
+#~ msgstr "hafta"
+
+#~ msgid "month"
+#~ msgstr "ay"
+
+#~ msgid "year"
+#~ msgstr "yıl"
+
+#~ msgid "Weekly"
+#~ msgstr "Haftalık"
+
+#~ msgid "This section only applies when weekly recurrence is selected."
+#~ msgstr "Bu bölge sadece haftalık yineleme seçildiğinde uygulanır."
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr "Bu bölge sadece haftalık yineleme seçildiğinde uygulanır."
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Gün ${aygün} her ayın"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${haftagünü} her ayın"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DINAMIK_ICERIK} her ayın"
+
+#~ msgid "Repeat"
+#~ msgstr "Tekrarla"
+
+#~ msgid "times"
+#~ msgstr "kere"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Sürekli tekrarla"
+
+#~ msgid "${DYNAMIC_CONTENT}"
+#~ msgstr "${DINAMIK_ICERIK}"
+
+#~ msgid "Book resources"
+#~ msgstr "Kitap kaynakları"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "için Kaynak ayır ${baslik}"
+
+#~ msgid "Title:"
+#~ msgstr "Başlık"
+
+#~ msgid "Starts:"
+#~ msgstr "Başlar"
+
+#~ msgid "Ends:"
+#~ msgstr "Biter"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Bu olay yinelenen bir olaydir!"
+
+#~ msgid "Resource Booking"
+#~ msgstr "Kaynak Ayırmak"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Çakışan olaylar"
+
+#~ msgid "Book"
+#~ msgstr "Ayırmak"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a group title and <strong>may</"
+#~ "strong> include an optional group description. Any extra information will "
+#~ "be discarded."
+#~ msgstr ""
+#~ "CSV verisi bir grup başlığı içermek <strong>zorundadır</strong> ve "
+#~ "opsiyonel olarak grup tanımlaması <strong>içerebilir</strong>."
+
+#~ msgid ""
+#~ "\n"
+#~ "LUG, Linux Users Group\n"
+#~ "Chess Club\n"
+#~ "Sports Club, After-school sports club, <em>text after a second comma</"
+#~ "em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "LUG, Linux Kullanıcıları Grubu\n"
+#~ "Satranç Kulübü\n"
+#~ "Sporlar Kulübü, Okul-sonrası sporlar kulübü, <em>virgülden sonraki metin</"
+#~ "em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+#~ "'Sports Club'. The first and last group will have the descriptions 'Linux "
+#~ "Users Group' and 'After-school sports club' respectively. The 'Chess "
+#~ "Club' group will have no description, and the extra \"text after a second "
+#~ "comma\" text on the third group will be ignored."
+#~ msgstr ""
+#~ "Yukarıda verilen örnek ile 3 grup başlığı 'LUG', 'Satranç Kulübü' ve "
+#~ "Sporlar Kulübü, oluşturulmaktadır. İlk grup ve son grup 'Linux "
+#~ "Kullanıcıları Grup' ve 'Okul-sonrası sporlar kulübü' tanımlamaları "
+#~ "içereceklerdir. 'Satranç Kulübü'nde herhangi bir tanımlama içermeyecektir "
+#~ "ve ikinci virgülden sonraki üçüncü gruba ait ilave metin dikkate "
+#~ "alınmayacaktır."
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Schooltool gruplarını CSV olarak güncelle"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "CSV Dosyasını Güncelle"
+
+#~ msgid "CSV File"
+#~ msgstr "CSV Dosyası"
+
+#~ msgid "Charset:"
+#~ msgstr "Fonttipi"
+
+#~ msgid "Unicode (UTF-8)"
+#~ msgstr "Unicode (UTF-8)"
+
+#~ msgid "Western (ISO-8859-1)"
+#~ msgstr "Batı (ISO-8859-1)"
+
+#~ msgid "Western (ISO-8859-15)"
+#~ msgstr "Batı (ISO-8859-15)"
+
+#~ msgid "Western (Windows-1252)"
+#~ msgstr "Batı (Windows-1252)"
+
+#~ msgid "Other (please specify)"
+#~ msgstr "Diğer (lütfen belirtiniz)"
+
+#~ msgid "Other charset: ${other_charset}"
+#~ msgstr "Diğer Fonttipi: ${diger_fonttipi}"
+
+#~ msgid "Input CSV Data"
+#~ msgstr "CSV Verisini giriniz"
+
+#~ msgid "CSV Data"
+#~ msgstr "CSV Verisi"
+
+#~ msgid "Members"
+#~ msgstr "Üyeler"
+
+#~ msgid "edit members"
+#~ msgstr "üyleri düzenle"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Bu grupa üye olan kişileri değiştir"
+
+#~ msgid "Remove"
+#~ msgstr "Kaldır"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Bu sayfada giriş yapmaya yetkili değilsiniz. Sayfadaki geri butonunu "
+#~ "tıklayarak geri gidip, daha yetkili bir kullanıcının giriş yapmasını "
+#~ "isteyebilirsiniz."
+
+#~ msgid "Please log in"
+#~ msgstr "Lütfen giriş yapın"
+
+#~ msgid "Login"
+#~ msgstr "Giriş"
+
+#~ msgid "User Information"
+#~ msgstr "Kullanıcı Bilgisi"
+
+#~ msgid "L"
+#~ msgstr "L"
+
+#~ msgid "Your session has expired."
+#~ msgstr "Oturumuz zaman aşımına uğradı"
+
+#~ msgid "There are none."
+#~ msgstr "Bulunmamıştır"
+
+#~ msgid "R"
+#~ msgstr "R"
+
+#~ msgid "submit-button"
+#~ msgstr "gönderme-butonu"
+
+#~ msgid "There are none to add."
+#~ msgstr "Eklenecek bir şey yok"
+
+#~ msgid "Find Now"
+#~ msgstr "Şimdi bul"
+
+#~ msgid "Clear"
+#~ msgstr "Temizle"
+
+#~ msgid "A"
+#~ msgstr "A"
+
+#~ msgid "cancel-button"
+#~ msgstr "iptal-butonu"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Kim bu notu görüntüleyebilir"
+
+#~ msgid "Private"
+#~ msgstr "Özel"
+
+#~ msgid "Public"
+#~ msgstr "Genel"
+
+#~ msgid "Add note"
+#~ msgstr "Not ekle"
+
+#~ msgid "add-button"
+#~ msgstr "Ekleme-butonu"
+
+#~ msgid "Delete"
+#~ msgstr "Sil"
+
+#~ msgid "( p )"
+#~ msgstr "( p )"
+
+#~ msgid "Please note the following:"
+#~ msgstr "Lütfen aşağıdakini not ediniz:"
+
+#~ msgid "You might have misspelled the url"
+#~ msgstr "url'yi yalnış girmiş olabilirsiniz"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Var omayan bir sayfaya giriş yapamya çalıyor olabilirsiniz."
+
+#~ msgid "Not Found"
+#~ msgstr "Bulunamadı"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "Giriş yapmaya çalıştığınız sayfa mevcut değildir."
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "CSV verisi bir kullanıcı adı ve isim soyisim içermek <strong> zorundadır "
+#~ "</strong> . Opsiyonel bir parola <strong>dahil edilebilir.</strong>"
+
+#~ msgid ""
+#~ "\n"
+#~ "jjones, Jimmy Jones\n"
+#~ "jbjones, Jim Bob Jones, r2m45J\n"
+#~ "howard, Howard\n"
+#~ msgstr ""
+#~ "\n"
+#~ "tseleker, Tarkan Seleker\n"
+#~ "tmseleker, Tarkan Murat Seleker, r2m45J\n"
+#~ "tarkan, Tarkan\n"
+
+#~ msgid ""
+#~ "The above example will create three users, 'jjones', 'jbjones' and "
+#~ "'howard'. Of the three, only 'jbjones' has a password ('r2m45J') and will "
+#~ "be able to login to the system. Note that passwords must be sent in plain "
+#~ "text."
+#~ msgstr ""
+#~ "Yukarıdaki örnek üç kullanıcı oluşturacaktır, 'jjones', 'jbjones' and "
+#~ "'howard'. Bu üç tansinin sadece 'jbjones' olanın parolası var ('r2m45J') "
+#~ "ve sisteme giriş yapabilecektir. Parolanın düz metin olarak gönderilmek "
+#~ "zorunda olduğunu dikkat ediniz."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Schooltool kişileri CSV olarak yükle."
+
+#~ msgid "Details"
+#~ msgstr "Detaylar"
+
+#~ msgid "edit details"
+#~ msgstr "Detayları düzenle"
+
+#~ msgid "Modify this person's details"
+#~ msgstr "Bu kişinin detaylarını değiştir"
+
+#~ msgid "Add person"
+#~ msgstr "Kişi ekle"
+
+#~ msgid "Add to groups"
+#~ msgstr "Gruplara ekle"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Özür dileriz, kendi kullanıcı hesabını silemezsiniz"
+
+#~ msgid "Edit contact information"
+#~ msgstr "İrtibat bilgilerini düzenle"
+
+#~ msgid "Edit person"
+#~ msgstr "Kişiyi düzenle"
+
+#~ msgid "Calendar Preferences"
+#~ msgstr "Takvim Tercihleri"
+
+#~ msgid "Edit person preferences"
+#~ msgstr "Kişi tercihlerini düzenle"
+
+#~ msgid "You are trying to delete a repeating event."
+#~ msgstr "Yinelenen bir olayı silmeye çalışıyorsunuz"
+
+#~ msgid "Current"
+#~ msgstr "Geçerli"
+
+#~ msgid "Future"
+#~ msgstr "Gelecek"
+
+#~ msgid "All"
+#~ msgstr "Hepsi"
+
+#~ msgid "Deleting a repeating event (${event_title})"
+#~ msgstr "Kenidni yineleeyen bir olay silinmekte"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> include a resource title and <strong>may</"
+#~ "strong> include an optional resource description. Any extra information "
+#~ "will be discarded."
+#~ msgstr ""
+#~ "CSV verisi bir kanynak adı ve başlık içermek <strong>zorundadır </strong> "
+#~ "Opsiyonel olarak bir kaynak izahatnamesi içerebilir. Herhangi başka bir "
+#~ "bilgi bulundurulmayacaktır."
+
+#~ msgid ""
+#~ "\n"
+#~ "PRJ302, Overhead Projector #302\n"
+#~ "Main Auditorium\n"
+#~ "LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PRJ302, Tepe-Göz #302\n"
+#~ "Ana oditoryum\n"
+#~ "LC-805, Dizüstü Bilgisayar #805, <em>ikinci virgülden sonra gelen metin</"
+#~ "em>\n"
+
+#~ msgid ""
+#~ "The above example will create 3 resources titled 'PRJ302', 'Main "
+#~ "Auditorium' and 'LC-805'. The first and last resource will have the "
+#~ "descriptions 'Overhead Projector #302' and 'Laptop Computer #805' "
+#~ "respectively. The \"Main Auditorium\" resource will have no description, "
+#~ "and the \"text after a second comma\" text on the third resource will be "
+#~ "ignored."
+#~ msgstr ""
+#~ "Üstteki gösterilen örnek 3 tane 'PRJ302' isimli kaynak oluşturacaktır. "
+#~ "'Ana Oditoryum' ve 'LC-805'. İlk ve son kaynak 'Tepe-Göz #302' ve "
+#~ "'Dizüstü Bilgisayar #805' tanımlamaları içerecektir. \"Ana \"Oditoryum\" "
+#~ "herhangi bir tanımlama içermeyecektir\". Üçüncü kaynaktaki metin dikkate "
+#~ "alınmayacaktır."
+
+#~ msgid "Upload schooltool resources as CSV"
+#~ msgstr "Schooltool kaynakları CSV olarak güncelle"
+
+#~ msgid "There are ${num_errors} input errors."
+#~ msgstr "There area $(num_erros) giriş hataları var."
+
+#~ msgid "Identifier (optional)"
+#~ msgstr "tanımlayıcı (opsiyonel)"
+
+#~ msgid ""
+#~ "<p> ${DYNAMIC_CONTENT} Server Running SchoolBell <span>${DYNAMIC_CONTENT}"
+#~ "</span> &copy; The Shuttleworth Foundation 2003 - <span>2005</span>: "
+#~ "Supporting Social Innovation. </p> <p> SchoolTool&trade; is a Trademark "
+#~ "of The Shuttleworth Foundation. </p>"
+#~ msgstr ""
+#~ "<p> ${DYNAMIC_CONTENT} Server SchoolBell'i çalıştırmakta<span>"
+#~ "${DYNAMIC_CONTENT}</span> © Shuttleworth Kuruluşu 2003 - <span>2005</"
+#~ "span>: Sosyal yenilikler içermekte. </p> <p> SchoolTool™ Shuttleworth "
+#~ "Kuruluşunun bir tescilli markasıdır. </p>"
+
+#~ msgid "Printable version"
+#~ msgstr "Yazdırılabilinir versiyonu"
+
+#~ msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+#~ msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#~ msgid "View daily calendar"
+#~ msgstr "Günlük takvimi görüntüle"
+
+#~ msgid "View weekly calendar"
+#~ msgstr "Haftalık Takvimi görüntüle"
+
+#~ msgid "View monthly calendar"
+#~ msgstr "Aylık Takvimi görüntüle"
+
+#~ msgid "View yearly calendar"
+#~ msgstr "Yıllık Takvimi görüntüle"
+
+#~ msgid "Yearly"
+#~ msgstr "Yıllık"
+
+#~ msgid "Calendar for ${title} - ${calendar_title}"
+#~ msgstr "için Takvim ${calendar_title}"
+
+#~ msgid "Jump To ..."
+#~ msgstr "Geçiş yap"
+
+#~ msgid "SchoolTool"
+#~ msgstr "SchoolTool"
+
+#~ msgid "Tomorrow's Events"
+#~ msgstr "Yarinki olay"
+
+#~ msgid "Log in"
+#~ msgstr "Giriş"
+
+#~ msgid "User:"
+#~ msgstr "Kullanıcı:"
+
+#~ msgid "Log Out"
+#~ msgstr "Çıkış"
+
+#~ msgid "Edit Info"
+#~ msgstr "Düzenleme bilgisi"
+
+#~ msgid "Add Event"
+#~ msgstr "Olay ekle"
+
+#~ msgid "Modify Event"
+#~ msgstr "Olay değiştir"
+
+#~ msgid "Set up access"
+#~ msgstr "Giriş ayarı"
+
+#~ msgid "Unauthenticated Users"
+#~ msgstr "Yetkisiz Kullanıcı"
+
+#~ msgid "Unauthenticated User"
+#~ msgstr "Yetkisiz Kullanıcı"
+
+#~ msgid "Authenticated Users"
+#~ msgstr "Yetkili Kullanıcı"
+
+#~ msgid "All Users"
+#~ msgstr "Tüm Kullanıcılar"
+
+#~ msgid "%s: warning: ignored configuration option '%s'"
+#~ msgstr "%s: Uyarı: Dikkate alimayan konfigürasyon opsiyonu %s'"
+
+#~ msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+#~ msgstr "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+
+#~ msgid "<span>x</span> &raquo;"
+#~ msgstr "<span>x</span> &raquo;"

Added: schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/tr/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5045 @@
+# Turkish translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-09-16 01:06+0000\n"
+"Last-Translator: gongan <gokhan at 1mayis.net>\n"
+"Language-Team: Turkish <tr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr "İkinci Telefon"
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr "İkinci telefon numarası."
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr "Web Sitesi"
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr "Web Sitesi veya Web Günlüğü"
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr "Posta Adresi"
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Kişiler"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 kişi"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} kişi"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "Kullanıcı ismi veya şifre yanlış"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Mart"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Ocak"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Şubat"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Haziran"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Mayıs"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Nisan"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Ertesi gün"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Bugün"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Önceki gün"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "Pazartesi"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "Salı"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "Çarşamba"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "Perşembe"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr "Pazar"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "Cumartesi"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "Cuma"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Pzt"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Başlık"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "Dakika"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "Saat"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "Gün"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "Yer"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "Tanım"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "Ay"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "Yıl"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "ebediyen"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Etkinlik Sayısı"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "İş günleri"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "İş günü"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "Aylık"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "İstisna günler"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "aynı iş günü"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Geçersiz saat"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Bitiş tarihi başlangıç tarihinden önce"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Etkinlik ekle"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "Ekle"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Etkinliği Düzelt"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "Güncelle"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Güncelleme: ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "Takvim"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Gelecek hafta"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Bu hafta"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Geçen sene"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "İşlemler"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "Takvim"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "Takvim"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "Takvim"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "Takvim"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "Göster"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "Takvim"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "Etkinlik ekle"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "Etkinliği Düzelt"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "Giriş Yap"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Gezinme"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "İşlemler"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "Takvim"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "Veri sağlanmamış"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "Veri, unicode'a dönüştürülemedi (yanlış karakter kümesi -charset-?)."
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "CSV metni başarıyla aktarıldı."
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "CSV metni aktarımı başarısız oldu"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Karakter kümesi (charset) tanımlanmamış"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "Bilinmeyen karakter kümesi (charset)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Unicode'a dönüşüm, ${line_no} no'lu satırda başarısız oldu"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "2. satır boş değil"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "Dönem ${term} mevcut değil."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "Zaman tablosu şeması (${schema}) bulunmuyor."
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Zaman tablosu CVS verisinde hata var, satır ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "Seçilen şemada (${args}) belirtilen gün kimlikleri tanımlanmamış"
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "Seçilen günlerde (${args}) periyotlar tanımlanmamış."
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "Kişiler bulunamadı: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "Dersler bulunamadı: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "Bölümler bulunamadı: ${args}."
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "Geçersiz kayıtlar: ${args}."
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Değişiklikler kaydedildi."
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "tüm gün"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Yer: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Hafta %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+#, fuzzy
+msgid "Change site preferences"
+msgstr "Tercihleri Değiştir"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+#, fuzzy
+msgid "General preferences"
+msgstr "Takvim Tercihleri"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr "Takvim Tercihleri"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+#, fuzzy
+msgid "Edit site preferences"
+msgstr "Tercihlerim"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+#, fuzzy
+msgid "Edit attendance preferences"
+msgstr "Takvim Tercihleri"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "Tanım"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "...'e geç"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "Yarınki Olaylar"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "Yazdırılabilir versiyon"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "Günlük takvimi görüntüle"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "Günlük"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "Haftalık takvimi görüntüle"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "Haftalık"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "Aylık takvimi görüntüle"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "Yıllık takvimi görüntüle"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "Yıllık"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "${title} - ${calendar_title} için Takvim"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+#, fuzzy
+msgid "Cal"
+msgstr "Vazgeç"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "Kişisel Takvim"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "Ders Programı Çizelgesi"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "Takvimim"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Takvimler"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+#, fuzzy
+msgid "More..."
+msgstr "Daha..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "Takvim"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "Takvimi göster"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr "A"
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr "silme butonu"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "iptal-butonu"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr "R"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr "Sil"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr "Hiç yok"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr "Şimdi Bul"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "Takvim"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+#, fuzzy
+msgid "There are none to add."
+msgstr "Hiç yok"
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "Etkinlik ekle"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "Detaylar"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "Başlangıç tarihi"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "Etkinliği Düzelt"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "Change the details of this event"
+msgstr "Bu bölüm için öğretmenleri değiştir."
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "grupları düzenle"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "Etkinlikleri değiştir/sil"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+#, fuzzy
+msgid "Event information"
+msgstr "Bölüm Bilgisini Düzenle"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "Detaylar"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "Güncelle"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "Bugün"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "Gelecek hafta"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "Ay"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "Yıl"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "Takvimi göster"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "ebediyen"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "Başlık"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+#, fuzzy
+msgid "Resource Booking"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "Yer: %s"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "Dersler"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "SchoolTool'a Hoşgeldiniz"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+#, fuzzy
+msgid "User Information"
+msgstr "Bölüm Bilgisini Düzenle"
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+#, fuzzy
+msgid "Log in"
+msgstr "Giriş Yap"
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "Bu hafta"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "Diğer (lütfen belirtin)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "Diğer karakter setleri: ${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "CSV Verisi Gir"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV Verisi"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "gönderme butonu"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+#, fuzzy
+msgid "Import Timetable"
+msgstr "Ders Programı"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "SchoolTool Zaman tablosunu CSV olarak upload et"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "Örnek:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+#, fuzzy
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+"\n"
+"\"2005-Güz\",\"Üç gün\"\n"
+"\"\",\"\",\"\"\n"
+"\"Felsefe\",\"lorch\"\n"
+"\"Pazartesi\",\"A\",\"Oda137\"\n"
+"\"Pazartesi\",\"B\"\n"
+"\"Salı\",\"C\",\"Oda138\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"Edebiyat\",\"guzman\"\n"
+"\"Çarşamba\",\"B\"\n"
+"\"Çarşamba\",\"C\",\"Oda139\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "CSV dosyasını upload et."
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV Dosyası"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "Karakter kümesi (Charset)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "Yardım için %s -h yazın."
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s Yönetici"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"Bu bir SchoolTool 0.10 veritabanı dosyası değildir, durduruluyor.\n"
+"\n"
+"Lütfen; tekil, varitabanı güncelleme scripti çalıştırınız.\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ACL"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "SchoolTool Sunucusuna Hoşgeldiniz"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+#, fuzzy
+msgid "Attendance preferences"
+msgstr "Takvim Tercihleri"
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+#, fuzzy
+msgid "back to site preferences"
+msgstr "Tercihleri Değiştir"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "Kişiler"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+#, fuzzy
+msgid "Legend"
+msgstr "Açıklama"
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "Dakika"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+#, fuzzy
+msgid "Summary"
+msgstr "Pazar"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+#, fuzzy
+msgid "There are no terms defined."
+msgstr "Hiç yok"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+#, fuzzy
+msgid "There are no unresolved absences."
+msgstr "Hiç yok"
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "Geçen sene"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr "Sonraki"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "Yer"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+#, fuzzy
+msgid "Add Commendation"
+msgstr "Bölüm Ekle"
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "Göster"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "Etkinliği Düzelt"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "Bölüm Ekle"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr "Bölüm Bilgisini Düzenle"
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr "Dersleri Al"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "Yeni ders ekle"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr "Yeni Ders"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr "Ders indeksi"
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr "Yeni ders ekle"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Sağlanan veri yetersiz."
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr "Böyle bir ders yok."
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr "Ders Kimliği (ID) gerekiyor."
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr "${course}'e bir bölüm ekle"
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr "Öğretmenler"
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr "Güncel Hocalar"
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr "Mevcut Hocalar"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr "Öğrenciler"
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr "Gruplar"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr "Bölüm indeksi"
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr "Yeni bir bölüm ekle"
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV verileri bir grup başlığı içermek <strong>zorundadır</strong> ve "
+"opsiyonel olarak grup tanımlaması <strong>içerebilir</strong>. Diğer ekstra "
+"bilgiler önemsenmeyecek."
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+"Yukarıda verilen örnek ile 3 grup başlığı 'LUG', 'Satranç Kulübü' ve Spor "
+"Kulübü, oluşturulmaktadır. İlk grup ve son grup sırasıyla 'Linux "
+"Kullanıcıları Grubu' ve 'Okul-sonrası sporlar kulübü' tanımlamaları "
+"alacaklar. 'Satranç Kulübü'nde herhangi bir tanımlama içermeyecektir ve "
+"ikinci virgülden sonraki üçüncü gruba ait ekstra metin dikkate "
+"alınmayacaktır."
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr "SchoolTool derslerini CSV olarak yükle."
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr "Bölümler"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr "Öğrenciler"
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "edit info"
+msgstr "ismi düzelt"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+#, fuzzy
+msgid "Change the name or description of this section."
+msgstr "Bu bölüm için öğretmenleri değiştir."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "Change the resources for this section."
+msgstr "Bu bölüm için öğretmenleri değiştir."
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr "Bu bölüm için öğretmenleri değiştir."
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr "öğetmenleri düzenle"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr "bireyleri düzenle"
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr "Bölümdeki öğrecileri bireysel olarak değiştir"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr "Bölümdeki öğrecileri grup olarak değiştir"
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr "grupları düzenle"
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr "Kimlik -Identifier- (isteğe bağlı)"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "Bölümler"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+#, fuzzy
+msgid "Current Size"
+msgstr "Bu hafta"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr "${num_errors} adet girdi hatsı mevcut."
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr "Dersin adı."
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr "Dersin tanımı."
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr "Etiket"
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr "Kod"
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr "Bölümün tanımı"
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr "${instructors} -- ${courses}"
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "Kişiler"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "Mart"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+#, fuzzy
+msgid "schooldata"
+msgstr "Okul günü"
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "Düzenle"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr "Vazgeç"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "Uygula"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "Günlük"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+#, fuzzy
+msgid "There were no results."
+msgstr "Hiç yok"
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+#, fuzzy
+msgid "There are no persons."
+msgstr "Hiç yok"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Tam isim"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "Dersler"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "silme butonu"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr "ekleme butonu"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "iptal-butonu"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+#, fuzzy
+msgid "Add an Activity"
+msgstr "Bölüm Ekle"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "Etkinliği Düzelt"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+#, fuzzy
+msgid "Student Name"
+msgstr "Öğrenciler"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "silme butonu"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+#, fuzzy
+msgid "Grade ${name}"
+msgstr "Periyot ${number}"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "Grupları Al"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+#, fuzzy
+msgid "Edit Group Information"
+msgstr "Bölüm Bilgisini Düzenle"
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "Üyelik Yönetimi"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+#, fuzzy
+msgid "New Group"
+msgstr "Gruplar"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "Gruplar"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+"CSV verileri bir grup başlığı içermek <strong>zorundadır</strong> ve "
+"opsiyonel olarak grup tanımlaması <strong>içerebilir</strong>. Diğer ekstra "
+"bilgiler önemsenmeyecek."
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+"\n"
+"LUG, Linux Kullanıcıları Grubu\n"
+"Satranç Kulübü\n"
+"Sporlar Kulübü, Okul-sonrası sporlar kulübü, <em>ikinci virgülden sonraki "
+"metin</em>\n"
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+"Yukarıda verilen örnek ile 3 grup başlığı 'LUG', 'Satranç Kulübü' ve Spor "
+"Kulübü, oluşturulmaktadır. İlk grup ve son grup sırasıyla 'Linux "
+"Kullanıcıları Grubu' ve 'Okul-sonrası sporlar kulübü' tanımlamaları "
+"alacaklar. 'Satranç Kulübü'nde herhangi bir tanımlama içermeyecektir ve "
+"ikinci virgülden sonraki üçüncü gruba ait ekstra metin dikkate "
+"alınmayacaktır."
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr "SchoolTool gruplarını CSV olarak yükle."
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "ismi düzelt"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr "Grubun başlığı."
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr "Grubun tanımı."
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "Takvimi göster"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "Etkinlik ekle"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "Etkinliği Düzelt"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "Hayır"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "ekleme butonu"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "Bu hafta"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+#, fuzzy
+msgid "Enroll Students"
+msgstr "Öğrenciler"
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "iptal-butonu"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "ekleme butonu"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "iptal-butonu"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "Yeni dönem"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr "Notun gövdesi."
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr "Gizlilik"
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "Hayır"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+#, fuzzy
+msgid "Private"
+msgstr "Gizlilik"
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "Dönem ekle"
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "kullanıcı adı boş bırakılmamalı"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "tam isim boş bırakılmamalı"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Çakışan kullanıcı isimleri: ${username}"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "Kişileri Al"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+"CSV verisi <strong>mutlaka</strong> bir kullanıcı ismi ve bir tam isim "
+"içermelidir. İsteğe bağlı olarak bir şifre de <strong>içerebilir</strong>."
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+"\n"
+"okanık, orhan kanık\n"
+"ovkanık, Orhan Veli Kanık, r2m45j\n"
+"kemal, Kemal\n"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+"Yukarıdaki örnek, 'okanık', 'ovkanık' ve 'kemal' olarak üç kullanıcı "
+"yaratacaktır. Bu üçünden sadece 'ovkanık' bir şifreye('r2m45j') sahip "
+"olacaktır ve sisteme giriş yapabilecektir. Şifrelerin düz metin (plain text) "
+"olarak yollanacağını göz önünde bulundurun."
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr "SchoolTool kişilerini CSV olarak yükle."
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr "${user} kullanıcısı için tercihleri değiştir"
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+#, fuzzy
+msgid "Edit person preferences"
+msgstr "Takvim Tercihleri"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr "Saat Dilimi"
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr "Saat Biçimi"
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr "SS:DD"
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr "SS:DD am/pm"
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr "Tarih Biçimi"
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr "AA/GG/YY"
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr "YYYY-AA-GG"
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr "Periyotları göster"
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr "Periyot isimlerini günlük olarak görüntüle"
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr "İlişkiler"
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "Etkinlik ekle"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "Etkinliği Düzelt"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+#, fuzzy
+msgid "New Requirement"
+msgstr "Yeni dönem"
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr "Görüntüleniyor"
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "Dakika"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr "Kaynakları Al"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+#, fuzzy
+msgid "Add a Resource"
+msgstr "Yeni ders ekle"
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+#, fuzzy
+msgid "Edit Resource Information"
+msgstr "Bölüm Bilgisini Düzenle"
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+#, fuzzy
+msgid "New Resource"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+#, fuzzy
+msgid "A Resource"
+msgstr "Kaynaklar"
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+#, fuzzy
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+"CSV verileri bir grup başlığı içermek <strong>zorundadır</strong> ve "
+"opsiyonel olarak grup tanımlaması <strong>içerebilir</strong>. Diğer ekstra "
+"bilgiler önemsenmeyecek."
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+#, fuzzy
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+"Yukarıda verilen örnek ile 3 grup başlığı 'LUG', 'Satranç Kulübü' ve Spor "
+"Kulübü, oluşturulmaktadır. İlk grup ve son grup sırasıyla 'Linux "
+"Kullanıcıları Grubu' ve 'Okul-sonrası sporlar kulübü' tanımlamaları "
+"alacaklar. 'Satranç Kulübü'nde herhangi bir tanımlama içermeyecektir ve "
+"ikinci virgülden sonraki üçüncü gruba ait ekstra metin dikkate "
+"alınmayacaktır."
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "SchoolTool derslerini CSV olarak yükle."
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr "Kaynağın başlığı."
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr "Kaynağın tanımı."
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+#, fuzzy
+msgid "Calendar_relationships"
+msgstr "İlişkiler"
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "Takvim"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr "başa dön"
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "İstisna günler"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr "Giriş Yap"
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr "Kullanıcı"
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr "Çıkış Yap"
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr "Yeni Dönem"
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr "$title Dönemini Değiştir"
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr "Yeni dönem"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr "Dönemler"
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr "Yeni bir dönem ekle"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr "Başlangıç tarihi"
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr "Bitiş tarihi"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr "${month} ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr "Hafta ${week_number}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr "Dönem ekle"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr "Değişiklikleri kaydet"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+"Lütfen, dönemin zaman aralığını isimlendiriniz ve tanımlayınız (ör: 2004-09-"
+"01 to 2004-12-31). Tarihler YYYY-AA-GG biçeminde olmalıdır."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr "Tarih aralığı içeriliyor (ör: 2004-09-01 to 2004-12-31)"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr "Tazele"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+"İkincil olarak; lütfen hangi günlerin okul günü, hangi günlerin tatil günü "
+"olduğunu belirleyiniz."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+"Lütfen hangi günlerin okul günü, hangi günlerin tatil günü olduğunu "
+"belirleyiniz."
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr "Açıklama"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr "Okul günü"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr "Tatil"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr "Haftanın takip eden diğer günlerine geç"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr "${object}'nin zaman tablosu"
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Geöersiz tarih. Lütfen YYYY-AA-GG biçimini kullanın."
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr "Tarih hiçbir döneme ait değil."
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr "Yeni Ders Programı"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr "Zaman Tablolarını Göster"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr "Çizelge"
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr "En az bir periyod belirtmelisin."
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr "Yeni plan ekle"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr "Lütfen bir değer seçiniz"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr "Gün ${number}"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr "Periyot 1"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr "Periyot ${number}"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr "Zaman tablosu şeması ${schema}"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+"Zaman tablosu günleri, hafta günü ile örtüşmektedir. (ör: Pazartesi ilk "
+"zaman tablosu kullanılır, Salı günü ikinci, gibi)"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+"Zaman tablosu günleri sıralı olarak kullanılır, atlanılan günler okul günü "
+"değildir."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+"Üçüncü olarak, haftanın belirli günlerindeki periyotların zamanını ve "
+"süresini tanımlayın. Aşağıdaki biçemlerden birini kullanın: <tt>SS:DD</tt> "
+"(ayrıca, aşağıdaki metin kutusunda süreyi belirtmeyi unutmayın) ya da <HH:DD-"
+"HH:DD</tt> (başlangıç-bitiş zamanını belirlemek için, ör: 9.30-10:15). "
+"Haftanın bütün günleri için periyot tanımlamak gerekli değildir, bunun "
+"ihmali sadece haftanın belirli günündeki dersin geçilmesi ile sonuçlanır. "
+"Eğer periyot listesi , yukarıda tabloda yaptığınız değişikliklere göre "
+"güncel değil ise, formu tazalemek için \"Tazele\" butonunu kullanınız."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr "Zaman tablosu şeması yaratmak için lütfen bir isim seçiniz."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr "Kesin periyot özellikleri yanlış olması sebebiyle dikkate alınmadı."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+"Son olarak, bu formdaki bilgilerin doğru olduğundan emin olun. Çünkü, "
+"girdileri düzeltmenin tek yolu bu zaman tablosu şemasının kaldırılması ve "
+"yeniden yaratılmasıyla mümkündür."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr "Zaman tablosu şeması yarat"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+"İlk olarak, lütfen zaman tablosundaki günleri ve periyotları tanımlayınız."
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr "C"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr "Geçmiş günlerden periyotları kopyala"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr "X"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr "Bu günü kaldır"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr "Gün ekle"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr "Periyot ekle"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+"İkincil olarak, zaman tablosu günlerini takvim günlerine göre hizzalandırın."
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr "Ders Programı"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr "Dönem"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr "Plan"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "Dersler"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+#, fuzzy
+msgid "Save"
+msgstr "Aynı"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+#, fuzzy
+msgid "There are no terms or timetable schemas defined."
+msgstr "Zaman tablosu şeması yarat"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "Zaman Tablolarını Göster"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+#, fuzzy
+msgid "Period title (optional)"
+msgstr "Kimlik -Identifier- (isteğe bağlı)"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+#, fuzzy
+msgid "Period end time"
+msgstr "Periyot ${number}"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+#, fuzzy
+msgid "Period title"
+msgstr "Periyot 1"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr "Özgün başlangıç"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr "Özgün son"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr "Yeni başlangıç"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr "Yeni bitiş"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr "Değiştir"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr "Devam et"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "Zaman tablosu şeması yarat"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr "${object} için Zaman tabloları"
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr "Yeni Zaman tablosu şeması"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr "Değişik zamanlar"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr "Haftanın Günleri"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr "Aynı"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr "Farklı"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr "Evet"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr "Hayır"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr "Bilinmeyen gün kimliği (id): %r"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr "Bilinmeyen periyot kimliği (id): %r"
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Username:"
+#~ msgstr "Kullanıcı Adı :"
+
+#~ msgid "Change this person's name, picture, or password"
+#~ msgstr "Bu kişinin ismini, resmini veya şifresini değiştir"
+
+#~ msgid "Manage this person's memberships"
+#~ msgstr "Bu kişinin üyeliklerini yönet"
+
+#~ msgid "Import Sections"
+#~ msgstr "Bölüm Yükle"
+
+#~ msgid ""
+#~ "Malformed line ${line_no} (it should contain a day id, a period id and "
+#~ "optionally a location id)"
+#~ msgstr ""
+#~ "Hatalı satır ${line_no}(Gün id, periyod id ve yer id(isteğe bağlı) "
+#~ "içermelidir)"
+
+#~ msgid "Locations not found: ${args}."
+#~ msgstr "Yerler bulunamadı: ${args}."
+
+#~ msgid "Person index"
+#~ msgstr "Kişi dizini"
+
+#~ msgid "New photo"
+#~ msgstr "Yeni resim"
+
+#~ msgid "New password"
+#~ msgstr "Yeni Şifre"
+
+#~ msgid "Verify password"
+#~ msgstr "Şifreyi doğrula"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Şifreler eşleşmedi"
+
+#~ msgid "Password was successfully changed!"
+#~ msgstr "Şifre başarıyla değiştirildi!"
+
+#~ msgid "Create new objects"
+#~ msgstr "Yeni nesneler yarat"
+
+#~ msgid "Add events"
+#~ msgstr "Etkinlik ekle"
+
+#~ msgid "Control access"
+#~ msgstr "Erişimi kontrol et"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Doğrulanmış Kullancılar"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Doğrulanmamış Kullanıcılar"
+
+#~ msgid "An error occured."
+#~ msgstr "Bir hata oluştu"
+
+#~ msgid "All Users"
+#~ msgstr "Tüm Kullanıcılar"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is not a SchoolTool 0.10 database file, aborting.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Bu bir SchoolTool 0.10 veritabanı dosyası değildir, durduruluyor.\n"

Added: schooltool/branches/upstream/current/src/schooltool/locales/uk/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/uk/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/uk/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4763 @@
+# Ukrainian translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Ukrainian <uk at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/vi/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/vi/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/vi/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2693 @@
+# Vietnamese translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2005-11-24 02:00+0000\n"
+"Last-Translator: Larry Nguyen <larry at vnlinux.org>\n"
+"Language-Team: Vietnamese <vi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "Người dùng"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "1 người dùng"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} người dùng"
+
+#: /src/schooltool/app/browser/app.py:231
+#, fuzzy
+msgid "Username or password is incorrect"
+msgstr "Ngươì dùng và mật khẩu không đúng"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+#, fuzzy
+msgid "Current leaders"
+msgstr "Năm hiện tại"
+
+#: /src/schooltool/app/browser/app.py:315
+#, fuzzy
+msgid "Available leaders"
+msgstr "Nhứng nhóm đang có"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "Tháng Ba"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "Tháng Giêng"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "Tháng Hai"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "Tháng Sáu"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "Tháng Năm"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "Tháng Tư"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "Tháng Tám"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "Tháng Chín"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "Tháng Bảy"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "Ngày mai"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "Hôm nay"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "Hôm qua"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "Tháng Mười"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "Tháng Mười Hai"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "Tháng Mười Một"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr "Thứ Hai"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr "Thứ Ba"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr "Thứ Tư"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr "Thứ Năm"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr "Chủ Nhật"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr "Thứ Bảy"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr "Thứ Sáu"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "Thứ Hai"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "Thứ Ba"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "Thứ Tư"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "Thứ Năm"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "Thứ Sáu"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "Thứ Bảy"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "Chủ Nhật"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "Tựa"
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr "Cả ngày"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr "Ngày"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "Giờ"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "Thời gian bắt đầu kiểu 24h"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "Kéo dài"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr "Phút"
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr "Giờ"
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr "Ngày"
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr "Địa điểm"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr "Mô tả"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "Lặp lại"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "Lặp lại mỗi"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "Ngày"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "Tuần"
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr "Tháng"
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr "Năm"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "Lặp lại mỗi"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "Khoảng"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "Số lượng"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "Cho đến"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "Mãi mãi"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "Số lượng sự kiện"
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr "Lặp lại cho đến lúc"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "Ngày trong tuần"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "Ngày thường"
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr "Hàng tháng"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "Trừ các ngày"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "cùng ngày trong tuần"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "Lần đầu"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "Lần thứ tư"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "Lần thứ ba"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "Lần thứ nhì"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "Lần thứ năm"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "Ngày cuối trong tuần"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "Ngày cuối ${trong tuần}"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+#, fuzzy
+msgid "An error occurred."
+msgstr "Bị lỗi"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "Giờ không đúng"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "Ngày chấm dứt sớm hơn ngày bắt đầu"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "Ngày không đúng. Vui lòng dùng NNNN-TT-NN, một cho mỗi dòng"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "Thêm sự kiện"
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr "Thêm"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "Sửa sự kiện"
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr "Cập nhật"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "Cập nhậ vào ${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#, fuzzy
+msgid "Calendar"
+msgstr "Lịch"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "Tuần tới"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "Tuần hiện tại"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "Tuần vừa qua"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "Tháng tới"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "Tháng hiện tại"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "Tháng vừa qua"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "Tuần ${week_no}"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "Năm tới"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "Năm hiện tại"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "Năm vừa qua"
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "Tập tin CSV đã được nhập thành công"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "Không thể nhập tập tin CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "Nội dung CSV đã được nhập thành công"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "Không thể nhập nội dung từ CSV"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "Chưa chọn charset"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "charset không rõ ràng"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "Lỗi trong dữ liệu CVS, hàng $(line_no}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "Chuyển đổi qua unicode không thành công hàng ${line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+#, fuzzy
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "Lỗi trong dữ liệu CVS, hàng $(line_no}"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "Ghi lại các thay đổi"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "Cả ngày"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "Địa điểm: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "Tài nguyên đã được chọn: %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr "Sẽ lặp lại"
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "Lịch hàng ngày của %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "Lịch hàng tuần của %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "Tuần %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "Lịch hàng tháng của %s"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "Hỗ trợ PDF đã bị tắt. Người quản trị có thể bật nó lên."
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+#, fuzzy
+msgid "$title"
+msgstr "Tựa"
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+#, fuzzy
+msgid "group"
+msgstr "Nhóm"
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "national"
+msgstr "Kéo dài"
+
+#: /src/schooltool/commendation/interfaces.py:61
+#, fuzzy
+msgid "state"
+msgstr "Ngày"
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "Danh sách các tài nguyên"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "Thêm một tài nguyên mới"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr "Thông tin cung cấp không đầy đủ"
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr "Tựa đề không thể để trống"
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+#, fuzzy
+msgid "Current Instructors"
+msgstr "Những nhóm hiện tại"
+
+#: /src/schooltool/course/browser/section.py:261
+#, fuzzy
+msgid "Available Instructors"
+msgstr "Nhứng nhóm đang có"
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+#, fuzzy
+msgid "Current Students"
+msgstr "Tháng hiện tại"
+
+#: /src/schooltool/course/browser/section.py:285
+#, fuzzy
+msgid "Available Students"
+msgstr "Nhứng nhóm đang có"
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr "Nhóm"
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr "Những nhóm hiện tại"
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr "Nhứng nhóm đang có"
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr "Tài nguyên"
+
+#: /src/schooltool/course/browser/section.py:339
+#, fuzzy
+msgid "Current Resources"
+msgstr "Nhập tài nguyên"
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr "Những tài nguyên đang có"
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "Danh sách người dùng"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "Thêm người dùng mới"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+#, fuzzy
+msgid "Change name information for ${fullname}"
+msgstr "Đổi thông tin liên hệ cho ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:172
+#, fuzzy
+msgid "Change name"
+msgstr "Thay đổi thành viên"
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+#, fuzzy
+msgid "Change demographics for ${fullname}"
+msgstr "Đổi thông tin liên hệ cho ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+#, fuzzy
+msgid "Change school data for ${fullname}"
+msgstr "Đổi thông tin liên hệ cho ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+#, fuzzy
+msgid "Change contact information for ${fullname}"
+msgstr "Đổi thông tin liên hệ cho ${user}"
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr "Thông tin liện hệ"
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr "Người dùng"
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr "Mật khẩu"
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr "Người dùng này đã tồn tại"
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr "Áp dụng"
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+#, fuzzy
+msgid "Previous school"
+msgstr "Tháng vừa qua"
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+#, fuzzy
+msgid "Health information"
+msgstr "Thông tin sự kiện"
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+#, fuzzy
+msgid "Street"
+msgstr "Bắ đầu"
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+#, fuzzy
+msgid "State"
+msgstr "Thứ Bảy"
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+#, fuzzy
+msgid "Name of parent"
+msgstr "Số lượng sự kiện"
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "sửa tên"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "sửa tên"
+
+#: /src/schooltool/demographics/interfaces.py:59
+#, fuzzy
+msgid "Last name"
+msgstr "sửa tên"
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+#, fuzzy
+msgid "Preferred name"
+msgstr "sửa tên"
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "Họ và Tên"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr "Ảnh"
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr "Ảnh (loại JPEG)"
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+#, fuzzy
+msgid "New Category"
+msgstr "Chú thích mới"
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+#, fuzzy
+msgid "Categories successfully deleted."
+msgstr "Nội dung CSV đã được nhập thành công"
+
+#: /src/schooltool/gradebook/browser/category.py:81
+#, fuzzy
+msgid "Category successfully added."
+msgstr "Mật khẩu đã được thay đổi"
+
+#: /src/schooltool/gradebook/browser/category.py:87
+#, fuzzy
+msgid "Default category successfully changed."
+msgstr "Mật khẩu đã được thay đổi"
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+#, fuzzy
+msgid "Exam"
+msgstr "Ví dụ:"
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+#, fuzzy
+msgid "Presentation"
+msgstr "Kéo dài"
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "Danh sách nhóm dùng"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr "Thêm một nhóm mới"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+#, fuzzy
+msgid "Groups of ${person}"
+msgstr "Nhóm của ${title}"
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "Danh sách các tài nguyên"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "Thêm một tài nguyên mới"
+
+#: /src/schooltool/level/browser/level.py:60
+#, fuzzy
+msgid "Previous Level"
+msgstr "Tuần vừa qua"
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+#, fuzzy
+msgid "Student processes successfully updated."
+msgstr "Nội dung CSV đã được nhập thành công"
+
+#: /src/schooltool/level/browser/promotion.py:57
+#, fuzzy
+msgid "Work Item successfully finished."
+msgstr "Mật khẩu đã được thay đổi"
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+#, fuzzy
+msgid "Current Level: $level"
+msgstr "Tuần hiện tại"
+
+#: /src/schooltool/level/browser/record.py:56
+#, fuzzy
+msgid "The status was successfully updated."
+msgstr "Mật khẩu đã được thay đổi"
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr "Người dùng"
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#, fuzzy
+msgid "Status"
+msgstr "Bắ đầu"
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+#, fuzzy
+msgid "Next Level"
+msgstr "Tuần tới"
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr "Người dùng không thể để trống"
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr "Họ Tên không thể để trống"
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr "Người dùng đã có: ${username}"
+
+#: /src/schooltool/person/browser/person.py:176
+#, fuzzy
+msgid "Edit password"
+msgstr "Mật khẩu mới"
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+#, fuzzy
+msgid "Changed password"
+msgstr "Mật khẩu mới"
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+#, fuzzy
+msgid "Make calendar public"
+msgstr "Xem lịch"
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr "Tên nên hiển thị"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "Danh sách các tài nguyên"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "Thêm một tài nguyên mới"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "Danh sách các tài nguyên"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr "Thêm một tài nguyên mới"
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+#, fuzzy
+msgid "Insufficient data in person info"
+msgstr "Thông tin cung cấp không đầy đủ"
+
+#: /src/schooltool/restclient/restclient.py:673
+#, fuzzy
+msgid "Insufficient data in group info"
+msgstr "Thông tin cung cấp không đầy đủ"
+
+#: /src/schooltool/restclient/restclient.py:688
+#, fuzzy
+msgid "Insufficient data in level info"
+msgstr "Thông tin cung cấp không đầy đủ"
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr "Thêm..."
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "Lịch"
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr "Thân chào bạn đã tìm đến SchoolBell"
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "Tới lui"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+#, fuzzy
+msgid "photo"
+msgstr "Ảnh"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr "Người dùng:"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr "sửa tên"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr "Đổi tên, ảnh, hoặc mật khẩu"
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+#, fuzzy
+msgid "No changes"
+msgstr "Ghi lại các thay đổi"
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+#, fuzzy
+msgid "Change Term: $title"
+msgstr "Thay đổi chi tiết"
+
+#: /src/schooltool/term/browser/term.py:165
+#, fuzzy
+msgid "New term"
+msgstr "Chú thích mới"
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "Thêm người dùng mới"
+
+#: /src/schooltool/term/browser/term.py:65
+#, fuzzy
+msgid "Start date"
+msgstr "Bắ đầu"
+
+#: /src/schooltool/term/browser/term.py:67
+#, fuzzy
+msgid "End date"
+msgstr "Trừ các ngày"
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+#, fuzzy
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr "Ngày không đúng. Vui lòng dùng NNNN-TT-NN, một cho mỗi dòng"
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "Thêm một tài nguyên mới"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+#, fuzzy
+msgid "Day ${number}"
+msgstr "${number} người dùng"
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+#, fuzzy
+msgid "Same time each day"
+msgstr "cùng ngày trong tuần"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+#, fuzzy
+msgid "Have names"
+msgstr "sửa tên"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+#, fuzzy
+msgid "No"
+msgstr "Lời dặn"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+#, fuzzy
+msgid "Unknown day id: %r"
+msgstr "charset không rõ ràng"
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "New photo"
+#~ msgstr "Ảnh mới"
+
+#~ msgid "A small picture (about 48x48 pixels in JPEG format)"
+#~ msgstr "Một tấm ảnh nhỏ (khoảng 48x48 pixels loại JPEG)"
+
+#~ msgid "Clear photo"
+#~ msgstr "Không dùng ảnh"
+
+#~ msgid "Check this to clear the photo"
+#~ msgstr "Chọn cái này để xóa ảnh"
+
+#~ msgid "Verify password"
+#~ msgstr "Xác nhận mật khẩu"
+
+#~ msgid "Passwords do not match."
+#~ msgstr "Mật khẩu khộng giống nhau"
+
+#~ msgid "Passwords do not match!"
+#~ msgstr "Mật khẩu không khớp"
+
+#~ msgid "View"
+#~ msgstr "Xem"
+
+#~ msgid "Edit"
+#~ msgstr "Sửa đổi"
+
+#~ msgid "Create new objects"
+#~ msgstr "Tạo mới"
+
+#~ msgid "Add events"
+#~ msgstr "Thêm sự kiện"
+
+#~ msgid "Modify/delete events"
+#~ msgstr "Thay đổi/xóa sự kiện"
+
+#~ msgid "Control access"
+#~ msgstr "Quản lý sử dụng"
+
+#~ msgid "Manage membership"
+#~ msgstr "Quản lý thành viên"
+
+#~ msgid "Authenticated users"
+#~ msgstr "Người dùng đăng nhập"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "Người dùng không đăng nhập"
+
+#~ msgid "Set Up Access"
+#~ msgstr "Cấu hình quyền sử dụng"
+
+#~ msgid "Change Preferences"
+#~ msgstr "Thay đổi lựa chọn riêng"
+
+#~ msgid "New Person"
+#~ msgstr "Người dùng mới"
+
+#~ msgid "Import Persons"
+#~ msgstr "Nhập người dùng"
+
+#~ msgid "Add a Group"
+#~ msgstr "Thêm một nhóm"
+
+#~ msgid "New Group"
+#~ msgstr "Nhóm mới"
+
+#~ msgid "Edit Group Information"
+#~ msgstr "Sửa đổi thông tin của nhóm"
+
+#~ msgid "A Group"
+#~ msgstr "Một Nhóm"
+
+#~ msgid "SchoolBell Group"
+#~ msgstr "Nhóm của SchoolBell"
+
+#~ msgid "Add/Remove Members"
+#~ msgstr "Thêm/Xóa Thành Viên"
+
+#~ msgid "Import Groups"
+#~ msgstr "Nhập các Nhóm"
+
+#~ msgid "Add a Resource"
+#~ msgstr "Thêm một tài nguyên"
+
+#~ msgid "Edit Resource Information"
+#~ msgstr "Sửa đổi thông tin tài nguyên"
+
+#~ msgid "New Resource"
+#~ msgstr "Tài nguyên mới"
+
+#~ msgid "SchoolBell Resource"
+#~ msgstr "Tài nguyên của SchoolBell"
+
+#~ msgid "A Resource"
+#~ msgstr "Một tài nguyên"
+
+#~ msgid "Actions"
+#~ msgstr "Hành động"
+
+#~ msgid "View Calendar"
+#~ msgstr "Xem lịch"
+
+#~ msgid "Calendar (Daily)"
+#~ msgstr "Lịch (Hàng ngày)"
+
+#~ msgid "Calendar (Daily, PDF)"
+#~ msgstr "Lịch (Hàng ngày, PDF)"
+
+#~ msgid "Calendar (Weekly)"
+#~ msgstr "Lịch (Hàng Tuần)"
+
+#~ msgid "Calendar (Weekly, PDF)"
+#~ msgstr "Lịch (Hàng tuần, PDF)"
+
+#~ msgid "Calendar (Monthly)"
+#~ msgstr "Lịch (Hàng tháng)"
+
+#~ msgid "Calendar (Monthly, PDF)"
+#~ msgstr "Lịch (Hàng tháng, PDF)"
+
+#~ msgid "Calendar (Yearly)"
+#~ msgstr "Lịch (Hàng năm)"
+
+#~ msgid "Free/Busy"
+#~ msgstr "Rãnh/Bận"
+
+#~ msgid "New Event"
+#~ msgstr "Sự kiện mới"
+
+#~ msgid "Open in iCal"
+#~ msgstr "Mở trong iCal"
+
+#~ msgid "Edit Event"
+#~ msgstr "Sửa đổi sự kiện"
+
+#~ msgid "Change Site Preferences"
+#~ msgstr "Thay đổi tùy thích của trang"
+
+#~ msgid ""
+#~ "This permission allows viewing names, titles, photos, lists of objects, "
+#~ "and other information."
+#~ msgstr ""
+#~ "Quyền này cho phép xem tên, chức, ảnh, danh sách và các thông tin khác"
+
+#~ msgid "Allows to edit names, titles, descriptions, photos, etc."
+#~ msgstr "Cho phép sửa đổi tên, chức, mô tả, ảnh, .v.v."
+
+#~ msgid "Lets the user create new persons, groups, and resources."
+#~ msgstr "Cho phép người dùng tạo người sử dụng, nhóm và tài nguyên mới"
+
+#~ msgid "Allows viewing calendars of persons, groups, and resources."
+#~ msgstr "Cho phép xem lịch của người dùng, nhóm và tài nguyên"
+
+#~ msgid "Access control"
+#~ msgstr "Điều khiển quyền sử dụng"
+
+#~ msgid "Set Access"
+#~ msgstr "Chọn quyền sử dụng"
+
+#~ msgid "Permissions for Users"
+#~ msgstr "Quyền của người dùng"
+
+#~ msgid ""
+#~ "The permissions are inherited in the containment hierarchy. For example, "
+#~ "if you set a View Calendar permission for a user on the Persons Index, "
+#~ "that user will be able to see the calendars of all persons. If you want "
+#~ "the user to be able to access just a calendar of some resource, you can "
+#~ "set the View Calendar permission for that user on that resource."
+#~ msgstr ""
+#~ "Quyền sử dụng sẽ có tác dụng đến tất cả trong cùng nhóm. Ví dụ, nếu bạn "
+#~ "cho phép người dùng xem lịch trong một danh sách, thì người dùng này sẽ "
+#~ "có quyền xem lịch của tất cả người dùng trong danh sách này. Nếu bạn muốn "
+#~ "giới hạn lịch của một tài nguyên nào đó, bạn có thể chỉ định quyền xem "
+#~ "lịch của người dùng trên tài nguyên đó thôi."
+
+#~ msgid "Below is a list of permission names with their respective meanings."
+#~ msgstr "Bên dươí là danh sách quyền sử dụng với định nghĩa tương ứng"
+
+#~ msgid "Change site preferences"
+#~ msgstr "Đổi lựa chọn tùy thích của trang"
+
+#~ msgid "General preferences"
+#~ msgstr "Lựa chọn chung"
+
+#~ msgid "Edit site preferences"
+#~ msgstr "Sửa đổi lựa chọn tùy thích của trang"
+
+#~ msgid "Events for"
+#~ msgstr "Sự kiện cho"
+
+#~ msgid "Validate my Atom feed"
+#~ msgstr "Kiểm lại đường duyệt Atom"
+
+#~ msgid "Location: ${location}"
+#~ msgstr "Địa điểm: ${location}"
+
+#~ msgid "Select additional calendars to display"
+#~ msgstr "Chọn thêm lịch để xem"
+
+#~ msgid "Hold down Ctrl or Shift to select multiple calendars."
+#~ msgstr "Giữ phím Ctrl hoặc Shift để chọn nhiều lịch"
+
+#~ msgid "Public Calendar"
+#~ msgstr "Lịch công cộng"
+
+#~ msgid "site-wide calendar"
+#~ msgstr "Lịch tổng quát"
+
+#~ msgid "Select calendars to display"
+#~ msgstr "Chọn lịch để hiển thị"
+
+#~ msgid "People"
+#~ msgstr "Công chúng"
+
+#~ msgid "There are no persons with calendars accessible to you."
+#~ msgstr "Bạn không thể xem lịch của ai hết"
+
+#~ msgid "There are no groups with calendars accessible to you."
+#~ msgstr "Bạn không thể xem lịch của nhóm nào hết"
+
+#~ msgid "delete-button"
+#~ msgstr "nút-xóa"
+
+#~ msgid "Exception"
+#~ msgstr "Ngoại lệ"
+
+#~ msgid "Server Error"
+#~ msgstr "Lỗi máy chủ"
+
+#~ msgid ""
+#~ "An internal server error has occurred. This most likely means that you "
+#~ "have found a bug in SchoolBell. Please report it on <a href=\"http://"
+#~ "issues.schooltool.org\">the issue tracker</a>."
+#~ msgstr ""
+#~ "Lỗi đã xảy ra. Rất có thể bạn đã tìm thấy lỗi của chương trình. Vui lòng "
+#~ "báo lỗi này trên <a href=\"http://issues.schooltool.org\">trang web</a>"
+
+#~ msgid "All day event"
+#~ msgstr "Sự kiện kéo dài cả ngày"
+
+#~ msgid "This is a recurring event."
+#~ msgstr "Sự kiện này sẽ lặp lại"
+
+#~ msgid "Ends"
+#~ msgstr "Chấm dứt"
+
+#~ msgid "edit event"
+#~ msgstr "Sửa đổi sự kiện"
+
+#~ msgid "Change the details of this event"
+#~ msgstr "Đổi chi tiết sự kiện này"
+
+#~ msgid "Scheduled resources"
+#~ msgstr "Tài nguyên đã được sắp xếp"
+
+#~ msgid "edit resources"
+#~ msgstr "sửa đổi tài nguyên"
+
+#~ msgid "delete event"
+#~ msgstr "xóa sự kiện"
+
+#~ msgid "Event details"
+#~ msgstr "Chi tiết của sự kiện"
+
+#~ msgid "day"
+#~ msgstr "ngày"
+
+#~ msgid "week"
+#~ msgstr "tuần"
+
+#~ msgid "This section only applies when the monthly recurrence is selected."
+#~ msgstr "Phần này chỉ có tác dụng khi sự kiện xảy ra hàng tháng đã được chọn"
+
+#~ msgid "Day ${monthday} of every month"
+#~ msgstr "Ngày ${monday} của hàng tháng"
+
+#~ msgid "${weekday} of every month"
+#~ msgstr "${weekday} của mỗi tháng"
+
+#~ msgid "${DYNAMIC_CONTENT} of every month"
+#~ msgstr "${DYNAMIC_CONTENT} của mỗi tháng"
+
+#~ msgid "Repeat"
+#~ msgstr "Lặp lại"
+
+#~ msgid "times"
+#~ msgstr "lần"
+
+#~ msgid "Repeat forever"
+#~ msgstr "Lặp lại mãi mãi"
+
+#~ msgid "Book resources"
+#~ msgstr "Đặt tài nguyên"
+
+#~ msgid "Resource Booking for ${title}"
+#~ msgstr "Tài nguyên đã được đặt trước cho ${title}"
+
+#~ msgid "Ends:"
+#~ msgstr "Kết thúc:"
+
+#~ msgid "This is a recurring event!"
+#~ msgstr "Đây là sự kiện sẽ tái diễn"
+
+#~ msgid "Conflicting events"
+#~ msgstr "Sự kiện trùng nhau"
+
+#~ msgid "Upload schooltool groups as CSV"
+#~ msgstr "Tải lên nhóm của schooltool theo kiểu CSV"
+
+#~ msgid "Upload CSV File"
+#~ msgstr "Tải tập tin CSV"
+
+#~ msgid "CSV File"
+#~ msgstr "Tập tin CSV"
+
+#~ msgid "Charset:"
+#~ msgstr "Loại chữ:"
+
+#~ msgid "Members"
+#~ msgstr "Thành viên"
+
+#~ msgid "edit members"
+#~ msgstr "sửa đổi thành viên"
+
+#~ msgid "Change the people who are members of this group."
+#~ msgstr "Đổi người dùng là những thành viên trong nhóm này"
+
+#~ msgid "Remove"
+#~ msgstr "Bỏ đi"
+
+#~ msgid ""
+#~ "You are not allowed to access this page. You can click on the back button "
+#~ "in your browser to go back, or ask a more privileged user to log in."
+#~ msgstr ""
+#~ "Bạn không có quyền sử dụng trang này. Bạn có thể chọn nút quay lại trên "
+#~ "browser hoặc hỏi người khác được phép đăng nhập"
+
+#~ msgid "Please log in"
+#~ msgstr "Vui lòng đăng nhập"
+
+#~ msgid "There are none to add."
+#~ msgstr "Không có gì để thêm"
+
+#~ msgid "Find Now"
+#~ msgstr "Tìm Ngay"
+
+#~ msgid "Clear"
+#~ msgstr "Xóa"
+
+#~ msgid "cancel-button"
+#~ msgstr "nút bỏ qua"
+
+#~ msgid "Who can view the note"
+#~ msgstr "Ai có thể xem lời ghi này"
+
+#~ msgid "You might be trying to access a non-existing page"
+#~ msgstr "Rất có thể bạn đang xem một trang không tồn tại"
+
+#~ msgid "Not Found"
+#~ msgstr "Không tìm thấy"
+
+#~ msgid "The page that you are trying to access is not available"
+#~ msgstr "Trang bạn đang tìm không tồn tại"
+
+#~ msgid ""
+#~ "CSV data <strong>must</strong> contain a user name and a full name. An "
+#~ "optional password <strong>may</strong> be included as well."
+#~ msgstr ""
+#~ "CSV <strong>phải</strong> chứa người dùng và họ tên. Mật khẩu cũng có thể "
+#~ "thêm vào tùy thích."
+
+#~ msgid "Upload schooltool persons as CSV"
+#~ msgstr "Tải lên người dùng schooltool kiểu CSV"
+
+#~ msgid "Add to groups"
+#~ msgstr "Thêm vào các nhóm"
+
+#~ msgid "Sorry, you may not delete your own user account."
+#~ msgstr "Xin lỗi, bạn không thể xóa tài khoản của chính mình"
+
+#~ msgid "Edit contact information"
+#~ msgstr "Sửa thông tin liên hệ"

Added: schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2240 @@
+# Yiddish translation for schoolbell
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Yiddish <yi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/yi/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4763 @@
+# Yiddish translation for schooltool
+# Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:33 2006\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Yiddish <yi at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Version: 0.1\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:324
+msgid "Calendar (Daily)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+msgid "Calendar (Weekly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+msgid "Calendar (Monthly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+msgid "Calendar (Yearly)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:394
+msgid "Atom View"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:404
+msgid "iCalendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+msgid "Add Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:463
+msgid "Edit Event"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+msgid "Login"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+msgid "Application"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:572
+msgid "Calendar Widget"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+msgid "Calendar Preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "[Schooltool.org]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+msgid "Schooltool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+msgid "atom_description"
+msgstr ""
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+msgid "Public Calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+msgid "site-wide calendar"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+msgid "Select calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+msgid "delete-button"
+msgstr ""
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+msgid "Clear"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+msgid "All day event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+msgid "Starts"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+msgid "Scheduled resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+msgid "edit resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+msgid "delete event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+msgid "Event details"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+msgid "Book Resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+msgid "Update form"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+msgid "day"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+msgid "week"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+msgid "month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+msgid "year"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+msgid "Repeat"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+msgid "times"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+msgid "[popup calendar]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+msgid "Repeat forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+msgid "Book resources"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+msgid "Title:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+msgid "Starts:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+msgid "Location: ${location}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+msgid "Current"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+msgid "All"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr ""
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr ""
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+msgid "Booking Resources"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+msgid "Person"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+msgid "Section attendance for ${section}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+msgid "Minutes late:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+msgid "Previous"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+msgid "Next"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+msgid "Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+msgid "Edit Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+msgid "Add a Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+msgid "Import Courses"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:9
+msgid "Add a Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:96
+msgid "New Course"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+msgid "Upload schooltool courses as CSV"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+msgid "Sections"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "book resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+msgid "Section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+msgid "Current Size"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+msgid "New Person"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+msgid "Search"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+msgid "Display"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+msgid "Configure"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+msgid "remove-button"
+msgstr ""
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "add-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+msgid "change-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+msgid "Edit Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "update-button"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+msgid "Change Membership"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "A Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+msgid "Upload SchoolTool groups as CSV"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:16
+msgid "Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "edit members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+msgid "Private_calendar"
+msgstr ""
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+msgid "Add a Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:114
+msgid "Edit Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+msgid "None"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+msgid "validate-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+msgid "Current Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "enroll-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "apply-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+msgid "initialize-button"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+msgid "New Note"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+msgid "Note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+msgid "Add note"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:17
+msgid "Delete"
+msgstr ""
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+msgid "Upload SchoolTool persons as CSV"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+msgid "Add a Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+msgid "Edit Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+msgid "items"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+msgid "Import Resources"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+msgid "Upload schooltool resources as CSV"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+msgid "Calendar_ACL"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+msgid "Exception"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${month} ${year}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+msgid "Week ${week_number}"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+msgid "Save changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+msgid "Schoolday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+msgid "Holiday"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+msgid "New Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+msgid "View Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "Copy periods from previous day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+msgid "Add day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+msgid "Timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+msgid "Choose"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+msgid "Scheduling for ${section}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+msgid "Using timetable:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+msgid "Create"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+msgid "New end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+msgid "Modify"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+msgid "Default Timetable Schema:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+msgid "New timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/schoolbell.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/schoolbell.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/schoolbell.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2251 @@
+# Chinese (China) translation for schoolbell
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schoolbell package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schoolbell\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Tue Oct 17 17:42:41 2006\n"
+"PO-Revision-Date: 2006-04-18 08:56+0000\n"
+"Last-Translator: Army <guhongjun at gmail.com>\n"
+"Language-Team: Chinese (China) <zh_CN at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:4
+#: /src/schooltool/sbapp/browser/templates/index.pt:11
+msgid "Persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+msgid "Monday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+msgid "Tuesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+msgid "Wednesday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+msgid "Thursday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+msgid "Saturday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+msgid "Friday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1661
+msgid "All day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+msgid "Date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1680
+msgid "Minutes"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1681
+msgid "Hours"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1682
+msgid "Days"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1685
+msgid "Location"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+msgid "Description"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1703
+msgid "Month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1704
+msgid "Year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1724
+msgid "Repeat until"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1741
+msgid "Monthly"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:1993
+msgid "Add"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2063
+msgid "Update"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:2532
+msgid "Calendar"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr ""
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr ""
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr ""
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr ""
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr ""
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr ""
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr ""
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr ""
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr ""
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:40
+#, fuzzy
+msgid "Course index"
+msgstr "资源索引"
+
+#: /src/schooltool/course/browser/course.py:41
+#, fuzzy
+msgid "Add a new course"
+msgstr "添加一个人员"
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:6
+#: /src/schooltool/sbapp/browser/templates/person.pt:36
+#: /src/schooltool/sbapp/browser/templates/index.pt:12
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:8
+#: /src/schooltool/sbapp/browser/templates/index.pt:13
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+#, fuzzy
+msgid "Section index"
+msgstr "人员列表"
+
+#: /src/schooltool/course/browser/section.py:69
+#, fuzzy
+msgid "Add a new section"
+msgstr "添加一个人员"
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:31
+msgid "Apply"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+msgid "Notes"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+#, fuzzy
+msgid "First name"
+msgstr "全名"
+
+#: /src/schooltool/demographics/interfaces.py:54
+#, fuzzy
+msgid "Middle name"
+msgstr "全名"
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr "全名"
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr "群组列表"
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:41
+#, fuzzy
+msgid "Level index"
+msgstr "资源索引"
+
+#: /src/schooltool/level/browser/level.py:42
+#, fuzzy
+msgid "Add a new level"
+msgstr "添加一个人员"
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+#, fuzzy
+msgid "Requirement index"
+msgstr "资源索引"
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+#, fuzzy
+msgid "Add a new Requirement"
+msgstr "添加一个人员"
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr "资源索引"
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:12
+msgid "My Calendar"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:33
+msgid "More..."
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/index.pt:6
+msgid "Welcome to SchoolBell"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/navigation.pt:2
+msgid "Navigation"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:15
+msgid "Username:"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "edit name"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:18
+msgid "Change this person's name, picture, or password"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:4
+msgid "Person info: ${title}"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "Manage this person's memberships"
+msgstr ""
+
+#: /src/schooltool/sbapp/browser/templates/person.pt:47
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+#, fuzzy
+msgid "Add a new term"
+msgstr "添加一个人员"
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+#, fuzzy
+msgid "Add a new schema"
+msgstr "添加一个人员"
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""

Added: schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/schooltool.po
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/schooltool.po	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/locales/zh_CN/LC_MESSAGES/schooltool.po	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4952 @@
+# Chinese (China) translation for schooltool
+# Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006
+# This file is distributed under the same license as the schooltool package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: schooltool\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
+"POT-Creation-Date: Fri Oct 20 15:20:33 2006\n"
+"PO-Revision-Date: 2006-05-28 16:05+0000\n"
+"Last-Translator: gnix_oag <gnix.oag at gmail.com>\n"
+"Language-Team: Chinese (China) <zh_CN at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: /src/schoolbell/app/interfaces.py:13
+msgid "Nickname"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:15
+msgid "A short nickname for this person."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:18
+msgid "Primary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:22
+msgid "Secondary Email"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:26
+msgid "Primary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:28
+msgid "Recommended telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:31
+msgid "Secondary phone"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:33
+msgid "Secondary telephone number."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:36
+msgid "Website"
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:38
+msgid "Website or weblog."
+msgstr ""
+
+#: /src/schoolbell/app/interfaces.py:41
+msgid "Mailing address"
+msgstr ""
+
+#: /src/schooltool/app/browser/__init__.py:254
+#: /src/schooltool/app/browser/templates/index.pt:11
+msgid "Persons"
+msgstr "用户"
+
+#: /src/schooltool/app/browser/__init__.py:259
+msgid "1 person"
+msgstr "用户1"
+
+#. Default: ""
+#: /src/schooltool/app/browser/__init__.py:261
+msgid "${number} persons"
+msgstr "${number} 用户"
+
+#: /src/schooltool/app/browser/app.py:231
+msgid "Username or password is incorrect"
+msgstr "用户名或密码错误"
+
+#: /src/schooltool/app/browser/app.py:313
+msgid "Leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:314
+msgid "Current leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/app.py:315
+msgid "Available leaders"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "March"
+msgstr "三月"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "January"
+msgstr "一月"
+
+#: /src/schooltool/app/browser/cal.py:100
+msgid "February"
+msgstr "二月"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "June"
+msgstr "六月"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "May"
+msgstr "五月"
+
+#: /src/schooltool/app/browser/cal.py:101
+msgid "April"
+msgstr "四月"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "August"
+msgstr "八月"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "September"
+msgstr "九月"
+
+#: /src/schooltool/app/browser/cal.py:102
+msgid "July"
+msgstr "七月"
+
+#: /src/schooltool/app/browser/cal.py:1021
+msgid "The next day"
+msgstr "下一日"
+
+#: /src/schooltool/app/browser/cal.py:1022
+msgid "Today"
+msgstr "今天"
+
+#: /src/schooltool/app/browser/cal.py:1023
+msgid "The previous day"
+msgstr "上一日"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "October"
+msgstr "十月"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "December"
+msgstr "十二月"
+
+#: /src/schooltool/app/browser/cal.py:103
+msgid "November"
+msgstr "十一月"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/person/interfaces.py:176
+#: /src/schooltool/timetable/browser/schema.py:95
+#: /src/schooltool/timetable/browser/schema.py:270
+#: /src/schooltool/term/browser/term_add_edit.pt:94
+#: /src/schooltool/term/browser/term_add_edit.pt:120
+#: /src/schooltool/term/browser/term.pt:31
+msgid "Monday"
+msgstr "星期一"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:96
+#: /src/schooltool/timetable/browser/schema.py:271
+#: /src/schooltool/term/browser/term_add_edit.pt:96
+#: /src/schooltool/term/browser/term_add_edit.pt:121
+#: /src/schooltool/term/browser/term.pt:32
+msgid "Tuesday"
+msgstr "星期二"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:97
+#: /src/schooltool/timetable/browser/schema.py:272
+#: /src/schooltool/term/browser/term_add_edit.pt:98
+#: /src/schooltool/term/browser/term_add_edit.pt:122
+#: /src/schooltool/term/browser/term.pt:33
+msgid "Wednesday"
+msgstr "星期三"
+
+#: /src/schooltool/app/browser/cal.py:106
+#: /src/schooltool/timetable/browser/schema.py:98
+#: /src/schooltool/timetable/browser/schema.py:273
+#: /src/schooltool/term/browser/term_add_edit.pt:100
+#: /src/schooltool/term/browser/term_add_edit.pt:123
+#: /src/schooltool/term/browser/term.pt:34
+msgid "Thursday"
+msgstr "星期四"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/person/interfaces.py:175
+#: /src/schooltool/timetable/browser/schema.py:276
+#: /src/schooltool/term/browser/term_add_edit.pt:106
+#: /src/schooltool/term/browser/term_add_edit.pt:126
+#: /src/schooltool/term/browser/term.pt:37
+msgid "Sunday"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:275
+#: /src/schooltool/term/browser/term_add_edit.pt:104
+#: /src/schooltool/term/browser/term_add_edit.pt:125
+#: /src/schooltool/term/browser/term.pt:36
+msgid "Saturday"
+msgstr "星期六"
+
+#: /src/schooltool/app/browser/cal.py:107
+#: /src/schooltool/timetable/browser/schema.py:99
+#: /src/schooltool/timetable/browser/schema.py:274
+#: /src/schooltool/term/browser/term_add_edit.pt:102
+#: /src/schooltool/term/browser/term_add_edit.pt:124
+#: /src/schooltool/term/browser/term.pt:35
+msgid "Friday"
+msgstr "星期五"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1732
+msgid "Mon"
+msgstr "星期一"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1733
+msgid "Tue"
+msgstr "星期二"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1734
+msgid "Wed"
+msgstr "星期三"
+
+#: /src/schooltool/app/browser/cal.py:110
+#: /src/schooltool/app/browser/cal.py:1735
+msgid "Thu"
+msgstr "星期四"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1736
+msgid "Fri"
+msgstr "星期五"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1737
+msgid "Sat"
+msgstr "星期六"
+
+#: /src/schooltool/app/browser/cal.py:111
+#: /src/schooltool/app/browser/cal.py:1738
+msgid "Sun"
+msgstr "星期日"
+
+#: /src/schooltool/app/browser/cal.py:1658
+#: /src/schooltool/app/interfaces.py:122 /src/schooltool/app/interfaces.py:133
+#: /src/schooltool/commendation/interfaces.py:48
+#: /src/schooltool/course/interfaces.py:36
+#: /src/schooltool/dashboard/interfaces.py:44
+#: /src/schooltool/group/interfaces.py:43
+#: /src/schooltool/level/interfaces.py:75
+#: /src/schooltool/level/interfaces.py:142
+#: /src/schooltool/note/interfaces.py:42
+#: /src/schooltool/resource/interfaces.py:38
+#: /src/schooltool/term/browser/term.py:63
+#: /src/schooltool/term/interfaces.py:67
+#: /src/schooltool/timetable/browser/ttwizard.py:241
+msgid "Title"
+msgstr "标题"
+
+#: /src/schooltool/app/browser/cal.py:1661
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:39
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:42
+msgid "All day"
+msgstr "整天"
+
+#: /src/schooltool/app/browser/cal.py:1664
+#: /src/schooltool/commendation/interfaces.py:65
+#: /src/schooltool/gradebook/interfaces.py:54
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:29
+#: /src/schooltool/term/browser/emergency_select.pt:29
+msgid "Date"
+msgstr "日期"
+
+#: /src/schooltool/app/browser/cal.py:1667
+msgid "Time"
+msgstr "时间"
+
+#: /src/schooltool/app/browser/cal.py:1668
+msgid "Start time in 24h format"
+msgstr "开始时间"
+
+#: /src/schooltool/app/browser/cal.py:1672
+msgid "Duration"
+msgstr "持续时间"
+
+#: /src/schooltool/app/browser/cal.py:1677
+msgid "Duration Type"
+msgstr "持续时间类型"
+
+#: /src/schooltool/app/browser/cal.py:1680
+#: /src/schooltool/app/browser/templates/event_add.pt:168
+msgid "Minutes"
+msgstr "分钟"
+
+#: /src/schooltool/app/browser/cal.py:1681
+#: /src/schooltool/app/browser/templates/event_add.pt:171
+msgid "Hours"
+msgstr "小时"
+
+#: /src/schooltool/app/browser/cal.py:1682
+#: /src/schooltool/app/browser/templates/event_add.pt:175
+msgid "Days"
+msgstr "日"
+
+#: /src/schooltool/app/browser/cal.py:1685
+#: /src/schooltool/app/browser/templates/event.pt:48
+#: /src/schooltool/resource/browser/resource.pt:11
+msgid "Location"
+msgstr "地点"
+
+#: /src/schooltool/app/browser/cal.py:1689
+#: /src/schooltool/commendation/interfaces.py:53
+#: /src/schooltool/course/interfaces.py:40
+#: /src/schooltool/course/interfaces.py:77
+#: /src/schooltool/gradebook/interfaces.py:38
+#: /src/schooltool/group/interfaces.py:47
+#: /src/schooltool/level/interfaces.py:147
+#: /src/schooltool/resource/interfaces.py:42
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:24
+msgid "Description"
+msgstr "说明"
+
+#: /src/schooltool/app/browser/cal.py:1694
+msgid "Recurring"
+msgstr "重复"
+
+#: /src/schooltool/app/browser/cal.py:1698
+msgid "Recurs every"
+msgstr "重来"
+
+#: /src/schooltool/app/browser/cal.py:1701
+msgid "Day"
+msgstr "日"
+
+#: /src/schooltool/app/browser/cal.py:1702
+msgid "Week"
+msgstr "周"
+
+#: /src/schooltool/app/browser/cal.py:1703
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:124
+msgid "Month"
+msgstr "月"
+
+#: /src/schooltool/app/browser/cal.py:1704
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:137
+msgid "Year"
+msgstr "年"
+
+#: /src/schooltool/app/browser/cal.py:1707
+msgid "Repeat every"
+msgstr "重复所有"
+
+#: /src/schooltool/app/browser/cal.py:1712
+msgid "Range"
+msgstr "范围"
+
+#: /src/schooltool/app/browser/cal.py:1715
+msgid "Count"
+msgstr "数目"
+
+#: /src/schooltool/app/browser/cal.py:1716
+msgid "Until"
+msgstr "直到"
+
+#: /src/schooltool/app/browser/cal.py:1717
+msgid "forever"
+msgstr "永远"
+
+#: /src/schooltool/app/browser/cal.py:1720
+msgid "Number of events"
+msgstr "事件号"
+
+#: /src/schooltool/app/browser/cal.py:1724
+#: /src/schooltool/app/browser/templates/event_add.pt:304
+msgid "Repeat until"
+msgstr "重复直到"
+
+#: /src/schooltool/app/browser/cal.py:1728
+msgid "Weekdays"
+msgstr "每周"
+
+#: /src/schooltool/app/browser/cal.py:1731
+msgid "Weekday"
+msgstr "每周"
+
+#: /src/schooltool/app/browser/cal.py:1741
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/event_add.pt:257
+msgid "Monthly"
+msgstr "每月"
+
+#: /src/schooltool/app/browser/cal.py:1749
+msgid "Exception dates"
+msgstr "日期例外"
+
+#: /src/schooltool/app/browser/cal.py:1828
+msgid "same weekday"
+msgstr "一些周"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "1st"
+msgstr "第一"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "4th"
+msgstr "第四"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "3rd"
+msgstr "第三"
+
+#: /src/schooltool/app/browser/cal.py:1833
+msgid "2nd"
+msgstr "第二"
+
+#: /src/schooltool/app/browser/cal.py:1834
+msgid "5th"
+msgstr "第五"
+
+#: /src/schooltool/app/browser/cal.py:1848
+msgid "last weekday"
+msgstr "最后一周"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:1858
+msgid "Last ${weekday}"
+msgstr "最后${weekday}周"
+
+#: /src/schooltool/app/browser/cal.py:1881
+#: /src/schooltool/app/browser/cal.py:2187
+#: /src/schooltool/course/browser/section.py:134
+msgid "An error occurred."
+msgstr "发生错误"
+
+#: /src/schooltool/app/browser/cal.py:1914
+msgid "Invalid time"
+msgstr "无效时间"
+
+#: /src/schooltool/app/browser/cal.py:1935
+msgid "End date is earlier than start date"
+msgstr "终止日期比开始日期还早"
+
+#: /src/schooltool/app/browser/cal.py:1944
+msgid "Invalid date.  Please specify YYYY-MM-DD, one per line."
+msgstr "无效日期。请指定每行 YYYY-MM-DD"
+
+#: /src/schooltool/app/browser/cal.py:1992
+msgid "Add event"
+msgstr "添加事件"
+
+#: /src/schooltool/app/browser/cal.py:1993
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+msgid "Add"
+msgstr "添加"
+
+#: /src/schooltool/app/browser/cal.py:2062
+msgid "Edit event"
+msgstr "编辑事件"
+
+#: /src/schooltool/app/browser/cal.py:2063
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:29
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:81
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:185
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:42
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:61
+msgid "Update"
+msgstr "更新"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:2193 /src/schooltool/skin/form.py:77
+msgid "Updated on ${date_time}"
+msgstr "更新于${date_time}"
+
+#: /src/schooltool/app/browser/cal.py:2532
+#: /src/schooltool/app/browser/configure.zcml:554
+#: /src/schooltool/app/configure.zcml:301
+#: /src/schooltool/resource/rest/resource.pt:14
+#: /src/schooltool/person/rest/person.pt:13
+msgid "Calendar"
+msgstr "日历"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:372
+msgid "${day_of_week}, ${date}"
+msgstr "${day_of_week}, ${date}"
+
+#: /src/schooltool/app/browser/cal.py:845
+msgid "Next week"
+msgstr "下一周"
+
+#: /src/schooltool/app/browser/cal.py:846
+msgid "Current week"
+msgstr "本周"
+
+#: /src/schooltool/app/browser/cal.py:847
+msgid "Previous week"
+msgstr "上一周"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:856
+msgid "${month}, ${year} (week ${week})"
+msgstr ""
+
+#: /src/schooltool/app/browser/cal.py:906
+msgid "Next month"
+msgstr "下一月"
+
+#: /src/schooltool/app/browser/cal.py:907
+msgid "Current month"
+msgstr "本月"
+
+#: /src/schooltool/app/browser/cal.py:908
+msgid "Previous month"
+msgstr "上一月"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:916
+msgid "${month}, ${year}"
+msgstr "${month}, ${year}"
+
+#. Default: ""
+#: /src/schooltool/app/browser/cal.py:938
+msgid "Week ${week_no}"
+msgstr "${week_no} 星期"
+
+#: /src/schooltool/app/browser/cal.py:954
+msgid "Next year"
+msgstr "下一年"
+
+#: /src/schooltool/app/browser/cal.py:955
+msgid "Current year"
+msgstr "今年"
+
+#: /src/schooltool/app/browser/cal.py:956
+msgid "Previous year"
+msgstr "上一年"
+
+#: /src/schooltool/app/browser/configure.zcml:137
+msgid "Actions"
+msgstr "操作"
+
+#: /src/schooltool/app/browser/configure.zcml:184
+#: /src/schooltool/app/configure.zcml:287
+#: /src/schooltool/skin/templates/view_macros.pt:33
+msgid "SchoolTool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/configure.zcml:324
+#, fuzzy
+msgid "Calendar (Daily)"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/configure.zcml:334
+msgid "Calendar (Daily, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:344
+#, fuzzy
+msgid "Calendar (Weekly)"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/configure.zcml:354
+msgid "Calendar (Weekly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:364
+#, fuzzy
+msgid "Calendar (Monthly)"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/configure.zcml:374
+msgid "Calendar (Monthly, PDF)"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:384
+#, fuzzy
+msgid "Calendar (Yearly)"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/configure.zcml:394
+#, fuzzy
+msgid "Atom View"
+msgstr "查看"
+
+#: /src/schooltool/app/browser/configure.zcml:404
+#, fuzzy
+msgid "iCalendar"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/configure.zcml:414
+msgid "Free/Busy"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:444
+#, fuzzy
+msgid "Add Event"
+msgstr "添加事件"
+
+#: /src/schooltool/app/browser/configure.zcml:463
+#, fuzzy
+msgid "Edit Event"
+msgstr "编辑事件"
+
+#: /src/schooltool/app/browser/configure.zcml:530
+msgid "Browser UI"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:542
+#: /src/schooltool/app/browser/templates/login.pt:3
+#, fuzzy
+msgid "Login"
+msgstr "地点"
+
+#: /src/schooltool/app/browser/configure.zcml:548
+#: /src/schooltool/app/rest/configure.zcml:261
+msgid "Errors"
+msgstr ""
+
+#: /src/schooltool/app/browser/configure.zcml:560
+#: /src/schooltool/skin/templates/navigation.pt:2
+msgid "Navigation"
+msgstr "导航"
+
+#: /src/schooltool/app/browser/configure.zcml:566
+#: /src/schooltool/app/rest/configure.zcml:267
+#, fuzzy
+msgid "Application"
+msgstr "操作"
+
+#: /src/schooltool/app/browser/configure.zcml:572
+#, fuzzy
+msgid "Calendar Widget"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/configure.zcml:578
+msgid "Templates"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:106
+#: /src/schooltool/app/browser/csvimport.py:286
+msgid "No data provided"
+msgstr "倘若没有数据"
+
+#: /src/schooltool/app/browser/csvimport.py:113
+msgid "Could not convert data to Unicode (incorrect charset?)."
+msgstr "不能转换数据编码(错误字符集)"
+
+#: /src/schooltool/app/browser/csvimport.py:122
+msgid "CSV file imported successfully."
+msgstr "输入CSV文件成功"
+
+#: /src/schooltool/app/browser/csvimport.py:124
+msgid "Failed to import CSV file"
+msgstr "输入CSV文件失败"
+
+#: /src/schooltool/app/browser/csvimport.py:132
+msgid "CSV text imported successfully."
+msgstr "输入CSV文本失败"
+
+#: /src/schooltool/app/browser/csvimport.py:134
+msgid "Failed to import CSV text"
+msgstr "输入CSV文本失败"
+
+#: /src/schooltool/app/browser/csvimport.py:156
+msgid "No charset specified"
+msgstr "未指定字符集"
+
+#: /src/schooltool/app/browser/csvimport.py:161
+msgid "Unknown charset"
+msgstr "未知字符集"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:205
+msgid "Error in CSV data, line ${line_no}"
+msgstr "CSV 数据的${line_no}行错误"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:209
+#: /src/schooltool/app/browser/csvimport.py:514
+msgid "Conversion to unicode failed in line ${line_no}"
+msgstr "第 ${line_no} 行转换成 unicode 失败"
+
+#: /src/schooltool/app/browser/csvimport.py:292
+msgid "Row 2 is not empty"
+msgstr "2行非空"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:328
+msgid ""
+"Wrong section header on line ${line_no} (it should contain a course id and "
+"an instructor id)"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:354
+msgid "Malformed line ${line_no} (it should contain a day id and a period id)"
+msgstr "畸形的${line_no} 行(it should contain a day id and a period id)"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:377
+msgid "Incomplete section description on line ${line}"
+msgstr "${line} 行的章节描述不全"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:382
+msgid "No students in section (line ${line})"
+msgstr ""
+
+#: /src/schooltool/app/browser/csvimport.py:462
+msgid ""
+"The first row of the CSV file must contain the term id and the timetable "
+"schema id."
+msgstr "CSV 文件的第一行必需有项目ID和时间安排表"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:471
+msgid "The term ${term} does not exist."
+msgstr "术语 ${term} 不存在。"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:478
+msgid "The timetable schema ${schema} does not exist."
+msgstr "时间计划表 ${schema} 不存在。"
+
+#. Default: ""
+#: /src/schooltool/app/browser/csvimport.py:509
+msgid "Error in timetable CSV data, line ${line_no}"
+msgstr "在课程表 CSV 数据的第 ${line_no} 行出错"
+
+#: /src/schooltool/app/browser/csvimport.py:549
+msgid "Day ids not defined in selected schema: ${args}."
+msgstr "天 ID 没有在所选的模式中定义:${args}。"
+
+#: /src/schooltool/app/browser/csvimport.py:550
+msgid "Periods not defined in selected days: ${args}."
+msgstr "时段没有在所选的天中定义:${args}。"
+
+#: /src/schooltool/app/browser/csvimport.py:551
+msgid "Persons not found: ${args}."
+msgstr "没有找到会员:${args}。"
+
+#: /src/schooltool/app/browser/csvimport.py:552
+msgid "Courses not found: ${args}."
+msgstr "没有找到课程:${args}"
+
+#: /src/schooltool/app/browser/csvimport.py:553
+msgid "Sections not found: ${args}."
+msgstr "没有找到段:${args}。"
+
+#: /src/schooltool/app/browser/csvimport.py:554
+msgid "Invalid records: ${args}."
+msgstr "无效记录:${args}。"
+
+#: /src/schooltool/app/browser/overlay.py:209
+#: /src/schooltool/term/browser/term.py:146
+msgid "Saved changes."
+msgstr "更改已保存"
+
+#: /src/schooltool/app/browser/pdfcal.py:159
+msgid "all day"
+msgstr "整天"
+
+#: /src/schooltool/app/browser/pdfcal.py:186
+msgid "Location: %s"
+msgstr "位置:%s"
+
+#: /src/schooltool/app/browser/pdfcal.py:192
+msgid "Booked resources: %s"
+msgstr "已入册的资源"
+
+#: /src/schooltool/app/browser/pdfcal.py:207
+msgid "recurrent"
+msgstr ""
+
+#: /src/schooltool/app/browser/pdfcal.py:211
+msgid "overlaid from %s"
+msgstr "从 %s 覆盖"
+
+#: /src/schooltool/app/browser/pdfcal.py:278
+msgid "Daily calendar for %s"
+msgstr "%s的每日日历"
+
+#: /src/schooltool/app/browser/pdfcal.py:292
+msgid "Weekly calendar for %s"
+msgstr "%s的每周日历"
+
+#: /src/schooltool/app/browser/pdfcal.py:298
+msgid "Week %d (%s - %s), %d"
+msgstr "周 %d (%s - %s), %d"
+
+#: /src/schooltool/app/browser/pdfcal.py:317
+msgid "Monthly calendar for %s"
+msgstr "%s的每月日历"
+
+#: /src/schooltool/app/browser/pdfcal.py:57
+msgid "PDF support is disabled.  It can be enabled by your administrator."
+msgstr "PDF 支持失效。它能被管理员激活。"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:13
+msgid "Change site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:19
+msgid "General preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:34
+#: /src/schooltool/person/browser/person_preferences.pt:22
+#, fuzzy
+msgid "Calendar Preferences"
+msgstr "%s的日历"
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:4
+msgid "Edit site preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/application_preferences.pt:63
+msgid "Edit attendance preferences"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "[Schooltool.org]"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:15
+#, fuzzy
+msgid "Schooltool"
+msgstr "SchoolTool"
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:22
+msgid "Events for"
+msgstr ""
+
+#. Default: ""
+#.  "This is an Atom formatted XML site feed. It is intended to be viewed\n"
+#.  "      in a Newsreader or syndicated to another site. Please visit"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:43
+#, fuzzy
+msgid "atom_description"
+msgstr "说明"
+
+#. Default: "Atom Enabled"
+#: /src/schooltool/app/browser/templates/cal_atom.pt:47
+msgid "atom_enabled"
+msgstr ""
+
+#. Default: "for more info."
+#: /src/schooltool/app/browser/templates/cal_atom.pt:50
+msgid "atom_more_info"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "Validate my Atom feed"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/cal_atom.pt:57
+msgid "[Valid Atom]"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:120
+msgid "Jump To ..."
+msgstr "跳过......"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:206
+msgid "Tomorrow's Events"
+msgstr "明天的事件"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:29
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+msgid "Printable version"
+msgstr "发布版本"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:34
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:53
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+msgstr "<img alt=\"x\" src=\"${DYNAMIC_CONTENT}\" />"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:37
+msgid "View daily calendar"
+msgstr "查看日历"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:41
+msgid "Daily"
+msgstr "每天"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:43
+msgid "View weekly calendar"
+msgstr "查看周历"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:47
+#: /src/schooltool/app/browser/templates/event_add.pt:235
+msgid "Weekly"
+msgstr "每周"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:49
+msgid "View monthly calendar"
+msgstr "查看月历"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:55
+msgid "View yearly calendar"
+msgstr "查看年历"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:59
+msgid "Yearly"
+msgstr "每年"
+
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+msgid "Calendar for ${title} - ${calendar_title}"
+msgstr "日历的 ${title} - ${calendar_title}"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Cal"
+msgstr "Cal(Cal语言)"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:13
+msgid "Personal calendar"
+msgstr "个人日历"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "Timetable calendar"
+msgstr "课程安排表"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:16
+msgid "TT"
+msgstr "TT (用户终端)"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:26
+#: /src/schooltool/skin/templates/view_macros.pt:76
+msgid "My Calendar"
+msgstr "我的日历"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:4
+msgid "Calendars"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:48
+msgid "More..."
+msgstr "更多..."
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:15
+msgid "Select additional calendars to display"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:27
+msgid "Hold down Ctrl or Shift to select multiple calendars."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:32
+#, fuzzy
+msgid "Public Calendar"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:37
+#, fuzzy
+msgid "site-wide calendar"
+msgstr "日程表视图"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:4
+#, fuzzy
+msgid "Select calendars to display"
+msgstr "%s的每周日历"
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:42
+msgid "People"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:43
+msgid "There are no persons with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:57
+msgid "There are no groups with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:71
+msgid "There are no resources with calendars accessible to you."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:62
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:90
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+#: /src/schooltool/commendation/commendation_add.pt:33
+msgid "A"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:10
+#: /src/schooltool/person/browser/person_container_delete.pt:10
+msgid "Are you sure you want to delete selected items?"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/container_delete.pt:16
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:16
+#: /src/schooltool/person/browser/person_container_delete.pt:16
+#: /src/schooltool/term/browser/term-container-delete.pt:16
+msgid "You have not selected any items."
+msgstr ""
+
+#. Default: "Confirm"
+#: /src/schooltool/app/browser/templates/container_delete.pt:27
+#: /src/schooltool/gradebook/browser/activities_overview.pt:46
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:29
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:29
+#: /src/schooltool/course/browser/templates/course_container.pt:59
+#: /src/schooltool/course/browser/templates/section_container.pt:83
+#: /src/schooltool/skin/templates/container.pt:46
+#: /src/schooltool/skin/templates/table_macros.pt:15
+#: /src/schooltool/person/browser/person_container_delete.pt:30
+#: /src/schooltool/term/browser/term-container-delete.pt:29
+#: /src/schooltool/term/browser/term-container.pt:26
+#, fuzzy
+msgid "delete-button"
+msgstr "取消"
+
+#. Default: "Cancel"
+#: /src/schooltool/app/browser/templates/container_delete.pt:29
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:87
+#: /src/schooltool/app/browser/templates/application_preferences.pt:59
+#: /src/schooltool/app/browser/templates/event_booking.pt:84
+#: /src/schooltool/app/browser/templates/event_add.pt:344
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:74
+#: /src/schooltool/setupdata/setupdata.pt:25
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:67
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:57
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:61
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:31
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:63
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:109
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:42
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:65
+#: /src/schooltool/sampledata/sampledata.pt:77
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:26
+#: /src/schooltool/course/browser/templates/section_edit.pt:54
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:102
+#: /src/schooltool/course/browser/templates/section_add.pt:75
+#: /src/schooltool/skin/templates/simple_edit.pt:54
+#: /src/schooltool/skin/templates/simple_add.pt:58
+#: /src/schooltool/note/note_add.pt:46
+#: /src/schooltool/demographics/browser/person_add.pt:11
+#: /src/schooltool/person/browser/person_preferences.pt:55
+#: /src/schooltool/person/browser/person_container_delete.pt:32
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:73
+#: /src/schooltool/term/browser/term-container-delete.pt:31
+#: /src/schooltool/term/browser/emergency_select.pt:42
+#: /src/schooltool/term/browser/emergency2.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:36
+msgid "cancel-button"
+msgstr "取消"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "R"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:23
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:37
+msgid "Remove"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:29
+#: /src/schooltool/gradebook/browser/activities_overview.pt:51
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:15
+#: /src/schooltool/course/browser/templates/course_container.pt:16
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:43
+#: /src/schooltool/course/browser/templates/section_container.pt:19
+#: /src/schooltool/skin/templates/container.pt:57
+#: /src/schooltool/skin/templates/table.pt:8
+#: /src/schooltool/term/browser/term-container.pt:14
+msgid "There are none."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/requirement/browser/requirement.pt:31
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:64
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:33
+msgid "Find Now"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:52
+#: /src/schooltool/requirement/browser/requirement.pt:33
+#: /src/schooltool/sampledata/sampledata.pt:69
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:66
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:35
+#, fuzzy
+msgid "Clear"
+msgstr "日历"
+
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:67
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:95
+msgid "There are none to add."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:15
+#, fuzzy
+msgid "All day event"
+msgstr "添加事件"
+
+#: /src/schooltool/app/browser/templates/event.pt:20
+msgid "This is a recurring event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:33
+msgid "Details"
+msgstr "详细资料"
+
+#: /src/schooltool/app/browser/templates/event.pt:37
+#, fuzzy
+msgid "Starts"
+msgstr "星期六"
+
+#: /src/schooltool/app/browser/templates/event.pt:42
+msgid "Ends"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+#, fuzzy
+msgid "edit event"
+msgstr "编辑事件"
+
+#: /src/schooltool/app/browser/templates/event.pt:53
+msgid "Change the details of this event"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event.pt:64
+#, fuzzy
+msgid "Scheduled resources"
+msgstr "已入册的资源"
+
+#: /src/schooltool/app/browser/templates/event.pt:72
+#, fuzzy
+msgid "edit resources"
+msgstr "已入册的资源"
+
+#: /src/schooltool/app/browser/templates/event.pt:80
+#, fuzzy
+msgid "delete event"
+msgstr "修改/删除事件"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:137
+msgid "Event information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:143
+#, fuzzy
+msgid "Event details"
+msgstr "详细资料"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:197
+#, fuzzy
+msgid "Book Resources"
+msgstr "已入册的资源"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:207
+#, fuzzy
+msgid "Update form"
+msgstr "更新"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:224
+#, fuzzy
+msgid "day"
+msgstr "今天"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:225
+#, fuzzy
+msgid "week"
+msgstr "周"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:226
+#, fuzzy
+msgid "month"
+msgstr "月"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:227
+#, fuzzy
+msgid "year"
+msgstr "年"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:236
+msgid "This section only applies when weekly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:258
+msgid "This section only applies when the monthly recurrence is selected."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:265
+msgid "Day ${monthday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+msgid "${weekday} of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+msgid "x of every month"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_add.pt:289
+#, fuzzy
+msgid "Repeat"
+msgstr "重复直到"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:292
+#, fuzzy
+msgid "times"
+msgstr "时间"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:307
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:32
+#: /src/schooltool/term/browser/emergency_select.pt:32
+#, fuzzy
+msgid "[popup calendar]"
+msgstr "日程表视图"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:325
+#, fuzzy
+msgid "Repeat forever"
+msgstr "重复所有"
+
+#: /src/schooltool/app/browser/templates/event_add.pt:346
+#, fuzzy
+msgid "Book resources"
+msgstr "已入册的资源"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:11
+msgid "Resource Booking for ${title}"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:17
+#, fuzzy
+msgid "Title:"
+msgstr "标题"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:21
+#, fuzzy
+msgid "Starts:"
+msgstr "星期六"
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:25
+msgid "Ends:"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:29
+msgid "This is a recurring event!"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:4
+msgid "Resource Booking"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:55
+msgid "Conflicting events"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_booking.pt:82
+msgid "Book"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:12
+#, fuzzy
+msgid "Location: ${location}"
+msgstr "位置:%s"
+
+#: /src/schooltool/app/browser/templates/index.pt:12
+#: /src/schooltool/course/browser/templates/section_container.pt:26
+msgid "Courses"
+msgstr "课程"
+
+#: /src/schooltool/app/browser/templates/index.pt:15
+msgid "Levels"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/index.pt:6
+msgid "Welcome to SchoolTool"
+msgstr "欢迎使用 SchoolTool"
+
+#: /src/schooltool/app/browser/templates/login.pt:13
+msgid ""
+"You are not allowed to access this page. You can click on the back button in "
+"your browser to go back, or ask a more privileged user to log in."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:23
+msgid "Please log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:29
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:36
+#: /src/schooltool/app/browser/templates/cal_monthly.pt:9
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:12
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:14
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:3
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:6
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:10
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:13
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:17
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:20
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:69
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:83
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:126
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:139
+#: /src/schooltool/app/browser/templates/calendar_macros.pt:155
+#: /src/schooltool/app/browser/templates/cal_daily.pt:39
+#: /src/schooltool/app/browser/templates/event.pt:3
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:19
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:21
+#: /src/schooltool/app/browser/templates/cal_weekly.pt:14
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:16
+#: /src/schooltool/app/browser/templates/cal_yearly.pt:23
+#: /src/schooltool/app/browser/templates/event_add.pt:4
+#: /src/schooltool/app/browser/templates/event_add.pt:248
+#: /src/schooltool/app/browser/templates/event_add.pt:272
+#: /src/schooltool/app/browser/templates/event_add.pt:279
+#: /src/schooltool/app/browser/templates/event_add.pt:341
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/app/browser/templates/edit_relationships.pt:36
+#: /src/schooltool/app/browser/templates/event_info_viewlet.pt:14
+#: /src/schooltool/group/browser/group-csvimport.pt:13
+#: /src/schooltool/group/browser/group-csvimport.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:17
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:53
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:58
+#: /src/schooltool/gradebook/browser/categories.pt:19
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:17
+#: /src/schooltool/requirement/browser/requirement.pt:4
+#: /src/schooltool/requirement/browser/requirement.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:19
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:99
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:152
+#: /src/schooltool/timetable/browser/templates/timetable.pt:3
+#: /src/schooltool/timetable/browser/templates/timetable.pt:8
+#: /src/schooltool/timetable/browser/templates/timetable.pt:21
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:25
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:31
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:40
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:50
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:59
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:79
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:9
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:60
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:86
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:19
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:18
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:12
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:15
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:21
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:14
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:3
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:8
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:24
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:14
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:19
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:11
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:14
+#: /src/schooltool/level/browser/record.pt:4
+#: /src/schooltool/level/browser/record.pt:19
+#: /src/schooltool/level/browser/record.pt:39
+#: /src/schooltool/level/browser/record.pt:61
+#: /src/schooltool/level/browser/promotion.pt:4
+#: /src/schooltool/level/browser/promotion.pt:15
+#: /src/schooltool/course/browser/templates/section_edit.pt:14
+#: /src/schooltool/course/browser/templates/section_edit.pt:19
+#: /src/schooltool/course/browser/templates/course.pt:48
+#: /src/schooltool/course/browser/templates/course.pt:49
+#: /src/schooltool/course/browser/templates/course_container.pt:4
+#: /src/schooltool/course/browser/templates/course_container.pt:9
+#: /src/schooltool/course/browser/templates/course_container.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:70
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:11
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:14
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:4
+#: /src/schooltool/course/browser/templates/section_container.pt:11
+#: /src/schooltool/course/browser/templates/section_add.pt:13
+#: /src/schooltool/skin/templates/simple_edit.pt:14
+#: /src/schooltool/skin/templates/simple_edit.pt:19
+#: /src/schooltool/skin/templates/actions.pt:10
+#: /src/schooltool/skin/templates/simple_add.pt:12
+#: /src/schooltool/skin/templates/simple_add.pt:17
+#: /src/schooltool/skin/templates/view_macros.pt:42
+#: /src/schooltool/skin/templates/view_macros.pt:46
+#: /src/schooltool/skin/templates/view_macros.pt:68
+#: /src/schooltool/skin/templates/view_macros.pt:73
+#: /src/schooltool/skin/templates/container.pt:4
+#: /src/schooltool/skin/templates/container.pt:10
+#: /src/schooltool/skin/templates/widget_macros.pt:5
+#: /src/schooltool/skin/templates/widget_macros.pt:10
+#: /src/schooltool/person/browser/person-csvimport.pt:13
+#: /src/schooltool/person/browser/person-csvimport.pt:16
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:48
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/real_time.pt:11
+#: /src/schooltool/attendance/browser/templates/real_time.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:11
+#: /src/schooltool/attendance/browser/templates/retro.pt:15
+#: /src/schooltool/attendance/browser/templates/retro.pt:26
+#: /src/schooltool/attendance/browser/templates/retro.pt:78
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:28
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:47
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:90
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:121
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:154
+#: /src/schooltool/term/browser/emergency_select.pt:18
+#: /src/schooltool/term/browser/emergency2.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:4
+#: /src/schooltool/term/browser/term_add_edit.pt:25
+#: /src/schooltool/term/browser/term_add_edit.pt:33
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term-container.pt:3
+#: /src/schooltool/term/browser/term-container.pt:9
+#: /src/schooltool/term/browser/term.pt:26
+msgid "${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/app/browser/templates/login.pt:35
+msgid "User Information"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "L"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:57
+msgid "Log in"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/login.pt:8
+msgid "Your session has expired."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:21
+msgid "You are trying to delete a repeating event."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:43
+#, fuzzy
+msgid "Current"
+msgstr "今年"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:45
+msgid "Future"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:47
+#, fuzzy
+msgid "All"
+msgstr "整天"
+
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:6
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:16
+msgid "Deleting a repeating event (${event_title})"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:57
+#: /src/schooltool/group/browser/group-csvimport.pt:57
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:57
+#: /src/schooltool/person/browser/person-csvimport.pt:55
+msgid "Western (ISO-8859-15)"
+msgstr "Western (ISO-8859-15)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:101
+#: /src/schooltool/resource/browser/resource-csvimport.pt:58
+#: /src/schooltool/group/browser/group-csvimport.pt:58
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:58
+#: /src/schooltool/person/browser/person-csvimport.pt:56
+msgid "Western (Windows-1252)"
+msgstr "Western (Windows-1252)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:102
+#: /src/schooltool/resource/browser/resource-csvimport.pt:59
+#: /src/schooltool/group/browser/group-csvimport.pt:59
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:59
+#: /src/schooltool/person/browser/person-csvimport.pt:57
+msgid "Other (please specify)"
+msgstr "其它 (请指定)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:106
+#: /src/schooltool/resource/browser/resource-csvimport.pt:63
+#: /src/schooltool/group/browser/group-csvimport.pt:63
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:63
+#: /src/schooltool/person/browser/person-csvimport.pt:61
+msgid "Other charset: ${other_charset}"
+msgstr "其它字符集:${other_charset}"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:110
+#: /src/schooltool/resource/browser/resource-csvimport.pt:67
+#: /src/schooltool/group/browser/group-csvimport.pt:67
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:67
+#: /src/schooltool/person/browser/person-csvimport.pt:65
+msgid "Input CSV Data"
+msgstr "输入 CSV 数据"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:111
+#: /src/schooltool/resource/browser/resource-csvimport.pt:68
+#: /src/schooltool/group/browser/group-csvimport.pt:68
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:68
+#: /src/schooltool/person/browser/person-csvimport.pt:66
+msgid "CSV Data"
+msgstr "CSV 数据"
+
+#. Default: "Submit"
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:117
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:84
+#: /src/schooltool/app/browser/templates/application_preferences.pt:56
+#: /src/schooltool/resource/browser/resource-csvimport.pt:72
+#: /src/schooltool/group/browser/group-csvimport.pt:72
+#: /src/schooltool/level/browser/record.pt:29
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:23
+#: /src/schooltool/course/browser/templates/section_edit.pt:51
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:72
+#: /src/schooltool/skin/templates/simple_edit.pt:51
+#: /src/schooltool/demographics/browser/person_add.pt:8
+#: /src/schooltool/person/browser/person-csvimport.pt:70
+#: /src/schooltool/person/browser/person_preferences.pt:52
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:70
+msgid "submit-button"
+msgstr "提交"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:20
+msgid "Import Timetable"
+msgstr "输入时间表"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:24
+msgid ""
+"You can create the CSV file in a spreadsheet and export it in CSV (Comma-"
+"Separated Values) format. The structure of the table is described below."
+msgstr "你能创建一个空的 CSV 表文件和输出 CSV 格式。在表的下面描述"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:30
+msgid ""
+"The first row of the file must contain the name of the <strong>term</strong> "
+"and the <strong>timetable schema</strong> which will be used for the new "
+"timetables. The second row should be empty. After that, several section "
+"descriptions may follow. They are separated by an empty line."
+msgstr ""
+"文件的第一行必须饮食<strong>学期</strong>名和一个新的<strong>时间表</"
+"strong>。第二行可以为空。之后可以跟随几节描述。它们用空行分开。"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:38
+msgid ""
+"Each section description's first row contains the <strong>course id</strong> "
+"and the <strong>instructor id</strong> for the new section. Then a number of "
+"rows, each containing a <strong>day id</strong> and a <strong>period id</"
+"strong>, follows. The list of period descriptions is terminated by three "
+"asterisks ('***') in the first column. After the terminator, any number of "
+"<strong>person ids</strong> may follow, the denoted persons will be added to "
+"the section as learners."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:4
+msgid "Upload SchoolTool timetable as CSV"
+msgstr "以 CSV 上传 SchoolTool 时间表"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:49
+#: /src/schooltool/resource/browser/resource-csvimport.pt:29
+#: /src/schooltool/group/browser/group-csvimport.pt:30
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:29
+#: /src/schooltool/person/browser/person-csvimport.pt:29
+msgid "Example:"
+msgstr "示例:"
+
+#. Default: ""
+#.  "\"2005-fall\",\"three-day\"\n"
+#.  "\"\",\"\",\"\"\n"
+#.  "\"philosophy\",\"lorch\"\n"
+#.  "\"Monday\",\"A\"\n"
+#.  "\"Monday\",\"B\"\n"
+#.  "\"Tuesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"billy\"\n"
+#.  "\"\"\n"
+#.  "\"literature\",\"guzman\"\n"
+#.  "\"Wednesday\",\"B\"\n"
+#.  "\"Wednesday\",\"C\"\n"
+#.  "\"***\"\n"
+#.  "\"johnny\"\n"
+#.  "\"pete\""
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:51
+msgid ""
+"\n"
+"\"2005-fall\",\"three-day\"\n"
+"\"\",\"\",\"\"\n"
+"\"philosophy\",\"lorch\"\n"
+"\"Monday\",\"A\"\n"
+"\"Monday\",\"B\"\n"
+"\"Tuesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"billy\"\n"
+"\"\"\n"
+"\"literature\",\"guzman\"\n"
+"\"Wednesday\",\"B\"\n"
+"\"Wednesday\",\"C\"\n"
+"\"***\"\n"
+"\"johnny\"\n"
+"\"pete\"\n"
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:69
+msgid ""
+"The above example will create two new sections, one for the philosophy "
+"lecture and the other for the literature lecture. The section for the "
+"philosophy lecture will have persons with ids 'johnny' and 'billy' as "
+"learners, and its timetable will contain three timetable activities, two on "
+"Monday. The literature section will be processed in a similar fashion."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:78
+msgid ""
+"Note that only ids of objects are to be used in the file, not titles. If a "
+"row ends with empty cells (e.g., <em>\"philosophy\",\"lorch\",\"\",\"\"</"
+"em>), those cells will be discarded. You may separate section descriptions "
+"by more than one line. In the list of learners, only the first column "
+"containing the person ids is processed, the other columns are ignored. You "
+"can import the same data several times without any side effects."
+msgstr ""
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:89
+#: /src/schooltool/resource/browser/resource-csvimport.pt:46
+#: /src/schooltool/group/browser/group-csvimport.pt:46
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:46
+#: /src/schooltool/person/browser/person-csvimport.pt:44
+msgid "Upload CSV File"
+msgstr "上载 CSV 文件"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:91
+#: /src/schooltool/resource/browser/resource-csvimport.pt:48
+#: /src/schooltool/group/browser/group-csvimport.pt:48
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:48
+#: /src/schooltool/person/browser/person-csvimport.pt:46
+msgid "CSV File"
+msgstr "CSV 文件"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:96
+#: /src/schooltool/resource/browser/resource-csvimport.pt:53
+#: /src/schooltool/group/browser/group-csvimport.pt:53
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:53
+#: /src/schooltool/person/browser/person-csvimport.pt:51
+msgid "Charset:"
+msgstr "字符集:"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:98
+#: /src/schooltool/resource/browser/resource-csvimport.pt:55
+#: /src/schooltool/group/browser/group-csvimport.pt:55
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:55
+#: /src/schooltool/person/browser/person-csvimport.pt:53
+msgid "Unicode (UTF-8)"
+msgstr "Unicode (UTF-8)"
+
+#: /src/schooltool/app/browser/templates/timetables-csvimport.pt:99
+#: /src/schooltool/resource/browser/resource-csvimport.pt:56
+#: /src/schooltool/group/browser/group-csvimport.pt:56
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:56
+#: /src/schooltool/person/browser/person-csvimport.pt:54
+msgid "Western (ISO-8859-1)"
+msgstr "Western (ISO-8859-1)"
+
+#: /src/schooltool/app/browser/tests/test_pdfcal.py:60
+msgid "Calendar for %s"
+msgstr "%s的日历"
+
+#: /src/schooltool/app/configure.zcml:293
+msgid "Security (General)"
+msgstr ""
+
+#: /src/schooltool/app/configure.zcml:308
+#, fuzzy
+msgid "Booking Resources"
+msgstr "已入册的资源"
+
+#: /src/schooltool/app/interfaces.py:124 /src/schooltool/app/interfaces.py:135
+msgid ""
+"The name for the school or organization running\n"
+"            this server.  This will be displayed on the public calendar, "
+"the\n"
+"            bottom of all pages and in the page title."
+msgstr ""
+"The name for the school or organization running↵\n"
+"            this server. This will be displayed on the public calendar, "
+"the↵\n"
+"            bottom of all pages and in the page title."
+
+#: /src/schooltool/app/interfaces.py:140
+msgid "Front Page Calendar"
+msgstr "头版日历"
+
+#: /src/schooltool/app/interfaces.py:141
+msgid ""
+"Display site-wide calendar as the front page of the\n"
+"            site."
+msgstr ""
+"Display site-wide calendar as the front page of the↵\n"
+"            site."
+
+#: /src/schooltool/app/interfaces.py:158
+msgid "Show timetables"
+msgstr "显示时间表"
+
+#: /src/schooltool/app/interfaces.py:159
+msgid ""
+"\n"
+"            An option that controls whether the timetable of this "
+"calendar's\n"
+"            owner is shown in the calendar views.\n"
+"            "
+msgstr ""
+"\n"
+"            ↵\n"
+"            An option that controls whether the timetable of this "
+"calendar's↵\n"
+"            owner is shown in the calendar views.↵\n"
+"            "
+
+#: /src/schooltool/app/interfaces.py:42
+msgid "Required input is missing."
+msgstr "缺少必需的输入"
+
+#: /src/schooltool/app/interfaces.py:50
+msgid "Form input is not a file object"
+msgstr "表单输入不是一个文件对象"
+
+#: /src/schooltool/app/interfaces.py:51 /src/schooltool/app/interfaces.py:55
+msgid "Invalid integer data"
+msgstr "无效的整型数据"
+
+#: /src/schooltool/app/interfaces.py:52
+msgid "Invalid text data"
+msgstr "无效文本数据"
+
+#: /src/schooltool/app/interfaces.py:53
+msgid "Invalid textual data"
+msgstr "无效原文数据"
+
+#: /src/schooltool/app/interfaces.py:54
+msgid "Invalid unicode data"
+msgstr "无效unicode数据"
+
+#: /src/schooltool/app/interfaces.py:56
+msgid "Invalid floating point data"
+msgstr "无效的浮点数据"
+
+#: /src/schooltool/app/interfaces.py:57
+msgid "Invalid datetime data"
+msgstr "无效日期时间数据"
+
+#: /src/schooltool/app/main.py:299
+msgid "Going to background, daemon pid %d"
+msgstr "后台处理,后台程序pid %d"
+
+#: /src/schooltool/app/main.py:354 /src/schooltool/app/main.py:391
+#: /src/schooltool/app/main.py:394
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: /src/schooltool/app/main.py:355
+msgid "Run %s -h for help."
+msgstr "运行 %s -h 得到帮助"
+
+#: /src/schooltool/app/main.py:367
+msgid "%s: daemon mode not supported on your operating system."
+msgstr "%s:%s:你的操作系统不支持守护模式"
+
+#: /src/schooltool/app/main.py:386
+msgid "Reading configuration from %s"
+msgstr "从%s读入配置"
+
+#: /src/schooltool/app/main.py:435
+msgid "%s Manager"
+msgstr "%s 管理员"
+
+#: /src/schooltool/app/main.py:455
+msgid "Startup time: %.3f sec real, %.3f sec CPU"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/app/main.py:493
+msgid ""
+"Could not initialize the database:\n"
+"%s"
+msgstr "不能初始化数据库"
+
+#: /src/schooltool/app/main.py:496
+msgid ""
+"\n"
+"Perhaps another %s instance is using it?"
+msgstr ""
+"\n"
+"↵\n"
+"Perhaps another %s instance is using it?"
+
+#: /src/schooltool/app/main.py:564
+msgid ""
+"Warning: could not find the reportlab library.\n"
+"PDF support disabled."
+msgstr ""
+"警告:没有找到 reportlab 库。\n"
+"PDF支持失效。"
+
+#: /src/schooltool/app/main.py:569
+msgid ""
+"Warning: font directory '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"警告:字体文件夹 '%s' 不存在\n"
+"PDF支持失效。"
+
+#: /src/schooltool/app/main.py:577
+msgid ""
+"Warning: font '%s' does not exist.\n"
+"PDF support disabled."
+msgstr ""
+"警告:字体 '%s' 不存在\n"
+"PDF支持失效。"
+
+#: /src/schooltool/app/main.py:71
+msgid ""
+"\n"
+"Usage: %s [options]\n"
+"Options:\n"
+"  -c, --config xxx       use this configuration file instead of the default\n"
+"  -h, --help             show this help message\n"
+"  -d, --daemon           go to background after starting\n"
+"  -r, --restore-manager password\n"
+"                         restore the manager user with the provided "
+"password\n"
+"                         (read password from the standart input if "
+"'password'\n"
+"                         is '-')\n"
+"  --manage               only do management tasks, don't run the server\n"
+msgstr ""
+
+#: /src/schooltool/app/main.py:85
+msgid ""
+"\n"
+"No storage defined in the configuration file.\n"
+"\n"
+"If you're using the default configuration file, please edit it now and\n"
+"uncomment one of the ZODB storage sections.\n"
+msgstr ""
+"\n"
+"↵\n"
+"No storage defined in the configuration file.↵\n"
+"↵\n"
+"If you're using the default configuration file, please edit it now and↵\n"
+"uncomment one of the ZODB storage sections.↵\n"
+
+#: /src/schooltool/app/main.py:93
+msgid ""
+"\n"
+"This is not a SchoolTool 0.11 database file, aborting.\n"
+msgstr ""
+"\n"
+"↵\n"
+"This is not a SchoolTool 0.11 database file, aborting.↵\n"
+
+#: /src/schooltool/app/main.py:98
+msgid ""
+"\n"
+"This is not a SchoolTool 0.10 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+"\n"
+"↵\n"
+"This is not a SchoolTool 0.10 database file, aborting.↵\n"
+"↵\n"
+"Please run the standalone database upgrade script.↵\n"
+
+#: /src/schooltool/app/rest/configure.zcml:244
+msgid "REST Interface"
+msgstr ""
+
+#: /src/schooltool/app/rest/templates/aoc.pt:10
+#: /src/schooltool/resource/rest/resource.pt:11
+#: /src/schooltool/group/rest/group.pt:11
+#: /src/schooltool/level/rest/level.pt:12
+#: /src/schooltool/course/rest/course.pt:10
+#: /src/schooltool/course/rest/section.pt:10
+#: /src/schooltool/person/rest/person.pt:10
+msgid "ACL"
+msgstr "ALC(访问控制表)"
+
+#: /src/schooltool/app/rest/templates/app.pt:5
+msgid "Welcome to the SchoolTool server"
+msgstr "欢迎使用SchoolTool服务"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:390
+msgid "Explanation was accepted."
+msgstr "公认的说明"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:392
+msgid "Is not explanained yet."
+msgstr "还未说明。"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:512
+msgid "Was late for ${section} (${mins} minutes)."
+msgstr "迟到${section} (${mins} minutes)。"
+
+#. Default: ""
+#: /src/schooltool/attendance/attendance.py:518
+msgid "Was absent from ${section}."
+msgstr "缺席${section}。"
+
+#: /src/schooltool/attendance/browser/attendance.py:428
+#: /src/schooltool/attendance/browser/attendance.py:754
+msgid "The arrival time you entered is invalid.  Please use HH:MM format"
+msgstr "你输入了无效的到达时间,请用HH:MM格式"
+
+#: /src/schooltool/attendance/browser/attendance.py:450
+msgid ""
+"The minutes late value you entered is invalid.  Please use an integer number "
+"of minutes."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:454
+msgid "Arrival times only apply to tardy students"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:647
+msgid "You are not allowed to modify attendance information."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:681
+msgid "Added an explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:689
+msgid "Resolved $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:692
+msgid "Rejected explanation for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:696
+msgid "Made $absence a tardy"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:707
+msgid ""
+"Cannot add new explanation for $absence: old explanation not accepted/"
+"rejected"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:718
+msgid "There are no outstanding explanations to accept for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:729
+msgid "There are no outstanding explanations to reject for $absence"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:745
+msgid ""
+"$absence is not a homeroom absence, only homeroom absences can be converted "
+"into tardies"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:762
+msgid "Could not convert $absence absence intoa homeroom tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/attendance.py:795
+msgid "homeroom"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:807
+msgid "$date $time: absent from $section"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/attendance.py:809
+msgid "$date $time: late for $section, arrived on $late_arrival"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:14
+#: /src/schooltool/attendance/browser/configure.zcml:49
+#: /src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt:1
+msgid "Attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/configure.zcml:58
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:4
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:10
+msgid "Attendance Control Panel"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:4
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:12
+msgid "Attendance preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:78
+msgid "back to site preferences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:17
+msgid "Students with unresolved absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:41
+#, fuzzy
+msgid "Person"
+msgstr "用户"
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:42
+msgid "Homeroom<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/controlpanel.pt:43
+msgid "Section<br />absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:11
+#, fuzzy
+msgid "Section attendance for ${section}"
+msgstr "缺席${section}。"
+
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:16
+msgid "This section has no meetings today."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:13
+#: /src/schooltool/attendance/browser/templates/retro.pt:13
+msgid "Homeroom attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:17
+#: /src/schooltool/attendance/browser/templates/retro.pt:17
+msgid "Section attendance for ${section} at ${date} period ${period_id}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:31
+msgid "Legend"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:32
+msgid ""
+"The sparkline (the little graph next to each student's name) shows the "
+"student's attendance for the last ten schooldays section had meetings on. If "
+"attendance status for a day is unknown the sparkline shows a dot. The "
+"whisker points upwards if the student was present during the homeroom "
+"period. An unexplained absence for a meeting is coloured red, and an "
+"unexplained absence for homeroom period is yellow."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:4
+#: /src/schooltool/attendance/browser/templates/retro.pt:4
+#: /src/schooltool/attendance/browser/templates/no_section_meeting.pt:4
+msgid "${section} attendance"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:40
+msgid ""
+"The student names are colored according to their attendance during today:"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:75
+msgid "attendance graph for the last 10 days"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:84
+msgid "Mark as absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:87
+msgid "Make tardy"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/real_time.pt:89
+#, fuzzy
+msgid "Minutes late:"
+msgstr "分钟"
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:30
+msgid "For Tardy, enter a number of minutes late. This field is optional."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:36
+msgid "Present"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:37
+msgid "Absent"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:38
+msgid "Tardy, mins late/arrival time"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/retro.pt:86
+msgid "Submit"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:133
+msgid "Summary"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:135
+msgid "There are no terms defined."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:139
+msgid "Tardies"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:159
+msgid "There were no absences in this term."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:34
+msgid "There are no unresolved absences."
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:4
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:10
+msgid "Attendance of ${person}"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:42
+msgid "Unresolved explained absences"
+msgstr ""
+
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:85
+msgid "Unresolved unexplained absences"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/attendance/browser/tests/test_attendance.py:263
+msgid "$title"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:39
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:18
+msgid "Attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:40
+msgid "Dictionary of abbreviated attendance status codes"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:44
+msgid "Retroactive attendance timeout"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:45
+msgid ""
+"\n"
+"            The period of time in minutes that must pass after the\n"
+"            section meeting is completed before the attendance form\n"
+"            changes from realtime to retroactive."
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:52
+msgid "Homeroom tardy grace period"
+msgstr ""
+
+#: /src/schooltool/attendance/interfaces.py:53
+msgid ""
+"\n"
+"            The period of time in minutes you can be late for section after\n"
+"            beeing late for homeroom period without giving separate\n"
+"            explanation."
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:28 /src/schooltool/batching/macros.pt:35
+#, fuzzy
+msgid "Previous"
+msgstr "上一年"
+
+#: /src/schooltool/batching/macros.pt:36
+msgid "&laquo; <span>x</span> <span>${DYNAMIC_CONTENT}</span>"
+msgstr ""
+
+#: /src/schooltool/batching/macros.pt:46 /src/schooltool/batching/macros.pt:51
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:35
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:30
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:39
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:20
+#: /src/schooltool/term/browser/term_add_edit.pt:60
+#, fuzzy
+msgid "Next"
+msgstr "下一周"
+
+#: /src/schooltool/batching/macros.pt:51
+msgid "<span>x</span> &raquo;"
+msgstr ""
+
+#: /src/schooltool/commendation/browser.py:69
+msgid "<unknown>"
+msgstr ""
+
+#: /src/schooltool/commendation/commendation_add.pt:13
+#, fuzzy
+msgid "Commendation"
+msgstr "地点"
+
+#: /src/schooltool/commendation/commendation_add.pt:4
+msgid "Add Commendation"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:49
+msgid "Title of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:54
+msgid "A detailed description of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:58
+msgid "Scope"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:59
+msgid "The scope of the commendation."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "school-wide"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "group"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:60
+msgid "community"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "global"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "national"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:61
+msgid "state"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:66
+msgid "The date the commendation was issued."
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:71
+msgid "Grantor"
+msgstr ""
+
+#: /src/schooltool/commendation/interfaces.py:72
+msgid "The grantor of the commendation."
+msgstr ""
+
+#: /src/schooltool/configure.zcml:44
+#: /src/schooltool/app/browser/configure.zcml:202
+#: /src/schooltool/app/browser/configure.zcml:434
+#: /src/schooltool/group/browser/configure.zcml:16
+#: /src/schooltool/group/browser/configure.zcml:106
+#: /src/schooltool/resource/browser/configure.zcml:17
+#: /src/schooltool/resource/browser/configure.zcml:90
+#: /src/schooltool/demographics/browser/configure.zcml:28
+#: /src/schooltool/course/browser/configure.zcml:58
+#: /src/schooltool/course/browser/configure.zcml:69
+#: /src/schooltool/course/browser/configure.zcml:103
+#: /src/schooltool/course/browser/configure.zcml:113
+#: /src/schooltool/level/browser/configure.zcml:10
+#: /src/schooltool/level/browser/configure.zcml:127
+#: /src/schooltool/requirement/browser/configure.zcml:46
+#: /src/schooltool/term/browser/configure.zcml:6
+#: /src/schooltool/term/browser/configure.zcml:16
+#: /src/schooltool/term/browser/configure.zcml:49
+#: /src/schooltool/timetable/browser/configure.zcml:55
+#: /src/schooltool/timetable/browser/configure.zcml:65
+#: /src/schooltool/timetable/browser/configure.zcml:103
+#: /src/schooltool/timetable/browser/configure.zcml:121
+#: /src/schooltool/timetable/browser/configure.zcml:130
+msgid "View"
+msgstr "查看"
+
+#: /src/schooltool/configure.zcml:45
+#: /src/schooltool/group/browser/configure.zcml:39
+#: /src/schooltool/resource/browser/configure.zcml:40
+#: /src/schooltool/course/browser/configure.zcml:143
+#: /src/schooltool/level/browser/level.pt:35
+#, fuzzy
+msgid "Edit Info"
+msgstr "编辑事件"
+
+#: /src/schooltool/configure.zcml:46
+msgid "Add Info"
+msgstr ""
+
+#: /src/schooltool/configure.zcml:47
+msgid "Edit Calendar Overlays"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:130
+#, fuzzy
+msgid "Add a Section"
+msgstr "操作"
+
+#: /src/schooltool/course/browser/configure.zcml:143
+msgid "Edit Section Information"
+msgstr ""
+
+#: /src/schooltool/course/browser/configure.zcml:85
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:21
+#, fuzzy
+msgid "Import Courses"
+msgstr "导入组"
+
+#: /src/schooltool/course/browser/configure.zcml:9
+#, fuzzy
+msgid "Add a Course"
+msgstr "课程"
+
+#: /src/schooltool/course/browser/configure.zcml:96
+#, fuzzy
+msgid "New Course"
+msgstr "课程"
+
+#: /src/schooltool/course/browser/course.py:40
+msgid "Course index"
+msgstr ""
+
+#: /src/schooltool/course/browser/course.py:41
+msgid "Add a new course"
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:39
+#: /src/schooltool/group/browser/csvimport.py:39
+#: /src/schooltool/person/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:39
+msgid "Insufficient data provided."
+msgstr ""
+
+#: /src/schooltool/course/browser/csvimport.py:43
+#: /src/schooltool/group/browser/csvimport.py:43
+#: /src/schooltool/resource/browser/csvimport.py:43
+msgid "Titles may not be empty"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:103
+msgid "No such course."
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:113
+msgid "Need a course ID."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/browser/section.py:118
+msgid "Add a Section to ${course}"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:259
+#: /src/schooltool/course/browser/templates/section.pt:50
+#: /src/schooltool/course/browser/templates/section_container.pt:32
+msgid "Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:260
+msgid "Current Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:261
+msgid "Available Instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:283
+#: /src/schooltool/gradebook/interfaces.py:75
+#: /src/schooltool/course/browser/templates/section.pt:69
+#: /src/schooltool/course/browser/templates/course_container.pt:52
+#: /src/schooltool/course/browser/templates/course_container.pt:77
+#: /src/schooltool/course/browser/templates/section_container.pt:77
+msgid "Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:284
+msgid "Current Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:285
+msgid "Available Students"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:311
+#: /src/schooltool/app/browser/templates/index.pt:13
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:56
+msgid "Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:312
+#: /src/schooltool/group/browser/group.py:60
+msgid "Current Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:313
+#: /src/schooltool/group/browser/group.py:61
+msgid "Available Groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:338
+#: /src/schooltool/app/browser/templates/index.pt:14
+#: /src/schooltool/app/browser/templates/calendar_selection.pt:70
+#: /src/schooltool/course/browser/templates/section.pt:33
+msgid "Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:339
+msgid "Current Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:340
+#: /src/schooltool/app/browser/templates/event_booking.pt:36
+msgid "Available Resources"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:68
+msgid "Section index"
+msgstr ""
+
+#: /src/schooltool/course/browser/section.py:69
+msgid "Add a new section"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a course title and <strong>may</"
+"strong> include an optional course description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "Ancient History, Pre-history through 1000 A.D.\n"
+#.  "US History\n"
+#.  "World History, 1000 A.D. through the 20th century, text after a second comma"
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:31
+msgid ""
+"\n"
+"Ancient History, Pre-history through 1000 A.D.\n"
+"US History\n"
+"World History, 1000 A.D. through the 20th century, text after a second "
+"comma\n"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:36
+msgid ""
+"The above example will create 3 courses titled 'Ancient History', 'US "
+"History' and 'World History'. The first and last course will have the "
+"descriptions 'Pre-history through 1000 A.D.' and '1000 A.D. through the 20th "
+"century' respectively. The Second course will have no description, and the "
+"extra \"text after a second comma\" text on the third course will be ignored."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool courses as CSV"
+msgstr "以 CSV 上传 SchoolTool 时间表"
+
+#: /src/schooltool/course/browser/templates/course.pt:18
+#, fuzzy
+msgid "Sections"
+msgstr "操作"
+
+#: /src/schooltool/course/browser/templates/course.pt:36
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:11
+msgid "photo"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/course.pt:53
+msgid "students"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:27
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:80
+msgid ""
+"Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a> (${day_id}, "
+"${period_id})"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:32
+#: /src/schooltool/course/browser/templates/edit_relationships.pt:85
+msgid "Conflict: <a href=\"${DYNAMIC_CONTENT}\">${DYNAMIC_CONTENT}</a>"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:13
+#, fuzzy
+msgid "Section of ${course} -- ${DYNAMIC_CONTENT}"
+msgstr "${DYNAMIC_CONTENT}"
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "edit info"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:22
+msgid "Change the name or description of this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+msgid "Change the resources for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:40
+#, fuzzy
+msgid "book resources"
+msgstr "已入册的资源"
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "Change the instructors for this section."
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:57
+msgid "edit instructors"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "edit individuals"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:87
+msgid "Change the students in this section individually"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "Change the students in this section by groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section.pt:94
+msgid "edit groups"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_add.pt:50
+#: /src/schooltool/skin/templates/simple_add.pt:45
+msgid "Identifier (optional)"
+msgstr ""
+
+#: /src/schooltool/course/browser/templates/section_container.pt:29
+#, fuzzy
+msgid "Section"
+msgstr "操作"
+
+#: /src/schooltool/course/browser/templates/section_container.pt:38
+#, fuzzy
+msgid "Current Size"
+msgstr "本周"
+
+#: /src/schooltool/course/browser/templates/section_edit.pt:23
+#: /src/schooltool/course/browser/templates/section_add.pt:27
+#: /src/schooltool/skin/templates/simple_edit.pt:23
+#: /src/schooltool/skin/templates/simple_add.pt:22
+msgid "There are ${num_errors} input errors."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:37
+msgid "Title of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:42
+msgid "Description of the course."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:65
+msgid "Label"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:67
+msgid ""
+"An identifier for a section, made up of instructor\n"
+"            names, courses, and meeting time."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:72
+#: /src/schooltool/attendance/browser/templates/attendance_preferences.pt:23
+msgid "Code"
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:74
+msgid "ID code for the section."
+msgstr ""
+
+#: /src/schooltool/course/interfaces.py:79
+msgid "Description of the section."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/course/section.py:63
+msgid "${instructors} -- ${courses}"
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:45
+msgid "Category Title."
+msgstr ""
+
+#: /src/schooltool/dashboard/interfaces.py:49
+#: /src/schooltool/dashboard/interfaces.py:50
+msgid "Weight"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:13
+#, fuzzy
+msgid "New Person"
+msgstr "用户"
+
+#: /src/schooltool/demographics/browser/configure.zcml:189
+#, fuzzy
+msgid "Search"
+msgstr "三月"
+
+#: /src/schooltool/demographics/browser/configure.zcml:199
+msgid "Schooltool Person Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:210
+#: /src/schooltool/demographics/browser/configure.zcml:271
+msgid "name info"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:216
+#: /src/schooltool/demographics/browser/configure.zcml:277
+msgid "demographics"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:222
+#: /src/schooltool/demographics/browser/configure.zcml:283
+msgid "schooldata"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:228
+#: /src/schooltool/demographics/browser/configure.zcml:289
+msgid "parent1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:234
+#: /src/schooltool/demographics/browser/configure.zcml:295
+msgid "parent2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:240
+#: /src/schooltool/demographics/browser/configure.zcml:301
+msgid "emergency1"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:246
+#: /src/schooltool/demographics/browser/configure.zcml:307
+msgid "emergency2"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:252
+#: /src/schooltool/demographics/browser/configure.zcml:313
+msgid "emergency3"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:260
+msgid "Schooltool Person Display Menu"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/configure.zcml:37
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#: /src/schooltool/term/browser/configure.zcml:58
+msgid "Edit"
+msgstr "编辑"
+
+#: /src/schooltool/demographics/browser/personform.py:102
+msgid "Apply and Next"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:113
+#: /src/schooltool/demographics/browser/personform.py:312
+#: /src/schooltool/person/browser/person.py:188
+#: /src/schooltool/skin/form.py:85
+#: /src/schooltool/app/browser/templates/recevent_delete.pt:49
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:37
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:22
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:43
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:20
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:32
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:41
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:22
+msgid "Cancel"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:156
+msgid "Change name information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:172
+msgid "Change name"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:183
+msgid "Change demographics for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:191
+msgid "Demographics"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:202
+msgid "Change school data for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:212
+msgid "School data"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/demographics/browser/personform.py:230
+msgid "Change contact information for ${fullname}"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:238
+msgid "Contact information"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:272
+#: /src/schooltool/demographics/browser/personform.py:273
+#: /src/schooltool/person/interfaces.py:78
+#: /src/schooltool/app/browser/templates/login.pt:38
+msgid "Username"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:277
+#: /src/schooltool/person/browser/person.py:167
+#: /src/schooltool/app/browser/templates/login.pt:44
+msgid "Password"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:292
+msgid "This username is already used!"
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:345
+msgid "Invalid teacher. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:377
+msgid "Invalid group. Possible causes: deleted or renamed."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/personform.py:98
+#: /src/schooltool/demographics/browser/personform.py:289
+#: /src/schooltool/person/browser/person.py:178
+#: /src/schooltool/skin/form.py:55
+#: /src/schooltool/app/browser/templates/calendar_overlay.pt:46
+msgid "Apply"
+msgstr "应用"
+
+#: /src/schooltool/demographics/browser/schooldata_view.pt:3
+#: /src/schooltool/demographics/browser/nameinfo_view.pt:3
+#: /src/schooltool/demographics/browser/display_form.pt:3
+#, fuzzy
+msgid "Display"
+msgstr "每天"
+
+#: /src/schooltool/demographics/browser/search.pt:24
+msgid "There were no results."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/search.pt:6
+msgid ""
+"Search for persons here. Note that in fulltext fields you can use wildcard "
+"characters such as *. For example, to search for everyone with John in their "
+"name, use <em>*john*</em>."
+msgstr ""
+
+#: /src/schooltool/demographics/browser/table.pt:8
+msgid "There are no persons."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:120
+msgid "Gender"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:126
+msgid "Birth date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:131
+msgid "Ethnicity"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:137
+msgid "Primary language"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:143
+msgid "Special education"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:148
+msgid "Previous school"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:191
+msgid "ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:196
+msgid "Enrollment date"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:201
+msgid "Projected graduation year"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:206
+msgid "Advisor"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:212
+msgid "Team"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:218
+msgid "Health information"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:239
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:15
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:32
+#: /src/schooltool/attendance/browser/templates/real_time.pt:55
+#: /src/schooltool/attendance/browser/templates/retro.pt:35
+msgid "Name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:244
+msgid "Relationship to student"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:250
+msgid "Street"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:255
+msgid "City"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:260
+msgid "State"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:265
+msgid "Postal code"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:270
+msgid "Home phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:275
+msgid "Work phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:280
+msgid "Cell phone"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:285
+#: /src/schooltool/app/browser/configure.zcml:536
+#: /src/schooltool/app/rest/configure.zcml:255 /src/schooltool/note/notes.pt:2
+msgid "Notes"
+msgstr "笔记"
+
+#: /src/schooltool/demographics/interfaces.py:295
+msgid "Text"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:296
+msgid "Full text search in name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:301
+msgid "Name of parent"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:302
+msgid "Full text search in parent names"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:307
+msgid "Student ID"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:43
+msgid "Prefix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:44
+msgid "Prefix such as Mr., Mrs."
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:49
+msgid "First name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:54
+msgid "Middle name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:59
+msgid "Last name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:64
+msgid "Suffix"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:69
+msgid "Preferred name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:70
+msgid "Name by which the student prefers to be called"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:75
+#: /src/schooltool/person/interfaces.py:69
+msgid "Full name"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:80
+#: /src/schooltool/person/interfaces.py:73
+msgid "Photo"
+msgstr ""
+
+#: /src/schooltool/demographics/interfaces.py:82
+#: /src/schooltool/person/interfaces.py:75
+msgid "Photo (in JPEG format)"
+msgstr ""
+
+#: /src/schooltool/devmode/configure.zcml:89
+#, fuzzy
+msgid "Configure"
+msgstr "课程"
+
+#: /src/schooltool/devmode/configure.zcml:97
+msgid "Error List"
+msgstr ""
+
+#: /src/schooltool/gradebook/activity.py:62
+#: /src/schooltool/gradebook/activity.py:78
+#: /src/schooltool/gradebook/interfaces.py:71
+#: /src/schooltool/gradebook/browser/configure.zcml:79
+#: /src/schooltool/gradebook/browser/configure.zcml:87
+#: /src/schooltool/gradebook/browser/configure.zcml:95
+#: /src/schooltool/gradebook/browser/activities_overview.pt:4
+#: /src/schooltool/gradebook/browser/activities_overview.pt:8
+msgid "Activities"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/activities_overview.pt:41
+msgid "(inherited)"
+msgstr ""
+
+#. Default: "Remove"
+#: /src/schooltool/gradebook/browser/categories.pt:27
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#, fuzzy
+msgid "remove-button"
+msgstr "提交"
+
+#. Default: "Add"
+#: /src/schooltool/gradebook/browser/categories.pt:36
+#: /src/schooltool/course/browser/templates/section_add.pt:64
+#: /src/schooltool/course/browser/templates/section_add.pt:69
+#: /src/schooltool/skin/templates/simple_add.pt:55
+#: /src/schooltool/note/note_add.pt:43
+#: /src/schooltool/commendation/commendation_add.pt:33
+#, fuzzy
+msgid "add-button"
+msgstr "取消"
+
+#: /src/schooltool/gradebook/browser/categories.pt:4
+#: /src/schooltool/gradebook/browser/categories.pt:15
+msgid "Manage Activity Categories"
+msgstr ""
+
+#. Default: "Change"
+#: /src/schooltool/gradebook/browser/categories.pt:45
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:59
+#, fuzzy
+msgid "change-button"
+msgstr "取消"
+
+#: /src/schooltool/gradebook/browser/category.py:43
+msgid "Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:49
+msgid "New Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:52
+msgid "Default Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:75
+msgid "Categories successfully deleted."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:81
+msgid "Category successfully added."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/category.py:87
+msgid "Default category successfully changed."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:103
+msgid "New Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:121
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:5
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:5
+msgid "Gradebook"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:38
+msgid "Add an Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/configure.zcml:51
+#, fuzzy
+msgid "Edit Activity"
+msgstr "编辑事件"
+
+#: /src/schooltool/gradebook/browser/configure.zcml:8
+msgid "Activity Categories"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:100
+msgid "Percent Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:102
+msgid "Median"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:104
+msgid "Standard Deviation"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:106
+msgid "Variance"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:113
+msgid "N/A"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:170
+msgid "The grade $value for activity $name is not valid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/gradebook/browser/gradebook.py:238
+msgid "The grade $value for $name is not valid."
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook.py:98
+msgid "Average"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:12
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:32
+msgid "Grade"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:28
+msgid "Student Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:29
+msgid "Activity Name"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:30
+msgid "(Due) Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:31
+msgid "Modification Date"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:33
+msgid "Max. Score"
+msgstr ""
+
+#. Default: "Update"
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+#, fuzzy
+msgid "update-button"
+msgstr "取消"
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:61
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:54
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:58
+msgid "U"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade.pt:64
+msgid "D"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:13
+#: /src/schooltool/gradebook/browser/gradebook_grade_activity.pt:13
+msgid "Grade ${name}"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_grade_student.pt:32
+msgid "Activity"
+msgstr ""
+
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:16
+#: /src/schooltool/gradebook/browser/gradebook_overview.pt:27
+msgid "(sort)"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:60
+msgid "Assignment"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:61
+msgid "Essay"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:62
+msgid "Exam"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:63
+msgid "Homework"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:64
+msgid "Journal"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:65
+msgid "Lab"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:66
+msgid "Presentation"
+msgstr ""
+
+#: /src/schooltool/gradebook/category.py:67
+msgid "Project"
+msgstr ""
+
+#: /src/schooltool/gradebook/configure.zcml:138
+msgid "Gradebook API"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:39
+msgid "A detailed description of the activity."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:43
+msgid "Category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:44
+msgid "The activity category"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:49
+msgid "Scoresystem"
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:50
+msgid "The activity scoresystem."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:55
+msgid "The date the activity was created."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:72
+msgid "Activities in this gradebook."
+msgstr ""
+
+#: /src/schooltool/gradebook/interfaces.py:76
+msgid "Students in this gradebook."
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:116
+msgid "Add/Remove Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:125
+#: /src/schooltool/group/browser/group-csvimport.pt:22
+msgid "Import Groups"
+msgstr "导入组"
+
+#: /src/schooltool/group/browser/configure.zcml:26
+msgid "Add a Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:39
+msgid "Edit Group Information"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:76
+#, fuzzy
+msgid "Change Membership"
+msgstr "管理全体会员"
+
+#: /src/schooltool/group/browser/configure.zcml:91
+msgid "New Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/configure.zcml:98
+#, fuzzy
+msgid "A Group"
+msgstr "导入组"
+
+#: /src/schooltool/group/browser/configure.zcml:98
+msgid "SchoolBell Group"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> include a group title and <strong>may</"
+"strong> include an optional group description. Any extra information will be "
+"discarded."
+msgstr ""
+
+#. Default: ""
+#.  "LUG, Linux Users Group\n"
+#.  "Chess Club\n"
+#.  "Sports Club, After-school sports club, <em>text after a second comma</em>"
+#: /src/schooltool/group/browser/group-csvimport.pt:32
+msgid ""
+"\n"
+"LUG, Linux Users Group\n"
+"Chess Club\n"
+"Sports Club, After-school sports club, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:37
+msgid ""
+"The above example will create 3 groups titled 'LUG', 'Chess Club' and "
+"'Sports Club'. The first and last group will have the descriptions 'Linux "
+"Users Group' and 'After-school sports club' respectively. The 'Chess Club' "
+"group will have no description, and the extra \"text after a second comma\" "
+"text on the third group will be ignored."
+msgstr ""
+
+#: /src/schooltool/group/browser/group-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool groups as CSV"
+msgstr "以 CSV 上传 SchoolTool 时间表"
+
+#: /src/schooltool/group/browser/group.pt:16
+#, fuzzy
+msgid "Members"
+msgstr "十一月"
+
+#: /src/schooltool/group/browser/group.pt:23
+#, fuzzy
+msgid "edit members"
+msgstr "九月"
+
+#: /src/schooltool/group/browser/group.pt:23
+msgid "Change the people who are members of this group."
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:47
+msgid "Group index"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:48
+msgid "Add a new group"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:59
+msgid "Groups of ${person}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/group/browser/group.py:97
+msgid "Members of ${group}"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:98
+msgid "Current Members"
+msgstr ""
+
+#: /src/schooltool/group/browser/group.py:99
+msgid "Add Members"
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:44
+msgid "Title of the group."
+msgstr ""
+
+#: /src/schooltool/group/interfaces.py:49
+msgid "Description of the group."
+msgstr ""
+
+#. Default: "Calendar"
+#: /src/schooltool/group/rest/group.pt:14
+#, fuzzy
+msgid "Private_calendar"
+msgstr "日程表视图"
+
+#: /src/schooltool/help/configure.zcml:46
+msgid "Contextual Help"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:102
+#, fuzzy
+msgid "Add a Level"
+msgstr "添加事件"
+
+#: /src/schooltool/level/browser/configure.zcml:114
+#, fuzzy
+msgid "Edit Level"
+msgstr "编辑事件"
+
+#: /src/schooltool/level/browser/configure.zcml:137
+#: /src/schooltool/level/browser/promotion.pt:10
+msgid "Student Management"
+msgstr ""
+
+#: /src/schooltool/level/browser/configure.zcml:164
+msgid "Academic Record"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:15
+msgid "This is an initial level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level.pt:21
+#, fuzzy
+msgid "None"
+msgstr "笔记"
+
+#: /src/schooltool/level/browser/level.py:41
+msgid "Level index"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:42
+msgid "Add a new level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:60
+msgid "Previous Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/level.py:61
+msgid ""
+"The previous level in the school. If None, then there is no previous level."
+msgstr ""
+
+#: /src/schooltool/level/browser/level_validation.pt:15
+msgid ""
+"The validation function examines the level graphs defined for this school "
+"and reports errors. It detects two types of errors: <ol> <li>Loops in "
+"Graphs</li> <li>Disconnected Levels</li> </ol>"
+msgstr ""
+
+#. Default: "Validate"
+#: /src/schooltool/level/browser/level_validation.pt:37
+#, fuzzy
+msgid "validate-button"
+msgstr "提交"
+
+#: /src/schooltool/level/browser/level_validation.pt:4
+#: /src/schooltool/level/browser/level_validation.pt:8
+msgid "Level Validation"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:100
+#, fuzzy
+msgid "Current Level"
+msgstr "本周"
+
+#: /src/schooltool/level/browser/promotion.pt:128
+msgid "O"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:21
+msgid "Enroll Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:29
+#: /src/schooltool/level/browser/promotion.pt:59
+#: /src/schooltool/level/browser/promotion.pt:99
+msgid "Student Name (username)"
+msgstr ""
+
+#. Default: "Enroll"
+#: /src/schooltool/level/browser/promotion.pt:44
+#, fuzzy
+msgid "enroll-button"
+msgstr "取消"
+
+#: /src/schooltool/level/browser/promotion.pt:44
+msgid "E"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:51
+msgid "Initialize Students"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:60
+msgid "Inital Level"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.pt:84
+msgid "I"
+msgstr ""
+
+#. Default: "Apply"
+#: /src/schooltool/level/browser/promotion.pt:84
+#: /src/schooltool/level/browser/promotion.pt:128
+#, fuzzy
+msgid "apply-button"
+msgstr "取消"
+
+#: /src/schooltool/level/browser/promotion.pt:91
+msgid "Level Outcome"
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:109
+#: /src/schooltool/level/browser/promotion.py:123
+msgid "No students were selected."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:116
+msgid "Students successfully enrolled."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:132
+msgid "Student processes successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/promotion.py:57
+msgid "Work Item successfully finished."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/level/browser/promotion.py:64
+msgid "Current Level: $level"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:107
+msgid "History"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:113
+msgid "on ${timestamp} by ${user}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:29
+msgid "S"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:38
+msgid "Workflow"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:46
+msgid "Below you see the current promotion work items for the student."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:71
+#: /src/schooltool/level/browser/record.pt:86
+#: /src/schooltool/level/browser/record.pt:99
+msgid "W"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:79
+msgid ""
+"You can also delete the process. All work items associated with this process "
+"will be removed as well."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:9
+msgid "Academic Record for ${name}"
+msgstr ""
+
+#: /src/schooltool/level/browser/record.pt:93
+msgid ""
+"The student is currently not initialized in the school. By pressing the "
+"button below, the student's school career will be initialized."
+msgstr ""
+
+#. Default: "Initialize"
+#: /src/schooltool/level/browser/record.pt:99
+#, fuzzy
+msgid "initialize-button"
+msgstr "取消"
+
+#: /src/schooltool/level/browser/record.py:56
+msgid "The status was successfully updated."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:68
+msgid "The Level Process was successfully initialized."
+msgstr ""
+
+#: /src/schooltool/level/browser/record.py:79
+msgid "The Level Process was successfully removed."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:132
+msgid "Time Stamp"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:133
+msgid "The date and time the record was created."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:137
+msgid "User"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:138
+msgid "The principal id of the user making the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:143
+msgid "Title of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:148
+msgid "A detailed description of the record."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:160
+msgid "Academic History"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:161
+msgid "The academic history of a student."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:166
+#: /src/schooltool/level/browser/record.pt:15
+#: /src/schooltool/attendance/browser/templates/real_time.pt:56
+msgid "Status"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:167
+msgid "The current standing of the student in the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Graduated"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+msgid "Withdrawn"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:169
+#: /src/schooltool/level/interfaces.py:171
+msgid "Enrolled"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:174
+msgid "Level Process"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:175
+msgid "The workflow process of the level the student is currently completing."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:76
+msgid "Title of the level."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:80
+msgid "Is Initial Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:81
+msgid "Is this level an initial level for the school."
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:86
+msgid "Next Level"
+msgstr ""
+
+#: /src/schooltool/level/interfaces.py:87
+msgid ""
+"The next level in the school. If None, then there is no following level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:128
+#: /src/schooltool/level/browser/promotion.pt:101
+msgid "Outcome"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:129
+msgid "Outcome of the level."
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "fail"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+msgid "withdraw"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:130
+#: /src/schooltool/level/promotion.py:132
+msgid "pass"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:96
+msgid "Level"
+msgstr ""
+
+#: /src/schooltool/level/promotion.py:97
+msgid "The initial level of the student in the school."
+msgstr ""
+
+#: /src/schooltool/note/configure.zcml:39
+#, fuzzy
+msgid "New Note"
+msgstr "笔记"
+
+#: /src/schooltool/note/interfaces.py:43
+msgid "Title of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:46
+msgid "Body"
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:47
+msgid "Body of the note."
+msgstr ""
+
+#: /src/schooltool/note/interfaces.py:50 /src/schooltool/note/note_add.pt:24
+msgid "Privacy"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:13
+#, fuzzy
+msgid "Note"
+msgstr "笔记"
+
+#: /src/schooltool/note/note_add.pt:24
+msgid "Who can view the note"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:30
+msgid "Private"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:31
+msgid "Public"
+msgstr ""
+
+#: /src/schooltool/note/note_add.pt:4
+#, fuzzy
+msgid "Add note"
+msgstr "添加事件"
+
+#: /src/schooltool/note/notes.pt:17
+#, fuzzy
+msgid "Delete"
+msgstr "日期"
+
+#: /src/schooltool/note/notes.pt:8
+msgid "( p )"
+msgstr ""
+
+#: /src/schooltool/person/browser/configure.zcml:149
+msgid "Person Container - Contents"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:47
+msgid "username may not be empty"
+msgstr ""
+
+#: /src/schooltool/person/browser/csvimport.py:51
+msgid "fullname may not be empty"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/person/browser/csvimport.py:62
+msgid "Duplicate username: ${username}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:22
+msgid "Import Persons"
+msgstr "导入的人员"
+
+#: /src/schooltool/person/browser/person-csvimport.pt:25
+msgid ""
+"CSV data <strong>must</strong> contain a user name and a full name. An "
+"optional password <strong>may</strong> be included as well."
+msgstr ""
+
+#. Default: ""
+#.  "jjones, Jimmy Jones\n"
+#.  "jbjones, Jim Bob Jones, r2m45J\n"
+#.  "howard, Howard"
+#: /src/schooltool/person/browser/person-csvimport.pt:31
+msgid ""
+"\n"
+"jjones, Jimmy Jones\n"
+"jbjones, Jim Bob Jones, r2m45J\n"
+"howard, Howard\n"
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:36
+msgid ""
+"The above example will create three users, 'jjones', 'jbjones' and 'howard'. "
+"Of the three, only 'jbjones' has a password ('r2m45J') and will be able to "
+"login to the system. Note that passwords must be sent in plain text."
+msgstr ""
+
+#: /src/schooltool/person/browser/person-csvimport.pt:4
+#, fuzzy
+msgid "Upload SchoolTool persons as CSV"
+msgstr "以 CSV 上传 SchoolTool 时间表"
+
+#: /src/schooltool/person/browser/person.py:176
+msgid "Edit password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:181
+msgid "No new password was supplied so original password is unchanged"
+msgstr ""
+
+#: /src/schooltool/person/browser/person.py:186
+msgid "Changed password"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_container_delete.pt:18
+msgid "Sorry, you may not delete your own user account."
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:14
+msgid "Change preferences for ${user}"
+msgstr ""
+
+#: /src/schooltool/person/browser/person_preferences.pt:4
+msgid "Edit person preferences"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:154
+msgid "Time Zone"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:155
+msgid "Time Zone used to display your calendar"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:159
+#: /src/schooltool/person/interfaces.py:160
+msgid "Time Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:161
+msgid "HH:MM"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:162
+msgid "HH:MM am/pm"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:165
+#: /src/schooltool/person/interfaces.py:166
+msgid "Date Format"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:167
+msgid "MM/DD/YY"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:168
+msgid "YYYY-MM-DD"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:169
+msgid "Day Month, Year"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:173
+msgid "Week starts on:"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:174
+msgid "Start display of weeks on Sunday or Monday"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:187
+msgid "Show periods"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:188
+msgid "Show period names in daily view"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:191
+#: /src/schooltool/person/interfaces.py:192
+msgid "Make calendar public"
+msgstr ""
+
+#: /src/schooltool/person/interfaces.py:70
+msgid "Name that should be displayed"
+msgstr ""
+
+#: /src/schooltool/relationship/configure.zcml:33
+#: /src/schooltool/app/rest/configure.zcml:249
+#: /src/schooltool/resource/rest/resource.pt:8
+#: /src/schooltool/group/rest/group.pt:8 /src/schooltool/level/rest/level.pt:9
+#: /src/schooltool/course/rest/course.pt:7
+#: /src/schooltool/course/rest/section.pt:7
+#: /src/schooltool/person/rest/person.pt:7
+msgid "Relationships"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/configure.zcml:19
+#, fuzzy
+msgid "Add a Requirement"
+msgstr "添加事件"
+
+#: /src/schooltool/requirement/browser/configure.zcml:32
+#, fuzzy
+msgid "Edit Requirement"
+msgstr "编辑事件"
+
+#: /src/schooltool/requirement/browser/configure.zcml:69
+msgid "New Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:40
+#: /src/schooltool/course/browser/templates/course_container.pt:28
+#: /src/schooltool/skin/templates/container.pt:29
+#: /src/schooltool/skin/templates/table_macros.pt:5
+msgid "Showing"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:42
+#: /src/schooltool/course/browser/templates/course_container.pt:30
+#: /src/schooltool/skin/templates/container.pt:31
+#: /src/schooltool/skin/templates/table_macros.pt:7
+msgid "of"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.pt:44
+#: /src/schooltool/course/browser/templates/course_container.pt:32
+#: /src/schooltool/skin/templates/container.pt:33
+#: /src/schooltool/skin/templates/table_macros.pt:9
+#, fuzzy
+msgid "items"
+msgstr "分钟"
+
+#: /src/schooltool/requirement/browser/requirement.py:53
+msgid "Requirement index"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/requirement.py:54
+msgid "Add a new Requirement"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:36
+msgid "Exisiting Score System"
+msgstr ""
+
+#: /src/schooltool/requirement/browser/scoresystem.py:41
+msgid "Custom score system"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:100
+#: /src/schooltool/resource/browser/resource-csvimport.pt:21
+#, fuzzy
+msgid "Import Resources"
+msgstr "导入的人员"
+
+#: /src/schooltool/resource/browser/configure.zcml:27
+msgid "Add a Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:40
+msgid "Edit Resource Information"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:75
+msgid "New Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "SchoolBell Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/configure.zcml:82
+msgid "A Resource"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:24
+msgid ""
+"CSV data <strong>must</strong> include a resource title and <strong>may</"
+"strong> include an optional resource description. Any extra information will "
+"be discarded."
+msgstr ""
+
+#. Default: ""
+#.  "PRJ302, Overhead Projector #302\n"
+#.  "Main Auditorium\n"
+#.  "LC-805, Laptop Computer #805, <em>text after a second comma</em>"
+#: /src/schooltool/resource/browser/resource-csvimport.pt:31
+msgid ""
+"\n"
+"PRJ302, Overhead Projector #302\n"
+"Main Auditorium\n"
+"LC-805, Laptop Computer #805, <em>text after a second comma</em>\n"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:36
+msgid ""
+"The above example will create 3 resources titled 'PRJ302', 'Main Auditorium' "
+"and 'LC-805'. The first and last resource will have the descriptions "
+"'Overhead Projector #302' and 'Laptop Computer #805' respectively. The "
+"\"Main Auditorium\" resource will have no description, and the \"text after "
+"a second comma\" text on the third resource will be ignored."
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource-csvimport.pt:4
+#, fuzzy
+msgid "Upload schooltool resources as CSV"
+msgstr "以 CSV 上传 SchoolTool 时间表"
+
+#: /src/schooltool/resource/browser/resource.py:39
+msgid "Resource index"
+msgstr ""
+
+#: /src/schooltool/resource/browser/resource.py:40
+msgid "Add a new resource"
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:39
+msgid "Title of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:44
+msgid "Description of the resource."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:47
+msgid "A Location."
+msgstr ""
+
+#: /src/schooltool/resource/interfaces.py:48
+msgid "Indicate this resource is a location, like a classroom."
+msgstr ""
+
+#. Default: "Calendar subscriptions"
+#: /src/schooltool/resource/rest/resource.pt:17
+#: /src/schooltool/group/rest/group.pt:17
+#: /src/schooltool/person/rest/person.pt:16
+msgid "Calendar_relationships"
+msgstr ""
+
+#. Default: "Calendar ACL"
+#: /src/schooltool/resource/rest/resource.pt:20
+#: /src/schooltool/group/rest/group.pt:20
+#: /src/schooltool/person/rest/person.pt:19
+#, fuzzy
+msgid "Calendar_ACL"
+msgstr "日历"
+
+#: /src/schooltool/restclient/restclient.py:644
+msgid "Could not parse relationship list"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:660
+msgid "Insufficient data in person info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:673
+msgid "Insufficient data in group info"
+msgstr ""
+
+#: /src/schooltool/restclient/restclient.py:688
+msgid "Insufficient data in level info"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with randomly generated data. "
+"Do not do this if you have any valuable data in your SchoolTool instance."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:20
+msgid ""
+"Setting a random seed allows you to to reproduce the same set of sample data "
+"by generating it again with the same value of the random seed."
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:3
+#: /src/schooltool/sampledata/sampledata.pt:9
+msgid "Sample Data Generation"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:37
+msgid "Plugins"
+msgstr ""
+
+#: /src/schooltool/sampledata/sampledata.pt:66
+msgid "View Dependencies"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:38
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+msgstr ""
+
+#: /src/schooltool/sbapp/main.py:43
+msgid ""
+"\n"
+"This is not a SchoolBell 1.0 database file, aborting.\n"
+"\n"
+"Please run the standalone database upgrade script.\n"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/configure.zcml:6
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:12
+msgid "Access Control"
+msgstr ""
+
+#: /src/schooltool/securitypolicy/browser/templates/access_control.pt:4
+msgid "Access control"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:14
+msgid ""
+"Warning: proceeding will populate the database with data generated from "
+"scripts installed on the filesystem of this server. Do not do this if you "
+"have any valuable data in this SchoolTool instance or don't already "
+"understand what this is for."
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:23
+#: /src/schooltool/sampledata/sampledata.pt:75
+msgid "Generate"
+msgstr ""
+
+#: /src/schooltool/setupdata/setupdata.pt:3
+#: /src/schooltool/setupdata/setupdata.pt:9
+msgid "Initial School Setup Scripts"
+msgstr ""
+
+#: /src/schooltool/skin/breadcrumbs.py:68
+msgid "top"
+msgstr ""
+
+#: /src/schooltool/skin/form.py:64
+msgid "No changes"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:13
+#, fuzzy
+msgid "Exception"
+msgstr "日期例外"
+
+#: /src/schooltool/skin/templates/error.pt:18
+msgid "Traceback"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:3
+#: /src/schooltool/skin/templates/error.pt:6
+msgid "Server Error"
+msgstr ""
+
+#: /src/schooltool/skin/templates/error.pt:9
+msgid ""
+"An internal server error has occurred. This most likely means that you have "
+"found a bug in SchoolBell. Please report it on <a href=\"http://issues."
+"schooltool.org\">the issue tracker</a>."
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:13
+msgid "Please note the following:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:16
+msgid "You might have misspelled the url"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:17
+msgid "You might be trying to access a non-existing page"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:3
+#: /src/schooltool/skin/templates/notfound.pt:6
+msgid "Not Found"
+msgstr ""
+
+#: /src/schooltool/skin/templates/notfound.pt:9
+msgid "The page that you are trying to access is not available"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:125
+msgid ""
+"&copy; The Shuttleworth Foundation 2003 - <span>2006</span>: Supporting "
+"Social Innovation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:130
+msgid "SchoolTool&trade; is a Trademark of The Shuttleworth Foundation."
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:57
+msgid "Log In"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:65
+msgid "User:"
+msgstr ""
+
+#: /src/schooltool/skin/templates/view_macros.pt:79
+msgid "Log Out"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:26
+msgid "New Term"
+msgstr ""
+
+#: /src/schooltool/term/browser/configure.zcml:67
+msgid "Cancel School in Emergency"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:100
+msgid "The replacement date you entered is invalid."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:123
+msgid "School cancelled due to emergency. Replacement day $replacement."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/emergency.py:133
+msgid "Replacement day for emergency day $emergency."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:84
+msgid "The date you entered is invalid.  Please use the YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:88
+msgid "The date you entered does not belong to this term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency.py:92
+msgid "The date you entered is not a schoolday."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:12
+msgid ""
+"You have selected ${DYNAMIC_CONTENT} as the emergency day. Now please select "
+"the replacement day. The selection below consists of non-schooldays in this "
+"term following the emergency day and several days after the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:28
+msgid "Please enter the replacement date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:33
+msgid "Replacement"
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency2.pt:6
+msgid "Choose a replacement for the emergency day."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:11
+msgid ""
+"This form allows you to mark a date as an emergency non-schoolday and add a "
+"replacement day to the term."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:24
+msgid "Please enter the emergency date below."
+msgstr ""
+
+#: /src/schooltool/term/browser/emergency_select.pt:3
+#: /src/schooltool/term/browser/emergency_select.pt:6
+#: /src/schooltool/term/browser/emergency2.pt:3
+msgid "Emergency day"
+msgstr ""
+
+#: /src/schooltool/term/browser/term-container-delete.pt:10
+msgid "Are you sure you want to delete the selected terms?"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/term/browser/term.py:129
+msgid "Change Term: $title"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:165
+msgid "New term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:55
+msgid "Terms"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:56
+msgid "Add a new term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:65
+msgid "Start date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term.py:67
+msgid "End date"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:115
+#: /src/schooltool/term/browser/term.pt:26
+#, fuzzy
+msgid "${month} ${year}"
+msgstr "${month}, ${year}"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:130
+#: /src/schooltool/term/browser/term.pt:41
+#, fuzzy
+msgid "Week ${week_number}"
+msgstr "${week_no} 星期"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:151
+msgid "Add term"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:158
+#, fuzzy
+msgid "Save changes"
+msgstr "更改已保存"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:38
+msgid ""
+"First, please name and define the time period of the term. The date range is "
+"inclusive (e.g., 2004-09-01 to 2004-12-31). Dates must be specified in YYYY-"
+"MM-DD format."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:44
+msgid "The date range is inclusive (e.g., 2004-09-01 to 2004-12-31)."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:64
+#: /src/schooltool/term/browser/term_add_edit.pt:149
+#: /src/schooltool/term/browser/term_add_edit.pt:156
+msgid "Refresh"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:70
+msgid ""
+"Second, please specify which days are school days, and which days are "
+"holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:74
+msgid "Please specify which days are school days, and which days are holidays."
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:81
+#: /src/schooltool/term/browser/term.pt:12
+msgid "Legend:"
+msgstr ""
+
+#: /src/schooltool/term/browser/term_add_edit.pt:82
+#: /src/schooltool/term/browser/term.pt:13
+#, fuzzy
+msgid "Schoolday"
+msgstr "SchoolTool"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:83
+#: /src/schooltool/term/browser/term.pt:14
+#, fuzzy
+msgid "Holiday"
+msgstr "今天"
+
+#: /src/schooltool/term/browser/term_add_edit.pt:93
+msgid "Toggle the following days of week:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/__init__.py:345
+msgid "${object}'s timetable"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:744
+msgid "Invalid date. Please use YYYY-MM-DD format."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:748
+msgid "The date does not belong to any term."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/__init__.py:757
+msgid "Some values were invalid.  They are highlighted in red."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:112
+msgid "Change Timetable for One Day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/configure.zcml:139
+#, fuzzy
+msgid "New Timetable"
+msgstr "显示时间表"
+
+#: /src/schooltool/timetable/browser/configure.zcml:22
+#, fuzzy
+msgid "View Timetables"
+msgstr "显示时间表"
+
+#: /src/schooltool/timetable/browser/configure.zcml:31
+#: /src/schooltool/timetable/browser/configure.zcml:39
+#: /src/schooltool/timetable/browser/configure.zcml:47
+#: /src/schooltool/course/browser/templates/section_container.pt:35
+msgid "Schedule"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:155
+msgid "Please use HH:MM format for period start and end times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:196
+msgid "You must specify at least one period."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:217
+msgid "School Timetables"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:218
+msgid "Add a new schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:302
+msgid "Please select a value"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:329
+#: /src/schooltool/timetable/browser/schema.py:336
+msgid "Day ${number}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/schema.py:359
+msgid "Period 1"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:369
+msgid "Period ${number}"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/schema.py:74
+msgid "Timetable schema ${schema}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:114
+msgid ""
+"Timetable day always coincides with the day of week (i.e. on Mondays the "
+"first timetable day is used, on Tuesdays the second, and so on)."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:129
+msgid ""
+"Timetable days are used sequentially, jumping over days that are not school "
+"days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:136
+msgid ""
+"Third, define the time and duration of periods when they fall on certain "
+"days of week. Use one of the the following format: <tt>HH:MM</tt> (also, "
+"don't forget to specify the duration in the text box below) or <tt>HH:MM-HH:"
+"MM</tt> (when you want to specify both endpoints explicitly, e.g., 9:30-"
+"10:15). It is not necessary to define all periods for all days of week, "
+"omissions will just cause that period to be skipped if it happens to fall on "
+"that day of week. If the list of periods is not up to date with the changes "
+"you made in the table above, use the Update button to refresh the form."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:17
+msgid "Please choose a name for the timetable schema you want to create."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:175
+msgid ""
+"Certain period specifications were incorrect, and therefore were discarded."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:191
+msgid ""
+"Finally, make sure the information in this form is correct, because the only "
+"way to correct it will be to remove this timetable schema and recreate it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:197
+msgid "Create timetable schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:36
+msgid "First, please define the days and periods of the timetable."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+msgid "C"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:51
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:155
+#, fuzzy
+msgid "Copy periods from previous day"
+msgstr "上一日"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "X"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:58
+msgid "Remove this day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:84
+#, fuzzy
+msgid "Add day"
+msgstr "整天"
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:87
+msgid "Add period"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:94
+msgid "Second, select the way timetable days are aligned with calendar days."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:102
+msgid ""
+"Note: if a section appears in more than one slot, all of them have to be set "
+"to <em>none</em> to remove it."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:22
+#, fuzzy
+msgid "Timetable"
+msgstr "输入时间表"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:24
+#: /src/schooltool/attendance/browser/templates/student-attendance.pt:138
+msgid "Term"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:34
+msgid "Schema"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:10
+msgid "Scheduling for ${person}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:43
+#, fuzzy
+msgid "Choose"
+msgstr "课程"
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:54
+msgid ""
+"This form lets you set up the timetable of a person by adding and removing "
+"the person to and from sections that have classes in their timetables."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:73
+msgid "as part of"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:82
+msgid "none"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:94
+msgid "Scheduling conflict."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/schooltt-delete.pt:10
+msgid "Are you sure you want to delete the selected school timetables?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:107
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:108
+msgid "Save"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:17
+#: /src/schooltool/timetable/browser/templates/person-timetable-setup.pt:15
+msgid "There are no terms or timetable schemas defined."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:25
+msgid "Choose schedule template"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:27
+msgid "For term(s):"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:4
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:11
+#, fuzzy
+msgid "Scheduling for ${section}"
+msgstr "缺席${section}。"
+
+#: /src/schooltool/timetable/browser/templates/section-timetable-setup.pt:46
+#, fuzzy
+msgid "Using timetable:"
+msgstr "显示时间表"
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:11
+msgid ""
+"This is a simple way to create a weekly timetable schema. Just fill in a "
+"sufficient number of lines for your periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:16
+msgid ""
+"If you need more flexibility, you can use the <a href=\"add.html\">timetable "
+"schema creation wizard</a>, or a <a href=\"complexadd.html\">complex "
+"timetable schema set up form</a>."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:37
+msgid "Period title (optional)"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:38
+msgid "Period start time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:39
+msgid "Period end time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:61
+#, fuzzy
+msgid "Create"
+msgstr "日期"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:13
+msgid ""
+"You can adjust the start and end times of periods for ${DYNAMIC_CONTENT} in "
+"the form below. In order to remove a period from the day, just delete the "
+"period's start and end times."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:29
+msgid "Period title"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:30
+msgid "Original start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:31
+msgid "Original end"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:32
+msgid "New start"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:33
+#, fuzzy
+msgid "New end"
+msgstr "日程表视图"
+
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:63
+#, fuzzy
+msgid "Modify"
+msgstr "星期一"
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:11
+msgid ""
+"This form allows you to change the start and end times for periods on a "
+"certain date, or to cancel some periods altogether."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:24
+msgid "Please enter the date when the periods need to be changed below."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:6
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:3
+#: /src/schooltool/timetable/browser/templates/specialday_change.pt:6
+msgid "Choose a special day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/specialday_select.pt:40
+#: /src/schooltool/term/browser/emergency_select.pt:40
+#: /src/schooltool/term/browser/emergency2.pt:41
+msgid "Proceed"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:40
+#, fuzzy
+msgid "Default Timetable Schema:"
+msgstr "课程安排表"
+
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:46
+#: /src/schooltool/timetable/browser/templates/timetable-schema-container.pt:53
+msgid "Not Selected"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:4
+#: /src/schooltool/timetable/browser/templates/timetable_list.pt:11
+msgid "Timetables for ${object}"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/timetableschema.pt:31
+msgid "Homeroom"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt:6
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:3
+#: /src/schooltool/timetable/browser/templates/advancedtts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard.pt:6
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:3
+#: /src/schooltool/timetable/browser/templates/simpletts.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_choice.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt:6
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:3
+#: /src/schooltool/timetable/browser/templates/ttwizard_form.pt:6
+#, fuzzy
+msgid "New timetable schema"
+msgstr "显示时间表"
+
+#: /src/schooltool/timetable/browser/ttwizard.py:261
+msgid ""
+"Does your school's timetable cycle use days of the week, or a rotating cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:264
+msgid "Days of the week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:265
+msgid "Rotating cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:288
+msgid "Enter names of days in cycle, one per line."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:300
+msgid "Please enter at least one day name."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:306
+msgid "Please make sure the day names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:322
+msgid ""
+"Do classes begin and end at the same time each day in your school's "
+"timetable?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:325
+msgid "Same time each day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:326
+msgid "Different times"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:345
+msgid ""
+"Do start and end times vary based on the day of the week (Monday - Friday) "
+"or the day in the cycle?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:348
+msgid "Day of week"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:349
+msgid "Day in cycle"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:414
+msgid ""
+"Enter start and end times for each slot, one slot (HH:MM - HH:MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:428
+#: /src/schooltool/timetable/browser/ttwizard.py:470
+msgid "Not a valid time slot: $slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:432
+msgid "Please enter at least one time slot."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:453
+msgid ""
+"Enter start and end times for each slot on each day, one slot (HH:MM - HH:"
+"MM) per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:474
+msgid "Please enter at least one time slot for $day."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:515
+msgid ""
+"As you have selected a rotating timetable cycle and slots based on day of "
+"week, all days must have the same number of time periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:528
+msgid "Do periods have names or are they simply designated by time?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:531
+msgid "Have names"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:532
+msgid "Designated by time"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:568
+msgid "Enter names of periods, one per line."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:581
+msgid "Please enter at least $number periods."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:587
+msgid "Please make sure the period names are unique."
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:609
+msgid "Is the sequence of periods each day the same or different?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:611
+msgid "Same"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:612
+msgid "Different"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:627
+msgid "Please put the periods in order:"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:643
+#: /src/schooltool/timetable/browser/ttwizard.py:697
+msgid "Please provide all periods."
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:656
+#: /src/schooltool/timetable/browser/ttwizard.py:714
+msgid "The following periods were selected more than once: $periods"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:674
+msgid "Please put the periods in order for each day:"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/timetable/browser/ttwizard.py:710
+msgid "$period on day $day"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:731
+msgid ""
+"Do you check student attendance for the day in a homeroom period or "
+"equivalent?"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:734
+msgid "Yes"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:735
+msgid "No"
+msgstr ""
+
+#: /src/schooltool/timetable/browser/ttwizard.py:750
+msgid "Please indicate the homeroom period(s) for each day:"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:267
+msgid "Unknown day id: %r"
+msgstr ""
+
+#: /src/schooltool/timetable/rest/__init__.py:273
+msgid "Unknown period id: %r"
+msgstr ""
+
+#. Default: ""
+#: /src/schooltool/widget/password.py:39
+msgid ""
+"${password} <label for=\"${label}\" title=\"\">Confirm</label> ${confirm}"
+msgstr ""
+
+#: /src/schooltool/widget/password.py:51
+msgid "Supplied passwords are not identical"
+msgstr ""
+
+#~ msgid "Import Sections"
+#~ msgstr "导入章节"
+
+#~ msgid "Create new objects"
+#~ msgstr "创建新对象"
+
+#~ msgid "Add events"
+#~ msgstr "添加事件"
+
+#~ msgid "Control access"
+#~ msgstr "访问控制"
+
+#~ msgid "Authenticated users"
+#~ msgstr "用户认证"
+
+#~ msgid "Unauthenticated users"
+#~ msgstr "用户未认证"
+
+#~ msgid ""
+#~ "\n"
+#~ "Usage: %s [options]\n"
+#~ "Options:\n"
+#~ "  -c, --config xxx       use this configuration file instead of the "
+#~ "default\n"
+#~ "  -h, --help             show this help message\n"
+#~ "  -d, --daemon           go to background after starting\n"
+#~ "  -r, --restore-manager  restore the manager user with the default "
+#~ "password\n"
+#~ msgstr ""
+#~ "\n"
+#~ "↵\n"
+#~ "Usage: %s [options]↵\n"
+#~ "Options:↵\n"
+#~ "  -c, --config xxx use this configuration file instead of the default↵\n"
+#~ "  -h, --help show this help message↵\n"
+#~ "  -d, --daemon go to background after starting↵\n"
+#~ "  -r, --restore-manager restore the manager user with the default "
+#~ "password↵\n"

Added: schooltool/branches/upstream/current/src/schooltool/note/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,82 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Browser views for notes.
+"""
+
+from zope.app import zapi
+from zope.publisher.browser import BrowserView
+from zope.app.form.browser.add import AddView
+
+from schooltool.note.interfaces import IHaveNotes, INotes, INote
+from schooltool.note.note import Note
+
+
+class NotesView(BrowserView):
+
+    # __used_for__ = ?
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+        notes = INotes(context)
+        self.notes = [note for note in notes
+                      if note.privacy == 'public'
+                         or note.owner == request.principal.id]
+
+        if 'DELETE_NOTE' in request:
+            notes.remove(request['uid'])
+
+
+class NoteAddView(AddView):
+    """A view for adding a note."""
+
+    __used_for__ = IHaveNotes
+
+    # Form error message for the page template
+    error = None
+
+    # Override some fields of AddView
+    schema = INote
+    _factory = Note
+    _arguments = ['title', 'body', 'privacy']
+    _keyword_arguments = []
+    _set_before_add = []
+    _set_after_add = []
+
+    def create(self, title, body, privacy):
+        owner = self.request.principal.id
+        note = self._factory(title=title, body=body, privacy=privacy,
+                             owner=owner)
+        return note
+
+    def add(self, note):
+        """Add `note` to the object."""
+        notes = INotes(self.context)
+        notes.add(note)
+        return note
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            url = zapi.absoluteURL(self.context, self.request)
+            self.request.response.redirect(url)
+        return AddView.update(self)
+
+    def nextURL(self):
+        """See zope.app.container.interfaces.IAdding"""
+        return zapi.absoluteURL(self.context, self.request)


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,145 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:browser="http://namespaces.zope.org/browser"
+    xmlns:security="http://schooltool.org/securitypolicy"
+    i18n_domain="schooltool">
+
+  <adapter
+      for=".interfaces.IHaveNotes"
+      provides=".interfaces.INotes"
+      factory=".note.getNotes"
+      trusted="true"
+      />
+
+  <class class=".note.Notes">
+    <require permission="zope.Public"
+             attributes="__iter__" />
+    <require permission="schooltool.view"
+             attributes="add remove clear" />
+  </class>
+
+  <class class=".note.Note">
+    <require permission="zope.Public"
+             interface=".interfaces.INote" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.INote" />
+  </class>
+
+  <class class="schooltool.app.cal.CalendarEvent">
+    <implements interface="schooltool.note.interfaces.IHaveNotes" />
+  </class>
+
+  <class class="schooltool.course.course.Course">
+    <implements interface="schooltool.note.interfaces.IHaveNotes" />
+  </class>
+
+  <class class="schooltool.course.section.Section">
+    <implements interface="schooltool.note.interfaces.IHaveNotes" />
+  </class>
+
+  <class class="schooltool.person.person.Person">
+    <implements interface="schooltool.note.interfaces.IHaveNotes" />
+  </class>
+
+  <class class="schooltool.person.person.PersonContainer">
+    <implements interface="schooltool.note.interfaces.IHaveNotes" />
+  </class>
+
+  <class class="schooltool.group.group.Group">
+    <implements interface="schooltool.note.interfaces.IHaveNotes" />
+  </class>
+
+  <class class="schooltool.resource.resource.BaseResource">
+    <implements interface="schooltool.note.interfaces.IHaveNotes" />
+  </class>
+
+
+  <!-- Browser UI -->
+
+  <browser:page
+      name="notes"
+      for=".interfaces.IHaveNotes"
+      class=".browser.NotesView"
+      template="notes.pt"
+      permission="zope.Public"
+      />
+
+  <browser:page
+      name="addNote.html"
+      for=".interfaces.IHaveNotes"
+      class=".browser.NoteAddView"
+      template="note_add.pt"
+      permission="schooltool.view"
+      menu="schooltool_actions"
+      title="New Note"
+      />
+
+  <!-- REST API -->
+
+  <class class=".rest.NotesAdapter">
+    <allow attributes="context" />
+  </class>
+
+  <adapter factory=".rest.NotesAdapter" />
+
+  <class class=".rest.NotesView">
+    <allow interface=".rest.INotesView" />
+  </class>
+
+  <subscriber
+      for=".interfaces.IHaveNotes
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".rest.NotesTraverser"
+      />
+
+  <view
+      for=".rest.INotesAdapter"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      factory=".rest.NotesViewFactory"
+      allowed_interface=".rest.INotesView"
+      permission="zope.Public"
+      name="GET"
+      />
+
+  <view
+      for=".rest.INotesAdapter"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      factory=".rest.NotesViewFactory"
+      allowed_interface=".rest.INotesView"
+      permission="zope.Public"
+      name="POST"
+      />
+
+  <security:crowd
+      name="note_viewers"
+      factory=".note.NoteCrowd" />
+
+  <security:allow
+      interface=".interfaces.INote"
+      permission="schooltool.view"
+      crowds="note_viewers" />
+
+  <!-- Documentation -->
+
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      xmlns:apidoc="http://namespaces.zope.org/apidoc"
+      zcml:condition="have apidoc">
+
+    <apidoc:bookchapter
+        id="notes"
+        title="Notes"
+        parent="notes/"
+        doc_path="notes_browser.txt" />
+
+    <apidoc:bookchapter
+        id="notes_rest"
+        title="Notes (Rest)"
+        parent="notes/"
+        doc_path="notes_rest.txt" />
+
+  </configure>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.note" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,43 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.note.
+
+$Id: ftests.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+import os
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+note_functional_layer = ZCMLLayer(filename,
+                                  __name__,
+                                  'note_functional_layer')
+
+def test_suite():
+    return collect_ftests(filenames=['notes_rest.txt', 'notes_browser.txt'],
+                          layer=note_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,92 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Notes support interfaces
+
+$Id: interfaces.py 5982 2006-04-27 14:25:47Z faassen $
+"""
+import zope.interface
+import zope.schema
+
+from zope.annotation.interfaces import IAnnotatable
+from schooltool import SchoolToolMessage as _
+
+
+class IHaveNotes(IAnnotatable):
+    """An object that can have Notes.
+
+    See also INote and INotes.
+    """
+
+
+class INote(zope.interface.Interface):
+    """A note."""
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        description=_("Title of the note."))
+
+    body = zope.schema.Text(
+        title=_("Body"),
+        description=_("Body of the note."))
+
+    privacy = zope.schema.Choice(
+        title=_("Privacy"),
+        values=('private', 'public'),
+        description=u"""
+        Determines who can view the note.
+
+        Can be one of two values: 'private', 'public'
+
+        'private'  the note can only be viewed by the creator of the note.
+
+        'public'   anyone can view the note, including anonymous users.
+
+        """)
+
+    owner = zope.interface.Attribute("""Component that owns this note.""")
+
+    unique_id = zope.schema.TextLine(
+        title=u"UID",
+        required=False,
+        description=u"""A globally unique id for this note.""")
+
+
+class INotes(zope.interface.Interface):
+    """A set of notes.
+
+    Objects that can have notes are those that have an adapter to INotes.
+
+    See also `INote`.
+    """
+
+    def __iter__():
+        """Iterate over all notes."""
+
+    def add(note):
+        """Add a new note."""
+
+    def remove(note):
+        """Remove a note.
+
+        Raises ValueError if note is not in the set.
+        """
+
+    def clear():
+        """Remove all notes."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/note-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/note-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/note-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.note" />
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/note-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/note.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/note.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/note.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,146 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Implementation of notes for IAnnotatable objects.
+
+Notes are stored as a PersistentList of Note objects on IAnnotatable objects.
+A Note is a simple object that stores a brief note or comment about an object
+to be entered by a user.
+
+TODO: It might be a good idea to add some ACL to notes:
+
+    John in Accounting creates an event for the annual employee picnic.  Scott
+    from the Cafeteria group needs to note that the cream will go bad if it
+    sits outside for more than 4 hours.  Nobody in Accounting should really see
+    this, but everyone in the Cafeteria should.
+
+TODO: Notes are basically stupid comments, do we need real discussion items?  A
+      note on a note has a fairly visible use-case (say Jane from the Cafeteria
+      group notes that a new supply of super-fresh cream is due the day before
+      the picnic..)
+
+$Id: note.py 6183 2006-06-07 18:40:03Z ignas $
+"""
+import datetime
+import random
+import persistent
+import persistent.list
+import zope.interface
+
+from zope.annotation.interfaces import IAnnotations
+
+from schooltool.note import interfaces
+
+
+def getNotes(context):
+    """Adapt an IAnnotatable object to INotes."""
+    annotations = IAnnotations(context)
+    key = 'schooltool.app.Notes'
+    try:
+        return annotations[key]
+    except KeyError:
+        annotations[key] = Notes()
+        annotations[key].__parent__ = context
+        return annotations[key]
+
+
+class Notes(persistent.Persistent):
+    """A list of Note objects.
+
+    Notes are just a container for Note objects
+
+    >>> notes = Notes()
+
+    Add a few notes
+
+    >>> note1 = Note(title="note1")
+    >>> note2 = Note(title="note2")
+    >>> notes.add(note1)
+    >>> notes.add(note2)
+
+    Iterate over the notes
+
+    >>> [n.title for n in notes]
+    ['note1', 'note2']
+
+    Remove a note
+
+    >>> notes.remove(note1.unique_id)
+    >>> [n.title for n in notes]
+    ['note2']
+
+    Remove all the notes
+
+    >>> notes.clear()
+    >>> [n for n in notes]
+    []
+
+    """
+    zope.interface.implements(interfaces.INotes)
+
+    def __init__(self):
+        self._notes = persistent.list.PersistentList()
+
+    def __iter__(self):
+        return iter(self._notes)
+
+    def add(self, note):
+        self._notes.append(note)
+
+    def remove(self, unique_id):
+        for note in self._notes:
+            if note.unique_id == unique_id:
+                self._notes.remove(note)
+
+    def clear(self):
+        del self._notes[:]
+
+
+class Note(persistent.Persistent):
+    """A Note.
+
+    Your basic simple content ojbect:
+
+    >>> note = Note(title='Potluck Theme!',
+    ...             body="We're going Mexican! Bring tequila and tacos!",
+    ...             privacy="private")
+    >>> note.title
+    'Potluck Theme!'
+    >>> note.body
+    "We're going Mexican! Bring tequila and tacos!"
+
+    """
+    zope.interface.implements(interfaces.INote)
+
+    def __init__(self, title=None, body=None, privacy=None, owner=None):
+        self.title = title
+        self.body = body
+        self.privacy = privacy
+        self.owner = owner
+        self.unique_id = '%d.%d' %(datetime.datetime.utcnow().microsecond,
+                                   random.randrange(10 ** 6, 10 ** 7))
+
+from schooltool.securitypolicy.crowds import Crowd
+class NoteCrowd(Crowd):
+    def contains(self, principal):
+        if self.context.privacy == 'private':
+            return IPerson(self.principal) == self.context.owner
+        else:
+            return True
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/note.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/note_add.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/note_add.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/note_add.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Add note</title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+
+<metal:block metal:fill-slot="body">
+
+  <form class="standalone" method="post" enctype="multipart/form-data"
+        tal:attributes="action request/URL">
+    <h3 i18n:translate="">Note</h3>
+
+    <div class="error" tal:condition="view/error" tal:content="view/error" />
+
+    <fieldset>
+      <div class="row" tal:define="widget nocall:view/title_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row">
+        <div class="label">
+          <label for="field.privacy"
+            i18n:translate="" i18n:attributes="title"
+            title="Who can view the note">Privacy</label>
+        </div>
+        <div class="field">
+          <select name="field.privacy" id="field.privacy" size="1">
+            <option value="private" i18n:translate="">Private</option>
+            <option value="public" i18n:translate="">Public</option>
+          </select>
+        </div>
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/body_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+    </fieldset>
+
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Add"
+             title="Shortcut: Alt-A" accesskey="A"
+             i18n:attributes="value add-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/note_add.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/notes.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/notes.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/notes.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,27 @@
+<div id="notes" i18n:domain="schooltool">
+  <h5 i18n:translate="">Notes</h5>
+  <tal:loop repeat="note context/@@notes/notes">
+    <div tal:attributes="class python:note.privacy == 'public' and 'note public' or 'note private'">
+      <div class="header">
+        <h6>
+          <tal:if condition="python:note.privacy == 'private'">
+            <span class="privacy" i18n:translate="">( p )</span></tal:if>
+          <span tal:replace="note/title"/>
+        </h6>
+        <tal:comment condition="nothing">
+          Notes can technically be deleted by anyone who can view them, however
+          when rendering the notes we only provide the delete link to the owner
+          of the note.
+        </tal:comment>
+        <tal:if condition="python:note.owner == request.principal.id">
+          <a class="delete"
+             tal:attributes="href string:?DELETE_NOTE=1&uid=${note/unique_id}"
+             i18n:translate="">Delete</a>
+        </tal:if>
+      </div>
+      <div class="body">
+        <p tal:content="note/body"/>
+      </div>
+    </div>
+  </tal:loop>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/notes.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/notes_browser.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/notes_browser.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/notes_browser.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,130 @@
+Creating SchoolBell Notes
+=========================
+
+Set up
+------
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+We add a person
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('person1', 'person', 'pwd')
+
+
+Test
+----
+
+Add a note to the person
+
+    >>> manager.open('http://localhost')
+    >>> manager.getLink('Persons').click()
+    >>> manager.getLink('person1').click()
+    >>> manager.getLink('New Note').click()
+
+    >>> manager.getControl('Title').value = 'My Note'
+    >>> manager.getControl('Privacy').value = ['public']
+    >>> manager.getControl('Body').value = 'This is the note.'
+    >>> manager.getControl('Add').click()
+
+We should see the note now:
+
+    >>> print analyze.queryHTML("//div[@id='notes']", manager.contents)[0]
+    <div id="notes">
+      <h5>Notes</h5>
+    <BLANKLINE>
+        <div class="note public">
+          <div class="header">
+            <h6>
+    <BLANKLINE>
+              My Note
+            </h6>
+    ...
+          </div>
+          <div class="body">
+            <p>This is the note.</p>
+          </div>
+        </div>
+    <BLANKLINE>
+    </div>
+
+Notes can also be private (viewable only to the person who added them):
+
+    >>> manager.getLink('New Note').click()
+
+    >>> manager.getControl('Title').value = 'My Private Note'
+    >>> manager.getControl('Privacy').value = ['private']
+    >>> manager.getControl('Body').value = 'This is private.'
+    >>> manager.getControl('Add').click()
+
+Make sure the note is there when we view it:
+
+    >>> print analyze.queryHTML("//div[@class='note private']",
+    ...                         manager.contents)[0]
+    <div class="note private">
+          <div class="header">
+            <h6>
+    <BLANKLINE>
+                <span class="privacy">( p )</span>
+              My Private Note
+            </h6>
+    ...
+          </div>
+          <div class="body">
+            <p>This is private.</p>
+          </div>
+        </div>
+
+# Add a user who won't be able to see the private note:
+
+#     >>> from schooltool.app.browser.ftests.setup import addPerson
+#     >>> addPerson('Frog', 'frog', 'pwd')
+
+# View the page as our new user and we will only see the first (public) note:
+
+#     >>> frog = Browser()
+#     >>> frog.addHeader('Authorization', 'Basic frog:pwd')
+#     >>> frog.handleErrors = False
+#     >>> frog.open('http://localhost/persons/person')
+
+#     >>> print analyze.queryHTML("//div[@id='notes']", frog.contents)[0]
+#     <div id="notes">
+#       <h5>Notes</h5>
+#     <BLANKLINE>
+#         <div class="note public">
+#           <div class="header">
+#             <h6>
+#     <BLANKLINE>
+#               My Note
+#             </h6>
+#     <BLANKLINE>
+#     <BLANKLINE>
+#           </div>
+#           <div class="body">
+#             <p>This is the note.</p>
+#           </div>
+#         </div>
+#     <BLANKLINE>
+#     </div>
+
+Notes can also be deleted, but only by the person who created the note:
+
+#     >>> frog.getLink(url='edit.html').click()
+#     >>> frog.getLink(url='DELETE_NOTE').click()
+#     Traceback (most recent call last):
+#     ...
+#     LinkNotFoundError
+
+    >>> manager.getLink('Persons').click()
+    >>> manager.getLink('person1').click()
+    >>> manager.getLink(url='DELETE_NOTE').click()
+    >>> manager.getLink(url='DELETE_NOTE').click()
+
+    >>> print analyze.queryHTML("//div[@id='notes']", manager.  contents)[0]
+    <div id="notes">
+      <h5>Notes</h5>
+    </div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/notes_browser.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/notes_rest.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/notes_rest.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/notes_rest.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,199 @@
+Functional tests for SchoolBell Notes ReSTive view
+==================================================
+
+Let's create something that provides IHaveNotes
+
+    >>> print rest("""
+    ... POST /groups/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="A Group"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    Location: http://localhost/groups/a-group
+    Set-Cookie: ...
+    <BLANKLINE>
+    Object created: http://localhost/groups/a-group
+
+
+Now the notes view for the new group should be empty
+
+    >>> print rest("""
+    ... GET /groups/a-group/notes HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <notes xmlns:xlink="http://www.w3.org/1999/xlink">
+    <BLANKLINE>
+    <BLANKLINE>
+    </notes>
+    <BLANKLINE>
+
+We can add a note:
+
+    >>> print rest("""
+    ... POST /groups/a-group/notes HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ...
+    ... <?xml version="1.0" encoding="utf-8"?>
+    ... <notes xmlns="http://schooltool.org/ns/model/0.1">
+    ... <note title="My Note" privacy="public" body="This is the note body"/>
+    ... </notes>
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    <BLANKLINE>
+
+
+And view it:
+
+    >>> print rest("""
+    ... GET /groups/a-group/notes HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <notes xmlns:xlink="http://www.w3.org/1999/xlink">
+    <BLANKLINE>
+        <note body="This is the note body" privacy="public"
+                  title="My Note"/>
+    <BLANKLINE>
+    </notes>
+    <BLANKLINE>
+
+We can add multiple notes:
+
+    >>> print rest("""
+    ... POST /groups/a-group/notes HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ...
+    ... <?xml version="1.0" encoding="utf-8"?>
+    ... <notes xmlns="http://schooltool.org/ns/model/0.1">
+    ... <note title="My Note 2" privacy="public" body="This is note 2"/>
+    ... <note title="My Note 3" privacy="public" body="This is note 3"/>
+    ... <note title="My Note 4" privacy="public" body="This is note 4"/>
+    ... </notes>
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    <BLANKLINE>
+
+    >>> print rest("""
+    ... GET /groups/a-group/notes HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <notes xmlns:xlink="http://www.w3.org/1999/xlink">
+    <BLANKLINE>
+        <note body="This is the note body" privacy="public"
+                  title="My Note"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 2" privacy="public"
+                  title="My Note 2"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 3" privacy="public"
+                  title="My Note 3"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 4" privacy="public"
+                  title="My Note 4"/>
+    <BLANKLINE>
+    </notes>
+    <BLANKLINE>
+
+We can also add private notes:
+
+    >>> print rest("""
+    ... POST /groups/a-group/notes HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ...
+    ... <?xml version="1.0" encoding="utf-8"?>
+    ... <notes xmlns="http://schooltool.org/ns/model/0.1">
+    ... <note title="My Private Note" privacy="private" body="This is it"/>
+    ... </notes>
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    <BLANKLINE>
+
+And while we can view it:
+
+    >>> print rest("""
+    ... GET /groups/a-group/notes HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <notes xmlns:xlink="http://www.w3.org/1999/xlink">
+    <BLANKLINE>
+        <note body="This is the note body" privacy="public"
+                  title="My Note"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 2" privacy="public"
+                  title="My Note 2"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 3" privacy="public"
+                  title="My Note 3"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 4" privacy="public"
+                  title="My Note 4"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is it" privacy="private"
+              title="My Private Note"/>
+    <BLANKLINE>
+    </notes>
+    <BLANKLINE>
+
+Others can only view the public notes:
+
+    >>> print rest("""
+    ... GET /groups/a-group/notes HTTP/1.1
+    ... Authorization: Basic john:ann
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    ...
+    <notes xmlns:xlink="http://www.w3.org/1999/xlink">
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is the note body" privacy="public"
+              title="My Note"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 2" privacy="public"
+              title="My Note 2"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 3" privacy="public"
+              title="My Note 3"/>
+    <BLANKLINE>
+    <BLANKLINE>
+        <note body="This is note 4" privacy="public"
+              title="My Note 4"/>
+    <BLANKLINE>
+    <BLANKLINE>
+    </notes>
+    <BLANKLINE>


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/notes_rest.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/rest.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/rest.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/rest.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,134 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for notes
+
+$Id: rest.py 5325 2005-11-06 15:06:05Z srichter $
+"""
+from zope.component import adapts
+from zope.interface import Interface, Attribute, implements
+from zope.security.checker import ProxyFactory
+
+from schooltool.app.rest import View, Template
+from schooltool.xmlparsing import XMLDocument
+from schooltool.traverser.traverser import AdapterTraverserPlugin
+from schooltool.note.interfaces import INotes, IHaveNotes
+from schooltool.note.note import Note
+
+
+def NotesViewFactory(context, request):
+    return ProxyFactory(NotesView(context, request))
+
+class INotesView(Interface):
+    """Interface for RESTive view of notes."""
+
+    notes = Attribute("A list of Note objects")
+
+    schema = Attribute("A RNG schema for the accepted XML document")
+
+    template = Attribute("The template of the generated XML document")
+
+    def GET():
+        """The GET handler."""
+
+    def POST():
+        """The POST handler."""
+
+
+class NotesView(View):
+    """A view of notes on IHaveNotes providers."""
+
+    implements(INotesView)
+
+    template = Template("rest_notes.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    schema = """<?xml version="1.0" encoding="UTF-8"?>
+    <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+             ns="http://schooltool.org/ns/model/0.1"
+             datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+      <start>
+        <element name="notes">
+          <zeroOrMore>
+            <element name="note">
+              <attribute name="title">
+                <text/>
+              </attribute>
+              <attribute name="privacy">
+                <choice>
+                  <value>private</value>
+                  <value>public</value>
+                </choice>
+              </attribute>
+              <attribute name="body">
+                <text/>
+              </attribute>
+            </element>
+          </zeroOrMore>
+        </element>
+      </start>
+    </grammar>"""
+
+    def __init__(self, adapter, request):
+        self.context = adapter.context
+        self.request = request
+        self._notes = INotes(self.context)
+
+    def _getNotes(self):
+        return [note for note in self._notes if note.privacy == 'public'
+                or note.owner == self.request.principal.id]
+
+    notes = property(_getNotes)
+
+    def POST(self):
+        body = self.request.bodyStream.read()
+
+        doc = XMLDocument(body, self.schema)
+        try:
+            doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+            for node in doc.query('/m:notes/m:note'):
+                self.createAndAdd(node)
+        finally:
+            doc.free()
+
+        return ''
+
+    def createAndAdd(self, node):
+        owner = self.request.principal.id
+        note = Note(title=node['title'], body=node['body'],
+                    privacy=node['privacy'], owner=owner)
+
+        self._notes.add(note)
+
+
+class INotesAdapter(Interface):
+    """Adapter for RESTivew view of notes."""
+
+
+class NotesAdapter(object):
+    """A proxy to which the Notes view is hooked up"""
+
+    adapts(IHaveNotes)
+    implements(INotesAdapter)
+
+    def __init__(self, context):
+        self.context = context
+
+
+NotesTraverser = AdapterTraverserPlugin('notes', INotesAdapter)


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/rest.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/rest_notes.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/rest_notes.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/rest_notes.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,12 @@
+<notes xmlns:xlink="http://www.w3.org/1999/xlink"
+           xmlns:tal="http://xml.zope.org/namespaces/tal"
+           xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+           i18n:domain="schooltool">
+
+  <tal:loop repeat="note view/notes">
+    <note tal:attributes="title note/title;
+                          privacy note/privacy;
+                          body note/body"></note>
+  </tal:loop>
+
+</notes>


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/rest_notes.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/note/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/note/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/note/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,260 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.note
+
+$Id: tests.py 5987 2006-04-27 15:25:41Z faassen $
+"""
+import unittest
+
+from zope.component import provideAdapter
+from zope.interface import implements
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.testing import setup, ztapi
+
+from schooltool.app.browser.testing import setUp, tearDown
+
+
+def doctest_getNotes():
+    r"""Test for schooltool.note.note.getNotes.
+
+    We need to set up Zope 3 annotations
+
+        >>> from zope.app.testing import setup
+        >>> setup.placelessSetUp()
+        >>> setup.setUpAnnotations()
+
+    We need to have an annotatable object
+
+        >>> from zope.interface import implements
+        >>> from zope.annotation.interfaces import IAttributeAnnotatable
+        >>> class SomeAnnotatable(object):
+        ...     implements(IAttributeAnnotatable)
+
+        >>> obj = SomeAnnotatable()
+
+    Now we can check that a new Notes object is created automatically
+
+        >>> from schooltool.note.note import getNotes
+        >>> notes = getNotes(obj)
+
+        >>> from schooltool.note.interfaces import INotes
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(INotes, notes)
+        True
+
+    If you do it more than once, you will get the same Notes object
+
+        >>> notes is getNotes(obj)
+        True
+
+    """
+
+def doctest_browser_NoteAddView():
+    r"""Test for NoteAddView
+
+    We need some setup to make traversal work in a unit test.
+
+        >>> class FakeURL:
+        ...     def __init__(self, context, request): pass
+        ...     def __call__(self):
+        ...         return "http://localhost/frogpond/persons/milton"
+        >>> from schooltool.note.interfaces import IHaveNotes, INotes
+        >>> from zope.traversing.browser.interfaces import IAbsoluteURL
+        >>> ztapi.browserViewProviding(IHaveNotes, FakeURL, \
+        ...                            providing=IAbsoluteURL)
+
+    Let's create an owner for our note.  We need an id for our person to test
+    the AddView later on:
+
+        >>> from zope.annotation.interfaces import IAttributeAnnotatable
+        >>> class Owner(object):
+        ...     implements(IAttributeAnnotatable, IHaveNotes)
+        ...     id = None
+
+        >>> owner = Owner()
+        >>> owner.id = 'someone'
+
+    Now let's create a NoteAddView for the owner
+
+        >>> from schooltool.note.browser import NoteAddView
+        >>> view = NoteAddView(owner, TestRequest())
+        >>> view.update()
+
+    We need to set up an adapter for notes
+
+        >>> from zope.annotation.interfaces import IAnnotations
+        >>> setup.setUpAnnotations()
+        >>> from schooltool.note.note import getNotes
+        >>> ztapi.provideAdapter(IHaveNotes, INotes, getNotes)
+
+    Let's try to add a note:
+
+        >>> request = TestRequest(form={'field.title': u'Red Stapler',
+        ...                             'field.body': u"He won't give it back",
+        ...                             'field.privacy': u"public",
+        ...                             'UPDATE_SUBMIT': 'Add'})
+        >>> request.setPrincipal(owner)
+        >>> view = NoteAddView(owner, request)
+        >>> view.update()
+        ''
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> notes = INotes(owner)
+        >>> print [note.title for note in notes.__iter__()]
+        [u'Red Stapler']
+
+    """
+
+
+def doctest_rest_views():
+    r"""Tests for NotesView.
+
+    First we need a bit of standard set up:
+
+        >>> from zope.app.testing import ztapi
+        >>> from zope.publisher.browser import TestRequest
+        >>> from StringIO import StringIO
+
+        >>> from schooltool.note.rest import NotesViewFactory
+        >>> from schooltool.note.rest import NotesTraverser
+        >>> from schooltool.note.rest import NotesView
+        >>> from schooltool.note.rest import NotesAdapter
+
+        >>> from schooltool.note.note import getNotes
+        >>> from schooltool.note.interfaces import INotes
+        >>> from schooltool.note.interfaces import IHaveNotes
+        >>> from zope.annotation.interfaces import IAnnotations
+        >>> setup.setUpAnnotations()
+        >>> setup.placefulSetUp()
+        >>> ztapi.provideAdapter(IHaveNotes, INotes, getNotes)
+
+    We need an object that implements IHaveNotes.
+
+        >>> class Person(object):
+        ...     implements(IHaveNotes, IAttributeAnnotatable)
+        ...     id = ''
+        >>> person = Person()
+
+    We also need a principal in the request:
+
+        >>> request = TestRequest()
+        >>> person.id = 'someone'
+        >>> request.setPrincipal(person)
+
+    And a little more set up:
+
+        >>> provideAdapter(NotesAdapter)
+        >>> traverser = NotesTraverser(person, request)
+        >>> adapter = traverser.publishTraverse(request, 'notes')
+
+    We'll work on the person object, for now it has no notes:
+
+        >>> view = NotesView(adapter, request)
+        >>> view.GET()
+        u'<notes xmlns:xlink="http://www.w3.org/1999/xlink">\n\n\n</notes>\n'
+
+    Now we can create a note to add:
+
+        >>> body = '''<?xml version="1.0"?>
+        ... <notes xmlns="http://schooltool.org/ns/model/0.1">
+        ...   <note title="A Note" privacy="public"
+        ...         body="This is a sample note."/>
+        ... </notes>'''
+
+    Let's go ahead and add the note:
+
+        >>> request._body_instream = StringIO(body)
+        >>> view = NotesView(adapter, request)
+        >>> view.POST()
+        ''
+
+    And view it:
+
+        >>> view = NotesView(adapter, request)
+        >>> print view.GET()
+        <notes xmlns:xlink="http://www.w3.org/1999/xlink">
+        ...
+            <note body="This is a sample note." privacy="public"
+                  title="A Note"/>
+        ...
+        </notes>
+        ...
+
+    Note that we specified that the note would be 'public', so anyone can see
+    it, so let's create a private one:
+
+        >>> body = '''<?xml version="1.0"?>
+        ... <notes xmlns="http://schooltool.org/ns/model/0.1">
+        ...   <note title="A Secret Note" privacy="private"
+        ...         body="Something I don't want anyone to know."/>
+        ... </notes>'''
+        >>> request._body_instream = StringIO(body)
+        >>> view = NotesView(adapter, request)
+        >>> view.POST()
+        ''
+
+    We can see the note (along with the previous note):
+
+        >>> print view.GET()
+        <notes xmlns:xlink="http://www.w3.org/1999/xlink">
+        ...
+            <note body="This is a sample note." privacy="public"
+                  title="A Note"/>
+        ...
+            <note body="Something I don't want anyone to know."
+                  privacy="private" title="A Secret Note"/>
+        ...
+        </notes>
+        ...
+
+    But everyone else will only see the public note:
+
+        >>> person2 = Person()
+        >>> person2.id = 'someone-else'
+        >>> request.setPrincipal(person2)
+        >>> view = NotesView(adapter, request)
+        >>> print view.GET()
+        <notes xmlns:xlink="http://www.w3.org/1999/xlink">
+        ...
+            <note body="This is a sample note." privacy="public"
+                  title="A Note"/>
+        ...
+        </notes>
+        ...
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS|
+                             doctest.REPORT_NDIFF),
+        doctest.DocTestSuite('schooltool.note.rest'),
+        doctest.DocTestSuite('schooltool.note.note'),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/note/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,21 @@
+# Make a package.
+
+def registerTestSetup():
+    from zope.interface import classImplements
+    from schooltool.testing import registry
+
+    def addPersonContainer(app):
+        from schooltool.person import person
+        app['persons'] = person.PersonContainer()
+    registry.register('ApplicationContainers', addPersonContainer)
+
+    def haveCalendar():
+        from schooltool.person import person
+        from schooltool.app.interfaces import IHaveCalendar
+        if not IHaveCalendar.implementedBy(person.Person):
+            classImplements(person.Person, IHaveCalendar)
+    registry.register('CalendarComponents', haveCalendar)
+
+registerTestSetup()
+del registerTestSetup
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,187 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <!-- Person Traverser -->
+  <zope:view
+      for="..interfaces.IPerson"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.publisher.interfaces.browser.IBrowserPublisher"
+      factory="schooltool.traverser.browser.PluggableBrowserTraverser"
+      permission="zope.Public"
+      />
+
+  <!-- Viewlet Mangers -->
+
+  <viewletManager
+      name="schooltool.person.Info"
+      permission="zope.Public"
+      provides="schooltool.person.browser.person.IPersonInfoManager"
+      class="schooltool.skin.OrderedViewletManager"
+      />
+
+  <configure package="schooltool.skin">
+
+    <navigationViewlet
+      name="persons"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.TopLevelContainerNavigationViewlet"
+      permission="schooltool.view"
+      link="persons"
+      title="Persons"
+      order="10"
+      />
+
+  </configure>
+
+  <configure package="schooltool.app.browser">
+    <page
+        for="schooltool.person.interfaces.IPerson"
+        name="calendar_selection.html"
+        class=".overlay.CalendarSelectionView"
+        template="templates/calendar_selection.pt"
+        permission="schooltool.editCalendarOverlays"
+        />
+  </configure>
+
+  <containerViews
+      for="..interfaces.IPersonContainer"
+      contents="schooltool.view"
+      add="schooltool.edit"
+      />
+
+  <zope:adapter for=".person.IGroupsSource
+                     zope.publisher.interfaces.browser.IBrowserRequest"
+                factory=".person.GroupsTerms"/>
+
+  <!-- csv importer -->
+  <page
+      name="person-csvimport.html"
+      for="..interfaces.IPersonContainer"
+      class=".csvimport.PersonCSVImportView"
+      template="person-csvimport.pt"
+      permission="schooltool.edit"
+      />
+
+  <configure package="schooltool.skin">
+
+    <navigationViewlet
+      name="person-csvimport"
+      for="schooltool.person.interfaces.IPersonContainer"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.edit"
+      link="@@person-csvimport.html"
+      title="Import Persons"
+      order="10"
+      />
+
+    <navigationViewlet
+      name="change-person-preferences"
+      for="schooltool.person.interfaces.IHavePreferences"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.view"
+      link="preferences"
+      title="Change Preferences"
+      order="20"
+      />
+
+    <navigationViewlet
+      name="edit-person-password"
+      for="schooltool.person.interfaces.IPerson"
+      manager="schooltool.skin.IActionMenuManager"
+      class="schooltool.person.browser.person.PasswordEditMenuItem"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.view"
+      link="@@password_edit.html"
+      title="Edit Password"
+      order="30"
+      />
+
+  </configure>
+
+  <page
+      name="index.html"
+      for="..interfaces.IPersonPreferences"
+      class=".person.PersonPreferencesView"
+      template="person_preferences.pt"
+      permission="schooltool.edit" />
+
+  <page
+     name="password_edit.html"
+     for="..interfaces.IPerson"
+     class=".person.PersonPasswordEditView"
+     permission="schooltool.view"
+     />
+
+  <page
+      name="photo.jpg"
+      for="..interfaces.IPerson"
+      class=".person.PersonPhotoView"
+      permission="schooltool.view" />
+
+  <zope:subscriber
+      for="..interfaces.IHavePreferences
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".person.PreferencesTraverserPlugin"
+      permission="zope.Public"
+      />
+
+  <zope:adapter
+      for="schooltool.person.interfaces.IPersonContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory=".person.PersonFilterWidget" />
+
+  <zope:adapter
+      for="schooltool.person.interfaces.IPersonContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory=".person.PersonTableFormatter" />
+
+  <configure package="schooltool.skin">
+
+    <page
+        name="index.html"
+        for="schooltool.person.interfaces.IPersonContainer"
+        class="schooltool.person.browser.person.PersonContainerView"
+        template="templates/container.pt"
+        permission="schooltool.view"
+        menu="zmi_views"
+        title="View"
+        />
+
+  </configure>
+
+  <page
+     name="add.html"
+     for="..interfaces.IPersonContainer"
+     class=".person.PersonAddView"
+     template="person_add.pt"
+     permission="schooltool.edit"
+     menu="schooltool_actions" title="New Person" />
+
+  <page
+     name="edit.html"
+     for="..interfaces.IPerson"
+     class=".person.PersonEditView"
+     template="person_edit.pt"
+     permission="schooltool.edit"
+     menu="schooltool_actions"
+     title="Edit"
+     />
+
+  <page
+      name="index.html"
+      for="..interfaces.IPerson"
+      class=".person.PersonView"
+      template="person.pt"
+      permission="zope.View"
+      menu="zmi_views"
+      title="View"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/container_contents.rst
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/container_contents.rst	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/container_contents.rst	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+This screen provides a list of all people defined in their SchoolTool instance.

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,83 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+csv importing.
+
+$Id: csvimport.py 6516 2006-12-07 13:08:58Z ignas $
+"""
+from zope.component import getUtility
+
+from schooltool.app.browser.csvimport import BaseCSVImporter, BaseCSVImportView
+from schooltool.person.person import Person
+from schooltool.person.interfaces import IPersonFactory
+
+from schooltool import SchoolToolMessage as _
+
+class PersonCSVImporter(BaseCSVImporter):
+    """A Person CSV importer."""
+
+    def createAndAdd(self, data, dry_run=True):
+        """Create Person object and add to container.
+
+        We are requiring that we have a username and fullname (title) set.  If
+        any duplicates are found then an error is reported and the duplicate
+        entries are reported back to the user.
+        """
+        if len(data) < 2:
+            self.errors.fields.append(_("""Insufficient data provided."""))
+            return
+
+        if not data[0]:
+            self.errors.fields.append(_('username may not be empty'))
+            return
+
+        if not data[1]:
+            self.errors.fields.append(_('fullname may not be empty'))
+            return
+
+        username = data[0]
+        fullname = data[1]
+        if len(data) > 2:
+            password = data[2]
+        else:
+            password = None
+
+        if username in self.container:
+            error_msg = _("Duplicate username: ${username}",
+                          mapping={'username' : ', '.join(data)})
+            self.errors.fields.append(error_msg)
+            return
+
+        obj = self.personFactory(data[0], data[1])
+
+        if password:
+            obj.setPassword(password)
+
+        if not dry_run:
+            self.container[data[0]] = obj
+
+    def personFactory(self, username, title):
+        factory = getUtility(IPersonFactory)
+        person = factory(username=username, title=title)
+        return person
+
+class PersonCSVImportView(BaseCSVImportView):
+    """View for Person CSV importer."""
+
+    importer_class = PersonCSVImporter


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,53 @@
+Tests for PersonCSVImportView
+
+Now we'll try a text import.  Note that the description is not required
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> browser = Browser()
+    >>> browser.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> browser.open('http://localhost/persons/@@person-csvimport.html')
+    >>> csvtext = "aperson, A Person, secret\nanother, A Nother Person With No Password"
+    >>> browser.getControl(name='csvtext').value = csvtext
+    >>> browser.getControl(name='charset').value = ['UTF-8']
+    >>> browser.getControl(name='UPDATE_SUBMIT').click()
+
+    >>> root = getRootFolder()
+    >>> container = root['persons']
+    >>> sorted([person for person in container])
+    [u'another', u'aperson', u'manager']
+
+If no data is provided, we naturally get an error
+
+    >>> browser.open('http://localhost/persons/@@person-csvimport.html')
+    >>> browser.getControl(name='charset').value = ['UTF-8']
+    >>> browser.getControl(name='UPDATE_SUBMIT').click()
+    >>> 'No data provided' in browser.contents
+    True
+
+We also get an error if a line starts with a comma (no title)
+
+    >>> browser.open('http://localhost/persons/@@person-csvimport.html')
+    >>> csvtext = ", No username provided here, secret"
+    >>> browser.getControl(name='csvtext').value = csvtext
+    >>> browser.getControl(name='charset').value = ['UTF-8']
+    >>> browser.getControl(name='UPDATE_SUBMIT').click()    
+    >>> 'Failed to import CSV text' in browser.contents
+    True
+    >>> 'username may not be empty' in browser.contents
+    True
+
+
+Duplicate usernames are not imported, the error is noted to the user.
+
+    >>> browser.open('http://localhost/persons/@@person-csvimport.html')
+    >>> csvtext = "student1, Student 1, secret\nstudent2, Student 2, secret\nstudent1, Student 100"
+    >>> browser.getControl(name='csvtext').value = csvtext
+    >>> browser.getControl(name='charset').value = ['UTF-8']
+    >>> browser.getControl(name='UPDATE_SUBMIT').click()    
+
+    >>> sorted([person for person in container])
+    [u'another', u'aperson', u'manager', u'student1', u'student2']
+    >>> 'Failed to import CSV text' in browser.contents
+    True
+    >>> 'Duplicate username: student1' in browser.contents
+    True


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/csvimport.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,4 @@
+from schooltool.testing.functional import collect_ftests
+
+def test_suite():
+    return collect_ftests()


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/password.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/password.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/password.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,123 @@
+==================
+Password edit form
+==================
+
+We will edit the password of a person. First, let's create the person:
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> manager = Browser()
+  >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+
+  >>> from schooltool.app.browser.ftests.setup import addPerson
+  >>> addPerson('john', 'john', 'barfoo')
+
+We will set the password that user:
+
+  >>> manager.open('http://localhost/persons/john/@@password_edit.html')
+  >>> password_widget = manager.getControl(name='form.password')
+  >>> password_widget.value = 'mypassword'
+  >>> confirm_widget = manager.getControl(name='form.password.confirm')
+  >>> confirm_widget.value = 'mypassword'
+  >>> manager.getControl('Apply').click()
+
+We will get the 'Changed password' message:
+
+  >>> 'Changed password' in manager.contents
+  True
+
+We can now log in as that user with that password:
+
+  >>> def canLogin(username, password):
+  ...     user_browser = Browser()
+  ...     user_browser.addHeader('Authorization', 'Basic %s:%s' % (username,
+  ...         password))
+  ...     user_browser.open('http://localhost/')
+  ...     return 'My Calendar' in user_browser.contents
+  >>> canLogin('john', 'mypassword')
+  True
+
+Now let's try putting in something inconsistent in confirm:
+
+  >>> manager.open('http://localhost/persons/john/@@password_edit.html')
+  >>> password_widget = manager.getControl(name='form.password')
+  >>> password_widget.value = 'mypassword'
+  >>> confirm_widget = manager.getControl(name='form.password.confirm')
+  >>> confirm_widget.value = 'mypassword2'
+  >>> manager.getControl('Apply').click()
+
+We get a message that this didn't work:
+
+  >>> 'Supplied passwords are not identical' in manager.contents
+  True
+
+We can still log in as usual with the original password:
+
+  >>> canLogin('john', 'mypassword')
+  True
+  >>> canLogin('john', 'mypassword2')
+  False
+
+We can try putting in an empty password, too:
+
+  >>> manager.open('http://localhost/persons/john/@@password_edit.html')
+  >>> password_widget = manager.getControl(name='form.password')
+  >>> password_widget.value = ''
+  >>> confirm_widget = manager.getControl(name='form.password.confirm')
+  >>> confirm_widget.value = ''
+  >>> manager.getControl('Apply').click()
+
+The system will not allow that, instead leaving the password unchanged:
+
+  >>> 'unchanged' in manager.contents
+  True
+
+Since the password didn't change, we can still log in as usual with
+the original password:
+
+  >>> canLogin('john', 'mypassword')
+  True
+  >>> canLogin('john', '')
+  False
+
+What happens if person tries to change his password himself?
+
+  >>> john = Browser()
+  >>> john.handleErrors = False
+  >>> john.addHeader('Authorization', 'Basic john:mypassword')
+  >>> john.open('http://localhost/persons/john/')
+  >>> john.getLink('Edit Password').click()
+  >>> password_widget = john.getControl(name='form.password')
+  >>> password_widget.value = 'new_password'
+  >>> confirm_widget = john.getControl(name='form.password.confirm')
+  >>> confirm_widget.value = 'new_password'
+  >>> john.getControl('Apply').click()
+
+  >>> canLogin('john', 'new_password')
+  True
+
+Let's take away the permission:
+
+  >>> manager.open('http://localhost/access_control.html')
+  >>> manager.getControl('Persons can change their own passwords').click()
+  >>> manager.getControl('Apply').click()
+
+And try changing the password again:
+
+  >>> john = Browser()
+  >>> john.handleErrors = False
+  >>> john.addHeader('Authorization', 'Basic john:new_password')
+  >>> john.open('http://localhost/persons/john/')
+  >>> 'Edit Password' not in john.contents
+  True
+
+No link here, let's try going to the view directly:
+
+  >>> john.open('http://localhost/persons/john/@@password_edit.html')
+  >>> password_widget = john.getControl(name='form.password')
+  >>> password_widget.value = 'another_password'
+  >>> confirm_widget = john.getControl(name='form.password.confirm')
+  >>> confirm_widget.value = 'another_password'
+  >>> john.getControl('Apply').click()
+  Traceback (most recent call last):
+  ...
+  Unauthorized: (<...PersonPasswordWriter object at ...>, 'setPassword', 'schooltool.edit')


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/password.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person-csvimport.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person-csvimport.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person-csvimport.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,76 @@
+<tal:defs define="update view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <head>
+    <title metal:fill-slot="title" i18n:translate="">
+      Upload SchoolTool persons as CSV
+    </title>
+  </head>
+  <body>
+
+    <metal:block metal:fill-slot="body">
+
+      <div class="info" tal:condition="view/success">
+        <p i18n:translate=""
+           tal:repeat="msg view/success" tal:content="msg" />
+      </div>
+      <div class="error" tal:condition="view/errors"
+        tal:repeat="err view/errors" tal:content="err" i18n:translate="" />
+
+      <form method="POST" enctype="multipart/form-data" class="standalone"
+        tal:attributes="action request/URL">
+
+        <h3 i18n:translate="">
+          Import Persons
+        </h3>
+        <p i18n:translate="">
+          CSV data <strong>must</strong> contain a user name and a full name.
+          An optional password <strong >may</strong> be included as well.
+        </p>
+        <p i18n:translate="">Example:</p>
+
+<pre i18n:translate="">
+jjones, Jimmy Jones
+jbjones, Jim Bob Jones, r2m45J
+howard, Howard
+</pre>
+        <p i18n:translate="">
+          The above example will create three users, 'jjones', 'jbjones' and
+          'howard'.  Of the three, only 'jbjones' has a password ('r2m45J') and
+          will be able to login to the system.  Note that passwords must be
+          sent in plain text.
+        </p>
+
+        <fieldset>
+          <legend i18n:translate="">Upload CSV File</legend>
+          <div class="row">
+            <label for="csvfile" i18n:translate="">CSV File</label>
+            <input id="csvfile" type="file" name="csvfile"/>
+          </div>
+
+          <div class="row">
+            <tal:block i18n:translate="">Charset:</tal:block>
+            <select name="charset">
+              <option value="UTF-8" i18n:translate="">Unicode (UTF-8)</option>
+              <option value="ISO-8859-1" i18n:translate="">Western (ISO-8859-1)</option>
+              <option value="ISO-8859-15" i18n:translate="">Western (ISO-8859-15)</option>
+              <option value="Windows-1252" i18n:translate="">Western (Windows-1252)</option>
+              <option value="other" i18n:translate="">Other (please specify)</option>
+            </select>
+          </div>
+          <div class="row" i18n:translate="">
+            Other charset: <input name="other_charset" type="text" i18n:name="other_charset" />
+          </div>
+        </fieldset>
+        <fieldset>
+          <legend i18n:translate="">Input CSV Data</legend>
+          <label for="csvtext" i18n:translate="">CSV Data</label>
+          <textarea name="csvtext" id="csvtext" cols="50" rows="10"></textarea>
+        </fieldset>
+        <div class="controls">
+          <input name="UPDATE_SUBMIT" class="button-ok" type="submit"
+                 value="Submit" i18n:attributes="value submit-button" />
+        </div>
+      </form>
+    </metal:block>
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person-csvimport.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,41 @@
+<metal:block use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+
+  <metal:block fill-slot="title">
+    <title i18n:translate="">Person info: <span tal:replace="context/title"
+        i18n:name="title"/></title>
+  </metal:block>
+
+  <metal:block fill-slot="content-header">
+
+    <tal:if condition="context/photo">
+      <img src="photo" class="person-photo" alt="photo" i18n:attributes="alt"
+           tal:attributes="src string:${context/@@absolute_url}/photo" />
+    </tal:if>
+    <h1 tal:content="context/title" />
+    <strong i18n:translate="">Username:</strong>
+    <span tal:replace="context/zope:name">not_doe</span>
+    <br />
+    <a class="modify" href=""
+       title="Change this person's name, picture, or password"
+       tal:attributes="href string:${context/@@absolute_url}/@@edit.html"
+       i18n:attributes="title"
+       i18n:translate="">
+       edit name
+    </a>
+
+  </metal:block>
+
+  <metal:block metal:fill-slot="body">
+
+    <tal:block replace="structure context/@@notes|nothing"/>
+
+    <div class="person-info">
+      <div class="info-block">
+        <h5 i18n:translate="">Details</h5>
+      </div>
+      <tal:block tal:replace="structure provider:schooltool.person.Info"/>
+    </div>
+
+  </metal:block>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,449 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Person browser views.
+
+$Id: person.py 6860 2007-04-13 23:37:39Z ignas $
+"""
+from zope.interface import Interface
+from zope.publisher.interfaces import NotFound
+from zope.schema import Password, TextLine, Bytes, Bool
+from zope.schema.interfaces import ValidationError
+from zope.schema.interfaces import IIterableSource
+from zope.schema.interfaces import ITitledTokenizedTerm
+from zope.security.proxy import removeSecurityProxy
+from zope.app import zapi
+from zope.app.form.browser.add import AddView
+from zope.app.form.browser.source import SourceMultiCheckBoxWidget as SourceMultiCheckBoxWidget_
+from zope.app.form.browser.interfaces import ITerms
+from zope.app.form.interfaces import IInputWidget
+from zope.app.form.interfaces import WidgetsError
+from zope.app.form.utility import getWidgetsData, setUpWidgets
+from zope.publisher.browser import BrowserView
+from zope.viewlet.interfaces import IViewletManager
+from zope.formlib import form
+from zope.component import getUtility
+from zope.interface import implements
+from zope.app.pagetemplate import ViewPageTemplateFile
+from zope.security.management import checkPermission
+from zope.viewlet.viewlet import ViewletBase
+from zope.app.catalog.interfaces import ICatalog
+
+from schooltool import SchoolToolMessage as _
+from schooltool.skin.form import BasicForm
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.person.interfaces import IPasswordWriter
+from schooltool.person.interfaces import IPerson, IPersonFactory
+from schooltool.person.interfaces import IPersonPreferences
+from schooltool.person.interfaces import IPersonContainer, IPersonContained
+from schooltool.widget.password import PasswordConfirmationWidget
+from schooltool.traverser.traverser import AdapterTraverserPlugin
+from schooltool.table.table import IndexedFilterWidget
+from schooltool.table.table import IndexedTableFormatter
+from schooltool.skin.containers import TableContainerView
+
+
+def SourceMultiCheckBoxWidget(field, request):
+    source = field.value_type.source
+    return SourceMultiCheckBoxWidget_(field, source, request)
+
+
+class PersonPhotoView(BrowserView):
+    """View that returns photo of a Person."""
+
+    __used_for__ = IPerson
+
+    def __call__(self):
+        photo = self.context.photo
+        if not photo:
+            raise NotFound(self.context, u'photo', self.request)
+        self.request.response.setHeader('Content-Type', "image/jpeg")
+        return photo
+
+
+class PersonPreferencesView(BrowserView):
+    """View used for editing person preferences."""
+
+    __used_for__ = IPersonPreferences
+
+    # TODO: these aren't used yet but should be
+    error = None
+    message = None
+
+    schema = IPersonPreferences
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+        self.person = self.context.__parent__
+        initial = {}
+        for field in self.schema:
+            initial[field] = getattr(context, field)
+        setUpWidgets(self, self.schema, IInputWidget, initial=initial)
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            url = zapi.absoluteURL(self.person, self.request)
+            self.request.response.redirect(url)
+        elif 'UPDATE_SUBMIT' in self.request:
+            try:
+                data = getWidgetsData(self, self.schema)
+            except WidgetsError:
+                return # Errors will be displayed next to widgets
+
+            for field in self.schema:
+                if field in data: # skip non-fields
+                    setattr(self.context, field, data[field])
+
+
+PreferencesTraverserPlugin = AdapterTraverserPlugin(
+    'preferences', IPersonPreferences)
+
+
+# Should this be moved to a interface.py file ?
+class IGroupsSource(IIterableSource):
+    pass
+
+
+class GroupsSource(object):
+    implements(IGroupsSource)
+
+    def __iter__(self):
+        return iter(ISchoolToolApplication(None)['groups'].values())
+
+    def __len__(self):
+        return len(ISchoolToolApplication(None)['groups'].values())
+
+
+class GroupsTerm(object):
+    implements(ITitledTokenizedTerm)
+
+    def __init__(self, title, token, value):
+        self.title = title
+        self.token = token
+        self.value = value
+
+
+class GroupsTerms(object):
+    implements(ITerms)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getTerm(self, value):
+        return GroupsTerm(value.title, value.__name__, value)
+
+    def getValue(self, token):
+        return ISchoolToolApplication(None)['groups'][token]
+
+
+class IPasswordEditForm(Interface):
+    """Schema for a person's edit form."""
+
+    password = Password(
+        title=_("Password"),
+        required=False)
+
+
+class PersonPasswordEditView(BasicForm):
+    form_fields = form.Fields(IPasswordEditForm, render_context=False)
+    form_fields['password'].custom_widget = PasswordConfirmationWidget
+
+    def title(self):
+        return _("Edit password")
+
+    @form.action(_("Apply"))
+    def handle_edit_action(self, action, data):
+        if not data['password']:
+            self.status = _("No new password was supplied so "
+                            "original password is unchanged")
+            return
+        writer = IPasswordWriter(self.context)
+        writer.setPassword(data['password'])
+        self.status = _('Changed password')
+
+    @form.action(_("Cancel"))
+    def handle_cancel_action(self, action, data):
+        # redirect to parent
+        url = zapi.absoluteURL(self.context, self.request)
+        self.request.response.redirect(url)
+        return ''
+
+
+class IPersonInfoManager(IViewletManager):
+    """Provides a viewlet hook for the information on a Person's page."""
+
+
+class PasswordEditMenuItem(ViewletBase):
+    """Viewlet that is visible if user can change the password of the context."""
+
+    def render(self):
+        if checkPermission('schooltool.edit', IPasswordWriter(self.context)):
+            return super(PasswordEditMenuItem, self).render()
+
+
+class PersonFilterWidget(IndexedFilterWidget):
+    """A filter widget for persons.
+
+    Filters the list of available persons by title or groups they belong to.
+    """
+
+    template = ViewPageTemplateFile('person_filter.pt')
+    parameters = ['SEARCH_TITLE', 'SEARCH_GROUP']
+
+    def groups(self):
+        groups = []
+        for id, group in ISchoolToolApplication(None)['groups'].items():
+            if len(group.members) > 0:
+                groups.append({'id': id,
+                               'title': "%s (%s)" % (group.title, len(group.members))})
+        return groups
+
+    def filter(self, items):
+        if 'CLEAR_SEARCH' in self.request:
+            for parameter in self.parameters:
+                self.request.form[parameter] = ''
+            return items
+
+        if 'SEARCH_GROUP' in self.request:
+            group = ISchoolToolApplication(None)['groups'].get(self.request['SEARCH_GROUP'])
+            if group:
+                keys = set([person.__name__ for person in group.members])
+                items = [item for item in items
+                         if item['key'] in keys]
+
+        catalog = ICatalog(self.context)
+        index = catalog['title']
+
+        if 'SEARCH_TITLE' in self.request:
+            searchstr = self.request['SEARCH_TITLE'].lower()
+            results = []
+            for item in items:
+                title = index.documents_to_values[item['id']]
+                if searchstr in title.lower():
+                    results.append(item)
+            items = results
+
+        return items
+
+    def active(self):
+        for parameter in self.parameters:
+            if parameter in self.request:
+                return True
+        return False
+
+    def extra_url(self):
+        url = ""
+        for parameter in self.parameters:
+            if parameter in self.request:
+                url += '&%s=%s' % (parameter, self.request.get(parameter))
+        return url
+
+
+class PersonTableFormatter(IndexedTableFormatter):
+    """Person container specific table formatter."""
+
+    def columns(self):
+        return getUtility(IPersonFactory).columns()
+
+    def sortOn(self):
+        return getUtility(IPersonFactory).sortOn()
+
+
+class IPersonAddForm(Interface):
+    """Schema for person adding form."""
+
+    title = TextLine(
+        title=_("Full name"),
+        description=_("Name that should be displayed"))
+
+    username = TextLine(
+        title=_("Username"),
+        description=_("Username"))
+
+    password = Password(
+        title=_("Password"),
+        required=False)
+
+    verify_password = Password(
+        title=_("Verify password"),
+        required=False)
+
+    photo = Bytes(
+        title=_("Photo"),
+        required=False,
+        description=_("""Photo (in JPEG format)"""))
+
+
+class PersonAddView(AddView):
+    """A view for adding a person."""
+
+    __used_for__ = IPersonContainer
+
+    # Form error message for the page template
+    error = None
+
+    # Override some fields of AddView
+    schema = IPersonAddForm
+    _arguments = ['title', 'username', 'password', 'photo']
+    _keyword_arguments = []
+    _set_before_add = [] # getFieldNamesInOrder(schema)
+    _set_after_add = []
+
+    def createAndAdd(self, data):
+        """Create a Person from form data and add it to the container."""
+        if data['password'] != data['verify_password']:
+            self.error = _("Passwords do not match!")
+            raise WidgetsError([ValidationError(self.error)])
+        elif data['username'] in self.context:
+            self.error = _('This username is already used!')
+            raise WidgetsError([ValidationError(self.error)])
+        return AddView.createAndAdd(self, data)
+
+    def getAllGroups(self):
+        """Return a list of all groups in the system."""
+        return ISchoolToolApplication(None)['groups'].values()
+
+    def create(self, title, username, password, photo):
+        person = self._factory(username=username, title=title)
+        person.setPassword(password)
+        person.photo = photo
+        return person
+
+    def _factory(self, username, title):
+        return getUtility(IPersonFactory)(username, title)
+
+    def add(self, person):
+        """Add `person` to the container.
+
+        Uses the username of `person` as the object ID (__name__).
+        """
+        person_groups = removeSecurityProxy(person.groups)
+        for group in self.getAllGroups():
+            if 'group.' + group.__name__ in self.request:
+                person.groups.add(removeSecurityProxy(group))
+        name = person.username
+        self.context[name] = person
+        return person
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            url = zapi.absoluteURL(self.context, self.request)
+            self.request.response.redirect(url)
+
+        return AddView.update(self)
+
+    def nextURL(self):
+        """See zope.app.container.interfaces.IAdding"""
+        return zapi.absoluteURL(self.context, self.request)
+
+
+class IPersonEditForm(Interface):
+    """Schema for a person's edit form."""
+
+    title = TextLine(
+        title=_("Full name"),
+        description=_("Name that should be displayed"))
+
+    photo = Bytes(
+        title=_("New photo"),
+        required=False,
+        description=_(
+            """A small picture (about 48x48 pixels in JPEG format)"""))
+
+    clear_photo = Bool(
+        title=_("Clear photo"),
+        required=False,
+        description=_("""Check this to clear the photo"""))
+
+    new_password = Password(
+        title=_("New password"),
+        required=False)
+
+    verify_password = Password(
+        title=_("Verify password"),
+        required=False)
+
+
+class PersonEditView(BrowserView):
+    """A view for editing a person."""
+
+    __used_for__ = IPersonContained
+
+    error = None
+    message = None
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+        setUpWidgets(self, IPersonEditForm, IInputWidget,
+                     initial={'title': self.context.title,
+                              'photo': self.context.photo})
+
+    def update(self):
+        if 'UPDATE_SUBMIT' in self.request:
+            try:
+                data = getWidgetsData(self, IPersonEditForm)
+            except WidgetsError:
+                return # Errors will be displayed next to widgets
+
+            # If any of the password fields is set
+            if data.get('new_password') or data.get('verify_password'):
+                # We compare them
+                if data['new_password'] != data['verify_password']:
+                    self.error = _("Passwords do not match.")
+                    return
+
+                self.context.setPassword(data['new_password'])
+                self.message = _("Password was successfully changed!")
+
+            self.context.title = data['title']
+            if data.get('photo'):
+                self.context.photo = data['photo']
+
+            if data.get('clear_photo'):
+                self.context.photo = None
+                # Uncheck the checkbox before rendering the form
+                self.clear_photo_widget.setRenderedValue(False)
+
+        if 'CANCEL' in self.request:
+            url = zapi.absoluteURL(self.context, self.request)
+            self.request.response.redirect(url)
+
+
+class PersonContainerView(TableContainerView):
+    """A Person Container view."""
+
+    __used_for__ = IPersonContainer
+
+    delete_template = ViewPageTemplateFile("person_container_delete.pt")
+
+    index_title = _("Person index")
+
+    def isDeletingHimself(self):
+        person = IPerson(self.request.principal, None)
+        return person in self.itemsToDelete
+
+
+class PersonView(BrowserView):
+    """A Person info view."""
+
+    __used_for__ = IPersonContained
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,62 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schoolbell">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Add person</title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+
+<metal:block metal:fill-slot="body">
+
+  <form class="standalone" method="post" enctype="multipart/form-data"
+	tal:attributes="action request/URL">
+    <h3 i18n:translate="">Person Information</h3>
+
+    <div class="error" tal:condition="view/error"
+	 tal:content="view/error" i18n:translate="" />
+
+    <fieldset>
+      <div class="row" tal:define="widget nocall:view/title_widget">
+	<div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/username_widget">
+	<div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/password_widget">
+	<div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/verify_password_widget">
+	<div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/photo_widget">
+	<div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+    </fieldset>
+
+    <fieldset tal:define="groups view/getAllGroups" tal:condition="groups">
+      <legend i18n:translate="">Add to groups</legend>
+      <div tal:repeat="group groups/sortby:title">
+	<label>
+	  <input type="checkbox"
+		 tal:define="name  string:group.${group/__name__}"
+		 tal:attributes="name name; checked python: name in request" />
+	  <span tal:replace="group/title">Title</span>
+	</label>
+      </div>
+    </fieldset>
+
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Add"
+	     title="Shortcut: Alt-A" accesskey="A"
+	     i18n:attributes="value add-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+	     i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+===============
+Person add form
+===============
+
+Let's try to add a user:
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> browser = Browser()
+    >>> browser.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> browser.open('http://localhost/persons/@@add.html')
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('John Doe', 'jdoe', 'secret')
+    >>> pc = getRootFolder()['persons']
+    >>> 'jdoe' in pc
+    True
+    >>> person = pc['jdoe']
+    >>> person.title
+    u'John Doe'
+    >>> person.username
+    u'jdoe'
+    >>> person.checkPassword('secret')
+    True
+    >>> person.photo is None
+    True
+
+If we try to add a user with the same login, we get a nice error message:
+
+    >>> browser.open('http://localhost/persons/@@add.html')
+
+    >>> browser.getControl('Full name').value = 'John Doe'
+    >>> browser.getControl('Username').value = 'jdoe'
+    >>> browser.getControl('Add').click()
+    >>> 'This username is already used!' in browser.contents
+    True
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person_add.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person_container_delete.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person_container_delete.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person_container_delete.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,39 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title">
+    Delete items
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header" i18n:translate="">
+  Are you sure you want to delete selected items?
+</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="objects view/itemsToDelete">
+  <p tal:condition="not:objects" i18n:translate="">You have not
+  selected any items.</p>
+  <p tal:condition="view/isDeletingHimself" i18n:translate="">
+    Sorry, you may not delete your own user account.
+  </p>
+  <ul tal:condition="python: objects and not view.isDeletingHimself()">
+    <form method="post"
+          action="delete.html">
+      <li tal:repeat="obj objects/sortby:title">
+        <input type="hidden" tal:attributes="name string:delete.${obj/zope:name}" />
+        <a tal:content="obj/title"
+           tal:attributes="href obj/@@absolute_url">Some Object</a>
+      </li>
+      <div class="controls">
+        <input type="submit" class="button-cancel" name="CONFIRM" value="Confirm"
+               i18n:attributes="value delete-button;" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+      </div>
+    </form>
+  </ul>
+
+</metal:block>
+</body></html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person_container_delete.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person_edit.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person_edit.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person_edit.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,53 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Edit person</title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <form action="." method="post" tal:attributes="action request/URL"
+        class="standalone" enctype="multipart/form-data">
+
+    <h3 i18n:translate="">
+      Change info for <span tal:replace="context/title"
+      i18n:name="user">User</span>
+    </h3>
+
+    <div class="info" tal:condition="view/message"
+         tal:content="view/message" i18n:translate="" />
+    <div class="error" tal:condition="view/error"
+         tal:content="view/error" i18n:translate="" />
+
+    <fieldset>
+      <div class="row" tal:define="widget nocall:view/title_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+    </fieldset>
+
+    <fieldset>
+      <p tal:condition="context/photo">
+        <img src="photo" alt="Photo"
+             tal:attributes="src string:${context/@@absolute_url}/photo" />
+      </p>
+      <div class="row" tal:define="widget nocall:view/photo_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+      <div class="row" tal:define="widget nocall:view/clear_photo_widget">
+        <div metal:use-macro="context/@@form_macros/checkbox_widget " />
+      </div>
+    </fieldset>
+
+    <div class="controls">
+        <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Apply"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person_edit.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person_filter.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person_filter.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person_filter.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<tal:block i18n:domain="schooltool">
+    <input type="text" name="SEARCH_TITLE"
+           tal:attributes="value request/SEARCH_TITLE|nothing"/>
+    <select name="SEARCH_GROUP">
+      <option i18n:translate="">All groups</option>
+      <option tal:repeat="group view/groups"
+              tal:content="group/title"
+              tal:attributes="value group/id;
+                              selected python:group['id'] == request.get('SEARCH_GROUP')"/>
+    </select>
+    <input type="submit" name="SEARCH_BUTTON" value="Find Now"
+           i18n:attributes="value"/>
+    <input type="submit" name="CLEAR_SEARCH" value="Clear"
+           i18n:attributes="value"/>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person_filter.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/person_preferences.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/person_preferences.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/person_preferences.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,62 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Edit person preferences</title>
+</head>
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <form action="." method="post" tal:attributes="action request/URL"
+        class="standalone" enctype="multipart/form-data">
+
+    <h3 i18n:translate="">
+      Change preferences for <span tal:replace="view/person/title"
+      i18n:name="user">User</span>
+    </h3>
+
+    <div class="info" tal:condition="view/message" tal:content="view/message" />
+    <div class="error" tal:condition="view/error" tal:content="view/error" />
+
+    <fieldset>
+      <legend i18n:translate="">
+        Calendar Preferences
+      </legend>
+
+      <div class="row" tal:define="widget nocall:view/timezone_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/timeformat_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/dateformat_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/weekstart_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/cal_periods_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+
+      <div class="row" tal:define="widget nocall:view/cal_public_widget">
+        <div metal:use-macro="context/@@form_macros/widget_row" />
+      </div>
+    </fieldset>
+
+    <div class="controls">
+        <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Apply"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/person_preferences.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/browser/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/browser/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/browser/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,617 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for Person views.
+
+$Id: tests.py 6851 2007-04-13 12:02:20Z ignas $
+"""
+import unittest
+
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+from zope.traversing.interfaces import IContainmentRoot
+
+from schooltool.app.browser.testing import setUp, tearDown
+from schooltool.testing import setup as sbsetup
+
+def doctest_PersonContainerView():
+    r"""Test for PersonContainerView
+
+    Let's create some persons to delete from a person container:
+
+        >>> from schooltool.person.browser.person import \
+        ...     PersonContainerView
+        >>> from schooltool.person.person import Person, PersonContainer
+        >>> from schooltool.person.interfaces import IPerson
+        >>> setup.setUpAnnotations()
+
+        >>> personContainer = PersonContainer()
+        >>> directlyProvides(personContainer, IContainmentRoot)
+
+        >>> personContainer['pete'] = Person('pete', 'Pete Parrot')
+        >>> personContainer['john'] = Person('john', 'Long John')
+        >>> personContainer['frog'] = Person('frog', 'Frog Man')
+        >>> personContainer['toad'] = Person('toad', 'Taodsworth')
+
+        >>> request = TestRequest()
+        >>> view = PersonContainerView(personContainer, request)
+
+    Our user is not trying to delete anything yet:
+
+        >>> view.isDeletingHimself()
+        False
+
+    Lets log in:
+
+        >>> from schooltool.app.security import Principal
+        >>> principal = Principal('pete', 'Pete Parrot', personContainer['pete'])
+        >>> request.setPrincipal(principal)
+
+    Even if he is trying to delete someone who is not pete:
+
+        >>> request.form = {'delete.frog': 'on',
+        ...                 'delete.toad': 'on'}
+        >>> view.isDeletingHimself()
+        False
+
+    But if he will try deleting himself - the method should return true:
+
+        >>> request.form = {'delete.pete': 'on',
+        ...                 'delete.toad': 'on'}
+        >>> view.isDeletingHimself()
+        True
+
+    """
+
+
+def doctest_PersonPhotoView():
+    r"""Test for PersonPhotoView
+
+    We will need a person that has a photo:
+
+        >>> from schooltool.person.person import Person
+        >>> person = Person()
+        >>> person.photo = "I am a photo!"
+
+    We can now create a view:
+
+        >>> from schooltool.person.browser.person import PersonPhotoView
+        >>> request = TestRequest()
+        >>> view = PersonPhotoView(person, request)
+
+    The view returns the photo and sets the appropriate Content-Type header:
+
+        >>> view()
+        'I am a photo!'
+        >>> request.response.getHeader("Content-Type")
+        'image/jpeg'
+
+    However, if a person has no photo, the view raises a NotFound error.
+
+        >>> person.photo = None
+        >>> view()                                  # doctest: +ELLIPSIS
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: <...Person object at ...>, name: u'photo'
+
+    """
+
+
+def doctest_PersonEditView():
+    r"""Test for PersonEditView
+
+    PersonEditView is a view on IPerson.
+
+        >>> from schooltool.person.browser.person import PersonEditView
+        >>> from schooltool.person.person import Person
+        >>> person = Person()
+
+    Let's try creating one
+
+        >>> request = TestRequest()
+        >>> view = PersonEditView(person, request)
+
+    You can change person's title and photo
+
+        >>> request = TestRequest(form={'UPDATE_SUBMIT': True,
+        ...                             'field.title': u'newTitle',
+        ...                             'field.photo': 'PHOTO'})
+        >>> view = PersonEditView(person, request)
+
+        >>> view.update()
+        >>> view.message
+        >>> person.title
+        u'newTitle'
+        >>> person.photo
+        'PHOTO'
+
+    You can clear the person's photo:
+        >>> request = TestRequest(form={'UPDATE_SUBMIT': True,
+        ...                             'field.title':u'newTitle',
+        ...                             'field.clear_photo':'on'})
+        >>> view = PersonEditView(person, request)
+
+        >>> view.update()
+        >>> view.message
+        >>> person.title
+        u'newTitle'
+        >>> print person.photo
+        None
+
+    You can set a person's password
+
+        >>> person.setPassword('lala')
+        >>> request = TestRequest(form={'UPDATE_SUBMIT': True,
+        ...                             'field.title': person.title,
+        ...                             'field.new_password': 'bar',
+        ...                             'field.verify_password': 'bar'})
+        >>> view = PersonEditView(person, request)
+
+        >>> view.update()
+        >>> view.message
+        u'Password was successfully changed!'
+        >>> person.checkPassword('bar')
+        True
+
+    Unless new password and confirm password do not match
+
+        >>> person.setPassword('lala')
+        >>> request = TestRequest(form={'UPDATE_SUBMIT': True,
+        ...                             'field.title': person.title,
+        ...                             'field.new_password': 'bara',
+        ...                             'field.verify_password': 'bar'})
+        >>> view = PersonEditView(person, request)
+
+        >>> view.update()
+        >>> view.error
+        u'Passwords do not match.'
+
+    If the form contains errors, it is redisplayed
+
+        >>> request = TestRequest(form={'UPDATE_SUBMIT': True,
+        ...                             'field.title': '',
+        ...                             'field.new_password': 'xyzzy',
+        ...                             'field.verify_password': 'xyzzy'})
+        >>> view = PersonEditView(person, request)
+
+        >>> view.update()
+        >>> person.title
+        u'newTitle'
+
+        >>> bool(view.title_widget.error())
+        True
+
+    We can cancel an action if we want to:
+
+        >>> directlyProvides(person, IContainmentRoot)
+        >>> request = TestRequest()
+        >>> request.form = {'CANCEL': 'Cancel'}
+        >>> view = PersonEditView(person, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    """
+
+
+def doctest_PersonAddView():
+    r"""Test for PersonAddView
+
+    Make sure we have the PersonFactory utility available:
+
+        >>> from zope.component import provideUtility
+        >>> from schooltool.person.utility import PersonFactoryUtility
+        >>> from schooltool.person.interfaces import IPersonFactory
+        >>> provideUtility(PersonFactoryUtility(), IPersonFactory)
+
+    We need some setup to make traversal work in a unit test.
+
+        >>> class FakeURL:
+        ...     def __init__(self, context, request): pass
+        ...     def __call__(self): return "http://localhost/frogpond/persons"
+        ...
+        >>> from schooltool.person.interfaces import IPersonContainer
+        >>> from zope.traversing.browser.interfaces import IAbsoluteURL
+        >>> ztapi.browserViewProviding(IPersonContainer, FakeURL, \
+        ...                            providing=IAbsoluteURL)
+
+    Let's create a PersonContainer
+
+        >>> from schooltool.app.app import SchoolToolApplication
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> pc = app['persons']
+
+        >>> from zope.component import provideAdapter
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> provideAdapter(lambda context: app,
+        ...                adapts=[None],
+        ...                provides=ISchoolToolApplication)
+
+    Now let's create a PersonAddView for the container
+
+        >>> from schooltool.person.browser.person import PersonAddView
+        >>> view = PersonAddView(pc, TestRequest())
+        >>> view.update()
+
+    Let's try to add a user:
+
+        >>> request = TestRequest(form={'field.title': u'John Doe',
+        ...                             'field.username': u'jdoe',
+        ...                             'field.password': u'secret',
+        ...                             'field.verify_password': u'secret',
+        ...                             'field.photo': u'',
+        ...                             'UPDATE_SUBMIT': 'Add'})
+        >>> view = PersonAddView(pc, request)
+        >>> view.update()
+        ''
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+        >>> 'jdoe' in pc
+        True
+        >>> person = pc['jdoe']
+        >>> person.title
+        u'John Doe'
+        >>> person.username
+        u'jdoe'
+        >>> person.checkPassword('secret')
+        True
+        >>> person.photo is None
+        True
+
+    If we try to add a user with the same login, we get a nice error message:
+
+        >>> request = TestRequest(form={'field.title': u'Another John Doe',
+        ...                             'field.username': u'jdoe',
+        ...                             'field.password': u'pass',
+        ...                             'field.verify_password': u'pass',
+        ...                             'field.photo': None,
+        ...                             'UPDATE_SUBMIT': 'Add'})
+        >>> view = PersonAddView(pc, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.error
+        u'This username is already used!'
+
+    Let's try to add user with different password and verify_password fields:
+
+        >>> request = TestRequest(form={'field.title': u'Coo Guy',
+        ...                             'field.username': u'coo',
+        ...                             'field.password': u'secret',
+        ...                             'field.verify_password': u'plain',
+        ...                             'field.photo': None,
+        ...                             'UPDATE_SUBMIT': 'Add'})
+        >>> view = PersonAddView(pc, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> view.error
+        u'Passwords do not match!'
+        >>> 'coo' in pc
+        False
+
+    We can select groups that the user should be in.  First, let's create a
+    group:
+
+        >>> from schooltool.group.group import Group
+        >>> pov = app['groups']['pov'] = Group('PoV')
+
+    Now, let's create and render a view:
+
+        >>> request = TestRequest(form={'field.title': u'Gintas',
+        ...                             'field.username': u'gintas',
+        ...                             'field.password': u'denied',
+        ...                             'field.verify_password': u'denied',
+        ...                             'field.photo': ':)',
+        ...                             'group.pov': 'on',
+        ...                             'UPDATE_SUBMIT': 'Add'})
+        >>> view = PersonAddView(pc, request)
+        >>> view.update()
+        ''
+        >>> print view.errors
+        ()
+        >>> print view.error
+        None
+
+        >>> pc['gintas'].photo
+        ':)'
+
+    Now the person belongs to the group that we have selected:
+
+        >>> list(pc['gintas'].groups) == [pov]
+        True
+
+    We can cancel an action if we want to:
+
+        >>> directlyProvides(pc, IContainmentRoot)
+        >>> request = TestRequest()
+        >>> request.form = {'CANCEL': 'Cancel'}
+        >>> view = PersonAddView(pc, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/persons'
+
+    """
+
+
+def doctest_PersonPreferencesView():
+    """
+
+        >>> from schooltool.person.browser.person import PersonPreferencesView
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.person.preference import PersonPreferences
+        >>> from zope.traversing.interfaces import IContainmentRoot
+
+        >>> person = Person()
+        >>> directlyProvides(person, IContainmentRoot)
+        >>> prefs = PersonPreferences()
+        >>> prefs.__parent__ = person
+        >>> request = TestRequest()
+
+        >>> view = PersonPreferencesView(prefs, request)
+        >>> view.update()
+
+    Cancel a change: (TODO: set view.message)
+
+        >>> request = TestRequest(form={'CANCEL': 'Cancel'})
+        >>> view = PersonPreferencesView(prefs, request)
+        >>> view.update()
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    Let's see if posting works properly:
+
+        >>> request = TestRequest(form={'UPDATE_SUBMIT': 'Update',
+        ...                             'field.timezone': 'Europe/Vilnius',
+        ...                             'field.timeformat': '%H:%M',
+        ...                             'field.dateformat': '%d %B, %Y',
+        ...                             'field.weekstart': '6',
+        ...                             'field.cal_periods': 'off',
+        ...                             'field.cal_public': 'on'})
+        >>> view = PersonPreferencesView(prefs, request)
+
+        >>> view.update()
+
+        >>> prefs.timezone, prefs.timeformat, prefs.dateformat, prefs.weekstart
+        ('Europe/Vilnius', '%H:%M', '%d %B, %Y', 6)
+
+        >>> print prefs.cal_public, prefs.cal_periods
+        True False
+    """
+
+
+def doctest_PersonCSVImporter():
+    r"""Tests for PersonCSVImporter.
+
+    Make sure we have the PersonFactory utility available:
+
+        >>> from zope.component import provideUtility
+        >>> from schooltool.person.utility import PersonFactoryUtility
+        >>> from schooltool.person.interfaces import IPersonFactory
+        >>> provideUtility(PersonFactoryUtility(), IPersonFactory)
+
+    Create a person container and an importer
+
+
+        >>> from schooltool.person.browser.csvimport import \
+        ...     PersonCSVImporter
+        >>> from schooltool.person.person import PersonContainer
+        >>> container = PersonContainer()
+        >>> importer = PersonCSVImporter(container, None)
+
+    Import a user and verify that it worked
+
+        >>> importer.createAndAdd([u'joe', u'Joe Smith'], False)
+        >>> [p for p in container]
+        [u'joe']
+
+    Import a user with a password and verify it
+
+        >>> importer.createAndAdd([u'jdoe', u'John Doe', u'monkey'], False)
+        >>> container['jdoe'].checkPassword('monkey')
+        True
+
+    Some basic data validation exists.  Note that the errors are cumulative
+    between calls on an instance.
+
+        >>> importer.createAndAdd([], False)
+        >>> importer.errors.fields
+        [u'Insufficient data provided.']
+        >>> importer.createAndAdd([u'', u'Jim Smith'], False)
+        >>> importer.errors.fields
+        [u'Insufficient data provided.', u'username may not be empty']
+        >>> importer.createAndAdd([u'user', u''], False)
+        >>> importer.errors.fields
+        [u'Insufficient data provided.', u'username may not be empty', u'fullname may not be empty']
+
+    Let's clear the errors and review the contents of the container
+
+        >>> importer.errors.fields = []
+        >>> [p for p in container]
+        [u'jdoe', u'joe']
+
+    Now we'll try to add another 'jdoe' username.  In this case the error
+    message contains a translated variable, so we need zope.i18n.translate to
+    properly demonstrate it.
+
+        >>> from zope.i18n import translate
+        >>> importer.createAndAdd([u'jdoe', u'Jim Doe'], False)
+        >>> [translate(error) for error in importer.errors.fields]
+        [u'Duplicate username: jdoe, Jim Doe']
+
+    """
+
+
+def doctest_PersonFilterWidget():
+    """Doctest for PersonFilterWidget.
+
+    For this test we will need a catalog with an index for person
+    titles:
+
+        >>> from zope.app.catalog.interfaces import ICatalog
+        >>> class IndexStub(object):
+        ...     documents_to_values = {}
+        >>> index = IndexStub()
+
+        >>> class CatalogStub(dict):
+        ...     def __init__(self):
+        ...         self['title'] = index
+        >>> catalog = CatalogStub()
+
+   Some persons:
+
+        >>> class PersonStub(object):
+        ...     def __init__(self, title, groups):
+        ...         self.title = title
+        ...         self.__name__ = title
+        ...         for group in groups:
+        ...             group.add(self)
+        ...     def __repr__(self):
+        ...         return '<ItemStub %s>' % self.title
+
+   Some groups:
+
+        >>> class GroupStub(object):
+        ...     def __init__(self, title):
+        ...         self.title = title
+        ...         self.members = []
+        ...     def add(self, member):
+        ...         self.members.append(member)
+        >>> a = GroupStub('a')
+        >>> b = GroupStub('b')
+        >>> c = GroupStub('c')
+
+   Container with some persons in it:
+
+        >>> class ContainerStub(dict):
+        ...     def __init__(self):
+        ...         persons = [('alpha', [a]),
+        ...                    ('beta', [b, c]),
+        ...                    ('lambda', [b])]
+        ...         for id, (title, groups) in enumerate(persons):
+        ...             self[title] = PersonStub(title, groups)
+        ...             index.documents_to_values[id] = title
+        ...     def __conform__(self, iface):
+        ...         if iface == ICatalog:
+        ...             return catalog
+
+    Let's create the PersonFilterWidget:
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> from schooltool.person.browser.person import PersonFilterWidget
+        >>> container = ContainerStub()
+        >>> request = TestRequest()
+        >>> widget = PersonFilterWidget(container, request)
+
+    The state of the widget (whether it will filter the data or not)
+    is determined by checking whether there is at least one query
+    parameter in the request:
+
+        >>> widget.active()
+        False
+
+        >>> request.form = {'SEARCH_TITLE': 'lamb'}
+        >>> widget.active()
+        True
+
+        >>> request.form = {'SEARCH_GROUP': 'lamb'}
+        >>> widget.active()
+        True
+
+    The information that we got from the request can be appended to
+    the url:
+
+        >>> widget.extra_url()
+        '&SEARCH_GROUP=lamb'
+
+        >>> request.form = {'SEARCH_TITLE': 'lamb', 'SEARCH_GROUP': 'a'}
+        >>> widget.extra_url()
+        '&SEARCH_TITLE=lamb&SEARCH_GROUP=a'
+
+    Filtering is done by skipping any entry that doesn't contain the
+    query string in it's title, or are not in the target group:
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from zope.component import adapts
+        >>> from zope.interface import implements, Interface
+        >>> class StubApplication(dict):
+        ...     implements(ISchoolToolApplication)
+        ...     adapts(Interface)
+        ...     def __init__(self, context):
+        ...         self['groups'] = {'a': a, 'b': b, 'c': c}
+        >>> from zope.component import provideAdapter
+        >>> provideAdapter(StubApplication)
+
+        >>> items = [{'id': 0, 'key': 'alpha'},
+        ...          {'id': 1, 'key': 'beta'},
+        ...          {'id': 2, 'key': 'lambda'}]
+
+        >>> request.form = {'SEARCH_TITLE': 'lamb'}
+        >>> widget.filter(items)
+        [{'id': 2, 'key': 'lambda'}]
+
+        >>> request.form = {'SEARCH_GROUP': 'b'}
+        >>> widget.filter(items)
+        [{'id': 1, 'key': 'beta'}, {'id': 2, 'key': 'lambda'}]
+
+        >>> request.form = {'SEARCH_GROUP': 'b',
+        ...                 'SEARCH_TITLE': 'bet'}
+        >>> widget.filter(items)
+        [{'id': 1, 'key': 'beta'}]
+
+   The search is case insensitive:
+
+        >>> request.form = {'SEARCH_TITLE': 'AlphA'}
+        >>> widget.filter(items)
+        [{'id': 0, 'key': 'alpha'}]
+
+    If clear search button is clicked, the form attribute is cleared,
+    and all items are displayed:
+
+        >>> request.form['CLEAR_SEARCH'] = 'Yes'
+
+        >>> widget.filter(items)
+        [{'id': 0, 'key': 'alpha'}, {'id': 1, 'key': 'beta'}, {'id': 2, 'key': 'lambda'}]
+        >>> request.form['SEARCH_TITLE']
+        ''
+
+        >>> request.form['SEARCH_GROUP']
+        ''
+
+    """
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(
+        setUp=setUp, tearDown=tearDown,
+        optionflags=doctest.ELLIPSIS|doctest.REPORT_NDIFF))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/browser/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           i18n_domain="schooltool">
+
+  <include file="security.zcml" />
+
+  <interface
+      interface=".interfaces.IPersonContainer"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".person.PersonContainer">
+    <allow
+        interface="zope.app.container.interfaces.ISimpleReadContainer" />
+    <require
+        permission="schooltool.view"
+        attributes="keys values items __iter__ __len__" />
+    <require
+        permission="schooltool.edit"
+        interface="zope.app.container.interfaces.IWriteContainer" />
+  </class>
+
+  <interface
+      interface=".interfaces.IPerson"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".person.PersonPasswordWriter">
+    <require
+        interface=".interfaces.IPasswordWriter"
+        permission="schooltool.edit" />
+  </class>
+
+  <adapter trusted="True"
+           factory=".person.PersonPasswordWriter" />
+
+  <class class=".person.Person">
+    <implements interface="schooltool.app.interfaces.IHaveCalendar" />
+    <implements interface=".interfaces.IHavePreferences" />
+    <require
+        permission="schooltool.view"
+        interface=".interfaces.IReadPerson"
+        attributes="__cmp__" />
+    <require
+        permission="schooltool.edit"
+        interface=".interfaces.IWritePerson"
+        set_schema=".interfaces.IPerson" />
+  </class>
+
+  <utility
+     factory=".utility.PersonFactoryUtility"
+     provides="schooltool.person.interfaces.IPersonFactory"
+     />
+
+  <class class=".preference.PersonPreferences">
+    <require
+        permission="schooltool.view"
+        interface=".interfaces.IPersonPreferences" />
+    <require
+        permission="schooltool.edit"
+        set_schema=".interfaces.IPersonPreferences" />
+  </class>
+
+  <adapter
+      for=".interfaces.IHavePreferences"
+      provides=".interfaces.IPersonPreferences"
+      factory=".preference.getPersonPreferences"
+      trusted="true"
+      />
+
+  <subscriber
+      for="schooltool.person.interfaces.IPerson zope.app.container.interfaces.IObjectAddedEvent"
+      handler=".person.personAppCalendarOverlaySubscriber"
+      />
+
+  <!-- Application hook -->
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".person.addPersonContainerToApplication"
+      />
+
+  <adapter
+      factory=".person.getCalendarOwner"
+      provides=".interfaces.IPerson"
+      for="schooltool.app.interfaces.ISchoolToolCalendar" />
+
+  <adapter
+      factory=".preference.getPreferencesOwner"
+      provides=".interfaces.IPerson"
+      for="schooltool.person.interfaces.IPersonPreferences" />
+
+  <subscriber
+      for="schooltool.app.interfaces.ICatalogSetUpEvent"
+      handler=".person.catalogSetUpSubscriber"
+      />
+
+  <adapter
+      for=".interfaces.IPersonContainer"
+      factory=".person.getPersonContainerCatalog"
+      provides="zope.app.catalog.interfaces.ICatalog" />
+
+  <include package=".browser" />
+  <include package=".rest" />
+
+  <!-- Help files -->
+  <include package=".help" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/help/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/help/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/help/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/help/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/help/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,17 @@
+<configure
+  xmlns:zcml="http://namespaces.zope.org/zcml"
+  xmlns:browser="http://namespaces.zope.org/browser"
+  xmlns:help="http://namespaces.zope.org/help"
+  zcml:condition="have context-help"
+  i18n_domain="schooltool">
+
+  <help:register
+      id="personcontainer_index"
+      title="Person Container - Contents"
+      doc_path="person_container.pt"
+      for="schooltool.person.interfaces.IPersonContainer"
+      view="index.html"
+      class="zope.app.onlinehelp.onlinehelptopic.ZPTOnlineHelpTopic"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/help/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/help/person_container.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/help/person_container.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/help/person_container.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" metal:use-macro="view/@@schooltool_macros/onlinehelp/page">
+      <head>
+      <title metal:fill-slot="title" i18n:translate="">Person Container</title>
+</head>
+<body metal:fill-slot="body" tal:omit-tag="">
+
+<p>Use this page to browse and find individual persons.</p>
+
+<p>To sort the list, click on the <b>Title</b> header, and change the order
+of persons from descending to ascending order.</p>
+
+<p>To search for a user, use the <b>Search</b> box at the bottom of the page
+to look through all of the people in the system.</p>
+
+<p>To view the details of a certain person, click on the name (or the
+<b>Display</b> link).</p>
+
+<p>The <b>Edit</b> link next to the <b>Display</b> links to a page to edit the
+information of a certain user.</p>
+
+<p>Separate <q>batches</q> of the Person list can be accessed through the 
+<b>Next 10</b> (and <b>Previous</b>) and links in the blue bar.</p>
+
+<p>A <b>Show All</b> button is also there to show all of the people on a
+single page.</p>
+
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/help/person_container.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,200 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Person interfaces
+
+$Id: interfaces.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import calendar
+import pytz
+
+import zope.interface
+import zope.schema
+
+import zope.app.container.constraints
+from zope.app import container
+from zope.annotation.interfaces import IAnnotatable, IAttributeAnnotatable
+from zope.location.interfaces import ILocation
+
+from schooltool import SchoolToolMessage as _
+from schooltool.group.interfaces import IGroupMember
+
+
+def vocabulary(choices):
+    """Create a SimpleVocabulary from a list of values and titles.
+
+    >>> v = vocabulary([('value1', u"Title for value1"),
+    ...                 ('value2', u"Title for value2")])
+    >>> for term in v:
+    ...   print term.value, '|', term.token, '|', term.title
+    value1 | value1 | Title for value1
+    value2 | value2 | Title for value2
+
+    """
+    return zope.schema.vocabulary.SimpleVocabulary(
+        [zope.schema.vocabulary.SimpleTerm(v, title=t) for v, t in choices])
+
+
+class IPasswordWriter(zope.interface.Interface):
+    """Interface for setting a password for a person."""
+
+    def setPassword(password):
+        """Set the password of the person."""
+
+
+class IHavePreferences(IAnnotatable):
+    """An object that can have preferences. Namely a Person."""
+
+
+class IReadPerson(IGroupMember):
+    """Publically accessible part of IPerson."""
+
+    title = zope.schema.TextLine(
+        title=_("Full name"),
+        description=_("Name that should be displayed"))
+
+    photo = zope.schema.Bytes(
+        title=_("Photo"),
+        required=False,
+        description=_("""Photo (in JPEG format)"""))
+
+    username = zope.schema.TextLine(
+        title=_("Username"))
+
+    # XXX: Should not be here. At most this could be in an adapter.
+    overlaid_calendars = zope.interface.Attribute(
+        """Additional calendars to overlay.
+
+            A user may select a number of calendars that should be displayed in
+            the calendar view, in addition to the user's calendar.
+
+            This is a relationship property.""") # XXX Please use a Field.
+
+    def checkPassword(password):
+        """Check if the provided password is the same as the one set
+        earlier using setPassword.
+
+        Returns True if the passwords match.
+        """
+
+    def hasPassword():
+        """Check if the user has a password.
+
+        You can remove user's password (effectively disabling the account) by
+        passing None to setPassword.  You can reenable the account by passing
+        a new password to setPassword.
+        """
+
+    def __eq__(other):
+        """Compare two persons."""
+
+
+class IWritePerson(zope.interface.Interface):
+    """Protected part of IPerson."""
+
+    def setPassword(password):
+        """Set the password in a hashed form, so it can be verified later.
+
+        Setting password to None disables the user account.
+        """
+
+
+class IPerson(IReadPerson, IWritePerson, IAttributeAnnotatable):
+    """Person.
+
+    A person has a number of informative fields such as name, an optional
+    photo, and so on.
+
+    A person can also be a user of the system, therefore IPerson defines
+    `username`, and methods for setting/checking passwords (`setPassword`,
+    `checkPassword` and `hasPassword`).
+
+    Use IPersonContained instead if you want a person in context (that is,
+    one that you can use to traverse to other persons/groups/resources).
+    """
+
+
+class IPersonFactory(zope.interface.Interface):
+
+    def __call__(*args, **kw):
+        """Create a new Person instance."""
+
+    def columns():
+        """Return a list of default columns for person lists."""
+
+    def sortOn():
+        """Return the default sort order for persons."""
+
+
+class IPersonContainer(container.interfaces.IContainer):
+    """Container of persons."""
+
+    container.constraints.contains(IPerson)
+
+
+class IPersonContained(IPerson, container.interfaces.IContained):
+    """Person contained in an IPersonContainer."""
+
+    container.constraints.containers(IPersonContainer)
+
+
+class ICalendarDisplayPreferences(zope.interface.Interface):
+    """Preferences for displaying calendar events."""
+
+    timezone = zope.schema.Choice(
+        title=_("Time Zone"),
+        description=_("Time Zone used to display your calendar"),
+        values=pytz.common_timezones)
+
+    timeformat = zope.schema.Choice(
+        title=_("Time Format"),
+        description=_("Time Format"),
+        vocabulary=vocabulary([("%H:%M", _("HH:MM")),
+                               ("%I:%M %p", _("HH:MM am/pm"))]))
+
+    dateformat = zope.schema.Choice(
+        title=_("Date Format"),
+        description=_("Date Format"),
+        vocabulary=vocabulary([("%m/%d/%y", _("MM/DD/YY")),
+                               ("%Y-%m-%d", _("YYYY-MM-DD")),
+                               ("%d %B, %Y", _("Day Month, Year"))]))
+
+    # SUNDAY and MONDAY are integers, 6 and 0 respectivley
+    weekstart = zope.schema.Choice(
+        title=_("Week starts on:"),
+        description=_("Start display of weeks on Sunday or Monday"),
+        vocabulary=vocabulary([(calendar.SATURDAY, _("Saturday")),
+                               (calendar.SUNDAY, _("Sunday")),
+                               (calendar.MONDAY, _("Monday"))]))
+
+
+class IPersonPreferences(ICalendarDisplayPreferences):
+    """Preferences stored in an annotation on a person."""
+
+    __parent__ = zope.interface.Attribute(
+        """Person who owns these preferences""")
+
+    # XXX: Only available in SchoolTool, but that's ok for now.
+    cal_periods = zope.schema.Bool(
+        title=_("Show periods"),
+        description=_("Show period names in daily view"))
+
+    cal_public = zope.schema.Bool(
+        title=_("Make calendar public"),
+        description=_("Make calendar public"))


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/person.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/person.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/person.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,211 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Person implementation and support objects
+
+$Id: person.py 6849 2007-04-12 19:08:42Z ignas $
+"""
+
+import sha
+from persistent import Persistent
+
+from zope.interface import implements
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.container import btree
+from zope.app.container.contained import Contained
+from zope.component import adapts
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.catalog import Catalog
+from zope.component import getUtility
+
+from zc.catalog.catalogindex import ValueIndex
+
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.membership import URIMembership, URIMember, URIGroup
+from schooltool.app.overlay import OverlaidCalendarsProperty
+from schooltool.person import interfaces
+from schooltool.relationship import RelationshipProperty
+from schooltool.securitypolicy.crowds import Crowd
+from schooltool.person.interfaces import IPerson
+from schooltool.app.security import ICalendarParentCrowd
+from schooltool.securitypolicy.crowds import ConfigurableCrowd
+from schooltool.person.interfaces import IPersonPreferences
+from schooltool.person.interfaces import IPasswordWriter
+from schooltool.securitypolicy.crowds import OwnerCrowd
+from schooltool.utility.utility import UtilitySetUp
+
+PERSON_CATALOG_KEY = 'schooltool.person'
+
+
+class PersonContainer(btree.BTreeContainer):
+    """Container of persons."""
+
+    implements(interfaces.IPersonContainer, IAttributeAnnotatable)
+
+    def __setitem__(self, key, person):
+        """See `IWriteContainer`
+
+        Ignores `key` and uses `person.username` as the key.
+        """
+        key = person.username
+        btree.BTreeContainer.__setitem__(self, key, person)
+
+
+class Person(Persistent, Contained):
+    """Person."""
+
+    implements(interfaces.IPersonContained, IAttributeAnnotatable)
+
+    photo = None
+    username = None
+    _hashed_password = None
+
+    groups = RelationshipProperty(URIMembership, URIMember, URIGroup)
+    overlaid_calendars = OverlaidCalendarsProperty()
+
+    def __init__(self, username=None, title=None):
+        self.title = title
+        self.username = username
+
+    def setPassword(self, password):
+        self._hashed_password = hash_password(password)
+
+    def checkPassword(self, password):
+        return (self._hashed_password is not None
+                and hash_password(password) == self._hashed_password)
+
+    def hasPassword(self):
+        return self._hashed_password is not None
+
+    def __eq__(self, other):
+        if not IPerson.providedBy(other):
+            return False
+        return self.username == other.username
+
+
+def hash_password(password):
+    r"""Compute a SHA-1 hash of a given password.
+
+        >>> hash_password('secret')
+        '\xe5\xe9\xfa\x1b\xa3\x1e\xcd\x1a\xe8Ou\xca\xaaGO:f?\x05\xf4'
+
+    Passwords should be ASCII or Unicode strings.
+
+        >>> hash_password('\u263B')
+        '\xe4\x13\xef\x8dv3\xba*P\xbb1\xa2k\x9c|,n\xe3mL'
+
+    To avoid problems with a multitude of 8-bit encodings, they are forbidden
+
+        >>> hash_password('\xFF') # doctest: +ELLIPSIS
+        Traceback (most recent call last):
+          ...
+        UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in ...
+
+    None means "no password set, account is locked":
+
+        >>> hash_password(None) is None
+        True
+
+    Security note: passwords are not salted, so it is possible to detect
+    users that have the same password.
+    """
+    if password is None:
+        return None
+    return sha.sha(password.encode('UTF-8')).digest()
+
+
+def personAppCalendarOverlaySubscriber(person, event):
+    """Add application calendar to overlays of all new persons.
+    """
+    try:
+        app = getSchoolToolApplication()
+        person.overlaid_calendars.add(ISchoolToolCalendar(app))
+    except ValueError:
+        # If we get this we are probably in the initial new-site setup
+        # or creating a new manager during startup.  This should be
+        # safe to ignore since it will happen very infrequently
+        # (perhaps only once) and the manager can easily add the site
+        # calendar to his/her overlay in the overlay selection view.
+        pass
+
+
+def addPersonContainerToApplication(event):
+    event.object['persons'] = PersonContainer()
+
+
+class PersonCalendarCrowd(Crowd):
+    adapts(IPerson)
+    implements(ICalendarParentCrowd)
+
+    def contains(self, principal):
+        cal_public = IPersonPreferences(self.context).cal_public
+        return cal_public or self.context == IPerson(principal, None)
+
+
+def getCalendarOwner(calendar):
+    return IPerson(calendar.__parent__, None)
+
+
+class PersonPasswordWriter(object):
+    """Adapter of person to IPasswordWriter."""
+    adapts(IPerson)
+    implements(IPasswordWriter)
+
+    def __init__(self, person):
+        self.person = person
+
+    def setPassword(self, password):
+        """See IPasswordWriter."""
+        self.person.setPassword(password)
+
+
+class PersonListViewersCrowd(ConfigurableCrowd):
+    """The crowd of people who can view the person list."""
+
+    setting_key = 'everyone_can_view_person_list'
+
+
+class PersonInfoViewersCrowd(ConfigurableCrowd):
+    """The crowd of people who can view the info of a person."""
+
+    setting_key = 'everyone_can_view_person_info'
+
+
+class PasswordWriterCrowd(ConfigurableCrowd):
+
+    setting_key = 'persons_can_change_their_passwords'
+
+    def contains(self, principal):
+        """Return the value of the related setting (True or False)."""
+        return (ConfigurableCrowd.contains(self, principal) and
+                OwnerCrowd(self.context.person).contains(principal))
+
+
+def catalogSetUp(catalog):
+    catalog['__name__'] = ValueIndex('__name__', IPerson)
+    catalog['title'] = ValueIndex('title', IPerson)
+
+
+catalogSetUpSubscriber = UtilitySetUp(
+    Catalog, ICatalog, PERSON_CATALOG_KEY, setUp=catalogSetUp)
+
+
+def getPersonContainerCatalog(container):
+    return getUtility(ICatalog, PERSON_CATALOG_KEY)


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/person.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/preference.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/preference.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/preference.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Person Preferences implementation
+
+$Id: preference.py 6271 2006-06-16 19:16:12Z ignas $
+"""
+import calendar
+
+from persistent import Persistent
+from zope.interface import implements
+from zope.annotation.interfaces import IAnnotations
+from zope.location.location import ILocation
+
+from schooltool.securitypolicy.crowds import OwnerCrowd
+from schooltool.securitypolicy.crowds import ConfigurableCrowd
+from schooltool.person import interfaces
+
+PERSON_PREFERENCES_KEY = 'schooltool.app.PersonPreferences'
+
+
+class PersonPreferences(Persistent):
+
+    implements(interfaces.IPersonPreferences, ILocation)
+
+    __name__ = 'preferences'
+    __parent__ = None
+
+    timezone = "UTC"
+    dateformat = "%Y-%m-%d"
+    timeformat = "%H:%M"
+    weekstart = calendar.MONDAY
+    # XXX: Only available in schooltool, but that's okay for now.
+    cal_periods = True
+    cal_public = False
+
+
+def getPersonPreferences(person):
+    """Adapt an IAnnotatable object to IPersonPreferences."""
+    annotations = IAnnotations(person)
+    try:
+        return annotations[PERSON_PREFERENCES_KEY]
+    except KeyError:
+        prefs = PersonPreferences()
+        prefs.__parent__ = person
+        annotations[PERSON_PREFERENCES_KEY] = prefs
+        return prefs
+
+
+def getPreferencesOwner(preferences):
+    """Adapt IPersonPreferences to IPerson"""
+    return interfaces.IPerson(preferences.__parent__)
+
+
+class PersonPreferencesEditorsCrowd(ConfigurableCrowd):
+
+    setting_key = 'persons_can_set_their_preferences'
+
+    def contains(self, principal):
+        """Return the value of the related setting (True or False)."""
+        return (ConfigurableCrowd.contains(self, principal) and
+                OwnerCrowd(self.context).contains(principal))


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/preference.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,138 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    i18n_domain="schooltool">
+
+<!-- Adapters -->
+
+  <class class=".preference.PersonPreferencesAdapter">
+    <allow
+        interface=".interfaces.IPersonPreferencesAdapter" />
+  </class>
+
+  <adapter factory=".preference.PersonPreferencesAdapter" />
+
+  <class class=".person.PersonPhotoAdapter">
+    <allow interface=".interfaces.IPersonPhoto" />
+  </class>
+
+  <adapter factory=".person.PersonPhotoAdapter" />
+
+<!-- Traversers -->
+
+  <view
+      for="..interfaces.IPerson"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IPersonContainer"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="..interfaces.IHavePreferences
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".preference.PersonPreferencesHTTPTraverser"
+      />
+
+  <subscriber
+      for="..interfaces.IPerson
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".person.PersonPasswordHTTPTraverser"
+      />
+
+  <subscriber
+      for="..interfaces.IPerson
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".person.PersonPhotoHTTPTraverser"
+      />
+
+  <adapter
+      for="..interfaces.IPersonContainer"
+      provides="zope.filerepresentation.interfaces.IFileFactory"
+      factory=".person.PersonFileFactory"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.IPerson"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".person.PersonFile"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IPersonContainer"
+      name="GET"
+      factory=".person.PersonContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IPerson"
+      name="GET"
+      factory=".person.PersonView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".interfaces.IPersonPreferencesAdapter"
+      name="PUT"
+      factory=".preference.PersonPreferencesView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".interfaces.IPersonPreferencesAdapter"
+      name="GET"
+      factory=".preference.PersonPreferencesView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.person.interfaces.IPasswordWriter"
+      name="PUT"
+      factory=".person.PasswordWriterView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".interfaces.IPersonPhoto"
+      name="PUT"
+      factory=".person.PersonPhotoView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".interfaces.IPersonPhoto"
+      name="GET"
+      factory=".person.PersonPhotoView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for=".interfaces.IPersonPhoto"
+      name="DELETE"
+      factory=".person.PersonPhotoView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/rest/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/rest/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/rest/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,45 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Person REST interfaces
+
+$Id: interfaces.py 6349 2006-07-13 13:23:08Z ignas $
+"""
+from zope.interface import Interface, Attribute
+
+
+class IPersonPhoto(Interface):
+    """Interface for writing and reading of Person photo."""
+
+    def writePhoto(data):
+        """Set the photo of the person."""
+
+    def deletePhoto():
+        """Clear the photo of the person."""
+
+    def getPhoto():
+        """Read the photo of the person."""
+
+
+class IPersonPreferencesAdapter(Interface):
+    """Interface for PersonPreferencesAdapter."""
+
+    person = Attribute("""Person with preferences.""")
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/rest/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/rest/person-preferences.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/rest/person-preferences.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/rest/person-preferences.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<preferences xmlns:xlink="http://www.w3.org/1999/xlink"
+        xmlns:tal="http://xml.zope.org/namespaces/tal"
+        xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+        i18n:domain="schooltool">
+
+  <preference id="timezone" tal:attributes="value view/preferences/timezone"/>
+  <preference id="timeformat" tal:attributes="value view/preferences/timeformat"/>
+  <preference id="dateformat" tal:attributes="value view/preferences/dateformat"/>
+  <preference id="weekstart" tal:attributes="value view/preferences/weekstart"/>
+
+</preferences>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/rest/person-preferences.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/rest/person.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/rest/person.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/rest/person.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,22 @@
+<person xmlns:xlink="http://www.w3.org/1999/xlink"
+        xmlns:tal="http://xml.zope.org/namespaces/tal"
+        xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+        xmlns="http://schooltool.org/ns/model/0.1"
+        i18n:domain="schooltool">
+  <title tal:content="view/context/title">Pete</title>
+  <relationships xlink:type="simple" xlink:title="Relationships"
+      i18n:attributes="xlink:title Relationships"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/relationships" />
+  <acl xlink:type="simple" xlink:title="ACL"
+      i18n:attributes="xlink:title ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/acl" />
+  <calendar xlink:type="simple" xlink:title="Calendar"
+      i18n:attributes="xlink:title Calendar"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar" />
+  <relationships xlink:type="simple" xlink:title="Calendar subscriptions"
+      i18n:attributes="xlink:title Calendar_relationships"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar/relationships" />
+  <acl xlink:type="simple" xlink:title="Calendar ACL"
+      i18n:attributes="xlink:title Calendar_ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar/acl" />
+</person>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/rest/person.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/rest/person.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/rest/person.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/rest/person.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,177 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for Person
+
+$Id: person.py 6349 2006-07-13 13:23:08Z ignas $
+"""
+from zope.component import adapts
+from zope.interface import implements
+from zope.publisher.interfaces import NotFound
+
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.app import ApplicationObjectFile
+from schooltool.app.rest.app import ApplicationObjectFileFactory
+from schooltool.app.rest.app import GenericContainerView
+from schooltool.traverser.traverser import AdapterTraverserPlugin
+
+from schooltool.person.interfaces import (IPersonContainer, IPerson,
+                                          IPasswordWriter)
+from schooltool.person.person import Person
+from schooltool.person.rest.interfaces import IPersonPhoto
+
+
+class PersonFileFactory(ApplicationObjectFileFactory):
+    """Adapter that adapts PersonContainer to FileFactory"""
+
+    adapts(IPersonContainer)
+
+    schema = '''<?xml version="1.0" encoding="UTF-8"?>
+        <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                 ns="http://schooltool.org/ns/model/0.1"
+                 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+          <start>
+            <element name="object">
+              <attribute name="title">
+                <text/>
+              </attribute>
+            </element>
+          </start>
+        </grammar>
+        '''
+
+    factory = Person
+
+    def parseDoc(self, doc):
+        """Get values from document, and puts them into a dict."""
+        kwargs = {}
+        node = doc.query('/m:object')[0]
+        kwargs['title'] = node['title']
+        return kwargs
+
+    def __call__(self, name, content_type, data):
+        #Call is overrided in here so we could pass the name to
+        #Persons __init__
+        return self.factory(username=name, **self.parseXML(data))
+
+
+class PersonFile(ApplicationObjectFile):
+    """Adapter that adapts IPerson to IWriteFile"""
+
+    adapts(IPerson)
+
+    def modify(self, title=None):
+        """Modify underlying object."""
+        self.context.title = title
+
+
+class PersonContainerView(GenericContainerView):
+    """RESTive view of a person container."""
+
+
+class PersonView(View):
+    """RESTive view for persons"""
+
+    template = Template("person.pt",
+                        content_type="text/xml; charset=UTF-8")
+    factory = PersonFile
+
+
+PersonPasswordHTTPTraverser = AdapterTraverserPlugin(
+    'password', IPasswordWriter)
+
+
+class PasswordWriterView(View):
+    """A view that enables setting password of a Person."""
+
+    def PUT(self):
+        request = self.request
+
+        for name in request:
+            if name.startswith('HTTP_CONTENT_'):
+                # Unimplemented content header
+                request.response.setStatus(501)
+                return ''
+
+        body = self.request.bodyStream
+        password = body.read().split("\n")[0]
+        self.context.setPassword(password)
+        self.request.response.setStatus("200")
+        return ''
+
+
+PersonPhotoHTTPTraverser = AdapterTraverserPlugin('photo', IPersonPhoto)
+
+
+class PersonPhotoAdapter(object):
+    """Adapt a Person to PersonPhoto."""
+    adapts(IPerson)
+    implements(IPersonPhoto)
+
+    def __init__(self, person):
+        self.person = person
+
+    def writePhoto(self, data):
+        """See IPersonPhoto."""
+
+        self.person.photo = data
+
+    def deletePhoto(self):
+        """See IPersonPhoto."""
+
+        self.person.photo = None
+
+    def getPhoto(self):
+        """See IPersonPhoto."""
+
+        return self.person.photo
+
+
+class PersonPhotoView(View):
+    """A view for Persons photo."""
+
+    def GET(self):
+        photo = self.context.getPhoto()
+
+        if photo is None:
+            raise NotFound(self.context, u'photo', self.request)
+
+        self.request.response.setHeader('Content-Type', "image/jpeg")
+        self.request.response.setStatus(200)
+        return photo
+
+    def DELETE(self):
+        self.context.deletePhoto()
+        return ''
+
+    def PUT(self):
+        request = self.request
+
+        for name in request:
+            if name.startswith('HTTP_CONTENT_'):
+                # Unimplemented content header
+                request.response.setStatus(501)
+                return ''
+
+        body = self.request.bodyStream
+        self.context.writePhoto(body.read())
+        self.request.response.setStatus("200")
+        return ''
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/rest/person.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/rest/preference.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/rest/preference.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/rest/preference.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,119 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for Person Preferences
+
+$Id: preference.py 6047 2006-05-11 18:31:03Z mg $
+"""
+from zope.component import adapts
+from zope.interface import implements
+
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.errors import RestError
+from schooltool.traverser.traverser import AdapterTraverserPlugin
+from schooltool.xmlparsing import XMLDocument
+
+from schooltool.person.interfaces import IPerson
+from schooltool.person.interfaces import IPersonPreferences
+from schooltool.person.rest.interfaces import IPersonPreferencesAdapter
+
+
+PersonPreferencesHTTPTraverser = AdapterTraverserPlugin(
+    'preferences', IPersonPreferencesAdapter)
+
+class PersonPreferencesAdapter(object):
+    """Adapter of person to IPreferencesWriter"""
+
+    adapts(IPerson)
+    implements(IPersonPreferencesAdapter)
+
+    def __init__(self, person):
+        self.person = person
+
+
+class PersonPreferencesView(View):
+    """A view for Persons preferences."""
+
+    template = Template("person-preferences.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    schema = """<?xml version="1.0" encoding="UTF-8"?>
+    <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         ns="http://schooltool.org/ns/model/0.1"
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+      <start>
+        <element name="preferences">
+          <zeroOrMore>
+            <element name="preference">
+              <attribute name="id"><text/></attribute>
+              <attribute name="value"><text/></attribute>
+            </element>
+          </zeroOrMore>
+        </element>
+      </start>
+    </grammar>"""
+
+    def __init__(self, context, request):
+        View.__init__(self, context, request)
+        self.preferences = IPersonPreferences(context.person)
+
+    def parseData(self, body):
+        """Get values from document, and put them into a dict"""
+        doc = XMLDocument(body, self.schema)
+        results = {}
+        try:
+            doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+            for preference in doc.query('/m:preferences/m:preference'):
+                results[preference['id']] = preference['value']
+        finally:
+            doc.free()
+
+        return results
+
+    def validatePreference(self, name, value):
+        """Validate a preference.
+
+        Validates against IPersonPreferences widgets and raises RestError if:
+
+        * 'name' is not defined in the interface
+        * 'value' does not pass widget validation
+        """
+        field = IPersonPreferences.get(name)
+        if field is None:
+            raise RestError('Preference "%s" unknown' % name)
+
+        try:
+            field.validate(value)
+        except Exception:
+            raise RestError('Preference value "%s" does not'
+                            ' pass validation on "%s"' % (value, name))
+
+    def PUT(self):
+        """Extract data and validate it.
+
+        Validates preferences through validatePreference which can return a
+        RestError.
+        """
+        data = self.parseData(self.request.bodyStream.read())
+        for name, value in data.items():
+            self.validatePreference(name, value)
+            setattr(self.preferences, name, value)
+
+        return "Preferences updated"


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/rest/preference.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/rest/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/rest/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/rest/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,459 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for person REST views.
+
+$Id: tests.py 6349 2006-07-13 13:23:08Z ignas $
+"""
+import unittest
+from cStringIO import StringIO
+
+import zope.component
+from zope.interface.verify import verifyObject
+from zope.publisher.browser import TestRequest
+from zope.publisher.interfaces import NotFound
+from zope.testing import doctest
+from zope.filerepresentation.interfaces import IFileFactory
+from zope.app.testing import ztapi, setup
+
+from schooltool.app.rest.testing import ApplicationObjectViewTestMixin
+from schooltool.app.rest.testing import ContainerViewTestMixin
+from schooltool.app.rest.testing import FileFactoriesSetUp
+from schooltool.person.interfaces import IPasswordWriter
+from schooltool.person.interfaces import IPersonContainer
+from schooltool.person.person import PersonContainer, Person
+from schooltool.person.person import PersonPasswordWriter
+from schooltool.person.rest.interfaces import IPersonPhoto
+from schooltool.person.rest.person import PasswordWriterView
+from schooltool.person.rest.person import PersonContainerView, PersonView
+from schooltool.person.rest.person import PersonFile, PersonFileFactory
+from schooltool.person.rest.person import PersonPhotoAdapter
+from schooltool.person.rest.person import PersonPhotoView
+from schooltool.person.rest.preference import PersonPreferencesView
+
+
+class TestPersonContainerView(ContainerViewTestMixin,
+                             unittest.TestCase):
+    """Test for PersonContainerView"""
+
+    def setUp(self):
+        ContainerViewTestMixin.setUp(self)
+        ztapi.provideAdapter(IPersonContainer, IFileFactory,
+                             PersonFileFactory)
+
+        self.person = self.app['persons']['root'] = Person("root",
+                                                           "Root person")
+        self.personContainer = self.app['persons']
+
+    def test_render(self):
+        view = PersonContainerView(self.personContainer,
+                                  TestRequest())
+        result = view.GET()
+        response = view.request.response
+
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result, """
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <name>persons</name>
+              <items>
+                <item xlink:href="http://127.0.0.1/persons/root"
+                      xlink:type="simple" xlink:title="Root person"/>
+              </items>
+              <acl xlink:href="http://127.0.0.1/persons/acl" xlink:title="ACL"
+                   xlink:type="simple"/>
+            </container>
+            """)
+
+
+class TestPersonFileFactory(unittest.TestCase):
+
+    def setUp(self):
+        self.personContainer = PersonContainer()
+        self.factory = PersonFileFactory(self.personContainer)
+
+    def test_title(self):
+        person = self.factory("new_person", None,
+                     '''<object xmlns="http://schooltool.org/ns/model/0.1"
+                                title="New Person"/>''')
+
+        self.assertEquals(person.title, "New Person")
+
+
+class TestPersonFile(FileFactoriesSetUp, unittest.TestCase):
+    """A test for IPerson IWriteFile adapter"""
+
+    def setUp(self):
+        FileFactoriesSetUp.setUp(self)
+        ztapi.provideAdapter(IPersonContainer, IFileFactory,
+                             PersonFileFactory)
+
+
+    def testWrite(self):
+        pc = PersonContainer()
+        person = Person("Frog")
+        pc['frog'] = person
+
+        file = PersonFile(person)
+        file.write('''<object xmlns="http://schooltool.org/ns/model/0.1"
+                              title="Frogsworth"/>''')
+
+        self.assertEquals(person.title, "Frogsworth")
+
+
+class TestPersonView(ApplicationObjectViewTestMixin, unittest.TestCase):
+    """A test for the RESTive view of a person."""
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+
+        self.testObject = self.app['persons']['root'] = Person("root",
+            title="Root person")
+
+    def makeTestView(self, object, request):
+        return PersonView(object, request)
+
+    def testGET(self):
+
+        result, response = self.get()
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result,
+            """<person xmlns="http://schooltool.org/ns/model/0.1"
+                       xmlns:xlink="http://www.w3.org/1999/xlink">
+                   <title>Root person</title>
+                   <relationships xlink:href="http://127.0.0.1/persons/root/relationships"
+                                  xlink:title="Relationships" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/persons/root/acl" xlink:title="ACL"
+                        xlink:type="simple"/>
+                   <calendar xlink:href="http://127.0.0.1/persons/root/calendar"
+                             xlink:title="Calendar" xlink:type="simple"/>
+                   <relationships
+                                  xlink:href="http://127.0.0.1/persons/root/calendar/relationships"
+                                  xlink:title="Calendar subscriptions" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/persons/root/calendar/acl"
+                        xlink:title="Calendar ACL" xlink:type="simple"/>
+               </person>""")
+
+
+class TestPersonPasswordWriterView(ApplicationObjectViewTestMixin,
+                                   unittest.TestCase):
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+        self.person = self.app['persons']['root'] = Person("root",
+                                                           title="Root person")
+
+        self.testObject = PersonPasswordWriter(self.person)
+
+    def makeTestView(self, object, request):
+        return PasswordWriterView(object, request)
+
+    def testPUT(self):
+
+        request = TestRequest(StringIO("super-secret-password"))
+        view = self.makeTestView(self.testObject, request)
+        result = view.PUT()
+        response = request.response
+
+        self.assertEquals(response.getStatus(), 200)
+        self.assertEqualsXML(result, "")
+        self.assert_(self.person.checkPassword("super-secret-password"))
+
+
+class TestPersonPhotoAdapter(unittest.TestCase):
+
+    def makeTestObject(self):
+        return PersonPhotoAdapter(Person("Frog"))
+
+    def testConformance(self):
+        personPhoto = self.makeTestObject()
+        self.assert_(verifyObject(IPersonPhoto, personPhoto))
+
+    def testSetDeletePhoto(self):
+        personPhoto = self.makeTestObject()
+        personPhoto.writePhoto("lalala")
+        self.assertEquals(personPhoto.person.photo, "lalala")
+
+        personPhoto.deletePhoto()
+        self.assert_(personPhoto.person.photo is None)
+
+    def testGetPhoto(self):
+        personPhoto = self.makeTestObject()
+        personPhoto.writePhoto("lalala")
+        self.assertEquals(personPhoto.getPhoto(), "lalala")
+
+        personPhoto.deletePhoto()
+        self.assert_(personPhoto.getPhoto() is None)
+
+
+class TestPersonPhotoView(ApplicationObjectViewTestMixin,
+                          unittest.TestCase):
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+        self.person = self.app['persons']['root'] = Person("root",
+                                                           title="Root person")
+
+        self.testObject = PersonPhotoAdapter(self.person)
+
+    def makeTestView(self):
+        return PersonPhotoView(self.testObject,
+                               TestRequest(StringIO("Icky Picky")))
+
+    def testGETNotFound(self):
+        view = self.makeTestView()
+        self.assertRaises(NotFound, view.GET)
+
+    def testGET(self):
+        view = self.makeTestView()
+        view.PUT()
+        result = view.GET()
+        response = view.request.response
+
+        self.assertEquals(response.getStatus(), 200)
+        self.assertEqual(result, "Icky Picky")
+
+    def testPUT(self):
+        view = self.makeTestView()
+        result = view.PUT()
+        response = view.request.response
+
+        self.assertEquals(response.getStatus(), 200)
+        self.assertEquals(result, "")
+
+    def testDelete(self):
+        view = self.makeTestView()
+        view.DELETE()
+
+        self.assertRaises(NotFound, view.GET)
+
+
+def doctest_PersonPasswordHttpTraverser():
+    r"""Tests for PersonPasswordHTTPTraverser.
+
+    This traverser allows you to access the password of the person:
+
+        >>> from schooltool.person.person import PersonPasswordWriter
+        >>> zope.component.provideAdapter(PersonPasswordWriter)
+
+        >>> from schooltool.person.rest.person import \
+        ...     PersonPasswordHTTPTraverser
+        >>> person = Person()
+        >>> request = TestRequest()
+
+        >>> traverser = PersonPasswordHTTPTraverser(person, request)
+        >>> traverser.context is person
+        True
+        >>> traverser.request is request
+        True
+
+    The traverser should implement ``ITraverserPlugin``:
+
+        >>> from schooltool.traverser.interfaces import ITraverserPlugin
+        >>> verifyObject(ITraverserPlugin, traverser)
+        True
+
+    Now access the password:
+
+        >>> traverser.publishTraverse(request, 'password')
+        <schooltool.person.person.PersonPasswordWriter ...>
+    """
+
+
+def doctest_PersonPhotoHttpTraverser():
+    r"""Tests for PersonPhotoHTTPTraverser.
+
+    This traverser allows you to access the photo of the person:
+
+        >>> from schooltool.person.rest.person import PersonPhotoAdapter
+        >>> zope.component.provideAdapter(PersonPhotoAdapter)
+
+        >>> person = Person()
+        >>> request = TestRequest()
+
+        >>> from schooltool.person.rest.person import PersonPhotoHTTPTraverser
+        >>> traverser = PersonPhotoHTTPTraverser(person, request)
+        >>> traverser.context is person
+        True
+        >>> traverser.request is request
+        True
+
+    The traverser should implement ``ITraverserPlugin``:
+
+        >>> from schooltool.traverser.interfaces import ITraverserPlugin
+        >>> verifyObject(ITraverserPlugin, traverser)
+        True
+
+    Now access the password:
+
+        >>> traverser.publishTraverse(request, 'photo')
+        <schooltool.person.rest.person.PersonPhotoAdapter ...>
+    """
+
+
+def doctest_PersonPreferencesHttpTraverser():
+    r"""Tests for PersonPreferencesHTTPTraverser.
+
+    PersonPreferencesHTTPTraverser allows you to access the preferences of the
+    person:
+
+        >>> from schooltool.person.rest.preference import \
+        ...     PersonPreferencesHTTPTraverser
+        >>> person = Person()
+        >>> request = TestRequest()
+
+        >>> from schooltool.person.preference import getPersonPreferences
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> setup.placelessSetUp()
+        >>> setup.setUpAnnotations()
+        >>> ztapi.provideAdapter(Person, IPersonPreferences,
+        ...                      getPersonPreferences)
+
+        >>> from schooltool.person.rest.preference import \
+        ...     PersonPreferencesAdapter
+        >>> zope.component.provideAdapter(PersonPreferencesAdapter)
+
+        >>> traverser = PersonPreferencesHTTPTraverser(person, request)
+        >>> traverser.context is person
+        True
+        >>> traverser.request is request
+        True
+
+    The traverser should implement ``ITraverserPlugin``:
+
+        >>> from schooltool.traverser.interfaces import ITraverserPlugin
+        >>> verifyObject(ITraverserPlugin, traverser)
+        True
+
+    Now access the preferences:
+
+        >>> traverser.publishTraverse(request, 'preferences')
+        <schooltool.person.rest.preference.PersonPreferencesAdapter ...>
+
+    Clean up:
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_PersonPreferencesView():
+    r"""Tests for PersonPreferencesView.
+
+    First lets create a view:
+
+        >>> setup.placefulSetUp()
+
+        >>> from schooltool.person.preference import getPersonPreferences
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> ztapi.provideAdapter(Person, IPersonPreferences,
+        ...                      getPersonPreferences)
+
+        >>> from schooltool.person.rest.preference import \
+        ...     PersonPreferencesAdapter
+        >>> zope.component.provideAdapter(PersonPreferencesAdapter)
+
+        >>> from schooltool.person.rest.preference import \
+        ...     PersonPreferencesHTTPTraverser
+        >>> person = Person()
+        >>> traverser = PersonPreferencesHTTPTraverser(person, TestRequest())
+        >>> adapter = traverser.publishTraverse(TestRequest(), 'preferences')
+        >>> view = PersonPreferencesView(adapter, TestRequest())
+
+        >>> print view.GET()
+        <preferences xmlns:xlink="http://www.w3.org/1999/xlink">
+        <BLANKLINE>
+          <preference id="timezone" value="UTC"/>
+          <preference id="timeformat" value="%H:%M"/>
+          <preference id="dateformat" value="%Y-%m-%d"/>
+          <preference id="weekstart" value="0"/>
+        <BLANKLINE>
+        </preferences>
+        <BLANKLINE>
+
+    Set a preference:
+
+        >>> from StringIO import StringIO
+        >>> body = '<preferences xmlns="http://schooltool.org/ns/model/0.1">' \
+        ...        '  <preference id="timezone" value="US/Eastern"/>' \
+        ...        '</preferences>'
+
+        >>> view = PersonPreferencesView(adapter, TestRequest(StringIO(body)))
+        >>> view.PUT()
+        'Preferences updated'
+
+    Check that the preference was set:
+
+        >>> u'<preference id="timezone" value="US/Eastern"/>' in view.GET()
+        True
+
+    Attempting to set a preference that does not exist will raise an error:
+
+        >>> body = '<preferences xmlns="http://schooltool.org/ns/model/0.1">' \
+        ...        '  <preference id="fakepref" value="1"/>' \
+        ...        '</preferences>'
+
+        >>> view = PersonPreferencesView(adapter, TestRequest(StringIO(body)))
+        >>> view.PUT()
+        Traceback (most recent call last):
+        ...
+        RestError: Preference "fakepref" unknown
+
+    Attempting to set a preference to an invalid value will also raise an
+    error:
+
+        >>> body = '<preferences xmlns="http://schooltool.org/ns/model/0.1">' \
+        ...        '  <preference id="timezone" value="Tatooine/Mos Isley"/>' \
+        ...        '</preferences>'
+
+        >>> view = PersonPreferencesView(adapter, TestRequest(StringIO(body)))
+        >>> view.PUT()
+        Traceback (most recent call last):
+        ...
+        RestError: Preference value "Tatooine/Mos Isley" does not pass validation on "timezone"
+
+    Clean up:
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTests([unittest.makeSuite(test) for test in
+                    (TestPersonContainerView,
+                     TestPersonFileFactory,
+                     TestPersonFile,
+                     TestPersonView,
+                     TestPersonPasswordWriterView,
+                     TestPersonPhotoAdapter,
+                     TestPersonPhotoView)])
+
+    suite.addTest(doctest.DocTestSuite(
+        optionflags=doctest.ELLIPSIS|
+                    doctest.REPORT_NDIFF|
+                    doctest.REPORT_ONLY_FIRST_FAILURE)
+        )
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/rest/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/security.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/security.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/security.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<configure xmlns="http://schooltool.org/securitypolicy"
+           xmlns:zope="http://namespaces.zope.org/zope">
+
+  <setting
+      key="everyone_can_view_person_list"
+      text="Everyone can view the list of persons"
+      default="False" />
+
+  <setting
+      key="everyone_can_view_person_info"
+      text="Everyone can view info of persons"
+      default="False" />
+
+  <setting
+      key="persons_can_set_their_preferences"
+      text="Persons can set their own preferences"
+      default="True" />
+
+  <setting
+      key="persons_can_change_their_passwords"
+      text="Persons can change their own passwords"
+      default="True" />
+
+  <crowd
+      name="person_list_viewers"
+      factory=".person.PersonListViewersCrowd" />
+
+  <crowd
+      name="person_info_viewers"
+      factory=".person.PersonInfoViewersCrowd" />
+
+  <crowd
+      name="person_prefs_editors"
+      factory=".preference.PersonPreferencesEditorsCrowd" />
+
+  <crowd
+      name="person_password_writers"
+      factory=".person.PasswordWriterCrowd" />
+
+  <allow
+      interface="schooltool.person.interfaces.IPersonContainer"
+      crowds="administration person_list_viewers"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.person.interfaces.IPersonContainer"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <allow
+      interface="schooltool.person.interfaces.IPerson"
+      crowds="administration owner person_info_viewers"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.person.interfaces.IPerson"
+      crowds="administration"
+      permission="schooltool.edit" />
+  <allow
+      interface="schooltool.person.interfaces.IPerson"
+      crowds="owner"
+      permission="schooltool.editCalendarOverlays" />
+
+  <zope:adapter
+      factory=".person.PersonCalendarCrowd"
+      provides="schooltool.app.interfaces.ICalendarParentCrowd"
+      name="schooltool.view" />
+
+  <allow
+      interface="schooltool.person.interfaces.IPersonPreferences"
+      crowds="administration owner"
+      permission="schooltool.view" /> <!-- XXX -->
+  <allow
+      interface="schooltool.person.interfaces.IPersonPreferences"
+      crowds="administration person_prefs_editors"
+      permission="schooltool.edit" />
+
+  <allow
+      interface="schooltool.person.interfaces.IPasswordWriter"
+      crowds="administration person_password_writers"
+      permission="schooltool.edit" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/security.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/tests/test_person.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/tests/test_person.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/tests/test_person.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,228 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.app.security
+
+$Id: test_person.py 6349 2006-07-13 13:23:08Z ignas $
+"""
+import unittest
+from pprint import pprint
+
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.container.contained import ObjectAddedEvent
+from zope.app.testing import setup
+
+from schooltool.person.person import Person
+from schooltool.person.person import PersonPasswordWriter
+from schooltool.person.interfaces import IPasswordWriter
+
+from schooltool.testing import setup as sbsetup
+
+
+def doctest_PersonContainer():
+    """Tests for PersonContainer
+
+        >>> from schooltool.person.interfaces import IPersonContainer
+        >>> from schooltool.person.person import PersonContainer
+        >>> c = PersonContainer()
+        >>> verifyObject(IPersonContainer, c)
+        True
+
+    PersonContainer uses the `username` attribute of persons as the key
+
+        >>> from schooltool.person.person import Person
+        >>> person = Person(username="itsme")
+        >>> c['doesnotmatter'] = person
+        >>> c['itsme'] is person
+        True
+        >>> c.get('doesnotmatter') is None
+        True
+
+    Adaptation (i.e. __conform__) is tested in doctest_SchoolToolApplication.
+    """
+
+
+def doctest_Person():
+    r"""Tests for Person
+
+        >>> from schooltool.person.interfaces import IPersonContained
+        >>> from schooltool.person.person import Person
+        >>> person = Person('person')
+        >>> verifyObject(IPersonContained, person)
+        True
+
+    Persons initially have no password
+
+        >>> person.hasPassword()
+        False
+
+    When a person has no password, he cannot log in
+
+        >>> person.checkPassword('')
+        False
+        >>> person.checkPassword(None)
+        False
+
+    You can set the password
+
+        >>> person.setPassword('secret')
+        >>> person.hasPassword()
+        True
+        >>> person.checkPassword('secret')
+        True
+        >>> person.checkPassword('justguessing')
+        False
+
+    Note that the password is not stored in plain text and cannot be recovered
+
+        >>> import pickle
+        >>> 'secret' not in pickle.dumps(person)
+        True
+
+    You can lock out the user's accound by setting the password to None
+
+        >>> person.setPassword(None)
+        >>> person.hasPassword()
+        False
+        >>> person.checkPassword('')
+        False
+        >>> person.checkPassword(None)
+        False
+
+    Note that you can set the password to an empty string, although that is
+    not a secure password
+
+        >>> person.setPassword('')
+        >>> person.hasPassword()
+        True
+        >>> person.checkPassword('')
+        True
+        >>> person.checkPassword(None)
+        False
+
+    It is probably not a very good idea to use non-ASCII characters in
+    passwords, but you can do that
+
+        >>> person.setPassword(u'\u1234')
+        >>> person.checkPassword(u'\u1234')
+        True
+
+    Persons are comparable (by username):
+
+        >>> person == person
+        True
+        >>> person == Person('person')
+        True
+        >>> person == 'foo'
+        False
+
+    Persons have a calendar:
+
+        >>> setup.placelessSetUp()
+        >>> setup.setUpAnnotations()
+        >>> sbsetup.setUpCalendaring()
+
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> calendar = ISchoolToolCalendar(person)
+        >>> calendar.__name__
+        'calendar'
+        >>> calendar.__parent__ is person
+        True
+        >>> len(calendar)
+        0
+
+    Clean up:
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_PersonPreferences():
+    r"""Tests for the Preferences adapter
+
+        >>> from zope.app.testing import setup
+        >>> setup.placelessSetUp()
+        >>> setup.setUpAnnotations()
+        >>> from schooltool.person.person import Person
+
+        >>> person = Person('person')
+
+    Note that the ``IHavePreferences`` interface is added in ZCML.
+
+    Make sure the attribute stores the correct interface
+
+        >>> from schooltool.person.interfaces import IPersonPreferences
+        >>> from schooltool.person.preference import getPersonPreferences
+        >>> prefs = getPersonPreferences(person)
+        >>> verifyObject(IPersonPreferences, prefs)
+        True
+
+        >>> prefs
+        <schooltool.person.preference.PersonPreferences object at 0x...>
+
+        >>> prefs.cal_periods
+        True
+        >>> prefs.timezone
+        'UTC'
+        >>> prefs.weekstart
+        0
+
+    Need to have prefs.__parent__ refer to the person it's attached to:
+
+        >>> prefs.__parent__ == person
+        True
+
+    Called another time, getPersonPreferences() returns the same object:
+
+        >>> getPersonPreferences(person) is prefs
+        True
+
+    Clean up:
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+class TestPersonPasswordWriter(unittest.TestCase):
+
+    def testSetPassword(self):
+        person =  Person("Frog")
+        passwordWriter = PersonPasswordWriter(person)
+        passwordWriter.setPassword("gorf")
+        self.assert_(person.checkPassword("gorf"))
+
+    def testConformance(self):
+        person =  Person("Frog")
+        passwordWriter = PersonPasswordWriter(person)
+        self.assert_(verifyObject(IPasswordWriter, passwordWriter))
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+        doctest.DocTestSuite('schooltool.person.person'),
+        unittest.makeSuite(TestPersonPasswordWriter)
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/tests/test_person.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/person/utility.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/person/utility.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/person/utility.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,44 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+from zc.table.interfaces import ISortableColumn
+
+from zope.interface import directlyProvides
+
+from schooltool.person.person import Person
+from schooltool.table.table import url_cell_formatter
+from schooltool.table.table import IndexedLocaleAwareGetterColumn
+
+
+class PersonFactoryUtility(object):
+
+    def columns(self):
+        title = IndexedLocaleAwareGetterColumn(
+            index='title',
+            name='title',
+            title=u'Full Name',
+            getter=lambda i, f: i.title,
+            cell_formatter=url_cell_formatter,
+            subsort=True)
+        return [title]
+
+    def sortOn(self):
+        return (("title", False),)
+
+    def __call__(self, *args, **kw):
+        return Person(*args, **kw)


Property changes on: schooltool/branches/upstream/current/src/schooltool/person/utility.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,438 @@
+Relationship
+============
+
+schooltool.relationship is a library for managing arbitrary many-to-many binary
+relationships.
+
+Quick overview
+--------------
+
+This package lets you define arbitrary many-to-many relationship schemas and
+use them to relate arbitrary components (that are annotatable or have an
+adapter to IRelationshipLinks).
+
+Usage example:
+
+    # Establish a relationship
+    Membership(member=frog, group=frogpond)
+
+    # Find all related objects for a given role (URIGroup in this case)
+    for group in getRelatedObjects(frog, URIGroup):
+        print group
+
+    Membership.unlink(member=frog, group=frogpond)
+
+You can also define relationship properties in your component classes, and
+rewrite the example above as
+
+    # Establish a relationship
+    frogpond.members.add(frog)      # or frog.groups.add(frogpond)
+
+    # Find all related objects for a given role (URIGroup in this case)
+    for group in frogpond.members:
+        print group
+
+    # Remove a relationship
+    frogpond.members.remove(frog)   # or frog.groups.remove(frogpond)
+
+
+Dependencies
+------------
+
+- zope.interface
+- zope.schema
+- zope.event
+- ZODB (persistent and persistent.list)
+- zope.app (only if you want to use the provided adapter for IAnnotatable,
+  and the provided event handlers for object change events)
+
+
+Details
+-------
+
+Relationship types and roles are identified by URIs (the idea was borrowed
+from XLink and RDF).  You can use strings containing those URIs directly,
+or you can use introspectable URI objects that also have an optional short name
+and a description in addition to the URI itself.
+
+    >>> from schooltool.relationship import URIObject
+
+For example, a generic group membership relationship can be defined with the
+following URIs:
+
+    >>> URIMembership = URIObject('http://schooltool.org/ns/membership',
+    ...                           'Membership', 'The membership relationship.')
+    >>> URIGroup = URIObject('http://schooltool.org/ns/membership/group',
+    ...                      'Group', 'A role of a containing group.')
+    >>> URIMember = URIObject('http://schooltool.org/ns/membership/member',
+    ...                       'Member', 'A group member role.')
+
+To demonstrate relationships we need some objects that can be related.  Any
+object that has an adapter to IRelationshipLinks can be used in relationships.
+Since schooltool.relationship provides a default adapter from IAnnotatable
+to IRelationshipLinks, it is enough to declare that our objects are
+IAttributeAnnotatable.
+
+    >>> from zope.interface import implements
+    >>> from zope.annotation.interfaces import IAttributeAnnotatable
+    >>> class SomeObject(object):
+    ...     implements(IAttributeAnnotatable)
+    ...     def __init__(self, name):
+    ...         self._name = name
+    ...     def __repr__(self):
+    ...         return self._name
+
+We need some setup to make Zope 3 annotations work.
+
+    >>> from zope.app.testing import setup
+    >>> setup.placelessSetUp()
+    >>> setup.setUpAnnotations()
+
+We need to define the adapter from IAnnotatable to IRelationshipLinks.
+In real life you would include the ZCML configuration of the
+'schooltool.relationship' package via Zope 3 package includes.  In a test
+you can use setUpRelationships from schooltool.relationship.tests.
+
+    >>> from schooltool.relationship.tests import setUpRelationships
+    >>> setUpRelationships()
+
+You can create relationships by calling the `relate` function
+
+    >>> from schooltool.relationship import relate
+    >>> frogs = SomeObject('frogs')
+    >>> frogger = SomeObject('frogger')
+    >>> relate(URIMembership, (frogs, URIGroup), (frogger, URIMember))
+
+Since you will always want to use a particular set of roles for a given
+relationship type, you can define a relationship schema and use it as a
+shortcut:
+
+    >>> from schooltool.relationship import RelationshipSchema
+    >>> Membership = RelationshipSchema(URIMembership, group=URIGroup,
+    ...                                 member=URIMember)
+
+    >>> lilfroggy = SomeObject('lilfroggy')
+    >>> Membership(member=lilfroggy, group=frogs)
+
+If you try to create the same relationship between the same objects more
+than once, you will get a DuplicateRelationship exception.
+
+    >>> Membership(member=lilfroggy, group=frogs)
+    Traceback (most recent call last):
+      ...
+    DuplicateRelationship
+
+You can query relationships by calling the `getRelatedObjects` function.
+It returns a list of objects in undefined order, so we'll define a function
+to sort them alphabetically:
+
+    >>> def sorted(list):
+    ...     items = [(repr(item), item) for item in list]
+    ...     items.sort()
+    ...     return [row[-1] for row in items]
+
+For example, you can get a list of all members of the `frogs` group like
+this:
+
+    >>> from schooltool.relationship import getRelatedObjects
+    >>> sorted(getRelatedObjects(frogs, URIMember))
+    [frogger, lilfroggy]
+
+The relationship is bidirectional, so you can ask an object what groups it
+belongs to
+
+    >>> getRelatedObjects(frogger, URIGroup)
+    [frogs]
+
+You can also explicitly say that you want all URIGroups that participate
+in a URIMembership relationship.
+
+    >>> getRelatedObjects(frogger, URIGroup, URIMembership)
+    [frogs]
+    >>> getRelatedObjects(frogger, URIGroup, 'example:Groupship')
+    []
+
+In general, avoid reusing the same role for different relationship types.
+
+You can remove relationships by calling the `unrelate` function
+
+    >>> from schooltool.relationship import unrelate
+    >>> unrelate(URIMembership, (frogs, URIGroup), (frogger, URIMember))
+
+    >>> getRelatedObjects(frogger, URIGroup)
+    []
+    >>> getRelatedObjects(frogs, URIMember)
+    [lilfroggy]
+
+If you try to remove a relationship that does not exist, you will get an
+exception
+
+    >>> unrelate(URIMembership, (frogs, URIMember), (frogger, URIGroup))
+    Traceback (most recent call last):
+      ...
+    NoSuchRelationship
+
+If you have a relationship schema, you can call its `unlink` method, as
+a shortcut for the full unrelate call.
+
+    >>> Membership.unlink(member=lilfroggy, group=frogs)
+    >>> getRelatedObjects(frogs, URIMember)
+    []
+
+There is also an `unrelateAll` function that removes all relationships of
+an object.  It is useful if you want to break all relationships when deleting
+an object.
+
+
+Relationship properties
+-----------------------
+
+You can define a property in a class and use it instead of explicitly
+calling global functions and passing roles around.
+
+    >>> from schooltool.relationship import RelationshipProperty
+
+    >>> class Group(SomeObject):
+    ...     members = RelationshipProperty(URIMembership, URIGroup, URIMember)
+
+    >>> class Member(SomeObject):
+    ...     groups = RelationshipProperty(URIMembership, URIMember, URIGroup)
+
+Usage example:
+
+    >>> fido = Member('fido')
+    >>> dogs = Group('dogs')
+
+    >>> list(fido.groups)
+    []
+    >>> list(dogs.members)
+    []
+
+    >>> bool(fido.groups)
+    False
+
+    >>> dogs.members.add(fido)
+
+    >>> list(fido.groups)
+    [dogs]
+    >>> list(dogs.members)
+    [fido]
+
+    >>> bool(fido.groups)
+    True
+    >>> len(fido.groups)
+    1
+
+    >>> fido.groups.remove(dogs)
+
+    >>> list(fido.groups)
+    []
+    >>> list(dogs.members)
+    []
+
+
+Events
+------
+
+    >>> import zope.event
+    >>> old_subscribers = zope.event.subscribers
+    >>> zope.event.subscribers = []
+
+Before you establish a relationship, a BeforeRelationshipEvent is sent out.
+You can implement constraints by raising an exception in an event subscriber.
+
+    >>> from zope.interface import Interface, directlyProvides
+    >>> class IFrog(Interface):
+    ...     pass
+
+    >>> from schooltool.relationship.interfaces import IBeforeRelationshipEvent
+    >>> def no_toads(event):
+    ...     if (IBeforeRelationshipEvent.providedBy(event) and
+    ...             event.rel_type == URIMembership and
+    ...             event[URIGroup] is frogs and
+    ...             not IFrog.providedBy(event[URIMember])):
+    ...         raise Exception("Only frogs can be members of the frogs group")
+    >>> zope.event.subscribers.append(no_toads)
+
+    >>> toady = SomeObject('toady')
+    >>> Membership(member=toady, group=frogs)
+    Traceback (most recent call last):
+      ...
+    Exception: Only frogs can be members of the frogs group
+
+When you establish a relationship, a RelationshipAddedEvent is sent out.
+
+    >>> from schooltool.relationship.interfaces import IRelationshipAddedEvent
+    >>> def my_subscriber(event):
+    ...     if IRelationshipAddedEvent.providedBy(event):
+    ...         print 'Relationship %s added between %s (%s) and %s (%s)' % (
+    ...                     event.rel_type.name,
+    ...                     event.participant1, event.role1.name,
+    ...                     event.participant2, event.role2.name)
+    ...         if event.extra_info:
+    ...             print '(BTW, %s)' % event.extra_info
+    >>> zope.event.subscribers.append(my_subscriber)
+
+    >>> kermit = SomeObject('kermit')
+    >>> directlyProvides(kermit, IFrog)
+    >>> Membership(member=kermit, group=frogs)
+    Relationship Membership added between kermit (Member) and frogs (Group)
+
+Before you break a relationship, a BeforeRemovingRelationshipEvent is sent out.
+You can implement constraints by raising exceptions in the subscriber (e.g.
+prevent members from leaving a group before they do something they have to
+do).
+
+When you break a relationship, a RelationshipRemovedEvent is sent out.
+
+    >>> from schooltool.relationship.interfaces \
+    ...         import IBeforeRemovingRelationshipEvent
+    >>> from schooltool.relationship.interfaces \
+    ...         import IRelationshipRemovedEvent
+    >>> def my_subscriber(event):
+    ...     if IBeforeRemovingRelationshipEvent.providedBy(event):
+    ...         if (event.rel_type == URIMembership
+    ...             and event[URIMember] is kermit):
+    ...             print "Please don't leave us!"
+    ...     if IRelationshipRemovedEvent.providedBy(event):
+    ...         print 'Relationship %s between %s (%s) and %s (%s) removed' % (
+    ...                     event.rel_type.name,
+    ...                     event.participant1, event.role1.name,
+    ...                     event.participant2, event.role2.name)
+    ...         if event.extra_info:
+    ...             print '(BTW, %s)' % event.extra_info
+    >>> zope.event.subscribers.append(my_subscriber)
+
+    >>> Membership.unlink(member=kermit, group=frogs)
+    Please don't leave us!
+    Relationship Membership between kermit (Member) and frogs (Group) removed
+
+
+Symmetric relationships
+-----------------------
+
+Symmetric relationships work too:
+
+    >>> URIFriendship = URIObject('example:Friendship', 'Friendship')
+    >>> URIFriend = URIObject('example:Friend', 'Friend')
+
+    >>> Friendship = RelationshipSchema(URIFriendship,
+    ...                                 one=URIFriend, other=URIFriend)
+    >>> Friendship(one=fido, other=kermit)
+    Relationship Friendship added between kermit (Friend) and fido (Friend)
+
+    >>> class FriendlyObject(SomeObject):
+    ...     friends = RelationshipProperty(URIFriendship, URIFriend, URIFriend)
+
+    >>> neko = FriendlyObject('neko')
+    >>> neko.friends.add(kermit)
+    Relationship Friendship added between neko (Friend) and kermit (Friend)
+    >>> list(neko.friends)
+    [kermit]
+    >>> sorted(getRelatedObjects(kermit, URIFriend))
+    [fido, neko]
+
+Note that if you use symmetric relationships, you cannot use `__getitem__`
+on IBeforeRelationshipEvents.
+
+
+Annotated relationships
+-----------------------
+
+Sometimes you may want to attach some extra information to a relationship (e.g.
+a label).  You can do so by passing an extra argument to `relate` and
+`unrelate`:
+
+    >>> relate(URIFriendship, (kermit, URIFriend), (frogger, URIFriend),
+    ...        'kermit and frogger know each other for years')
+    Relationship Friendship added between kermit (Friend) and frogger (Friend)
+    (BTW, kermit and frogger know each other for years)
+
+This extra argument should be either a read-only object, or a subclass of
+persistent.Persistent, because references to this object will be stored from
+both relationship sides.
+
+You can access this extra information from relationship links directly:
+
+    >>> from schooltool.relationship.interfaces import IRelationshipLinks
+    >>> for link in IRelationshipLinks(kermit):
+    ...     if link.extra_info:
+    ...         print link.extra_info
+    kermit and frogger know each other for years
+
+Since this is very inconvenient, I expect you will write your own access
+properties that mimic RelationshipProperty, and override the `__iter__`
+method.  For example:
+
+    >>> from schooltool.relationship.relationship import BoundRelationshipProperty
+    >>> class FriendshipProperty(object):
+    ...     def __get__(self, instance, owner):
+    ...         if instance is None: return self
+    ...         return BoundFriendshipProperty(instance)
+    >>> class BoundFriendshipProperty(BoundRelationshipProperty):
+    ...     def __init__(self, this):
+    ...         BoundRelationshipProperty.__init__(self, this, URIFriendship,
+    ...                                            URIFriend, URIFriend)
+    ...     def __iter__(self):
+    ...         for link in IRelationshipLinks(self.this):
+    ...             if link.role == self.other_role and link.rel_type == self.rel_type:
+    ...                 yield link.target, link.extra_info
+
+You can then use it like this:
+
+    >>> class Friend(SomeObject):
+    ...     friends = FriendshipProperty()
+
+    >>> fluffy = Friend('fluffy')
+    >>> fluffy.friends.add(kermit,
+    ...         'fluffy just met kermit, but fluffy is very friendly')
+    Relationship Friendship added between fluffy (Friend) and kermit (Friend)
+    (BTW, fluffy just met kermit, but fluffy is very friendly)
+
+    >>> for friend, extra_info in fluffy.friends:
+    ...     print '%s: %s' % (friend, extra_info)
+    kermit: fluffy just met kermit, but fluffy is very friendly
+
+As you see, the extra info is accessible to all event handlers
+
+    >>> fluffy.friends.remove(kermit)
+    Relationship Friendship between fluffy (Friend) and kermit (Friend) removed
+    (BTW, fluffy just met kermit, but fluffy is very friendly)
+
+
+Caveats
+-------
+
+- When you delete objects, you should remove all relationships for those
+  objects.  If you use Zope 3 objects events, you can register the
+  `unrelateOnDeletion` event handler from schooltool.relationship.objectevents.
+  configure.zcml of schooltool.relationship does that.
+
+- When you copy objects (e.g. using Zope's IObjectCopier), you should take
+  care to ensure that you do not duplicate just one half of relationship
+  links.  It is tricky.  locationCopy from zope.location.pickling
+  performs deep copies of all objects that are located within the object you
+  are copying.  It works if all relationships are within this subtree (or
+  outside it).  You will get problems if you have a relationship between
+  an object that is copied and another object that is not copied.
+
+  You can register the `unrelateOnCopy` event handler from
+  schooltool.relationship.objectevents to solve *part* of the problem
+  (configure.zcml of schooltool.relationship does that).  This event handler
+  removes all relationships from the copy of the object that you are copying.
+  It does not traverse the whole deply-copied subtree, therefore if you
+  have subobjects that participate in relationships with objects outside of
+  the subtree, you will have problems.
+
+  An alternative solution is to disallow copying of objects that may have
+  subobjects related with other objects that are not located within the
+  original object.  To do so, declare and IObjectCopier adapter for the object
+  and make the `copyable` method return False.
+
+
+Cleaning up
+-----------
+
+    >>> zope.event.subscribers = old_subscribers
+    >>> setup.placelessTearDown()
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,32 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Many-to-many relationships.
+
+See the README.txt file in this package for a detailed overview with working
+code examples.
+"""
+
+from schooltool.relationship.uri import URIObject, IURIObject       # reexport
+from schooltool.relationship.relationship import relate             # reexport
+from schooltool.relationship.relationship import unrelate           # reexport
+from schooltool.relationship.relationship import unrelateAll        # reexport
+from schooltool.relationship.relationship import getRelatedObjects  # reexport
+from schooltool.relationship.relationship import RelationshipSchema # reexport
+from schooltool.relationship.relationship import RelationshipProperty # ditto


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/annotatable.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/annotatable.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/annotatable.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Implementation of relationships for IAnnotatable objects.
+
+Relationships are represented as collections of links.  A link defines one
+half of a relationship.  The storage of links on an object is determined by
+an IRelationshipLinks adapter.  There is a default adapter registered for
+all IAnnotatable objects that uses Zope 3 annotations.
+"""
+
+from zope.annotation.interfaces import IAnnotations
+from schooltool.relationship.relationship import LinkSet
+
+
+def getRelationshipLinks(context):
+    """Adapt an IAnnotatable object to IRelationshipLinks."""
+    annotations = IAnnotations(context)
+    key = 'schooltool.relationship.RelationshipLinks'
+    try:
+        return annotations[key]
+    except KeyError:
+        annotations[key] = LinkSet()
+        annotations[key].__parent__ = context
+        annotations[key].__name__ = "relationships"
+        return annotations[key]


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/annotatable.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:security="http://schooltool.org/securitypolicy"
+    i18n_domain="schooltool">
+
+  <class
+      class="schooltool.relationship.relationship.BoundRelationshipProperty">
+    <allow attributes="__iter__ __contains__" />
+  </class>
+
+  <adapter
+      for="zope.annotation.interfaces.IAnnotatable"
+      provides="schooltool.relationship.interfaces.IRelationshipLinks"
+      factory="schooltool.relationship.annotatable.getRelationshipLinks"
+      trusted="true"
+      />
+
+  <subscriber
+      for="zope.app.container.interfaces.IObjectRemovedEvent"
+      handler="schooltool.relationship.objectevents.unrelateOnDeletion"
+      />
+
+  <subscriber
+      for="zope.lifecycleevent.interfaces.IObjectCopiedEvent"
+      handler="schooltool.relationship.objectevents.unrelateOnCopy"
+      />
+
+  <configure
+      xmlns="http://namespaces.zope.org/apidoc"
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have apidoc">
+    <bookchapter
+        id="relationships"
+        title="Relationships"
+        doc_path="README.txt"
+        parent="schoolbell"
+        />
+  </configure>
+
+  <security:allow
+      interface="schooltool.relationship.interfaces.IRelationshipLink"
+      crowds="administration owner"
+      permission="schooltool.view" />
+  <security:allow
+      interface="schooltool.relationship.interfaces.IRelationshipLink"
+      crowds="administration owner"
+      permission="schooltool.edit" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,178 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Relationship interfaces
+
+$Id: interfaces.py 6183 2006-06-07 18:40:03Z ignas $
+"""
+
+from zope.interface import Interface, Attribute
+
+
+class IRelationshipProperty(Interface):
+    """A property tied to a relationship."""
+
+    rel_type = Attribute("""Relationship type""")
+    my_role = Attribute("""Role of the object with this property""")
+    other_role = Attribute("""Role of other objects in this relationship""")
+    this = Attribute("""The object that this property is bound to.""")
+
+    def __nonzero__():
+        """Are there any related objects?
+
+        Equivalent to bool(list(self)), but can be implemented more
+        efficiently.
+        """
+
+    def __len__():
+        """Return the number of related objects."""
+
+    def __iter__():
+        """Iterate over all related objects."""
+
+    def add(other, extra_info=None):
+        """Establish a relationship with `other`."""
+
+    def remove(other):
+        """Unlink a relationship with `other`."""
+
+
+class IRelationshipLink(Interface):
+    """One half of a relationship.
+
+    When a relationship between `a` and `b` is established, two links are
+    created and placed into link sets of `a` and `b` respectively.
+    """
+
+    rel_type = Attribute("""Relationship type.""")
+    target = Attribute("""The other member of the relationship.""")
+    role = Attribute("""Role of `target`.""")
+    my_role = Attribute("""Role of the object that has this link.""")
+    extra_info = Attribute("""Extra information that was passed to `relate`.""")
+
+
+class IRelationshipLinks(Interface):
+    """A set of relationship links.
+
+    Objects that can be used in relationships are those that have an adapter to
+    IRelationshipLinks.
+
+    See also `IRelationshipLink`.
+    """
+
+    def __iter__():
+        """Iterate over all links."""
+
+    def add(link):
+        """Add a new link."""
+
+    def remove(link):
+        """Remove a link.
+
+        Raises ValueError if link is not in the set.
+        """
+
+    def clear():
+        """Remove all links."""
+
+    def find(my_role, target, role, rel_type):
+        """Find a link with matching attributes.
+
+        Raises ValueError if a matching link is not found.
+        """
+
+    def __getitem__(id):
+        """Return the link with a given id."""
+
+    def get(key, default=None):
+        """Get a link for a key
+
+        The default is returned if there is no value for the key.
+        """
+
+    def getTargetsByRole(role, rel_type=None):
+        """Return all objects related to this object with a given role."""
+
+
+class IRelationshipEvent(Interface):
+    """Common attributes for relationship events."""
+
+    rel_type = Attribute("""Relationship type.""")
+    participant1 = Attribute("""One of the participants.""")
+    role1 = Attribute("""Role of `participant1`.""")
+    participant2 = Attribute("""One of the participants.""")
+    role2 = Attribute("""Role of `participant2`.""")
+    extra_info = Attribute("""Extra info, as passed to relate().""")
+
+    def __getitem__(role):
+        """Return the participant with a given role.
+
+        This does not work well with "peer-to-peer" relationships, that is,
+        when role1 == role2.
+        """
+
+
+class IBeforeRelationshipEvent(IRelationshipEvent):
+    """A relationship is about to be established.
+
+    You can register subscribers for this event to implement constraints.
+    By convention, subscribers raise InvalidRelationship or a subclass
+    when a relationship does not meet all the constraints.
+    """
+
+
+class IRelationshipAddedEvent(IRelationshipEvent):
+    """A relationship has been established."""
+
+
+class IBeforeRemovingRelationshipEvent(IRelationshipEvent):
+    """A relationship is about to be broken.
+
+    You can register subscribers for this event to implement constraints
+    (by raising exceptions).
+    """
+
+
+class IRelationshipRemovedEvent(IRelationshipEvent):
+    """A relationship has been broken."""
+
+
+class InvalidRelationship(Exception):
+    """Invalid relationship."""
+
+
+class DuplicateRelationship(InvalidRelationship):
+    """Relationship already exists"""
+
+
+class NoSuchRelationship(Exception):
+    """Relationship does not exist"""
+
+
+class IRelationshipSchema(Interface):
+    """Relationship schema."""
+
+    roles = Attribute("""Roles of members of the relationship.""")
+    rel_type = Attribute("""Type of the relationship.""")
+
+    def __call__(**parties):
+        """Establish a relationship."""
+
+    def unlink(**parties):
+        """Break a relationship."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/objectevents.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/objectevents.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/objectevents.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,70 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Relationship maintenance.
+
+Zope 3 content management operations (Delete, Cut, Copy, Paste) do not work
+well with relationships unless you register event subscribers that perform
+the necessary relationship maintenance.
+
+This module contains event subscribers for IObjectRemovedEvent (and, soon,
+others) that update relationships on these changes.
+"""
+
+from zope.app.container.interfaces import IObjectRemovedEvent
+from zope.app.container.contained import getProxiedObject
+from zope.lifecycleevent.interfaces import IObjectCopiedEvent
+
+from schooltool.relationship.interfaces import IRelationshipLinks
+from schooltool.relationship.relationship import unrelateAll
+
+
+def unrelateOnDeletion(event):
+    """Remove all relationships when an object is deleted."""
+    if not IObjectRemovedEvent.providedBy(event):
+        return
+    linkset = IRelationshipLinks(event.object, None)
+    if linkset is not None:
+        # event.object may be a ContainedProxy
+        unrelateAll(getProxiedObject(event.object))
+
+
+def unrelateOnCopy(event):
+    """Remove all relationships when an object is copied."""
+    if not IObjectCopiedEvent.providedBy(event):
+        return
+    # event.object may be a ContainedProxy
+    obj = getProxiedObject(event.object)
+    linkset = IRelationshipLinks(obj, None)
+    if linkset is not None:
+        links_to_remove = []
+        for link in linkset:
+            other_linkset = IRelationshipLinks(link.target)
+            try:
+                other_linkset.find(link.role, obj, link.my_role, link.rel_type)
+            except ValueError:
+                # The corresponding other link was not copied, so we have a
+                # degenerate one-sided relationship.  Let's remove it
+                # altogether.  It would not difficult to have a different
+                # function, cloneRelationshipsOnCopy, that would create
+                # a corresponding link in other_linkset.
+                links_to_remove.append(link)
+        for link in links_to_remove:
+            linkset.remove(link)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/objectevents.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/relationship.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/relationship.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/relationship.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,599 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Implementation of relationships.
+
+Relationships are represented as collections of links.  A link defines one
+half of a relationship.  The storage of links on an object is determined by
+an IRelationshipLinks adapter.  There is a default adapter registered for
+all IAnnotatable objects that uses Zope 3 annotations.
+"""
+
+from BTrees.OOBTree import OOBTree
+from persistent import Persistent
+from persistent.list import PersistentList
+from zope.app.container.contained import Contained
+from zope.interface import implements
+import zope.event
+
+from schooltool.relationship.interfaces import IRelationshipLinks
+from schooltool.relationship.interfaces import IRelationshipLink
+from schooltool.relationship.interfaces import IRelationshipProperty
+from schooltool.relationship.interfaces import IBeforeRelationshipEvent
+from schooltool.relationship.interfaces import IRelationshipAddedEvent
+from schooltool.relationship.interfaces import IBeforeRemovingRelationshipEvent
+from schooltool.relationship.interfaces import IRelationshipRemovedEvent
+from schooltool.relationship.interfaces import DuplicateRelationship
+from schooltool.relationship.interfaces import NoSuchRelationship
+from schooltool.relationship.interfaces import IRelationshipSchema
+
+
+def relate(rel_type, (a, role_of_a), (b, role_of_b), extra_info=None):
+    """Establish a relationship between objects `a` and `b`."""
+    for link in IRelationshipLinks(a):
+        if (link.target is b and link.role == role_of_b
+            and link.rel_type == rel_type):
+            raise DuplicateRelationship
+    zope.event.notify(BeforeRelationshipEvent(rel_type,
+                                              (a, role_of_a),
+                                              (b, role_of_b),
+                                              extra_info))
+    IRelationshipLinks(a).add(Link(role_of_a, b, role_of_b, rel_type,
+                                   extra_info))
+    IRelationshipLinks(b).add(Link(role_of_b, a, role_of_a, rel_type,
+                                   extra_info))
+    zope.event.notify(RelationshipAddedEvent(rel_type,
+                                             (a, role_of_a),
+                                             (b, role_of_b),
+                                             extra_info))
+
+
+def unrelate(rel_type, (a, role_of_a), (b, role_of_b)):
+    """Break a relationship between objects `a` and `b`."""
+    links_of_a = IRelationshipLinks(a)
+    links_of_b = IRelationshipLinks(b)
+    try:
+        link_a_to_b = links_of_a.find(role_of_a, b, role_of_b, rel_type)
+    except ValueError:
+        raise NoSuchRelationship
+    extra_info = link_a_to_b.extra_info
+    zope.event.notify(BeforeRemovingRelationshipEvent(rel_type,
+                                                      (a, role_of_a),
+                                                      (b, role_of_b),
+                                                      extra_info))
+    links_of_a.remove(link_a_to_b)
+    # If links_of_b.find raises a ValueError, our data structures are out of
+    # sync.
+    link_b_to_a = links_of_b.find(role_of_b, a, role_of_a, rel_type)
+    links_of_b.remove(link_b_to_a)
+    zope.event.notify(RelationshipRemovedEvent(rel_type,
+                                               (a, role_of_a),
+                                               (b, role_of_b),
+                                               extra_info))
+
+
+def unrelateAll(obj):
+    """Break all relationships of `obj`.
+
+    Note that this operation is not atomic: if an event subscriber catches
+    a BeforeRemovingRelationshipEvent and vetoes the operation, some
+    relationships may have been removed, while others may still be there.
+    """
+    links_of_a = IRelationshipLinks(obj)
+    relationships = [(link.rel_type, (obj, link.my_role),
+                                     (link.target, link.role))
+                     for link in links_of_a]
+    for args in relationships:
+        try:
+            unrelate(*args)
+        except NoSuchRelationship:
+            pass # it was a loop, so we tried to delete it twice
+    return
+
+
+class RelationshipEvent(object):
+    """Base class for relationship events.
+
+        >>> event = RelationshipEvent('Membership',
+        ...                           ('a', 'Member'), ('b', 'Group'),
+        ...                           None)
+        >>> event['Member']
+        'a'
+        >>> event['Group']
+        'b'
+        >>> event['Bogus']
+        Traceback (most recent call last):
+          ...
+        KeyError: 'Bogus'
+
+    """
+
+    def __init__(self, rel_type, (a, role_of_a), (b, role_of_b), extra_info):
+        self.rel_type = rel_type
+        self.participant1 = a
+        self.role1 = role_of_a
+        self.participant2 = b
+        self.role2 = role_of_b
+        self.extra_info = extra_info
+
+    def __getitem__(self, role):
+        """Return the participant with a given role."""
+        if role == self.role1:
+            return self.participant1
+        if role == self.role2:
+            return self.participant2
+        raise KeyError(role)
+
+
+class BeforeRelationshipEvent(RelationshipEvent):
+    """A relationship is about to be established.
+
+        >>> from zope.interface.verify import verifyObject
+        >>> event = BeforeRelationshipEvent('example:Membership',
+        ...                                 ('a', 'example:Member'),
+        ...                                 ('letters', 'example:Group'),
+        ...                                 None)
+        >>> verifyObject(IBeforeRelationshipEvent, event)
+        True
+
+    """
+
+    implements(IBeforeRelationshipEvent)
+
+
+class RelationshipAddedEvent(RelationshipEvent):
+    """A relationship has been established.
+
+        >>> from zope.interface.verify import verifyObject
+        >>> event = RelationshipAddedEvent('example:Membership',
+        ...                                ('a', 'example:Member'),
+        ...                                ('letters', 'example:Group'),
+        ...                                None)
+        >>> verifyObject(IRelationshipAddedEvent, event)
+        True
+
+    """
+
+    implements(IRelationshipAddedEvent)
+
+
+class BeforeRemovingRelationshipEvent(RelationshipEvent):
+    """A relationship is about to be broken.
+
+        >>> from zope.interface.verify import verifyObject
+        >>> event = BeforeRemovingRelationshipEvent('example:Membership',
+        ...                 ('a', 'example:Member'),
+        ...                 ('letters', 'example:Group'),
+        ...                 None)
+        >>> verifyObject(IBeforeRemovingRelationshipEvent, event)
+        True
+
+    """
+
+    implements(IBeforeRemovingRelationshipEvent)
+
+
+class RelationshipRemovedEvent(RelationshipEvent):
+    """A relationship has been broken.
+
+        >>> from zope.interface.verify import verifyObject
+        >>> event = RelationshipRemovedEvent('example:Membership',
+        ...                                  ('a', 'example:Member'),
+        ...                                  ('letters', 'example:Group'),
+        ...                                  None)
+        >>> verifyObject(IRelationshipRemovedEvent, event)
+        True
+
+    """
+
+    implements(IRelationshipRemovedEvent)
+
+
+def getRelatedObjects(obj, role, rel_type=None):
+    """Return all objects related to `obj` with a given role."""
+    return IRelationshipLinks(obj).getTargetsByRole(role, rel_type)
+
+
+class RelationshipSchema(object):
+    """Relationship schema.
+
+    Boring doctest setup:
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> from schooltool.relationship.tests import SomeObject
+        >>> setUp()
+        >>> a = SomeObject('a')
+        >>> b = SomeObject('b')
+
+    Relationship schemas are syntactic sugar.  If you define a relationship
+    schema like this:
+
+        >>> from schooltool.relationship.tests import URIStub
+        >>> URIMembership = URIStub('example:Membership')
+        >>> URIMember = URIStub('example:Member')
+        >>> URIGroup = URIStub('example:Group')
+        >>> Membership = RelationshipSchema(URIMembership,
+        ...                     member=URIMember, group=URIGroup)
+
+    Then you can create and break relationships by writing
+
+        >>> Membership(member=a, group=b)
+        >>> Membership.unlink(member=a, group=b)
+
+    instead of having to explicitly say
+
+        >>> relate(URIMembership, (a, URIMember), (b, URIGroup))
+        >>> unrelate(URIMembership, (a, URIMember), (b, URIGroup))
+
+    That's it.
+
+        >>> tearDown()
+
+    """
+
+    implements(IRelationshipSchema)
+
+    def __init__(self, rel_type, **roles):
+        if len(roles) != 2:
+            raise TypeError("A relationship must have exactly two ends.")
+        self.rel_type = rel_type
+        self.roles = roles
+
+    def __call__(self, **parties):
+        """Establish a relationship."""
+        self._doit(relate, **parties)
+
+    def unlink(self, **parties):
+        """Break a relationship."""
+        self._doit(unrelate, **parties)
+
+    def _doit(self, fn, **parties):
+        """Extract and validate parties from keyword arguments and call fn."""
+        (name_of_a, role_of_a), (name_of_b, role_of_b) = self.roles.items()
+        try:
+            a = parties.pop(name_of_a)
+        except KeyError:
+            raise TypeError('Missing a %r keyword argument.' % name_of_a)
+        try:
+            b = parties.pop(name_of_b)
+        except KeyError:
+            raise TypeError('Missing a %r keyword argument.' % name_of_b)
+        if parties:
+            raise TypeError("Too many keyword arguments.")
+        fn(self.rel_type, (a, role_of_a), (b, role_of_b))
+
+
+class RelationshipProperty(object):
+    """Relationship property.
+
+    Instead of calling global functions and passing URIs around you can define
+    a property on an object and use it to create and query relationships:
+
+        >>> class SomeClass(object): # must be a new-style class
+        ...     friends = RelationshipProperty('example:Friendship',
+        ...                                    'example:Friend',
+        ...                                    'example:Friend')
+
+    The property is introspectable, although that's not very useful
+
+        >>> SomeClass.friends.rel_type
+        'example:Friendship'
+
+        >>> SomeClass.friends.my_role
+        'example:Friend'
+
+        >>> SomeClass.friends.other_role
+        'example:Friend'
+
+    IRelationshipProperty defines things you can do with a relationship
+    property.
+
+        >>> from zope.interface.verify import verifyObject
+        >>> someinstance = SomeClass()
+        >>> verifyObject(IRelationshipProperty, someinstance.friends)
+        True
+
+    """
+
+    def __init__(self, rel_type, my_role, other_role):
+        self.rel_type = rel_type
+        self.my_role = my_role
+        self.other_role = other_role
+
+    def __get__(self, instance, owner):
+        """Bind the property to an instance."""
+        if instance is None:
+            return self
+        else:
+            return BoundRelationshipProperty(instance, self.rel_type,
+                                             self.my_role, self.other_role)
+
+
+class BoundRelationshipProperty(object):
+    """Relationship property bound to an object."""
+
+    implements(IRelationshipProperty)
+
+    def __init__(self, this, rel_type, my_role, other_role):
+        self.this = this
+        self.rel_type = rel_type
+        self.my_role = my_role
+        self.other_role = other_role
+
+    def __nonzero__(self):
+        try:
+            iter(self).next()
+        except StopIteration:
+            return False
+        else:
+            return True
+
+    def __len__(self):
+        count = 0
+        for i in self:
+            count += 1
+        return count
+
+    def __iter__(self):
+        return iter(getRelatedObjects(self.this, self.other_role,
+                                      self.rel_type))
+
+    def add(self, other, extra_info=None):
+        """Establish a relationship between `self.this` and `other`."""
+        relate(self.rel_type, (self.this, self.my_role),
+                              (other, self.other_role), extra_info)
+
+    def remove(self, other):
+        """Unlink a relationship between `self.this` and `other`."""
+        unrelate(self.rel_type, (self.this, self.my_role),
+                                (other, self.other_role))
+
+
+class Link(Persistent, Contained):
+    """One half of a relationship.
+
+    A link is a simple class that holds information about one side of the
+    relationship:
+
+        >>> target = object()
+        >>> my_role = 'example:Group'
+        >>> role = 'example:Member'
+        >>> rel_type = 'example:Membership'
+        >>> link = Link(my_role, target, role, rel_type)
+        >>> link.target is target
+        True
+        >>> link.my_role
+        'example:Group'
+        >>> link.role
+        'example:Member'
+        >>> link.rel_type
+        'example:Membership'
+
+    The attributes are documented in IRelationshipLink
+
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(IRelationshipLink, link)
+        True
+
+    """
+
+    implements(IRelationshipLink)
+
+    def __init__(self, my_role, target, role, rel_type, extra_info=None):
+        self.my_role = my_role
+        self.target = target
+        self.role = role
+        self.rel_type = rel_type
+        self.extra_info = extra_info
+
+
+class LinkSet(Persistent, Contained):
+    """Set of links.
+
+    This class is used internally to represent relationships.  Initially it
+    is empty
+
+        >>> linkset = LinkSet()
+        >>> list(linkset)
+        []
+
+    You can add new links to it
+
+        >>> from schooltool.relationship.tests import URIStub
+        >>> link1 = Link('example:Group', object(), URIStub('example:Member'),
+        ...              URIStub('example:Membership'))
+        >>> link2 = Link('example:Friend', object(), URIStub('example:Friend'),
+        ...              URIStub('example:Friendship'))
+        >>> linkset.add(link1)
+        >>> linkset.add(link2)
+
+    The links have landed in the cache too:
+
+        >>> expected = {
+        ...     'example:Member': [link1],
+        ...     'example:Friend': [link2]}
+        >>> dict(linkset._byrole.items()) == expected
+        True
+
+    Let's zap the cache and call getLinksByRole(), which should restore it:
+
+        >>> del linkset._byrole
+        >>> linkset.getLinksByRole(URIStub('something'))
+        []
+
+        >>> dict(linkset._byrole.items()) == expected
+        True
+
+    Links should get named:
+
+        >>> link1.__name__
+        '1'
+        >>> link2.__name__
+        '2'
+
+    We can access our links through their names:
+
+        >>> linkset['1'] is link1
+        True
+        >>> linkset['2'] is link2
+        True
+
+    And get parents set:
+
+        >>> link1.__parent__ is linkset
+        True
+
+    We got them in the container now:
+
+        >>> from sets import Set
+        >>> Set(linkset) == Set([link1, link2]) # order is not preserved
+        True
+
+    You can look for links for a specific relationship
+
+        >>> linkset.find('example:Group',
+        ...              link1.target,
+        ...              URIStub('example:Member'),
+        ...              URIStub('example:Membership')) is link1
+        True
+
+    We can't add same link into the container twice:
+
+        >>> linkset.add(link1)                      # doctest: +ELLIPSIS
+        Traceback (most recent call last):
+          ...
+        ValueError: ...
+
+    If find fails, it raises ValueError, just like list.index.
+
+        >>> linkset.find('example:Member', link1.target,
+        ...              URIStub('example:Group'),
+        ...              URIStub('example:Membership'))      # doctest: +ELLIPSIS
+        Traceback (most recent call last):
+          ...
+        ValueError: ...
+
+    You can remove links
+
+        >>> linkset.remove(link2)
+        >>> Set(linkset) == Set([link1])
+        True
+
+    The links are removed from the cache too:
+
+        >>> list(linkset._byrole.keys())
+        ['example:Member']
+
+    If you try to remove a link that is not in the set, you will get a
+    ValueError.
+
+        >>> linkset.remove(link2)                   # doctest: +ELLIPSIS
+        Traceback (most recent call last):
+          ...
+        ValueError: ...
+
+    You can remove all links
+
+        >>> linkset.clear()
+        >>> Set(linkset) == Set([])
+        True
+
+    The cache has been cleared too:
+
+        >>> len(linkset._byrole)
+        0
+
+    The class is documented in IRelationshipLinks
+
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(IRelationshipLinks, linkset)
+        True
+
+    """
+
+    implements(IRelationshipLinks)
+
+    def __init__(self):
+        self._links = OOBTree()
+        self._byrole = OOBTree() # role -> list of links
+
+    def getLinksByRole(self, role):
+        """Get a set of links by role."""
+        try:
+            cache = self._byrole
+        except AttributeError:
+            cache = OOBTree()
+            for link in self:
+                cache.setdefault(link.role.uri, PersistentList()).append(link)
+            self._byrole = cache
+
+        return cache.get(role.uri, [])
+
+    def add(self, link):
+        if link.__parent__ == self:
+            raise ValueError("You are adding same link twice.")
+
+        i = 1
+        while "%s" % i in self._links:
+            i += 1
+        link.__name__ = "%s" % i
+        self._links[link.__name__] = link
+        link.__parent__ = self
+
+        self._byrole.setdefault(link.role.uri, PersistentList()).append(link)
+
+    def remove(self, link):
+        if link is self._links.get(link.__name__):
+            del self._links[link.__name__]
+            uri = link.role.uri
+            self._byrole[uri].remove(link)
+            if not self._byrole[uri]:
+                del self._byrole[uri]
+        else:
+            raise ValueError("This link does not belong to this container!")
+
+    def clear(self):
+        self._links.clear()
+        self._byrole.clear()
+
+    def __iter__(self):
+        return iter(self._links.values())
+
+    def find(self, my_role, target, role, rel_type):
+        links = self.getLinksByRole(role)
+        for link in links:
+            if (link.rel_type == rel_type and link.target is target
+                and link.my_role == my_role):
+                return link
+        else:
+            raise ValueError(my_role, target, role, rel_type)
+
+    def __getitem__(self, id):
+        return self._links[id]
+
+    def get(self, key, default=None):
+        return self._links.get(key, default)
+
+    def getTargetsByRole(self, role, rel_type=None):
+        links = self.getLinksByRole(role)
+        if rel_type is None:
+            return [link.target for link in links]
+        else:
+            return [link.target for link in links
+                    if link.rel_type == rel_type]


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/relationship.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,93 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.relationship
+
+This module contains a `setUpRelationships` function that can be used in
+unit test setup code to register an IRelationshipLinks adapter for IAnnotatable
+objects.  There are also `setUp` and `tearDown` functions that perform the
+necessary Zope 3 placeless setup that is needed to make annotations and
+relationships work for IAttributeAnnotatable objects.
+
+This module also contains some stub objects for use in tests (SomeObject and
+SomeContained).
+
+$Id: __init__.py 6022 2006-05-05 18:03:22Z gintas $
+"""
+
+from zope.app.testing import setup
+from zope.interface import implements
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.container.contained import Contained
+
+
+class SomeObject(object):
+    """A simple annotatable object for tests."""
+
+    implements(IAttributeAnnotatable)
+
+    def __init__(self, name):
+        self._name = name
+
+    def __repr__(self):
+        return self._name
+
+
+class SomeContained(SomeObject, Contained):
+    """A simple annotatable contained object for tests."""
+
+
+class URIStub(object):
+    def __init__(self, uri):
+        self.uri = uri
+    def __cmp__(self, other):
+        return cmp(self.uri, other.uri)
+
+
+def setUp():
+    """Set up for schooltool.relationship doctests.
+
+    Calls Zope's placelessSetUp, sets up annotations and relationships.
+    """
+    setup.placelessSetUp()
+    setup.setUpAnnotations()
+    setUpRelationships()
+
+
+def tearDown():
+    """Tear down for schooltool.relationshp doctests."""
+    setup.placelessTearDown()
+
+
+def setUpRelationships():
+    """Set up the adapter from IAnnotatable to IRelationshipLinks.
+
+    This function is created for use in unit tests.  You should call
+    zope.app.testing.setup.placelessSetUp before calling this function
+    (and don't forget to call zope.app.testing.setup.placelessTearDown after
+    you're done).  You should also call zope.app.testing.setup.setUpAnnotations
+    to get a complete test fixture.
+    """
+    from zope.app.testing import ztapi
+    from zope.annotation.interfaces import IAnnotatable
+    from schooltool.relationship.interfaces import IRelationshipLinks
+    from schooltool.relationship.annotatable import getRelationshipLinks
+    ztapi.provideAdapter(IAnnotatable, IRelationshipLinks,
+                         getRelationshipLinks)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_annotatable.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_annotatable.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_annotatable.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,80 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.relationship.annotatable
+
+$Id: test_annotatable.py 5987 2006-04-27 15:25:41Z faassen $
+"""
+
+import unittest
+
+from zope.testing import doctest
+from zope.app.testing import setup
+from zope.interface import implements
+from zope.annotation.interfaces import IAttributeAnnotatable
+
+
+def doctest_getRelationshipLinks():
+    r"""Test for schooltool.relationship.annotatable.getRelationshipLinks.
+
+    We need to set up Zope 3 annotations
+
+        >>> from zope.app.testing import setup
+        >>> setup.placelessSetUp()
+        >>> setup.setUpAnnotations()
+
+    We need to have an annotatable object
+
+        >>> from zope.interface import implements
+        >>> from zope.annotation.interfaces import IAttributeAnnotatable
+        >>> class SomeAnnotatable(object):
+        ...     implements(IAttributeAnnotatable)
+
+        >>> obj = SomeAnnotatable()
+
+    Now we can check that a new LinkSet is created automatically
+
+        >>> from schooltool.relationship.annotatable \
+        ...         import getRelationshipLinks
+        >>> linkset = getRelationshipLinks(obj)
+
+        >>> from schooltool.relationship.interfaces import IRelationshipLinks
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(IRelationshipLinks, linkset)
+        True
+
+    If you do it more than once, you will get the same link set
+
+        >>> linkset is getRelationshipLinks(obj)
+        True
+
+    Cleanup
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_annotatable.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_objectevents.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_objectevents.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_objectevents.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,225 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.relationship.objectevents
+
+$Id: test_objectevents.py 6022 2006-05-05 18:03:22Z gintas $
+"""
+
+import unittest
+
+from zope.testing import doctest
+from schooltool.relationship.tests import URIStub
+
+
+def doctest_delete_breaks_relationships():
+    """When you delete an object, all of its relationships should be removed
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> from schooltool.relationship.objectevents import unrelateOnDeletion
+        >>> zope.event.subscribers.append(unrelateOnDeletion)
+
+    Suppose we have two related objects
+
+        >>> from schooltool.relationship.tests import SomeObject
+        >>> apple = SomeObject('apple')
+        >>> orange = SomeObject('orange')
+
+        >>> from schooltool.relationship import getRelatedObjects, relate
+        >>> relate('example:Relationship',
+        ...             (apple, URIStub('example:One')),
+        ...             (orange, URIStub('example:Two')))
+        >>> getRelatedObjects(apple, URIStub('example:Two'))
+        [orange]
+
+    We put those objects to a Zope 3 container.
+
+        >>> from zope.app.container.btree import BTreeContainer
+        >>> container = BTreeContainer()
+        >>> container['apple'] = apple
+        >>> container['orange'] = orange
+
+    When we delete an object, all of its relationships should disappear
+
+        >>> del container['orange']
+        >>> getRelatedObjects(apple, URIStub('example:Two'))
+        []
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+
+    """
+
+
+def doctest_copy_breaks_relationships():
+    """When you copy an object, all of its relationships should be removed
+
+    (An alternative solution would be to clone the relationships, but I'm
+    wary of that path.  What happens if you copy and paste objects between
+    different application instances?)
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> from schooltool.relationship.objectevents import unrelateOnCopy
+        >>> zope.event.subscribers.append(unrelateOnCopy)
+
+    Suppose we have two related objects.  We must have objects that are
+    IContained, otherwise ObjectCopier will happily duplicate all related
+    objects as well as relationship links.
+
+        >>> from schooltool.relationship.tests import SomeContained
+        >>> apple = SomeContained('apple')
+        >>> orange = SomeContained('orange')
+
+        >>> from schooltool.relationship import getRelatedObjects, relate
+        >>> relate('example:Relationship',
+        ...             (apple, URIStub('example:One')),
+        ...             (orange, URIStub('example:Two')))
+        >>> getRelatedObjects(apple, URIStub('example:Two'))
+        [orange]
+
+    We put those objects to a Zope 3 container.
+
+        >>> from zope.app.container.btree import BTreeContainer
+        >>> container = BTreeContainer()
+        >>> container['apple'] = apple
+        >>> container['orange'] = orange
+
+    We copy one of the objects to another container.
+
+        >>> from zope.copypastemove import ObjectCopier
+        >>> another_container = BTreeContainer()
+        >>> copier = ObjectCopier(container['orange'])
+        >>> new_name = copier.copyTo(another_container)
+        >>> copy_of_orange = another_container[new_name]
+
+    When we copy an object, all of its relationships should disappear
+
+        >>> from schooltool.relationship.interfaces import IRelationshipLinks
+        >>> list(IRelationshipLinks(copy_of_orange))
+        []
+
+    The old relationships should still work
+
+        >>> getRelatedObjects(apple, URIStub('example:Two'))
+        [orange]
+        >>> getRelatedObjects(orange, URIStub('example:One'))
+        [apple]
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+
+    """
+
+
+def doctest_copy_does_not_break_inside_relationships():
+    """When you copy an object, all of its relationships should be removed
+
+    This is a regression test for the following bug: If x is related to x.y
+    where x.y is a subobject of x, when you copy x to x', all links from x'
+    will be removed, but the copied link on x'.y' will remain.
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> from schooltool.relationship.objectevents import unrelateOnCopy
+        >>> zope.event.subscribers.append(unrelateOnCopy)
+
+    Suppose we have two related objects.  We must have objects that are
+    IContained, otherwise ObjectCopier will happily duplicate all related
+    objects as well as relationship links.
+
+        >>> from schooltool.relationship.tests import SomeContained
+        >>> apple = SomeContained('apple')
+        >>> orange = SomeContained('orange')
+
+        >>> from schooltool.relationship import getRelatedObjects, relate
+        >>> relate(URIStub('example:Relationship'),
+        ...             (apple, URIStub('example:One')),
+        ...             (orange, URIStub('example:Two')))
+        >>> getRelatedObjects(apple, URIStub('example:Two'))
+        [orange]
+
+    We put one of the objects to a Zope 3 container.
+
+        >>> from zope.app.container.btree import BTreeContainer
+        >>> container = BTreeContainer()
+        >>> container['orange'] = orange
+
+    We make the other object a subobject of the first object
+
+        >>> apple.__parent__ = orange
+        >>> apple.__name__ = 'apple'
+        >>> orange.apple = apple
+
+    We copy the first object to another container.
+
+        >>> from zope.copypastemove import ObjectCopier
+        >>> another_container = BTreeContainer()
+        >>> copier = ObjectCopier(container['orange'])
+        >>> new_name = copier.copyTo(another_container)
+        >>> copy_of_orange = another_container[new_name]
+        >>> copy_of_apple = copy_of_orange.apple
+
+        >>> r1 = URIStub('example:One')
+        >>> r2 = URIStub('example:Two')
+
+    When we copy an object, its internal relationships should remain
+
+        >>> getRelatedObjects(copy_of_orange, r1)
+        [apple]
+        >>> getRelatedObjects(copy_of_apple, r2)
+        [orange]
+
+    These two objects are, in fact, copies
+
+        >>> getRelatedObjects(copy_of_orange, r1)[0] is copy_of_apple
+        True
+        >>> getRelatedObjects(copy_of_apple, r2)[0] is copy_of_orange
+        True
+
+    The old relationships should still work
+
+        >>> getRelatedObjects(apple, r2)
+        [orange]
+        >>> getRelatedObjects(orange, r1)
+        [apple]
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_objectevents.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_relationship.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_relationship.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_relationship.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,270 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.relationship
+
+$Id: test_relationship.py 6022 2006-05-05 18:03:22Z gintas $
+"""
+
+import unittest
+
+from zope.testing import doctest
+from schooltool.relationship.tests import URIStub
+
+
+def doctest_relate():
+    """Tests for relate
+
+    getRelatedObjects relies on adapters to IRelationshipLinks.  For the
+    purposes of this test it is simpler to just implement IRelationshipLinks
+    directly in the object
+
+        >>> from zope.interface import implements
+        >>> from schooltool.relationship.interfaces import IRelationshipLinks
+        >>> from schooltool.relationship.relationship import Link
+
+        >>> class Relatable:
+        ...     implements(IRelationshipLinks)
+        ...     def __init__(self, name):
+        ...         self._name = name
+        ...     def __repr__(self):
+        ...         return self._name
+        ...     def __iter__(self):
+        ...         return iter([])
+        ...     def add(self, link):
+        ...         print 'Linking %s with %s (the %s in %s)' % (self,
+        ...                 link.target, link.role.uri, link.rel_type)
+
+        >>> fred = Relatable('Fred')
+        >>> wilma = Relatable('Wilma')
+
+    Now we can test relate
+
+        >>> from schooltool.relationship.relationship import relate
+
+        >>> husband = URIStub('husband')
+        >>> wife = URIStub('wife')
+
+        >>> relate('marriage', (fred, husband), (wilma, wife))
+        Linking Fred with Wilma (the wife in marriage)
+        Linking Wilma with Fred (the husband in marriage)
+
+    """
+
+
+def doctest_LinkSet_getTargetsByRole():
+    """Tests for getTargetsByRole
+
+        >>> from schooltool.relationship.relationship import LinkSet, Link
+
+        >>> obj = LinkSet()
+
+        >>> role_a = URIStub('role_of_a')
+        >>> role_b = URIStub('role_of_b')
+
+        >>> obj.add(Link(role_b, 'a', role_a, 'rel_type_a'))
+        >>> obj.add(Link(role_a, 'b', role_b, 'rel_type_b'))
+
+    Now we can test getTargetsByRole
+
+        >>> obj.getTargetsByRole(role_a)
+        ['a']
+        >>> obj.getTargetsByRole(role_b)
+        ['b']
+        >>> obj.getTargetsByRole(URIStub('role_c'))
+        []
+
+    """
+
+
+def doctest_RelationshipSchema():
+    """Tests for RelationshipSchema
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+    The constructor takes exactly two keyword arguments
+
+        >>> from schooltool.relationship import RelationshipSchema
+        >>> role_mgr = URIStub('example:Mgr')
+        >>> role_rpt = URIStub('example:Rpt')
+        >>> role_spv = URIStub('example:Spv')
+        >>> RelationshipSchema('example:Mgmt', manager=role_mgr,
+        ...                    report=role_rpt, supervisor=role_spv)
+        Traceback (most recent call last):
+          ...
+        TypeError: A relationship must have exactly two ends.
+        >>> RelationshipSchema('example:Mgmt', manager='example:Mgr')
+        Traceback (most recent call last):
+          ...
+        TypeError: A relationship must have exactly two ends.
+
+    This works:
+
+        >>> Management = RelationshipSchema('example:Mgmt',
+        ...                                 manager=role_mgr,
+        ...                                 report=role_rpt)
+
+    You can call relationship schemas
+
+        >>> from schooltool.relationship.tests import SomeObject
+        >>> a = SomeObject('a')
+        >>> b = SomeObject('b')
+        >>> Management(manager=a, report=b)
+
+    You will see that a is b's manager, and b is a's report:
+
+        >>> from schooltool.relationship import getRelatedObjects
+        >>> getRelatedObjects(b, role_mgr)
+        [a]
+        >>> getRelatedObjects(a, role_rpt)
+        [b]
+
+    Order of arguments does not matter
+
+        >>> c, d = map(SomeObject, ['c', 'd'])
+        >>> Management(report=c, manager=d)
+        >>> getRelatedObjects(c, role_mgr)
+        [d]
+        >>> getRelatedObjects(d, role_rpt)
+        [c]
+
+    You must give correct arguments, though
+
+        >>> Management(report=c, friend=d)
+        Traceback (most recent call last):
+          ...
+        TypeError: Missing a 'manager' keyword argument.
+
+        >>> Management(manager=c, friend=d)
+        Traceback (most recent call last):
+          ...
+        TypeError: Missing a 'report' keyword argument.
+
+    You should not give extra arguments either
+
+        >>> Management(report=c, manager=b, friend=d)
+        Traceback (most recent call last):
+          ...
+        TypeError: Too many keyword arguments.
+
+    Cleanup
+
+        >>> tearDown()
+
+    """
+
+
+def doctest_unrelateAll():
+    r"""Tests for unrelateAll.
+
+        >>> from schooltool.relationship.tests import setUp, tearDown
+        >>> setUp()
+
+    Let us catch all events and remember them
+
+        >>> events = []
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> zope.event.subscribers.append(events.append)
+
+    Nothing happens if the object has no relationships.
+
+        >>> from schooltool.relationship.tests import SomeObject
+        >>> a = SomeObject('a')
+        >>> from schooltool.relationship import unrelateAll
+        >>> unrelateAll(a)
+        >>> events
+        []
+
+    Suppose that the object has a number of relationships
+
+        >>> from schooltool.relationship import relate
+        >>> b, c, d = map(SomeObject, ['b', 'c', 'd'])
+        >>> relationships = [
+        ...       ('example:SomeRelationship', (a, 'example:Foo'),
+        ...                                    (b, 'example:Bar')),
+        ...       ('example:SomeRelationship', (a, 'example:Foo'),
+        ...                                    (c, 'example:Bar')),
+        ...       ('example:OtherRelationship', (a, 'example:Symmetric'),
+        ...                                     (d, 'example:Symmetric')),
+        ...       ('example:Loop', (a, 'example:OneEnd'),
+        ...                        (a, 'example:OtherEnd')),
+        ...       ('example:Loop', (a, 'example:BothEnds'),
+        ...                        (a, 'example:BothEnds')),
+        ... ]
+        >>> for rel_type, (a, rel_a), (b, rel_b) in relationships:
+        ...     relate(rel_type, (a, URIStub(rel_a)), (b, URIStub(rel_b)))
+
+    We are not interested in relationship events up to this point
+
+        >>> del events[:]
+
+    We call `unrelateAll` and it suddenly has no relationships
+
+        >>> unrelateAll(a)
+
+        >>> from schooltool.relationship.interfaces import IRelationshipLinks
+        >>> list(IRelationshipLinks(a))
+        []
+
+    Relationships are broken properly, from both ends
+
+        >>> from schooltool.relationship import getRelatedObjects
+        >>> getRelatedObjects(b, URIStub('example:Foo'))
+        []
+
+    Also, we got a bunch of events
+
+        >>> from sets import Set
+        >>> from schooltool.relationship.interfaces \
+        ...         import IBeforeRemovingRelationshipEvent
+        >>> from schooltool.relationship.interfaces \
+        ...         import IRelationshipRemovedEvent
+        >>> before_removal_events = Set([
+        ...         (e.rel_type, (e.participant1, e.role1.uri),
+        ...                      (e.participant2, e.role2.uri))
+        ...         for e in events
+        ...         if IBeforeRemovingRelationshipEvent.providedBy(e)])
+        >>> before_removal_events == Set(relationships)
+        True
+
+        >>> removal_events = Set([(e.rel_type,
+        ...                        (e.participant1, e.role1.uri),
+        ...                        (e.participant2, e.role2.uri))
+        ...                       for e in events
+        ...                       if IRelationshipRemovedEvent.providedBy(e)])
+        >>> removal_events == Set(relationships)
+        True
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> tearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocFileSuite('../README.txt'),
+                doctest.DocTestSuite('schooltool.relationship.relationship'),
+                doctest.DocTestSuite(),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_relationship.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_uri.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_uri.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_uri.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,136 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.relationship.uri
+
+$Id: test_uri.py 4813 2005-08-18 17:20:09Z srichter $
+"""
+
+import unittest
+
+from zope.testing import doctest
+
+
+def doctest_URIObject():
+    """Tests for URIObject.
+
+    URIObject's constructor takes three arguments: URI, name and description
+
+        >>> from schooltool.relationship.uri import URIObject
+        >>> uri = URIObject('http://example.com', 'Example', 'An example.')
+        >>> uri
+        <URIObject Example>
+        >>> uri.uri
+        'http://example.com'
+        >>> uri.name
+        'Example'
+        >>> uri.description
+        'An example.'
+
+    The attributes of an URIObject match those defined by IURIObject
+
+        >>> from zope.interface.verify import verifyObject
+        >>> from schooltool.relationship.uri import IURIObject
+        >>> verifyObject(IURIObject, uri)
+        True
+
+    Description is optional
+
+        >>> uri = URIObject('http://example.com', 'Example')
+        >>> uri.description
+        ''
+
+    Name is also optional
+
+        >>> uri = URIObject('http://example.com')
+        >>> uri.name
+
+    XXX Why does description default to '', while name defaults to None?
+
+    URIs must be syntactically valid
+
+        >>> URIObject('not a URI')
+        Traceback (most recent call last):
+          ...
+        ValueError: This does not look like a URI: 'not a URI'
+
+    URIObjects are comparable.  Two URIObjects are equal if, and only if,
+    their 'uri' attributes are equal.
+
+        >>> uri2 = URIObject('http://example.com', 'Exampleur')
+        >>> uri3 = URIObject('http://example.org', 'Exampleur')
+        >>> uri2 == uri
+        True
+        >>> uri2 == uri3
+        False
+        >>> uri2 != uri
+        False
+        >>> uri2 != uri3
+        True
+        >>> uri == 'example:Just a string'
+        False
+        >>> uri != 'example:Just a string'
+        True
+
+    By the way, there are separate tests for == and != because in Python
+    __eq__ and __ne__ are two different methods.
+
+    What should uri == 'http://example.com' return?  I have decided that
+    it should return False, because applications may rely on roles having
+    `name` and `description` attributes, after they check the relationship
+    type.
+
+        >>> uri == 'http://example.com'
+        False
+        >>> uri != 'http://example.com'
+        True
+
+    URIObjects are hashable.  Equal objects must hash to the same value
+
+        >>> hash(uri) == hash(uri2)
+        True
+
+    URIObjects are immutable
+
+        >>> uri.uri = 'http://makemoneyfast.example.net'
+        Traceback (most recent call last):
+          ...
+        AttributeError: can't set attribute
+
+        >>> uri.name = 'Friendship'
+        Traceback (most recent call last):
+          ...
+        AttributeError: can't set attribute
+
+        >>> uri.description = 'Dunno'
+        Traceback (most recent call last):
+          ...
+        AttributeError: can't set attribute
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite('schooltool.relationship.uri'),
+                doctest.DocTestSuite(),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/tests/test_uri.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/relationship/uri.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/relationship/uri.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/relationship/uri.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,122 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+URI objects.
+
+Relationship types and roles are identified by URIs (the idea was borrowed
+from XLink and RDF).  Instead of dealing with strings directly,
+schooltool.relationship uses introspectable URI objects that also have an
+optional short name and a description in addition to the URI itself.
+
+By convention, names of global URI object constants start with 'URI'.
+"""
+
+import re
+
+from zope.interface import Interface, implements
+from zope.schema import Text, TextLine, URI
+
+
+class IURIObject(Interface):
+    """An opaque identifier of a role or a relationship type.
+
+    Roles and relationships are identified by URIs in XML representation.
+    URI objects let the application assign human-readable names to roles
+    and relationship types.
+
+    URI objects are equal iff their uri attributes are equal.
+
+    URI objects are hashable.
+    """
+
+    uri = URI(title=u"URI",
+            description=u"The URI (as a string).")
+
+    name = TextLine(title=u"Name",
+            description=u"Human-readable name.")
+
+    description = Text(title=u"Description",
+            description=u"Human-readable description.")
+
+
+class URIObject(object):
+    """See IURIObject."""
+
+    implements(IURIObject)
+
+    def __init__(self, uri, name=None, description=''):
+        if not looks_like_a_uri(uri):
+            raise ValueError("This does not look like a URI: %r" % uri)
+        self._uri = uri
+        self._name = name
+        self._description = description
+
+    uri = property(lambda self: self._uri)
+    name = property(lambda self: self._name)
+    description = property(lambda self: self._description)
+
+    def __eq__(self, other):
+        if not IURIObject.providedBy(other):
+            return False
+        return self.uri == other.uri
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __hash__(self):
+        return hash(self.uri)
+
+    def __repr__(self):
+        return '<URIObject %s>' % (self.name or self.uri)
+
+
+def looks_like_a_uri(uri):
+    r"""Check if the argument looks like a URI string.
+
+    Refer to http://www.ietf.org/rfc/rfc2396.txt for details.
+    We're only approximating to the spec.
+
+    Some examples of valid URI strings:
+
+        >>> looks_like_a_uri('http://foo/bar?baz#quux')
+        True
+        >>> looks_like_a_uri('HTTP://foo/bar?baz#quux')
+        True
+        >>> looks_like_a_uri('mailto:root')
+        True
+
+    These strings are all invalid URIs:
+
+        >>> looks_like_a_uri('2HTTP://foo/bar?baz#quux')
+        False
+        >>> looks_like_a_uri('\nHTTP://foo/bar?baz#quux')
+        False
+        >>> looks_like_a_uri('mailto:postmaster ')
+        False
+        >>> looks_like_a_uri('mailto:postmaster text')
+        False
+        >>> looks_like_a_uri('nocolon')
+        False
+        >>> looks_like_a_uri(None)
+        False
+
+    """
+    uri_re = re.compile(r"^[A-Za-z][A-Za-z0-9+-.]*:\S\S*$")
+    return bool(uri and uri_re.match(uri) is not None)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/relationship/uri.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1311 @@
+===============
+Requirement API
+===============
+
+Requirements are used to describe an academic accomplishment.
+
+  >>> from schooltool.requirement import interfaces, requirement
+
+A requirement is a simple object:
+
+  >>> forloop = requirement.Requirement(u'Write a for loop.')
+  >>> forloop
+  Requirement(u'Write a for loop.')
+
+Commonly, requirements are grouped:
+
+  >>> program = requirement.Requirement(u'Programming')
+  >>> program
+  Requirement(u'Programming')
+
+Since grouping definitions implement the ``IContainer`` interface, we can
+simply use the mapping interface to add other requirements:
+
+  >>> program[u'forloop'] = forloop
+
+The requirement is now available in the group:
+
+  >>> sorted(program.keys())
+  [u'forloop']
+
+But the interesting part is the inheritance of requirements. Let's say
+that the programming group above is defined as a requirement for any
+programming class. Now we would like to extend that requirement to a Python
+programming class:
+
+  >>> pyprogram = requirement.Requirement(
+  ...     u'Python Programming', program)
+  >>> pyprogram[u'iter'] = requirement.Requirement(u'Create an iterator.')
+
+So now the lookup of all requirements in ``pyprogram`` should be the generic and
+python-specific requirements:
+
+  >>> sorted(pyprogram.keys())
+  [u'forloop', u'iter']
+
+When looking at the requirements, one should be able to make the difference
+between inherited and locally defined requirements:
+
+  >>> pyprogram[u'iter']
+  Requirement(u'Create an iterator.')
+
+  >>> pyprogram[u'forloop']
+  InheritedRequirement(Requirement(u'Write a for loop.'))
+
+You can also check for the ``IInheritedRequirement`` interface.
+
+  >>> interfaces.IInheritedRequirement.providedBy(pyprogram[u'forloop'])
+  True
+
+You can also inspect and manage the bases:
+
+  >>> pyprogram.bases
+  [Requirement(u'Programming')]
+
+  >>> pyprogram.removeBase(program)
+  >>> sorted(pyprogram.keys())
+  [u'iter']
+
+  >>> pyprogram.addBase(program)
+  >>> sorted(pyprogram.keys())
+  [u'forloop', u'iter']
+
+For solidarity's sake, lets try removing a base that has more than one item in
+it.  There was a bug related to removing bases with multiple keys.  This is
+what was happening:
+
+  >>> a = [1,2]
+  >>> for item in a: a.remove(item)
+  >>> a
+  [2]
+
+It should be:
+
+  >>> a = [1,2]
+  >>> for item in list(a): a.remove(item)
+  >>> a
+  []
+
+In terms of our requirement package, we will add another requirement to the
+program requirement (which is a base of pyprogram).
+
+  >>> program[u'whileloop'] = requirement.Requirement(u"While Loop")
+  >>> sorted(pyprogram.keys())
+  [u'forloop', u'iter', u'whileloop']
+
+  >>> pyprogram.removeBase(program)
+  >>> sorted(pyprogram.keys())
+  [u'iter']
+
+  >>> pyprogram.addBase(program)
+  >>> sorted(pyprogram.keys())
+  [u'forloop', u'iter', u'whileloop']
+
+Now we will remove the whileloop requirement so we don't have to change
+everything in the doctest.
+
+  >>> del program['whileloop']
+  >>> sorted(pyprogram.keys())
+  [u'forloop', u'iter']
+
+Let's now look at a more advanced case. Let's say that the state of Virginia
+requires all students to take a programming class that fulfills the
+programming requirement:
+
+  >>> va = requirement.Requirement(u'Virginia')
+  >>> va[u'program'] = program
+
+Now, Yorktown High School (which is in Virginia) teaches Python and thus
+requires the Python requirement. However, Yorktown HS must still fulfill the
+state requirement:
+
+  >>> yhs = requirement.Requirement(u'Yorktown HS', va)
+  >>> sorted(yhs[u'program'].keys())
+  [u'forloop']
+
+  >>> yhs[u'program'][u'iter'] = requirement.Requirement(u'Create an iterator.')
+
+  >>> sorted(yhs[u'program'].keys())
+  [u'forloop', u'iter']
+
+  >>> sorted(va[u'program'].keys())
+  [u'forloop']
+
+Another tricky case is when the base is added later:
+
+  >>> yhs = requirement.Requirement(u'Yorktown HS')
+  >>> yhs[u'program'] = requirement.Requirement(u'Programming')
+  >>> yhs[u'program'][u'iter'] = requirement.Requirement(u'Create an iterator.')
+
+  >>> yhs.addBase(va)
+  >>> sorted(yhs[u'program'].keys())
+  [u'forloop', u'iter']
+
+  >>> yhs[u'program'][u'iter']
+  Requirement(u'Create an iterator.')
+
+  >>> yhs[u'program'][u'forloop']
+  InheritedRequirement(Requirement(u'Write a for loop.'))
+
+We can also delete requirements from the groups. However, we should only be
+able to delete locally defined requirements and not inherited ones:
+
+  >>> del yhs[u'program'][u'iter']
+  >>> sorted(yhs[u'program'].keys())
+  [u'forloop']
+
+  >>> del yhs[u'program'][u'forloop']
+  Traceback (most recent call last):
+  ...
+  KeyError: u'forloop'
+
+If we override the forloop requirement however, we should be able to delete the
+locally created forloop requirement.  After this, the InheritedRequirement that
+has just been overridden should reappear and the forloop should still be
+available as a key.
+
+  >>> yhs[u'program'][u'forloop'] = requirement.Requirement(
+  ...     u'Write a python for loop.')
+  >>> yhs[u'program'][u'forloop']
+  Requirement(u'Write a python for loop.')
+  >>> del yhs[u'program'][u'forloop']
+  >>> yhs[u'program'].keys()
+  [u'forloop']
+  >>> yhs[u'program'][u'forloop']
+  InheritedRequirement(Requirement(u'Write a for loop.'))
+
+Furthermore, sometimes it's the case where we only want to inherit one or more
+of the requirements from a particular base.  In this case we just add the
+specific requirement we want to inherit as we would add a normal requirement,
+instead of adding the base.  the ``__setitem__`` method will see that the
+requirement we are adding is part of another requirement, and will make it a
+``PersistentInheritedRequirement`` object instead.
+
+``PersistentInheritedRequirement`` is just like the ``InheritedRequirement``
+class except that is is persistent.  Since requirements are wrapped by the
+``InheritedRequirement`` class on the fly, they must be wrapped every time
+they are accessed based on the rules of inheritance (governed by bases).
+The ``PersistentInheritedRequirement`` class allows us to make a more arbitrary
+wrapping, as is necessary here.
+
+  >>> yhs.removeBase(va)
+  >>> yhs[u'program'].keys()
+  []
+  >>> yhs[u'program'][u'forloop'] = va[u'program'][u'forloop']
+  >>> yhs[u'program'][u'forloop']
+  PersistentInheritedRequirement(Requirement(u'Write a for loop.'))
+  >>> yhs[u'program'][u'forloop'].__parent__.__parent__
+  Requirement(u'Yorktown HS')
+  >>> va[u'program'][u'forloop'].__parent__.__parent__
+  Requirement(u'Virginia')
+  >>> del yhs[u'program'][u'forloop']
+  >>> yhs[u'program'].keys()
+  []
+  >>> va[u'program'].keys()
+  [u'forloop']
+  >>> yhs.addBase(va)
+
+Finally, requirements are ordered containers, which means that you can change
+the order of the dependency requirements. Let's first create a new
+requirements structure:
+
+  >>> physics = requirement.Requirement(u'Physics')
+  >>> physics[u'thermo'] = requirement.Requirement(u'Thermodynamics')
+  >>> physics[u'mech'] = requirement.Requirement(u'Mechanics')
+  >>> physics[u'rel'] = requirement.Requirement(u'Special Relativity')
+  >>> physics[u'elec'] = requirement.Requirement(u'Electromagnetism')
+
+  >>> college_physics = requirement.Requirement(u'College Physics', physics)
+  >>> college_physics[u'quant'] = requirement.Requirement(u'Quantum Mechanics')
+
+Now let's have a look at the original order:
+
+  >>> physics.keys()
+  [u'thermo', u'mech', u'rel', u'elec']
+
+The ordered container interface provides a fairly low level -- but powerful --
+method to change the order:
+
+  >>> physics.updateOrder([u'mech', u'elec', u'thermo', u'rel'])
+  >>> physics.keys()
+  [u'mech', u'elec', u'thermo', u'rel']
+
+The requirement interface provides another high-level method for sorting. It
+allows you to specify a new position for a given name:
+
+  >>> physics.changePosition(u'elec', 2)
+  >>> physics.keys()
+  [u'mech', u'thermo', u'elec', u'rel']
+
+  >>> physics.changePosition(u'rel', 1)
+  >>> physics.keys()
+  [u'mech', u'rel', u'thermo', u'elec']
+
+Now, the order of physics requirement purposefully does not change the order
+of the college physics requirement and vice versa:
+
+  >>> college_physics.keys()
+  [u'thermo', u'mech', u'rel', u'elec', u'quant']
+
+  >>> college_physics.changePosition(u'mech', 0)
+  >>> college_physics.changePosition(u'elec', 2)
+  >>> college_physics.changePosition(u'quant', 3)
+  >>> college_physics.keys()
+  [u'mech', u'thermo', u'elec', u'quant', u'rel']
+
+  >>> physics.keys()
+  [u'mech', u'rel', u'thermo', u'elec']
+
+There are many more high-level ordering functions that could be provided. But
+we wanted to keep the ``IRequirement`` interface a simple as possible and the
+idea is that you can implement adapters that use the ``updateOrder()`` method
+to provide high-level ordering APIs if desired.
+
+
+Removing Requirements from Bases
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Removing a requirement from a base requirement tree should
+remove the key from all of its subrequirement.  This is easier to explain with
+code:
+
+  >>> mathReqs = requirement.Requirement(u'Math Reqs')
+  >>> mathReqs[u'addition'] = requirement.Requirement(u'Addition')
+  >>> mathReqs.keys()
+  [u'addition']
+  >>> algebraReqs = requirement.Requirement(u'Algebra Reqs')
+  >>> algebraReqs.addBase(mathReqs)
+  >>> algebraReqs.keys()
+  [u'addition']
+
+  >>> del mathReqs[u'addition']
+  >>> mathReqs.keys()
+  []
+  >>> algebraReqs.keys()
+  []
+
+
+Overriding Requirements
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Now let's have a look at a case where the more specific requirement overrides
+a dependency requirement of one of its bases. First we create a global
+citizenship requirement that requires a person to be "good" globally.
+
+  >>> citizenship = requirement.Requirement(u'Global Citizenship')
+  >>> goodPerson = requirement.Requirement(u'Be a good person globally.')
+  >>> citizenship['goodPerson'] = goodPerson
+
+Now we create a local citizen requirement. Initially the local citizenship
+inherits the "good person" requirement from the global citizenship:
+
+  >>> localCitizenship = requirement.Requirement(
+  ...     u'A Local Citizenship Requirement')
+  >>> localCitizenship.addBase(citizenship)
+  >>> print localCitizenship.values()
+  [InheritedRequirement(Requirement(u'Be a good person globally.'))]
+
+Now we override the "good person" requirement with a local one:
+
+  >>> localGoodPerson = requirement.Requirement(u'Be a good person locally.')
+  >>> localCitizenship['goodPerson'] = localGoodPerson
+  >>> print localCitizenship.values()
+  [Requirement(u'Be a good person locally.')]
+
+This behavior is a design decision we made. But it is coherent with the
+behavior of real inheritance and acquisition. Another policy might be that you
+can never override a requirement like that and an error should occur. This is,
+however, much more difficult, since adding bases becomes a very complex task
+that would envolve complex conflict resolution.
+
+
+Complex Inheritance Patterns
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+__Note__: You probably want to skip this section, if you read this file for
+          the first time. It is not important for your understanding of the
+          package.
+
+Requirement inheritance can be very complex. The following section tests for
+those complex cases and ensures that they are working correctly. Let's first
+setup a 3-level requirement path:
+
+  >>> animal = requirement.Requirement(u'Animal')
+  >>> dog = requirement.Requirement(u'Dog', animal)
+  >>> hound = requirement.Requirement(u'Hound', dog)
+
+  >>> animal.keys()
+  []
+  >>> dog.keys()
+  []
+  >>> hound.keys()
+  []
+
+  >>> animal[u'categories'] = requirement.Requirement(u'Categories')
+
+  >>> animal.keys()
+  [u'categories']
+  >>> dog.keys()
+  [u'categories']
+  >>> hound.keys()
+  [u'categories']
+
+Now, one of the tricky parts is to get the key management done correctly, when
+a base higher-up is added or removed.
+
+  >>> lifeform = requirement.Requirement(u'Lifeform')
+  >>> lifeform[u'characteristics'] = requirement.Requirement(u'Characteristics')
+
+  >>> animal.addBase(lifeform)
+  >>> lifeform.keys()
+  [u'characteristics']
+  >>> animal.keys()
+  [u'categories', u'characteristics']
+  >>> dog.keys()
+  [u'categories', u'characteristics']
+  >>> hound.keys()
+  [u'categories', u'characteristics']
+
+  >>> animal.removeBase(lifeform)
+  >>> lifeform.keys()
+  [u'characteristics']
+  >>> animal.keys()
+  [u'categories']
+  >>> dog.keys()
+  [u'categories']
+  >>> hound.keys()
+  [u'categories']
+
+Another case is where you have multiple bases and two or more bases have a
+requirement with the same name. In this case the name should still be only
+listed once and the first listed base's value is chosen.
+
+  >>> mamal = requirement.Requirement(u'Mamal')
+  >>> mamal[u'categories'] = requirement.Requirement(u'Categories')
+
+  >>> dog.addBase(mamal)
+  >>> dog.keys()
+  [u'categories']
+  >>> hound.keys()
+  [u'categories']
+
+  >>> dog.values()
+  [InheritedRequirement(Requirement(u'Categories'))]
+  >>> dog[u'categories'].original is animal[u'categories']
+  True
+  >>> dog[u'categories'].original is mamal[u'categories']
+  False
+
+  >>> dog.removeBase(animal)
+  >>> dog.keys()
+  [u'categories']
+  >>> hound.keys()
+  [u'categories']
+
+  >>> dog.values()
+  [InheritedRequirement(Requirement(u'Categories'))]
+  >>> dog[u'categories'].original is animal[u'categories']
+  False
+  >>> dog[u'categories'].original is mamal[u'categories']
+  True
+
+Finally, let's make sure that when getting a value, it is wrapped with
+inherited requirement wrappers for every level of inheritance:
+
+  >>> mamal[u'categories']
+  Requirement(u'Categories')
+  >>> dog[u'categories']
+  InheritedRequirement(Requirement(u'Categories'))
+  >>> hound[u'categories']
+  InheritedRequirement(InheritedRequirement(Requirement(u'Categories')))
+
+Another complicated case is when requirements are added to a base using keys
+that already exist. This is sort of the reverse of overriding a
+requirement.
+
+  >>> courseReq = requirement.Requirement(u'Course Requirements')
+  >>> secReq = requirement.Requirement(u'Section Requirements')
+  >>> secReq.addBase(courseReq)
+
+Normally we would add requirements to the group of course requiremnts, then
+later override or add to these requirments as needed in the group of section
+requirements. Instead we will add to the section requirements first, then add
+requirements using the same keys to the course grouping.  The original section
+requirements should then inherit from the course requirements.
+
+  >>> secReq[u'behavior'] = requirement.Requirement(u'Do not be tardy')
+  >>> secReq[u'behavior'].bases
+  []
+  >>> courseReq[u'behavior'] = requirement.Requirement(u'Good Behavior')
+
+Had we done this requirements in the opposite order, then the 'Do not
+be tardy' requirements would inherit from the 'Good Behavior' requirements.
+We want to have this behavior regardless of the order in which we create the
+requirements.
+
+  >>> secReq[u'behavior'].bases
+  [Requirement(u'Good Behavior')]
+  >>> secReq.keys()
+  [u'behavior']
+
+A simple helper function is used to unwrap requirements:
+
+  >>> requirement.unwrapRequirement(mamal[u'categories'])
+  Requirement(u'Categories')
+  >>> requirement.unwrapRequirement(dog[u'categories'])
+  Requirement(u'Categories')
+  >>> requirement.unwrapRequirement(hound[u'categories'])
+  Requirement(u'Categories')
+
+The unwrapper also works for subclasses of Requirement.  To show this we will
+first create a simple subclass.
+
+  >>> class SpecialRequirement(requirement.Requirement):
+  ...     pass
+  >>> topLevel = SpecialRequirement(u'Global Top Level')
+  >>> topLevel['subone'] = SpecialRequirement(u'Global Sub Level One')
+  >>> localLevel = SpecialRequirement(u'Local Top Level')
+  >>> localLevel.addBase(topLevel)
+  >>> localLevel['subone']
+  InheritedRequirement(SpecialRequirement(u'Global Sub Level One'))
+  >>> requirement.unwrapRequirement(localLevel['subone'])
+  SpecialRequirement(u'Global Sub Level One')
+
+One can also quickly get the requirement's key using the
+``getRequirementKey()`` function:
+
+  >>> key1 = hash(requirement.getRequirementKey(mamal[u'categories']))
+  >>> str(key1)
+  '...'
+
+This function also unwraps inherited requirements, so that the key is always
+the same:
+
+  >>> key2 = hash(requirement.getRequirementKey(dog[u'categories']))
+  >>> key1 == key2
+  True
+
+
+Handling Sub Requirements
+~~~~~~~~~~~~~~~~~~~~~~~~~
+__Note__: You probably want to skip this section, if you read this file for
+          the first time. It is not important for your understanding of the
+          package.
+
+Requirements do not only keep track of what other requirements they are
+inheriting from (in the list of bases), but also the requirements that inherit
+it.  In terms of object oriented programming, Requirements keep track of both
+base classes and direct subclasses.
+
+  >>> mathreq = requirement.Requirement(u"Math Requirements")
+  >>> algebra = requirement.Requirement(u"Algebra Requirements")
+  >>> algebra.addBase(mathreq)
+
+Here we have created a general math requirement from which the algebra
+requirement inherits.  All requirements that inherit from mathreq are stored
+in a list called subs.
+
+  >>> algebra in mathreq.subs
+  True
+
+When we remove the mathreq base from algebra, then algebra should also be
+removed from mathreq.subs
+
+  >>> algebra.removeBase(mathreq)
+  >>> algebra in mathreq.subs
+  False
+
+When requirements get deleted, they should also be removed from whatever subs
+they are in.  But this only makes sense in the context of containment where we
+really do not care about objects which can not be located with a url.  Thus,
+to enable this feature, we have to register a subcriber to ObjectRemovedEvent.
+
+  >>> from zope import component
+  >>> component.provideHandler(requirement.garbageCollect)
+
+  >>> algebra.addBase(mathreq)
+  >>> highSchoolMath = requirement.Requirement("High School Math")
+  >>> highSchoolMath['algebra'] = algebra
+  >>> del highSchoolMath['algebra']
+  >>> algebra in mathreq.subs
+  False
+
+
+Requirement Adapters
+--------------------
+
+Commonly we want to attach requirements to other objects such as
+courses, sections and persons. This allows us to further refine the
+requirements at various levels. Objects that have requirements associated with
+them must provide the ``IHaveRequirement`` interface. Thus we first have to
+implement an object that provides this interface.
+
+  >>> import zope.interface
+  >>> from zope import annotation
+  >>> class Course(object):
+  ...     zope.interface.implements(interfaces.IHaveRequirement,
+  ...                               annotation.interfaces.IAttributeAnnotatable)
+  ...     title = ""
+
+  >>> course = Course()
+  >>> course.title = u"Computer Science"
+
+There exists an adapter from the ``IHaveRequirement`` interface to the
+``IRequirement`` interface.
+
+  >>> req = interfaces.IRequirement(course)
+  >>> req
+  Requirement(u'Computer Science')
+
+The title of the course becomes the title of the requirement.  If we look at
+the requirements, it is empty.
+
+  >>> len(req)
+  0
+  >>> len(req.bases)
+  0
+
+If we want to add requirements to this course, there are two methods.  First we
+can use inheritance as shown above:
+
+  >>> req.addBase(yhs[u'program'])
+  >>> sorted(req.keys())
+  [u'forloop']
+  >>> req[u'forloop']
+  InheritedRequirement(InheritedRequirement(Requirement(u'Write a for loop.')))
+
+Now if we add requirements to the Yorktown High School programming
+requirements, they will show up as well.
+
+  >>> yhs[u'program'][u'iter'] = requirement.Requirement(u'Create an iterator.')
+  >>> sorted(req.keys())
+  [u'forloop', u'iter']
+
+The second method for adding requirements to the course is by directly adding
+new requirements:
+
+  >>> req[u'decorator'] = requirement.Requirement(u'Create a decorator!')
+  >>> sorted(req.keys())
+  [u'decorator', u'forloop', u'iter']
+  >>> req[u'decorator']
+  Requirement(u'Create a decorator!')
+
+
+Score Systems
+-------------
+
+Score systems define the grading scheme of specific or a group of
+requirements. The simplest scoring system provided by this package is the
+commentary scoring system, which can have any comment as a score.
+
+  >>> from schooltool.requirement import scoresystem
+  >>> scoresystem.CommentScoreSystem.title
+  u'Comments'
+  >>> scoresystem.CommentScoreSystem.description
+  u'Scores are commentary text.'
+
+The score system interface requires two methods to be implemented. The first
+methods checks whether a value is a valid score. For the commentary score
+system all types of strings are allowed:
+
+  >>> scoresystem.CommentScoreSystem.isValidScore('My comment.')
+  True
+  >>> scoresystem.CommentScoreSystem.isValidScore(u'My comment.')
+  True
+  >>> scoresystem.CommentScoreSystem.isValidScore(49)
+  False
+
+There is also a global "unscored" score that can be used when assigning
+scores:
+
+  >>> scoresystem.CommentScoreSystem.isValidScore(scoresystem.UNSCORED)
+  True
+
+When a user inputs a grade, it is always a string value. Thus there is a
+method that allows us to convert unicode string representations of the score
+to a valid score. Since commentaries are unicode strings, the result
+equals the input:
+
+  >>> scoresystem.CommentScoreSystem.fromUnicode(u'My comment.')
+  u'My comment.'
+
+Empty strings are converted to the unscored score:
+
+  >>> scoresystem.CommentScoreSystem.fromUnicode('') is scoresystem.UNSCORED
+  True
+
+This scoring system can also be efficiently pickled:
+
+  >>> import pickle
+  >>> len(pickle.dumps(scoresystem.CommentScoreSystem))
+  59
+
+The commentary scoreing system cannot be used for statistical
+computations. See below for more details.
+
+Since scoring schemes vary widely among schools and even requirements, the
+package provides several score system classes that can be used to create new
+score systems. The first class is designed for grades that are given as
+discrete values. For example, if you want to be able to give the student a
+check, check plus, or check minus, then you can create a scoresystem as
+follows:
+
+  >>> from decimal import Decimal
+  >>> check = scoresystem.DiscreteValuesScoreSystem(
+  ...    u'Check', u'Check-mark score system',
+  ...    [('+', Decimal(1)), ('v', Decimal(0)), ('-', Decimal(-1))])
+
+The first and second arguments of the constructor are the title and
+description. The third argument is a list that really represents a mapping
+from the score to the numerical equivalent. Providing a numerical value is
+necessary to conduct automated statistics and grade computations. Also, we are
+purposefully not passing in a dictionary, so that the order of the items is
+retained, which is important for user interface purposes. There are a handful
+of methods associated with a values-based score system. We already looked at
+the two above. First, you can ask whether a particular score is valid:
+
+  >>> check.isValidScore('+')
+  True
+  >>> check.isValidScore('f')
+  False
+  >>> check.isValidScore(scoresystem.UNSCORED)
+  True
+
+Next, you can ask the score system to tell you the numerical value for a given
+score:
+
+  >>> check.getNumericalValue('+')
+  Decimal("1")
+
+The unscored score returns a ``None`` result:
+
+  >>> check.getNumericalValue(scoresystem.UNSCORED) is None
+  True
+
+We can also ask for the fractional value of a score. This is based on the
+range of scores:
+
+  >>> check.getFractionalValue('+')
+  Decimal("1")
+  >>> check.getFractionalValue('v')
+  Decimal("0.5")
+  >>> check.getFractionalValue('-')
+  Decimal("0")
+
+When a user inputs a grade, it is always a string value. Thus there is a
+method that allows us to convert unicode string representations of the score
+to a valid score.
+
+  >>> check.fromUnicode('+')
+  '+'
+
+  >>> check.fromUnicode('f')
+  Traceback (most recent call last):
+  ...
+  ValidationError: 'f' is not a valid score.
+
+  >>> check.fromUnicode('') is scoresystem.UNSCORED
+  True
+
+The fourth method is there to check whether a score is a passing score.
+
+  >>> check.isPassingScore('+') is None
+  True
+
+The result of this query is ``None``, because we have not defined a passing
+score yet. This is optional, since not in every case the decision of whether
+something is a passing score or not makes sense. If we initialize the score
+system again -- this time providing a minimum passing grade -- the method will
+provide more useful results:
+
+  >>> from schooltool.requirement import scoresystem
+  >>> check = scoresystem.DiscreteValuesScoreSystem(
+  ...    u'Check', u'Check-mark score system',
+  ...    [('+', Decimal(1)),
+  ...     ('v', Decimal(0)),
+  ...     ('-', Decimal(-1))],
+  ...     minPassingScore='v')
+  >>> check
+  <DiscreteValuesScoreSystem u'Check'>
+
+  >>> check.isPassingScore('+')
+  True
+  >>> check.isPassingScore('v')
+  True
+  >>> check.isPassingScore('-')
+  False
+
+Unscored returns a neutral result:
+
+  >>> check.isPassingScore(scoresystem.UNSCORED) is None
+  True
+
+Finally, you can query the score system for the best score:
+
+  >>> check.getBestScore() is None
+  True
+
+You receive ``None``, because you did not specify a maximum score yet. You
+might think that this is unnecessary, since you specified numerical values,
+but sometimes two scores might have the same numerical values and explicit is
+better than implicit anyways:
+
+  >>> from schooltool.requirement import scoresystem
+  >>> check = scoresystem.DiscreteValuesScoreSystem(
+  ...    u'Check', u'Check-mark score system',
+  ...    [('+', Decimal(1)), ('v', Decimal(0)), ('-', Decimal(-1))],
+  ...    bestScore='+', minPassingScore='v')
+
+  >>> check.getBestScore()
+  '+'
+
+The package also provides some default score systems. Since those score
+systems are global ones, they reduce very efficiently for pickling.
+
+- A simple Pass/Fail score system:
+
+  >>> scoresystem.PassFail
+  <GlobalDiscreteValuesScoreSystem u'Pass/Fail'>
+  >>> scoresystem.PassFail.__reduce__()
+  'PassFail'
+  >>> scoresystem.PassFail.title
+  u'Pass/Fail'
+  >>> scoresystem.PassFail.scores
+  [(u'Pass', Decimal("1")), (u'Fail', Decimal("0"))]
+  >>> scoresystem.PassFail.isValidScore('Pass')
+  True
+  >>> scoresystem.PassFail.isPassingScore('Pass')
+  True
+  >>> scoresystem.PassFail.isPassingScore('Fail')
+  False
+  >>> scoresystem.PassFail.getBestScore()
+  u'Pass'
+  >>> scoresystem.PassFail.fromUnicode(u'Pass')
+  u'Pass'
+  >>> scoresystem.PassFail.getNumericalValue(u'Pass')
+  Decimal("1")
+  >>> scoresystem.PassFail.getFractionalValue(u'Pass')
+  Decimal("1")
+  >>> scoresystem.PassFail.getFractionalValue(u'Fail')
+  Decimal("0")
+
+- The standard American letter score system:
+
+  >>> scoresystem.AmericanLetterScoreSystem
+  <GlobalDiscreteValuesScoreSystem u'Letter Grade'>
+  >>> scoresystem.AmericanLetterScoreSystem.__reduce__()
+  'AmericanLetterScoreSystem'
+  >>> scoresystem.AmericanLetterScoreSystem.title
+  u'Letter Grade'
+  >>> scoresystem.AmericanLetterScoreSystem.scores
+  [('A', Decimal("4")), ('B', Decimal("3")), ('C', Decimal("2")),
+   ('D', Decimal("1")), ('F', Decimal("0"))]
+  >>> scoresystem.AmericanLetterScoreSystem.isValidScore('C')
+  True
+  >>> scoresystem.AmericanLetterScoreSystem.isValidScore('E')
+  False
+  >>> scoresystem.AmericanLetterScoreSystem.isPassingScore('D')
+  True
+  >>> scoresystem.AmericanLetterScoreSystem.isPassingScore('F')
+  False
+  >>> scoresystem.AmericanLetterScoreSystem.getBestScore()
+  'A'
+  >>> scoresystem.AmericanLetterScoreSystem.fromUnicode('B')
+  'B'
+  >>> scoresystem.AmericanLetterScoreSystem.getNumericalValue('B')
+  Decimal("3")
+  >>> scoresystem.AmericanLetterScoreSystem.getFractionalValue('B')
+  Decimal("0.75")
+  >>> scoresystem.AmericanLetterScoreSystem.getFractionalValue('F')
+  Decimal("0")
+
+- The extended American letter score system:
+
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem
+  <GlobalDiscreteValuesScoreSystem u'Extended Letter Grade'>
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.__reduce__()
+  'ExtendedAmericanLetterScoreSystem'
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.title
+  u'Extended Letter Grade'
+  >>> [s for s, v in scoresystem.ExtendedAmericanLetterScoreSystem.scores]
+  ['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D', 'D-', 'F']
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.isValidScore('B-')
+  True
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.isValidScore('E')
+  False
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.isPassingScore('D-')
+  True
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.isPassingScore('F')
+  False
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.getBestScore()
+  'A+'
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.fromUnicode('B-')
+  'B-'
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.getNumericalValue('B')
+  Decimal("3.0")
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.getFractionalValue('A')
+  Decimal("1")
+  >>> scoresystem.ExtendedAmericanLetterScoreSystem.getFractionalValue('A+')
+  Decimal("1")
+
+The second score system class is the ranged values score system, which allows
+you to define numerical ranges as grades. Let's say I have given a quiz that
+has a maximum of 21 points:
+
+  >>> quizScore = scoresystem.RangedValuesScoreSystem(
+  ...     u'Quiz Score', u'Quiz Score System', Decimal(0), Decimal(21))
+  >>> quizScore
+  <RangedValuesScoreSystem u'Quiz Score'>
+
+Again, the first and second arguments are the title and description. The third
+and forth arguments are the minum and maximum value of the numerical range. by
+default the minimum value is 0, so I could have skipped that argument and just
+provide a ``max`` keyword argument.
+
+Practically any numerical value in the range between the minimum and maximum
+value are valid scores:
+
+  >>> quizScore.isValidScore(Decimal(-1))
+  False
+  >>> quizScore.isValidScore(Decimal(0))
+  True
+  >>> quizScore.isValidScore(Decimal("13.43"))
+  True
+  >>> quizScore.isValidScore(Decimal(21))
+  True
+  >>> quizScore.isValidScore(Decimal("21.1"))
+  False
+  >>> quizScore.isValidScore(scoresystem.UNSCORED)
+  True
+
+Clearly, for this type of score system, the numerical value always equals the
+score itself:
+
+  >>> quizScore.getNumericalValue(Decimal(20))
+  Decimal("20")
+  >>> quizScore.getNumericalValue(Decimal('20.1'))
+  Decimal("20.1")
+
+We can also determine the fractional value:
+
+  >>> quizScore.getFractionalValue(Decimal(20))
+  Decimal("0.9523809523809523809523809524")
+  >>> quizScore.getFractionalValue(Decimal(0))
+  Decimal("0")
+
+We can also convert any unicode input to a score.
+
+  >>> quizScore.fromUnicode('20')
+  Decimal("20")
+  >>> quizScore.fromUnicode('20.1')
+  Decimal("20.1")
+
+Note that non-integer values will always be converted to the decimal type,
+since float does not have an exact precision. Since the best score for the
+ranged value score system is well-defined by the maximum value, we can get a
+answer any time:
+
+  >>> quizScore.getBestScore()
+  Decimal("21")
+
+Since we have not defined a minimum passing grade, we cannot get a meaningful
+answer from the passing score evaluation:
+
+  >>> quizScore.isPassingScore(Decimal(13)) is None
+  True
+
+Again, if we provide a passing score at the beginning, then those queries make
+sense:
+
+  >>> quizScore = scoresystem.RangedValuesScoreSystem(
+  ...     u'quizScore', u'Quiz Score System',
+  ...     Decimal(0), Decimal(21), Decimal("0.6")*21) # 60%+ is passing
+
+  >>> quizScore.isPassingScore(Decimal(13))
+  True
+  >>> quizScore.isPassingScore(Decimal(10))
+  False
+  >>> quizScore.isPassingScore(scoresystem.UNSCORED) is None
+  True
+
+Let's also try a ranged system that doesn't start at 0:
+
+  >>> quizScore = scoresystem.RangedValuesScoreSystem(
+  ...     u'quizScore', u'Score System that does not start at zero',
+  ...     Decimal(5), Decimal(10))
+  >>> quizScore.getFractionalValue(Decimal(5))
+  Decimal("0")
+  >>> quizScore.getFractionalValue(Decimal(10))
+  Decimal("1")
+  >>> quizScore.getFractionalValue(Decimal("7.5"))
+  Decimal("0.5")
+
+The package provides two default ranged values score system, the percent
+score system,
+
+  >>> scoresystem.PercentScoreSystem
+  <GlobalRangedValuesScoreSystem u'Percent'>
+  >>> scoresystem.PercentScoreSystem.__reduce__()
+  'PercentScoreSystem'
+  >>> scoresystem.PercentScoreSystem.title
+  u'Percent'
+  >>> scoresystem.PercentScoreSystem.min
+  Decimal("0")
+  >>> scoresystem.PercentScoreSystem.max
+  Decimal("100")
+
+  >>> scoresystem.PercentScoreSystem.isValidScore(Decimal(40))
+  True
+  >>> scoresystem.PercentScoreSystem.isValidScore(scoresystem.UNSCORED)
+  True
+
+  >>> scoresystem.PercentScoreSystem.isPassingScore(Decimal(60))
+  True
+  >>> scoresystem.PercentScoreSystem.isPassingScore(Decimal(59))
+  False
+  >>> scoresystem.PercentScoreSystem.isPassingScore(scoresystem.UNSCORED)
+
+  >>> scoresystem.PercentScoreSystem.getBestScore()
+  Decimal("100")
+  >>> scoresystem.PercentScoreSystem.fromUnicode('42')
+  Decimal("42")
+  >>> scoresystem.PercentScoreSystem.getNumericalValue(Decimal(42))
+  Decimal("42")
+  >>> scoresystem.PercentScoreSystem.getFractionalValue(Decimal(42))
+  Decimal("0.42")
+
+and the "100 points" score system:
+
+  >>> scoresystem.HundredPointsScoreSystem
+  <GlobalRangedValuesScoreSystem u'100 Points'>
+  >>> scoresystem.HundredPointsScoreSystem.__reduce__()
+  'HundredPointsScoreSystem'
+  >>> scoresystem.HundredPointsScoreSystem.title
+  u'100 Points'
+  >>> scoresystem.HundredPointsScoreSystem.min
+  Decimal("0")
+  >>> scoresystem.HundredPointsScoreSystem.max
+  Decimal("100")
+
+  >>> scoresystem.HundredPointsScoreSystem.isValidScore(Decimal(40))
+  True
+  >>> scoresystem.HundredPointsScoreSystem.isValidScore(scoresystem.UNSCORED)
+  True
+
+  >>> scoresystem.HundredPointsScoreSystem.isPassingScore(Decimal(60))
+  True
+  >>> scoresystem.HundredPointsScoreSystem.isPassingScore(Decimal(59))
+  False
+  >>> scoresystem.HundredPointsScoreSystem.isPassingScore(scoresystem.UNSCORED)
+
+  >>> scoresystem.HundredPointsScoreSystem.getBestScore()
+  Decimal("100")
+  >>> scoresystem.HundredPointsScoreSystem.fromUnicode('42')
+  Decimal("42")
+  >>> scoresystem.HundredPointsScoreSystem.getNumericalValue(Decimal(42))
+  Decimal("42")
+  >>> scoresystem.HundredPointsScoreSystem.getFractionalValue(Decimal(42))
+  Decimal("0.42")
+
+There is also an ``AbstractScoreSystem`` class that implements the title,
+description and the representation of the object for you already. It is used
+for both of the above types of score system. If you need to develop a score
+system that does not fit into any of the two categories, you might want to
+develop one using this abstract class.
+
+Finally, I would like to talk a little bit more about the ``UNSCORED``
+score. This global is not just a string, so that is will more efficiently
+store in the ZODB:
+
+  >>> scoresystem.UNSCORED
+  UNSCORED
+  >>> scoresystem.UNSCORED.__reduce__()
+  'UNSCORED'
+  >>> import pickle
+  >>> len(pickle.dumps(scoresystem.UNSCORED))
+  49
+
+
+Evaluations
+-----------
+
+Evaluations provide a score for a single requirement for a single person. The
+value of the evaluation depends on the score system. Evaluations are attached
+to objects providing the ``IHaveEvaluations`` interface. In our use cases,
+those objects are usually people.
+
+  >>> class Person(object):
+  ...     zope.interface.implements(interfaces.IHaveEvaluations,
+  ...                               annotation.interfaces.IAttributeAnnotatable)
+  ...     def __init__(self, name):
+  ...         self.name = name
+  ...
+  ...     def __repr__(self):
+  ...         return "%s(%r)" % (self.__class__.__name__, self.name)
+
+  >>> student = Person(u'Sample Student')
+
+Evaluations are made by an evaluator:
+
+  >>> teacher = Person(u'Sample Teacher')
+
+The evaluations for an evaluatable object can be accessed using the
+``IEvaluations`` adapter:
+
+  >>> evals = interfaces.IEvaluations(student)
+  >>> evals
+  <Evaluations for Person(u'Sample Student')>
+  >>> from zope.app import zapi
+  >>> zapi.getParent(evals)
+  Person(u'Sample Student')
+
+Initially, there are no evaluations available.
+
+  >>> sorted(evals.keys())
+  []
+
+We now create a new evaluation.  When creating an evaluation, the following
+arguments must be passed to the constructor:
+
+ - ``requirement``
+   The requirement should be a reference to a provider of the ``IRequirement``
+   interface.
+
+ - ``scoreSystem``
+   The score system should be a reference to a provider of the ``IScoreSystem``
+   interface.
+
+ - ``value``
+   The value is a data structure that represents a valid score for the given
+   score system.
+
+ - ``evaluator``
+   The evaluator should be an object reference that represents the principal
+   making the evaluation. This will usually be a ``Person`` instance.
+
+For example, we would like to score the student's skill for writing iterators
+in the programming class.
+
+  >>> pf = scoresystem.PassFail
+  >>> from schooltool.requirement import evaluation
+  >>> ev = evaluation.Evaluation(req[u'iter'], pf, 'Pass', teacher)
+  >>> ev.requirement
+  InheritedRequirement(Requirement(u'Create an iterator.'))
+  >>> ev.scoreSystem
+  <GlobalDiscreteValuesScoreSystem u'Pass/Fail'>
+  >>> ev.value
+  'Pass'
+  >>> ev.evaluator
+  Person(u'Sample Teacher')
+  >>> ev.time
+  datetime.datetime(...)
+
+The evaluation also has an ``evaluatee`` property, but since we have not
+assigned the evaluation to the person, looking up the evaluatee raises an
+value error:
+
+  >>> ev.evaluatee
+  Traceback (most recent call last):
+  ...
+  ValueError: Evaluation is not yet assigned to a evaluatee
+
+Now that an evaluation has been created, we can add it to the student's
+evaluations.
+
+  >>> name = evals.addEvaluation(ev)
+  >>> sorted(evals.values())
+  [<Evaluation for In...nt(Requirement(u'Create an iterator.')), value='Pass'>]
+
+Now that the evaluation is added, the evaluatee is also available:
+
+  >>> ev.evaluatee
+  Person(u'Sample Student')
+
+Once several evaluations have been created, we can do some interesting queries.
+To demonstrate this feature effectively, we have to create a new requirement
+tree.
+
+  >>> calculus = requirement.Requirement(u'Calculus')
+
+  >>> calculus[u'int'] = requirement.Requirement(u'Integration')
+  >>> calculus[u'int']['fourier'] = requirement.Requirement(
+  ...     u'Fourier Transform')
+  >>> calculus[u'int']['path'] = requirement.Requirement(u'Path Integral')
+
+  >>> calculus[u'diff'] = requirement.Requirement(u'Differentiation')
+  >>> calculus[u'diff'][u'partial'] = requirement.Requirement(
+  ...     u'Partial Differential Equations')
+  >>> calculus[u'diff'][u'systems'] = requirement.Requirement(u'Systems')
+
+  >>> calculus[u'limit'] = requirement.Requirement(u'Limit Theorem')
+
+  >>> calculus[u'fundamental'] = requirement.Requirement(
+  ...     u'Fundamental Theorem of Calculus')
+
+While our sample teacher teaches programming and differentiation, a second
+teacher teaches integration.
+
+  >>> teacher2 = Person(u'Mr. Elkner')
+
+With that done (phew), we can create evaluations based on these requirements.
+
+  >>> student2 = Person(u'Student Two')
+  >>> evals = interfaces.IEvaluations(student2)
+
+  >>> evals.addEvaluation(evaluation.Evaluation(
+  ...     calculus[u'int'][u'fourier'], pf, 'Fail', teacher2))
+
+  >>> evals.addEvaluation(evaluation.Evaluation(
+  ...     calculus[u'int'][u'path'], pf, 'Pass', teacher2))
+
+  >>> evals.addEvaluation(evaluation.Evaluation(
+  ...     calculus[u'diff'][u'partial'], pf, 'Fail', teacher))
+
+  >>> evals.addEvaluation(evaluation.Evaluation(
+  ...     calculus[u'diff'][u'systems'], pf, 'Pass', teacher))
+
+  >>> evals.addEvaluation(evaluation.Evaluation(
+  ...     calculus[u'limit'], pf, 'Fail', teacher))
+
+  >>> evals.addEvaluation(evaluation.Evaluation(
+  ...     calculus[u'fundamental'], pf, 'Pass', teacher2))
+
+So now we can ask for all evaluations for which the sample teacher is the
+evaluator:
+
+  >>> teacherEvals = evals.getEvaluationsOfEvaluator(teacher)
+  >>> teacherEvals
+  <Evaluations for Person(u'Student Two')>
+
+  >>> [value for key, value in sorted(
+  ...     teacherEvals.items(), key=lambda x: x[1].requirement.title)]
+  [<Evaluation for Requirement(u'Limit Theorem'), value='Fail'>,
+   <Evaluation for Requirement(u'Partial Differential Equations'), value='Fail'>,
+   <Evaluation for Requirement(u'Systems'), value='Pass'>]
+
+As you can see, the query method returned another evaluations object having the
+student as a parent.  It is very important that the evaluated object is not
+lost.  The big advantage of returning an evaluations object is the ability to
+perform chained queries:
+
+  >>> result = evals.getEvaluationsOfEvaluator(teacher) \
+  ...               .getEvaluationsForRequirement(calculus[u'diff'])
+  >>> [value for key, value in sorted(
+  ...     result.items(), key=lambda x: x[1].requirement.title)]
+  [<Evaluation for Requirement(u'Partial Differential Equations'), value='Fail'>,
+   <Evaluation for Requirement(u'Systems'), value='Pass'>]
+
+By default, these queries search recursively through the entire subtree of the
+requirement.  However, you can call turn off the recursion:
+
+  >>> result = evals.getEvaluationsOfEvaluator(teacher) \
+  ...               .getEvaluationsForRequirement(calculus, recurse=False)
+  >>> sorted(result.values())
+  [<Evaluation for Requirement(u'Limit Theorem'), value='Fail'>]
+
+Of course, the few query methods defined by the container are not sufficient in
+all cases. In those scenarios, you can develop adapters that implement custom
+queries. The package provides a nice abstract base query adapter that can be
+used as follows:
+
+  >>> class PassedQuery(evaluation.AbstractQueryAdapter):
+  ...     def _query(self):
+  ...         return [(key, eval)
+  ...                 for key, eval in self.context.items()
+  ...                 if eval.scoreSystem.isPassingScore(eval.value)]
+
+  >>> result = PassedQuery(evals)().getEvaluationsOfEvaluator(teacher)
+  >>> sorted(result.values())
+  [<Evaluation for Requirement(u'Systems'), value='Pass'>]
+
+
+The ``IEvaluations`` API
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Contrary to what you might expect, the evaluations object is not a container,
+but a mapping from requirement to evaluation. The key reference package is used
+to create a hashable key for the requirement. The result is an object where we
+can quickly lookup the evaluation for a given requirement, which is clearly
+the most common form of query.
+
+This section demonstrates the implementation of the ``IMapping`` API.
+
+  >>> evals = evaluation.Evaluations(
+  ...     [(calculus[u'limit'],
+  ...       evaluation.Evaluation(calculus[u'limit'], pf, 'Pass', teacher)),
+  ...      (calculus[u'diff'],
+  ...       evaluation.Evaluation(calculus[u'diff'], pf, 'Fail', teacher))]
+  ...     )
+
+- ``__getitem__(key)``
+
+  >>> evals[calculus[u'limit']]
+  <Evaluation for Requirement(u'Limit Theorem'), value='Pass'>
+  >>> evals[calculus[u'fundamental']]
+  Traceback (most recent call last):
+  ...
+  KeyError: <schooltool.requirement.testing.KeyReferenceStub ...>
+
+- ``__delitem__(key)``
+
+  >>> del evals[calculus[u'limit']]
+  >>> len(evals._btree)
+  1
+  >>> del evals[calculus[u'fundamental']]
+  Traceback (most recent call last):
+  ...
+  KeyError: <schooltool.requirement.testing.KeyReferenceStub ...>
+
+- ``__setitem__(key, value)``
+
+  >>> evals[calculus[u'limit']] = evaluation.Evaluation(
+  ...     calculus[u'limit'], pf, 'Pass', teacher)
+  >>> len(evals._btree)
+  2
+
+- ``get(key, default=None)``
+
+  >>> evals.get(calculus[u'limit'])
+   <Evaluation for Requirement(u'Limit Theorem'), value='Pass'>
+  >>> evals.get(calculus[u'fundamental'], default=False)
+  False
+
+- ``__contains__(key)``
+
+  >>> calculus[u'limit'] in evals
+  True
+  >>> calculus[u'fundamental'] in evals
+  False
+
+- ``keys()``
+
+  >>> sorted(evals.keys(), key = lambda x: x.title)
+  [Requirement(u'Differentiation'), Requirement(u'Limit Theorem')]
+
+- ``__iter__()``
+
+  >>> sorted(iter(evals), key=lambda x: x.title)
+  [Requirement(u'Differentiation'), Requirement(u'Limit Theorem')]
+
+- ``values()``
+
+  >>> sorted(evals.values(), key=lambda x: x.requirement.title)
+  [<Evaluation for Requirement(u'Differentiation'), value='Fail'>,
+   <Evaluation for Requirement(u'Limit Theorem'), value='Pass'>]
+
+- ``items()``
+
+  >>> sorted(evals.items(), key=lambda x: x[0].title)
+  [(Requirement(u'Differentiation'),
+    <Evaluation for Requirement(u'Differentiation'), value='Fail'>),
+   (Requirement(u'Limit Theorem'),
+    <Evaluation for Requirement(u'Limit Theorem'), value='Pass'>)]
+
+- ``__len__()``
+
+  >>> len(evals)
+  2
+
+Epilogue
+--------
+
+ vim: ft=rest


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make package


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,66 @@
+===========================
+Requirements via the Web UI
+===========================
+
+This document presents the mangagement of requirements from the perspective
+of the Web UI.
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> browser = Browser()
+    >>> browser.addHeader('Authorization', 'Basic manager:schooltool')
+
+    >>> browser.handleErrors = False
+    >>> browser.open('http://localhost/')
+
+
+Requirement Management
+----------------------
+
+Requirements are accessed using the requirement namespace.  The namespace can
+be used on anything that has been configured to implement IHaveRequirement 
+First we will look at global requirements, which are attached to the
+``SchoolToolApplication`` object.  From this screen we can add subrequirements.
+
+    >>> browser.open('http://localhost/++requirement++')
+    >>> 'SchoolTool Sub Requirements' in browser.contents
+    True
+
+    >>> browser.getLink('New Requirement').click()
+    >>> browser.getControl('Title').value = u'Citizenship'
+    >>> browser.getControl('Add').click()
+
+    >>> 'Citizenship' in browser.contents
+    True
+
+We can then navigate to this new requirement and edit it.
+
+    >>> browser.getLink('Citizenship').click()
+    >>> 'Citizenship Sub Requirements' in browser.contents
+    True
+
+    >>> browser.getLink('Edit Requirement').click()
+    >>> browser.getControl('Title').value = u'Being a Good Citizen'
+    >>> browser.getControl('Apply').click()
+    >>> 'Being a Good Citizen Sub Requirements' in browser.contents
+    True
+
+If we create a sub requirement within this one, it will show up in the
+top level requirement, because the page recurses down the requirement tree.
+
+    >>> browser.getLink('New Requirement').click()
+    >>> browser.getControl('Title').value = u'Be kind to your fellow students.'
+    >>> browser.getControl('Add').click()
+
+    >>> browser.open('http://localhost/++requirement++')
+    >>> 'Be kind to your fellow students.' in browser.contents
+    True
+
+The view defaults to showing a depth of 3 recurssions.  If we want to show
+only the ones directly under the top level, we can use the depth control.
+
+    >>> browser.getControl('2').name
+    'DEPTH'
+    >>> browser.getControl('2').click()
+    >>> browser.getControl('1').click()
+    >>> 'Be kind to your fellow students.' not in browser.contents
+    True


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,76 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope">
+
+  <!-- Score system widget registration -->
+
+  <zope:view
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      for="schooltool.requirement.scoresystem.IScoreSystemField"
+      provides="zope.app.form.interfaces.IInputWidget"
+      factory=".scoresystem.ScoreSystemWidget"
+      permission="zope.Public"
+      />
+
+  <configure
+      package="schooltool.skin"
+      i18n_domain="schooltool">
+
+    <addform
+        label="Add a Requirement"
+        name="addRequirement.html"
+        schema="schooltool.requirement.interfaces.IRequirement"
+        fields="title"
+        arguments="title"
+        set_after_add="title"
+        content_factory="schooltool.requirement.requirement.Requirement"
+        permission="schooltool.edit"
+        template="templates/simple_add.pt"
+        class="schooltool.requirement.browser.requirement.RequirementAddView">
+    </addform>
+
+    <editform
+        label="Edit Requirement"
+        name="edit.html"
+        schema="schooltool.requirement.interfaces.IRequirement"
+        for="schooltool.requirement.interfaces.IRequirement"
+        fields="title"
+        template="templates/simple_edit.pt"
+        permission="schooltool.edit"
+        class="schooltool.requirement.browser.requirement.RequirementEditView"
+        menu="schooltool_actions"
+        title="Edit Requirement"
+        />
+  </configure>
+
+  <page
+      name="index.html"
+      for="schooltool.requirement.interfaces.IRequirement"
+      class="schooltool.requirement.browser.requirement.RequirementView"
+      template="requirement.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="View"
+      />
+
+  <page
+      name="treenode"
+      for="schooltool.requirement.interfaces.IRequirement"
+      template="treenode.pt"
+      permission="schooltool.view"
+      />
+
+  <containerViews
+      for="..interfaces.IRequirement"
+      contents="zope.ManageContent"
+      add="schooltool.edit"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="New Requirement"
+      for="schooltool.requirement.interfaces.IRequirement"
+      action="+/addRequirement.html"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.requirement" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,43 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.requirement.
+
+$Id: ftests.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+import os
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+requirement_functional_layer = ZCMLLayer(filename,
+                                         __name__,
+                                         'requirement_functional_layer')
+
+def test_suite():
+    return collect_ftests(filenames=['README.txt'],
+                          layer=requirement_functional_layer)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,51 @@
+<tal:define define="dummy view/update"/>
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title"
+         tal:content="string:${context/title} Contents"
+         i18n:translate="">
+    Contents
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="string:${context/title} Sub Requirements"
+    i18n:translate="">Contents</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="batch view/batch">
+  <tal:block replace="structure view/batch/render" />
+  <form method="post" class="batch-search">
+    <input id="batch-search-box" type="text" name="SEARCH"
+      tal:attributes="value request/SEARCH|nothing"/>
+    <input type="submit" name="SEARCH_BUTTON" value="Find Now"
+      i18n:attributes="value"/>
+    <input type="submit" name="CLEAR_SEARCH" value="Clear"
+      i18n:attributes="value"/>
+    <input type="checkbox" name="RECURSIVE" value="0"
+      tal:attributes="value request/RECURSIVE|nothing"/>recursive?
+  </form>
+  <tal:if condition="batch" define="depth python:int(request.get('DEPTH', 3))">
+    <div class="count">
+      <span i18n:translate="">Showing</span>
+      <span tal:content="python:len(batch)"/>
+      <span i18n:translate="">of</span>
+      <span tal:content="python:len(batch.list)"/>
+      <span i18n:translate="">items</span>
+    </div>
+    <form method="post">
+      <b>Depth:</b>
+      <input type="submit" name="DEPTH"
+          tal:condition="python:depth > 1"
+          tal:attributes="value python:depth-1" />
+      <b tal:content="python:depth">3</b>
+      <input type="submit" name="DEPTH"
+          tal:attributes="value python:depth+1" />
+    </form>
+    <tal:block replace="structure view/subthread" />
+  </tal:if>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,109 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+schooltooo.requirement browser views.
+
+$Id: requirement.py 6863 2007-04-16 14:50:03Z ignas $
+"""
+import urllib
+
+from zope.app import zapi
+from zope.app.form.browser.add import AddView
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+
+from schooltool import SchoolToolMessage as _
+import schooltool.app.browser.app
+import schooltool.requirement.interfaces
+import schooltool.skin.containers
+from schooltool.table.batch import IterableBatch
+
+
+class RequirementAddView(AddView):
+    """A view for adding Requirements."""
+
+    def nextURL(self):
+        return zapi.absoluteURL(self.context.context, self.request)
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(self.nextURL())
+        else:
+            return AddView.update(self)
+
+
+class RequirementView(schooltool.skin.containers.ContainerView):
+    """A Requirement view."""
+
+    __used_for__ = schooltool.requirement.interfaces.IRequirement
+
+    index_title = _("Requirement index")
+
+    def __init__(self, context, request, depth=None):
+        schooltool.skin.containers.ContainerView.__init__(self, context,
+                                                          request)
+        self.depth = depth
+        if self.depth is None:
+            self.depth = int(request.get('DEPTH', 3))
+
+    def _search(self, searchstr, context):
+        results = []
+        for item in context.values():
+            if searchstr.lower() in item.title.lower():
+                results.append(item)
+            results += self._search(searchstr, item)
+        return results
+
+    def update(self):
+        if 'SEARCH' in self.request and 'CLEAR_SEARCH' not in self.request:
+            searchstr = self.request['SEARCH'].lower()
+            if self.request.get('RECURSIVE'):
+                results = self._search(searchstr, self.context)
+            else:
+                results = [item for item in self.context.values()
+                           if searchstr in item.title.lower()]
+            extra_url = "&SEARCH=%s" % urllib.quote(self.request['SEARCH'])
+        else:
+            self.request.form['SEARCH'] = ''
+            results = self.context.values()
+            extra_url = ""
+
+        self.batch = IterableBatch(results, self.request, sort_by='title',
+                                   extra_url=extra_url)
+
+    def listContentInfo(self):
+        children = []
+        if self.depth < 1:
+            return []
+        for child in self.batch:
+            if schooltool.requirement.interfaces.IRequirement.providedBy(child):
+                info = {}
+                info['child'] = child
+                thread = RequirementView(child, self.request, self.depth-1)
+                info['thread'] = thread.subthread()
+                children.append(info)
+        return children
+
+    subthread = ViewPageTemplateFile('subthread.pt')
+
+
+class RequirementEditView(schooltool.app.browser.app.BaseEditView):
+    """View for editing Requirements."""
+
+    __used_for__ = schooltool.requirement.interfaces.IRequirement
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/requirement.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,194 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Score System Browser Code
+
+$Id: scoresystem.py 5664 2006-01-20 15:51:13Z srichter $
+"""
+__docformat__ = 'reStructuredText'
+import zope.interface
+import zope.schema
+from zope.app import form
+from zope.app.pagetemplate import ViewPageTemplateFile
+
+from schooltool import SchoolToolMessage as _
+from schooltool.requirement import interfaces, scoresystem
+
+class IWidgetData(interfaces.IRangedValuesScoreSystem):
+    """A schema used to generate the score system widget."""
+
+    existing = zope.schema.Choice(
+        title=_('Exisiting Score System'),
+        vocabulary='schooltool.requirement.scoresystems',
+        required=False)
+
+    custom = zope.schema.Bool(
+        title=_('Custom score system'),
+        required=True)
+
+
+class WidgetData(object):
+    """A simple object used to simulate the widget data."""
+
+    existing = None
+    custom = False
+    min = 0
+    max = 100
+
+
+class ScoreSystemWidget(object):
+    """Score System Widget"""
+    zope.interface.implements(form.browser.interfaces.IBrowserWidget,
+                              form.interfaces.IInputWidget)
+
+    template = ViewPageTemplateFile('scoresystemwidget.pt')
+    _prefix = 'field.'
+
+    # See zope.app.form.interfaces.IWidget
+    name = None
+    label = property(lambda self: self.context.title)
+    hint = property(lambda self: self.context.description)
+    visible = True
+    # See zope.app.form.interfaces.IInputWidget
+    required = property(lambda self: self.context.required)
+
+    def __init__(self, field, request):
+        self.context = field
+        self.request = request
+        data = WidgetData()
+        if interfaces.IRequirement.providedBy(field.context):
+            ss = field.context.scoresystem
+            if scoresystem.ICustomScoreSystem.providedBy(ss):
+                data.custom = True
+                data.min = ss.min
+                data.max = ss.max
+            else:
+                data.existing = ss
+        self.name = self._prefix + field.__name__
+        form.utility.setUpEditWidgets(self, IWidgetData, source=data,
+                                      prefix=self.name+'.')
+
+
+    def setRenderedValue(self, value):
+        """See zope.app.form.interfaces.IWidget"""
+        if scoresystem.ICustomScoreSystem.providedBy(value):
+            self.custom_widget.setRenderedValue(True)
+            self.min_widget.setRenderedValue(value.min)
+            self.max_widget.setRenderedValue(value.max)
+        else:
+            self.existing_widget.setRenderedValue(value)
+
+
+    def setPrefix(self, prefix):
+        """See zope.app.form.interfaces.IWidget"""
+        # Set the prefix locally
+        if not prefix.endswith("."):
+            prefix += '.'
+        self._prefix = prefix
+        self.name = prefix + self.context.__name__
+        # Now distribute it to the sub-widgets
+        for widget in [getattr(self, name+'_widget')
+                       for name in zope.schema.getFieldNames(IWidgetData)]:
+            widget.setPrefix(self.name+'.')
+
+
+    def getInputValue(self):
+        """See zope.app.form.interfaces.IInputWidget"""
+        if self.custom_widget.getInputValue():
+            min = self.min_widget.getInputValue()
+            max = self.max_widget.getInputValue()
+            custom = scoresystem.RangedValuesScoreSystem(
+                u'generated', min=min, max=max)
+            zope.interface.directlyProvides(
+                custom, scoresystem.ICustomScoreSystem)
+            return custom
+        else:
+            return self.existing_widget.getInputValue()
+
+
+    def applyChanges(self, content):
+        """See zope.app.form.interfaces.IInputWidget"""
+        field = self.context
+        new_value = self.getInputValue()
+        old_value = field.query(content, self)
+        # The selection of an existing scoresystem has not changed
+        if new_value == old_value:
+            return False
+        # Both, the new and old score system are generated
+        if (scoresystem.ICustomScoreSystem.providedBy(new_value) and
+            scoresystem.ICustomScoreSystem.providedBy(old_value)):
+            # If they both have the same min and max value, then there is no
+            # change
+            if (new_value.min == old_value.min and
+                new_value.max == old_value.max):
+                return False
+
+        field.set(content, new_value)
+        return True
+
+
+    def hasInput(self):
+        """See zope.app.form.interfaces.IInputWidget"""
+        return (self.existing_widget.hasInput() or
+                (self.custom_widget.hasValidInput() and
+                 self.custom_widget.getInputValue()))
+
+
+    def hasValidInput(self):
+        """See zope.app.form.interfaces.IInputWidget"""
+        if (self.custom_widget.hasValidInput() and
+            self.custom_widget.getInputValue()):
+            return (self.min_widget.hasValidInput() and
+                    self.min_widget.hasValidInput())
+
+        return self.existing_widget.hasValidInput()
+
+
+    def hidden(self):
+        """See zope.app.form.browser.interfaces.IBrowserWidget"""
+        if (self.custom_widget.hasValidInput() and
+            self.custom_widget.getInputValue()):
+            output = []
+            output.append(self.custom_widget.hidden())
+            output.append(self.min_widget.hidden())
+            output.append(self.max_widget.hidden())
+            return '\n'.join(output)
+
+        return self.existing_widget.hidden()
+
+
+    def error(self):
+        """See zope.app.form.browser.interfaces.IBrowserWidget"""
+        custom_error = self.custom_widget.error()
+        if custom_error:
+            return custom_error
+        if (self.custom_widget.hasInput() and
+            self.custom_widget.getInputValue()):
+            min_error = self.min_widget.error()
+            if min_error:
+                return min_error
+            max_error = self.max_widget.error()
+            if max_error:
+                return max_error
+
+        return self.existing_widget.error()
+
+
+    def __call__(self):
+        """See zope.app.form.browser.interfaces.IBrowserWidget"""
+        return self.template()


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,454 @@
+====================
+Score System Widgets
+====================
+
+Score system widgets are used to provide an advanced user experience when
+selecting score systems. The score system widget allows you to either select
+an existing, registered score system *or* create a custom one on the fly.
+
+Step 0 is some framework setup. We do not need much, though; one task is
+setting up the score system vocabulary:
+
+  >>> from schooltool.requirement import interfaces
+
+  >>> def ScoreSystems(context):
+  ...     from zope.app.component import vocabulary
+  ...     return vocabulary.UtilityVocabulary(context,
+  ...                                         interface=interfaces.IScoreSystem)
+
+  >>> from zope.schema import vocabulary
+  >>> vocabulary.getVocabularyRegistry().register(
+  ...     'schooltool.requirement.scoresystems', ScoreSystems)
+
+  >>> import zope.component
+  >>> from schooltool.requirement import scoresystem
+
+  >>> zope.component.provideUtility(
+  ...     scoresystem.PassFail, interfaces.IScoreSystem,
+  ...     u'Pass/Fail')
+
+  >>> zope.component.provideUtility(
+  ...     scoresystem.AmericanLetterScoreSystem, interfaces.IScoreSystem,
+  ...     u'Letter Grade')
+
+  >>> zope.component.provideUtility(
+  ...     scoresystem.PercentScoreSystem, interfaces.IScoreSystem,
+  ...     u'Percent')
+
+First we have to create a field and a request:
+
+  >>> field = scoresystem.ScoreSystemField(
+  ...     title=u'Scoresystem',
+  ...     description=u'The score system',
+  ...     required=True)
+  >>> field.__name__ = 'field'
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+
+Now we can initialize widget.
+
+  >>> import schooltool.requirement.browser.scoresystem
+  >>> from schooltool.requirement import browser
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+
+Let's make sure that all fields have the correct value:
+
+  >>> widget.name
+  'field.field'
+
+  >>> widget.label
+  u'Scoresystem'
+
+  >>> widget.hint
+  u'The score system'
+
+  >>> widget.visible
+  True
+
+  >>> widget.required
+  True
+
+The constructor should have also created 4 widgets:
+
+  >>> widget.existing_widget
+  <zope.app.form.browser.itemswidgets.DropdownWidget object at ...>
+  >>> widget.custom_widget
+  <zope.app.form.browser.boolwidgets.CheckBoxWidget object at ...>
+  >>> widget.min_widget
+  <zope.app.form.browser.textwidgets.IntWidget object at ...>
+  >>> widget.max_widget
+  <zope.app.form.browser.textwidgets.IntWidget object at ...>
+
+
+``setRenderedValue(value)`` Method
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The first method is ``setRenderedValue()``. The widget has two use cases,
+based on the type of value. If the value is a custom score system, it will
+send the information to the custom, min and max widget:
+
+  >>> 'checked="checked"' in widget.custom_widget()
+  False
+  >>> 'value="5"' in widget.min_widget()
+  False
+  >>> 'value="15"' in widget.max_widget()
+  False
+
+  >>> import zope.interface
+  >>> custom = scoresystem.RangedValuesScoreSystem(u'generated', min=5, max=15)
+  >>> zope.interface.directlyProvides(custom, scoresystem.ICustomScoreSystem)
+  >>> widget.setRenderedValue(custom)
+
+  >>> 'checked="checked"' in widget.custom_widget()
+  True
+  >>> 'value="5"' in widget.min_widget()
+  True
+  >>> 'value="15"' in widget.max_widget()
+  True
+
+After resetting the widget passing in one of the score systems in the
+vocabulary, should set the existing widget:
+
+  >>> 'selected="selected" value="Pass/Fail"' in widget.existing_widget()
+  False
+
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.setRenderedValue(scoresystem.PassFail)
+
+  >>> 'selected="selected" value="Pass/Fail"' in widget.existing_widget()
+  True
+  >>> 'checked="checked"' in widget.custom_widget()
+  False
+
+
+``setPrefix(prefix)`` Method
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The prefix determines the name of the widget and all its sub-widgets.
+
+  >>> widget.name
+  'field.field'
+  >>> widget.existing_widget.name
+  'field.field.existing'
+  >>> widget.custom_widget.name
+  'field.field.custom'
+  >>> widget.min_widget.name
+  'field.field.min'
+  >>> widget.max_widget.name
+  'field.field.max'
+
+  >>> widget.setPrefix('test.')
+
+  >>> widget.name
+  'test.field'
+  >>> widget.existing_widget.name
+  'test.field.existing'
+  >>> widget.custom_widget.name
+  'test.field.custom'
+  >>> widget.min_widget.name
+  'test.field.min'
+  >>> widget.max_widget.name
+  'test.field.max'
+
+
+``getInputValue()`` Method
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This method returns a score system based on the input; the data is assumed to
+be valid. In our case that means, if we selected the custom score system and
+have valid min and max values, a generated custom score system should be
+returned:
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on',
+  ...     'field.field.min': 10,
+  ...     'field.field.max': 20})
+
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+
+  >>> custom = widget.getInputValue()
+  >>> scoresystem.ICustomScoreSystem.providedBy(custom)
+  True
+  >>> custom.title
+  u'generated'
+  >>> custom.min
+  Decimal("10")
+  >>> custom.max
+  Decimal("20")
+
+On the other hand, if we selected an existing score system, it should be
+returned:
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.existing': 'Pass/Fail'})
+
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> passfail = widget.getInputValue()
+  >>> passfail is scoresystem.PassFail
+  True
+
+
+``applyChanges(content)`` Method
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This method applies the new score system to the passed content. However, it
+must be smart enough to detect whether the values really changed.
+
+  >>> class Content(object):
+  ...     field = None
+  >>> content = Content()
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on',
+  ...     'field.field.min': 10,
+  ...     'field.field.max': 20})
+
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.applyChanges(content)
+  True
+  >>> content.field
+  <RangedValuesScoreSystem u'generated'>
+
+  >>> widget.applyChanges(content)
+  False
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.existing': 'Pass/Fail'})
+
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+
+  >>> widget.applyChanges(content)
+  True
+  >>> content.field
+  <GlobalDiscreteValuesScoreSystem u'Pass/Fail'>
+
+  >>> widget.applyChanges(content)
+  False
+
+
+``hasInput()`` Method
+~~~~~~~~~~~~~~~~~~~~~
+
+This mehtod checks for any input, but does not validate it. In our case this
+means that either an existing scoresystem has been selected or the the custom
+score system checkbox has been set.
+
+  >>> request = TestRequest()
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasInput()
+  False
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasInput()
+  True
+
+  >>> request = TestRequest(form={
+  ...     'field.field.existing': ''})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasInput()
+  True
+
+  >>> request = TestRequest(form={
+  ...     'field.field.existing': 'Pass/Fail',
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasInput()
+  True
+
+
+``hasValidInput()`` Method
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Additionally to checking for any input, this method also checks whether the
+input is valid:
+
+  >>> request = TestRequest()
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasValidInput()
+  False
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasValidInput()
+  False
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on',
+  ...     'field.field.min': 1,
+  ...     'field.field.max': 3})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasValidInput()
+  True
+
+  >>> request = TestRequest(form={
+  ...     'field.field.existing': ''})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasValidInput()
+  True
+
+  >>> request = TestRequest(form={
+  ...     'field.field.existing': 'Pass/Fail',
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.hasValidInput()
+  False
+
+The final input is not valid, because if you select the custom checkbox, the
+widget expects that you really wanted a custom score system. But since the min
+and max value were not specified, the input is invalid.
+
+
+hidden() Method
+~~~~~~~~~~~~~~~
+
+This method is implemented by simply concetatenating the hidden output of the
+custom, min and max widget for custom score systems and the hidden output of
+the existing widget for a selected score system:
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on',
+  ...     'field.field.min': 1,
+  ...     'field.field.max': 3})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> print widget.hidden()
+  <input class="hiddenType" id="field.field.custom" name="field.field.custom"
+         type="hidden" value="on"  />
+  <input class="hiddenType" id="field.field.min" name="field.field.min"
+         type="hidden" value="1"  />
+  <input class="hiddenType" id="field.field.max" name="field.field.max"
+         type="hidden" value="3"  />
+
+  >>> request = TestRequest(form={
+  ...     'field.field.existing': 'Pass/Fail'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> print widget.hidden()
+  <input class="hiddenType" id="field.field.existing"
+         name="field.field.existing" type="hidden" value="Pass/Fail"  />
+
+
+error() Method
+~~~~~~~~~~~~~~
+
+Again, we have our two cases. If the custom widget is selected, we check for
+possible errors first in the min and then in the max widget:
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on',
+  ...     'field.field.min': 'f',
+  ...     'field.field.max': 'f'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.getInputValue()
+  Traceback (most recent call last):
+  ...
+  ConversionError: (u'Invalid integer data', <exceptions.ValueError ...>)
+  >>> print widget.error()
+  <span class="error">Invalid integer data</span>
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on',
+  ...     'field.field.min': '0',
+  ...     'field.field.max': 'f'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.getInputValue()
+  Traceback (most recent call last):
+  ...
+  ConversionError: (u'Invalid integer data', <exceptions.ValueError ...>)
+  >>> print widget.error()
+  <span class="error">Invalid integer data</span>
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on',
+  ...     'field.field.min': '0',
+  ...     'field.field.max': '10'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.getInputValue()
+  <RangedValuesScoreSystem u'generated'>
+  >>> widget.error()
+  ''
+
+When the custom checkbox is unchecked, then the existing widget error is
+returned:
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.existing': 'foo'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.getInputValue()
+  Traceback (most recent call last):
+  ...
+  ConversionError: ('Invalid value', token 'foo' not found in vocabulary)
+  >>> print widget.error()
+  <span class="error">Invalid value</span>
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.existing': 'Pass/Fail'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> widget.getInputValue()
+  <GlobalDiscreteValuesScoreSystem u'Pass/Fail'>
+  >>> widget.error()
+  ''
+
+
+__call__() Method
+~~~~~~~~~~~~~~~~~
+
+This method renders the widget using the sub-widgets. I am refraining from
+going through every combination here, since we know the sub-widgets work:
+
+  >>> request = TestRequest(form={
+  ...     'field.field.custom.used': '',
+  ...     'field.field.custom': 'on',
+  ...     'field.field.min': '0',
+  ...     'field.field.max': '10'})
+  >>> widget = browser.scoresystem.ScoreSystemWidget(field, request)
+  >>> print widget() # doctest: +REPORT_NDIFF
+  <fieldset>
+  <div>
+  <div class="value">
+  <select id="field.field.existing" name="field.field.existing" size="1" >
+  <option selected="selected" value="">(no value)</option>
+  <option value="Letter Grade">Letter Grade</option>
+  <option value="Pass/Fail">Pass/Fail</option>
+  <option value="Percent">Percent</option>
+  </select>
+  </div>
+  <input name="field.field.existing-empty-marker" type="hidden" value="1" />
+  </div>
+  <p><b>-- or --</b></p>
+  <p>
+    <input class="hiddenType" id="field.field.custom.used"
+           name="field.field.custom.used" type="hidden" value="" />
+    <input class="checkboxType" checked="checked" id="field.field.custom"
+           name="field.field.custom" type="checkbox" value="on"  />
+    <label for="field.field.custom">Custom score system</label>
+  </p>
+  <p>
+    <label for="field.field.min">Minimum</label>
+    <input class="textType" id="field.field.min" name="field.field.min"
+           size="10" type="text" value="0"  />
+  </p>
+  <p>
+    <label for="field.field.max">Maximum</label>
+    <input class="textType" id="field.field.max" name="field.field.max"
+           size="10" type="text" value="10"  />
+  </p>
+  </fieldset>
+  <BLANKLINE>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystem.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystemwidget.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystemwidget.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystemwidget.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,31 @@
+<fieldset i18n:domain="schooltool">
+<tal:block replace="structure view/existing_widget" />
+<p><b>-- or --</b></p>
+<p>
+  <span tal:replace="structure view/custom_widget" />
+  <label for=""
+      tal:attributes="for view/custom_widget/name"
+      tal:content="view/custom_widget/label"
+      i18n:translate="">
+    Custom score system
+  </label>
+</p>
+<p>
+  <label for=""
+      tal:attributes="for view/min_widget/name"
+      tal:content="view/min_widget/label"
+      i18n:translate="">
+    Min Score
+  </label>
+  <span tal:replace="structure view/min_widget" />
+</p>
+<p>
+  <label for=""
+      tal:attributes="for view/max_widget/name"
+      tal:content="view/max_widget/label"
+      i18n:translate="">
+    Max Score
+  </label>
+  <span tal:replace="structure view/max_widget" />
+</p>
+</fieldset>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/scoresystemwidget.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/subthread.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/subthread.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/subthread.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,8 @@
+<tal:define define="dummy view/update"/>
+<ul i18n:domain="schooltool">
+  <li tal:repeat="item view/listContentInfo">
+    <div tal:replace="structure item/child/@@treenode"
+         tal:on-error="nothing"/>
+    <div tal:replace="structure item/thread"/>
+  </li>
+</ul>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/subthread.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,257 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for group views.
+
+$Id: tests.py 5986 2006-04-27 15:17:13Z faassen $
+"""
+
+import unittest
+
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest, doctestunit
+from zope.traversing.interfaces import IContainmentRoot
+
+from schooltool.app.browser.testing import setUp, tearDown
+from schooltool.testing import setup
+
+
+def doctest_RequirementView():
+    r"""Test for RequirementView
+
+    Let's create a view for a requirement:
+
+        >>> from schooltool.requirement.browser.requirement import RequirementView
+        >>> from schooltool.requirement.requirement import Requirement
+        >>> requirement = Requirement(u"Zope 3 Competencies")
+        >>> request = TestRequest()
+        >>> view = RequirementView(requirement, request)
+
+    Let's create a tree of subrequirements:
+
+        >>> requirement['subOne'] = Requirement(u"Component Architecture")
+        >>> requirement['subOne']['subOne'] = Requirement(u"Component objects")
+        >>> requirement['subOne']['subTwo'] = Requirement(u"Adapters")
+        >>> requirement['subOne']['subTwo']['subOne'] = Requirement(u"zcml declaration")
+        >>> requirement['subOne']['subThree'] = Requirement(u"Interfaces")
+        >>> requirement['subTwo'] = Requirement(u"Security")
+        >>> requirement['subThree'] = Requirement(u"Testing")
+
+    We can control the depth we display of the tree, but it defaults to three
+
+        >>> view.depth
+        3
+
+    This view supports batching.
+
+        >>> view.update()
+        >>> requirement['subOne'] in view.batch
+        True
+        >>> requirement['subTwo'] in view.batch
+        True
+        >>> requirement['subThree'] in view.batch
+        True
+
+    We can also search within the batch using the ``_search`` method
+    which even searches recursively through the entire tree structure
+
+        >>> view._search("Inter", requirement)
+        [Requirement(u'Interfaces')]
+        >>> view._search("zcml", requirement)
+        [Requirement(u'zcml declaration')]
+
+    The ``listContentInfo`` method essentially gets another tree structure
+    used by the page templates to display each tree node
+    """
+
+
+def doctest_RequirementAddView():
+    r"""Test for RequirementAddView
+
+    Adding views in Zope 3 are somewhat unobvious.  The context of an adding
+    view is a view named '+' and providing IAdding.
+
+        >>> class AddingStub:
+        ...     pass
+        >>> context = AddingStub()
+
+    The container to which items will actually be added is accessible as the
+    `context` attribute
+
+        >>> from schooltool.requirement.requirement import Requirement
+        >>> container = Requirement(u"Test Requirement")
+        >>> context.context = container
+
+    ZCML configuration adds some attributes to RequirementAddView, namely
+    `schema`, 'fieldNames', and `_factory`.
+
+        >>> from schooltool.requirement.browser.requirement import RequirementAddView
+        >>> from schooltool.requirement.interfaces import IRequirement
+        >>> from schooltool.requirement.requirement import Requirement
+        >>> class RequirementAddViewForTesting(RequirementAddView):
+        ...     schema = IRequirement
+        ...     fieldNames = ('title',)
+        ...     _factory = Requirement
+
+    We can now finally create the view:
+
+        >>> request = TestRequest()
+        >>> view = RequirementAddViewForTesting(context, request)
+
+    The `nextURL` method tells Zope 3 where you should be redirected after
+    successfully adding a group.  We will pretend that `container` is located
+    at the root so that zapi.absoluteURL(container) returns 'http://127.0.0.1'.
+
+        >>> directlyProvides(container, IContainmentRoot)
+        >>> view.nextURL()
+        'http://127.0.0.1'
+
+    We can cancel an action if we want to:
+
+        >>> request = TestRequest()
+        >>> request.form = {'CANCEL': 'Cancel'}
+        >>> view = RequirementAddViewForTesting(context, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    If 'CANCEL' is not present in the request, the view calls inherited
+    'update'.  We will use a trick and set update_status to some value to
+    short-circuit AddView.update().
+
+        >>> request = TestRequest()
+        >>> request.form = {'field.title': 'a_requirement',
+        ...                 'UPDATE_SUBMIT': 'Add'}
+        >>> view = RequirementAddViewForTesting(context, request)
+        >>> view.update_status = 'Just checking'
+        >>> view.update()
+        'Just checking'
+
+    """
+
+
+def doctest_RequirementEditView():
+    r"""Test for RequirementEditView
+
+    Let's create a view for editing a requirement:
+
+        >>> from schooltool.requirement.browser.requirement import RequirementEditView
+        >>> from schooltool.requirement.requirement import Requirement
+        >>> from schooltool.requirement.interfaces import IRequirement
+        >>> requirement = Requirement(u"Test Requirement")
+        >>> directlyProvides(requirement, IContainmentRoot)
+        >>> request = TestRequest()
+
+        >>> class TestRequirementEditView(RequirementEditView):
+        ...     schema = IRequirement
+        ...     fieldNames = ('title',)
+        ...     _factory = Requirement
+
+        >>> view = TestRequirementEditView(requirement, request)
+
+    We should not get redirected if we did not click on apply button:
+
+        >>> request = TestRequest()
+        >>> view = TestRequirementEditView(requirement, request)
+        >>> view.update()
+        ''
+        >>> request.response.getStatus()
+        599
+
+    After changing name of the requirement you should get redirected to the
+    requirement list:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u'new_title'}
+        >>> view = TestRequirementEditView(requirement, request)
+        >>> view.update()
+        u'Updated on ${date_time}'
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+        >>> requirement.title
+        u'new_title'
+
+    Even if the title has not changed you should get redirected to the
+    requirement list:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u'new_title'}
+        >>> view = TestRequirementEditView(requirement, request)
+        >>> view.update()
+        ''
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+        >>> requirement.title
+        u'new_title'
+
+    We should not get redirected if there were errors:
+
+        >>> request = TestRequest()
+        >>> request.form = {'UPDATE_SUBMIT': 'Apply',
+        ...                 'field.title': u''}
+        >>> view = TestRequirementEditView(requirement, request)
+        >>> view.update()
+        u'An error occurred.'
+        >>> request.response.getStatus()
+        599
+
+        >>> requirement.title
+        u'new_title'
+
+    We can cancel an action if we want to:
+
+        >>> request = TestRequest()
+        >>> request.form = {'CANCEL': 'Cancel'}
+        >>> view = TestRequirementEditView(requirement, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite((
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS|
+                                         doctest.REPORT_NDIFF),
+        doctest.DocFileSuite('scoresystem.txt',
+                             setUp=setUp, tearDown=tearDown,
+                             globs={'pprint': doctestunit.pprint},
+                             optionflags=doctest.NORMALIZE_WHITESPACE|
+                                         doctest.ELLIPSIS),
+        ))
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/browser/treenode.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/browser/treenode.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/browser/treenode.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5 @@
+<a href=""
+   i18n:domain="schooltool"
+   i18n:translate=""
+   tal:attributes="href context/@@absolute_url"
+   tal:content="context/title">Requirement Title</a>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/browser/treenode.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,192 @@
+<?xml version="1.0"?>
+
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <include file="security.zcml" />
+
+  <adapter
+      for=".interfaces.IHaveRequirement"
+      provides=".interfaces.IRequirement"
+      factory=".requirement.getRequirement"
+      trusted="true"
+      />
+
+  <adapter
+      for=".interfaces.IHaveEvaluations"
+      provides=".interfaces.IEvaluations"
+      factory=".evaluation.getEvaluations"
+      trusted="true"
+      />
+
+  <view
+      name="requirement" type="*"
+      provides="zope.traversing.interfaces.ITraversable"
+      for="schooltool.requirement.interfaces.IHaveRequirement"
+      factory=".requirement.requirementNamespace"
+      />
+  <adapter
+      name="requirement"
+      provides="zope.traversing.interfaces.ITraversable"
+      for="schooltool.requirement.interfaces.IHaveRequirement"
+      factory=".requirement.requirementNamespace"
+      />
+
+  <subscriber
+      for="zope.app.container.interfaces.IObjectRemovedEvent"
+      handler=".requirement.garbageCollect"
+      />
+
+  <!-- Requirement Content -->
+
+  <class class=".requirement.Requirement">
+    <allow interface="zope.app.container.interfaces.ISimpleReadContainer" />
+    <require
+        permission="schooltool.view"
+        attributes="keys __iter__ values items __len__ addBase removeBase title"
+        />
+    <require
+        permission="schooltool.edit"
+        set_schema=".interfaces.IRequirement"
+        />
+    <require
+        permission="schooltool.edit"
+        interface="zope.app.container.interfaces.IWriteContainer"
+        />
+  </class>
+
+  <class class=".requirement.InheritedRequirement">
+    <require like_class=".requirement.Requirement" />
+    <require
+        permission="zope.View"
+        attributes="original"
+        />
+  </class>
+
+  <class class=".requirement.PersistentInheritedRequirement">
+    <require like_class=".requirement.InheritedRequirement" />
+  </class>
+
+  <!-- Scoresystem Content -->
+
+  <class class=".scoresystem.DiscreteValuesScoreSystem">
+    <require
+        permission="zope.View"
+        interface=".interfaces.IDiscreteValuesScoreSystem"
+        />
+    <require
+        permission="schooltool.edit"
+        set_schema=".interfaces.IScoreSystem"
+        />
+  </class>
+
+  <class class=".scoresystem.GlobalDiscreteValuesScoreSystem">
+    <require
+        permission="zope.View"
+        interface=".interfaces.IDiscreteValuesScoreSystem"
+        />
+    <require
+        permission="schooltool.edit"
+        set_schema=".interfaces.IScoreSystem"
+        />
+  </class>
+
+  <class class=".scoresystem.RangedValuesScoreSystem">
+    <require
+        permission="zope.View"
+        interface=".interfaces.IRangedValuesScoreSystem"
+        />
+    <require
+        permission="schooltool.edit"
+        set_schema=".interfaces.IScoreSystem"
+        />
+  </class>
+
+  <class class=".scoresystem.GlobalRangedValuesScoreSystem">
+    <require
+        permission="zope.View"
+        interface=".interfaces.IRangedValuesScoreSystem"
+        />
+    <require
+        permission="schooltool.edit"
+        set_schema=".interfaces.IScoreSystem"
+        />
+  </class>
+
+  <!-- Score System registrations -->
+
+  <utility
+      provides="zope.schema.interfaces.IVocabularyFactory"
+      component="zope.app.component.vocabulary.UtilityVocabulary"
+      name="schooltool.requirement.scoresystems"
+      />
+
+  <utility
+      provides="schooltool.requirement.interfaces.IScoreSystem"
+      component="schooltool.requirement.scoresystem.PassFail"
+      name="Pass/Fail"
+      />
+
+  <utility
+      provides="schooltool.requirement.interfaces.IScoreSystem"
+      component="schooltool.requirement.scoresystem.AmericanLetterScoreSystem"
+      name="Letter Grade"
+      />
+
+  <utility
+      provides="schooltool.requirement.interfaces.IScoreSystem"
+      component="
+          schooltool.requirement.scoresystem.ExtendedAmericanLetterScoreSystem"
+      name="Extended Letter Grade"
+      />
+
+  <utility
+      provides="schooltool.requirement.interfaces.IScoreSystem"
+      component="schooltool.requirement.scoresystem.PercentScoreSystem"
+      name="Percent"
+      />
+
+  <utility
+      provides="schooltool.requirement.interfaces.IScoreSystem"
+      component="schooltool.requirement.scoresystem.HundredPointsScoreSystem"
+      name="100 Points"
+      />
+
+  <!-- Evaluations Content -->
+
+  <class class=".evaluation.Evaluations">
+    <require
+        permission="schooltool.edit"
+        interface=".interfaces.IEvaluations"
+        />
+  </class>
+
+  <class class=".evaluation.Evaluation">
+    <require
+        permission="schooltool.edit"
+        interface=".interfaces.IEvaluation"
+        set_schema=".interfaces.IEvaluation"
+        />
+  </class>
+
+  <!-- These declarations should go somewhere else eventually -->
+
+  <class class="schooltool.app.app.SchoolToolApplication">
+    <implements
+        interface="schooltool.requirement.interfaces.IHaveRequirement" />
+  </class>
+
+  <class class="schooltool.course.course.Course">
+    <implements interface=".interfaces.IHaveRequirement" />
+  </class>
+
+  <class class="schooltool.course.section.Section">
+    <implements interface=".interfaces.IHaveRequirement" />
+  </class>
+
+  <class class="schooltool.person.person.Person">
+    <implements interface=".interfaces.IHaveEvaluations" />
+  </class>
+
+  <include package=".browser" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/evaluation.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/evaluation.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/evaluation.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,228 @@
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Level-related Tests
+
+$Id: evaluation.py 5991 2006-04-27 16:57:46Z faassen $
+"""
+
+__docformat__ = 'restructuredtext'
+
+import datetime
+import persistent
+from BTrees.OOBTree import OOBTree
+
+import zope.component
+import zope.event
+from zope import annotation
+from zope.app import container
+from zope.app import zapi
+from zope.location import location
+from zope.app.keyreference.interfaces import IKeyReference
+
+from schooltool.requirement import interfaces
+
+
+EVALUATIONS_KEY = "schooltool.evaluations"
+
+
+def getRequirementList(req, recurse=True):
+    result = []
+    for value in req.values(): # loop through your children
+        if recurse:
+            result += getRequirementList(value) # append their children...
+        else:
+            result.append(value) # just append the child
+    result.append(req) # append the object itself
+    return result
+
+
+class Evaluations(persistent.Persistent, container.contained.Contained):
+    """Evaluations mapping.
+
+    This particular implementation uses the ``zope.app.keyreference`` package
+    to generate the keys of the requirements. Any key that is passed in could
+    be the requirement or the ``IKeyReference`` of the requirement. This
+    implementation will always convert the key to provide ``IKeyReference``
+    before treating it as a true key.
+
+    Another feature of this implementation is that if you set an evaluation
+    for a requirement that has already an evaluation, then the old evaluation
+    is simply overridden. The ``IContainer`` interface would raise a duplicate
+    name error.
+    """
+    zope.interface.implements(interfaces.IEvaluations)
+
+    def __init__(self, items=None):
+        super(Evaluations, self).__init__()
+        self._btree = OOBTree()
+        for name, value in items or []:
+            self[name] = value
+
+    def __getitem__(self, key):
+        """See zope.interface.common.mapping.IItemMapping"""
+        return self._btree[IKeyReference(key)]
+
+    def __delitem__(self, key):
+        """See zope.interface.common.mapping.IWriteMapping"""
+        value = self[key]
+        del self._btree[IKeyReference(key)]
+        event = container.contained.ObjectRemovedEvent(value, self)
+        zope.event.notify(event)
+
+    def __setitem__(self, key, value):
+        """See zope.interface.common.mapping.IWriteMapping"""
+        self._btree[IKeyReference(key)] = value
+        value, event = container.contained.containedEvent(value, self)
+        zope.event.notify(event)
+
+    def get(self, key, default=None):
+        """See zope.interface.common.mapping.IReadMapping"""
+        try:
+            return self[key]
+        except KeyError:
+            return default
+
+    def __contains__(self, key):
+        """See zope.interface.common.mapping.IReadMapping"""
+        return IKeyReference(key) in self._btree
+
+    def keys(self):
+        """See zope.interface.common.mapping.IEnumerableMapping"""
+        # For now I decided to return the activities (as I think it is more
+        # natural), though they are not the true keys as we know
+        return [key() for key in self._btree.keys()]
+
+    def __iter__(self):
+        """See zope.interface.common.mapping.IEnumerableMapping"""
+        return iter(self.keys())
+
+    def values(self):
+        """See zope.interface.common.mapping.IEnumerableMapping"""
+        return self._btree.values()
+
+    def items(self):
+        """See zope.interface.common.mapping.IEnumerableMapping"""
+        return [(key(), value) for key, value in self._btree.items()]
+
+    def __len__(self):
+        """See zope.interface.common.mapping.IEnumerableMapping"""
+        return len(self._btree)
+
+    def addEvaluation(self, evaluation):
+        """See interfaces.IEvaluations"""
+        self[evaluation.requirement] = evaluation
+
+    def getEvaluationsForRequirement(self, req, recurse=True):
+        """See interfaces.IEvaluations"""
+        requirements = getRequirementList(req, recurse)
+        result = [(name, ev)
+                  for name, ev in self.items()
+                  if ev.requirement in requirements]
+        result = Evaluations(result)
+        location.locate(result, zapi.getParent(self), zapi.name(self))
+        return result
+
+    def getEvaluationsOfEvaluator(self, evaluator):
+        """See interfaces.IEvaluations"""
+        result = [(name, ev)
+                  for name, ev in self.items()
+                  if ev.evaluator == evaluator]
+        result = Evaluations(result)
+        location.locate(result, zapi.getParent(self), zapi.name(self))
+        return result
+
+    def __repr__(self):
+        try:
+            parent = zapi.getParent(self)
+        except TypeError:
+            parent = None
+        return '<%s for %r>' % (self.__class__.__name__, parent)
+
+
+class Evaluation(container.contained.Contained):
+
+    zope.interface.implements(interfaces.IEvaluation)
+
+    def __init__(self, requirement, scoreSystem, value, evaluator):
+        self._value = None
+        self.requirement = requirement
+        self.scoreSystem = scoreSystem
+        self.value = value
+        self.evaluator = evaluator
+
+    @apply
+    def value():
+        def get(self):
+            return self._value
+
+        def set(self, value):
+            if not self.scoreSystem.isValidScore(value):
+                raise ValueError('%r is not a valid score.' %value)
+            self._value = value
+            # XXX mg: since it is a very bad idea to mix datetimes with tzinfo
+            # and datetimes without tzinfo, I suggest using datetimes with
+            # tzinfo everywhere.  Most of SchoolTool follows this convention,
+            # (with the painful exception of schooltool.timetable).
+            self.time = datetime.datetime.utcnow()
+
+        return property(get, set)
+
+    @property
+    def evaluatee(self):
+        try:
+            return zapi.getParent(zapi.getParent(self))
+        except TypeError:
+            raise ValueError('Evaluation is not yet assigned to a evaluatee')
+
+    def __repr__(self):
+        return '<%s for %r, value=%r>' % (self.__class__.__name__,
+                                          self.requirement, self.value)
+
+
+class AbstractQueryAdapter(object):
+
+    zope.component.adapts(interfaces.IEvaluations)
+    zope.interface.implements(interfaces.IEvaluationsQuery)
+
+    def __init__(self, context):
+        self.context = context
+
+    def _query(self, *args, **kwargs):
+        raise NotImplemented
+
+    def __call__(self, *args, **kwargs):
+        """See interfaces.IEvaluationsQuery"""
+        result = Evaluations(self._query(*args, **kwargs))
+        location.locate(
+            result, zapi.getParent(self.context), zapi.name(self.context))
+        return result
+
+
+def getEvaluations(context):
+    """Adapt an ``IHaveEvaluations`` object to ``IEvaluations``."""
+    annotations = annotation.interfaces.IAnnotations(context)
+    try:
+        return annotations[EVALUATIONS_KEY]
+    except KeyError:
+        evaluations = Evaluations()
+        annotations[EVALUATIONS_KEY] = evaluations
+        location.locate(evaluations, zope.proxy.removeAllProxies(context),
+                        '++evaluations++')
+        return evaluations
+# Convention to make adapter introspectable
+getEvaluations.factory = Evaluations
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/evaluation.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/grades.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/grades.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/grades.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,103 @@
+=========================
+Grading Integration Tests
+=========================
+
+The overarching requirement in this scenario is the school curriculum.  That is,
+this requirement represents the work that has to be done to graduate.
+
+First we need to set up the school itself:
+
+  >>> from schooltool.testing import setup
+  >>> school = setup.setUpSchoolToolSite()
+
+Next we are creating the base requirement for graduation:
+
+  >>> from schooltool.requirement import interfaces, requirement
+  >>> graduation = requirement.Requirement(u'Graduation Requirements')
+
+We want to create a course to provide some context:
+
+  >>> from schooltool.course.course import Course
+
+  >>> econ = school[u'courses'][u'econ'] = Course()
+  >>> econ.title = u'Economics'
+  >>> econ.title
+  u'Economics'
+
+The course can be adapted to be a ``IRequirement``:
+
+  >>> econ_req = interfaces.IRequirement(econ)
+  >>> econ_req
+  Requirement(u'Economics')
+
+We want to indicate that Economics is part of the Graduation Requirements:
+
+  >>> graduation[u'econ'] = econ_req
+  >>> sorted(graduation.keys())
+  [u'econ']
+
+Now we'll create a section of the economics course.  It also implements
+``IRequirement``:
+
+  >>> from schooltool.course.section import Section
+
+  >>> econ_section = Section(u"3rd Period Econ.")
+  >>> school[u'sections'][u'3rd-econ'] = econ_section
+
+  >>> sec_req = interfaces.IRequirement(econ_section)
+  >>> sec_req
+  Requirement(u'3rd Period Econ.')
+
+This section should inherit the requirements of the course:
+
+  >>> sec_req.addBase(econ_req)
+  >>> sec_req.bases
+  [Requirement(u'Economics')]
+
+Create some people.
+
+  >>> from schooltool.person.person import Person
+
+  >>> student = school[u'persons'][u'jane'] = Person(u"Jane Student")
+  >>> teacher = school[u'persons'][u'joe'] = Person(u"Joe Teacher")
+
+Grab the student's ``IEvaluations`` adapter:
+
+  >>> evals = interfaces.IEvaluations(student)
+  >>> evals
+  <Evaluations for <schooltool.person.person.Person object at ...>
+  >>> from zope.app import zapi
+  >>> sorted(evals.keys())
+  []
+
+The next step is to decide on a scoresystem to use for the requirements. For
+simplicity's sake, let use the standard Pass/Fail system:
+
+  >>> from schooltool.requirement.scoresystem import PassFail
+  >>> pf = PassFail
+
+We should be able to make an evaluation now:
+
+  >>> from schooltool.requirement import evaluation
+  >>> ev = evaluation.Evaluation(sec_req, pf, 'Pass', teacher)
+  >>> ev.requirement
+  Requirement(u'3rd Period Econ.')
+  >>> ev.scoreSystem
+  <GlobalDiscreteValuesScoreSystem u'Pass/Fail'>
+  >>> ev.value
+  'Pass'
+  >>> ev.evaluator
+  <schooltool.person.person.Person object at ...>
+
+And we then attach the section evaluation to the student being evaluated:
+
+  >>> sorted(evals.keys())
+  []
+  >>> ev
+  <Evaluation for Requirement(u'3rd Period Econ.'), value='Pass'>
+
+We need to do some kind of setup to get this working.
+
+  >>> name = evals.addEvaluation(ev)
+  >>> sorted(evals.values())
+  [<Evaluation for Requirement(u'3rd Period Econ.'), value='Pass'>]


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/grades.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,292 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Requirement Interfaces
+
+$Id: interfaces.py 6388 2006-08-06 02:59:18Z pcardune $
+"""
+
+__docformat__ = 'restructuredtext'
+
+import zope.interface
+import zope.schema
+import zope.app.container.constraints
+import zope.app.container.interfaces
+
+
+class IRequirement(zope.app.container.interfaces.IOrderedContainer,
+                   zope.app.container.interfaces.IContained):
+    """Something a student can do.
+
+    A requirement can contain further requirements that are needed to fulfill
+    this requirement. You can think of those requirements as dependencies of
+    this requirement. We will refer to those requirements from now on as
+    dependencies or depoendency requirements.
+    """
+
+    zope.app.container.constraints.contains('.IRequirement')
+    zope.app.container.constraints.containers('.IRequirement')
+
+    title = zope.schema.TextLine(
+        title=u'Title',
+        description=u'A brief title of the requirement.',
+        required=True)
+
+    bases = zope.schema.List(
+        title=u'Bases',
+        description=u'An enumeration of base requirements.',
+        readonly=True)
+
+    def addBase(definition):
+        """Add a group requirement as a base definition."""
+
+    def removeBase(definition):
+        """Remove a group requirement from the bases.
+
+        This method is responsible for notifying its contained requirements
+        about the removal of this requirement.
+        """
+
+    def changePosition(name, pos):
+        """Changes the requirement's position to the specified position."""
+
+
+## XXX: should I put the various methods/attributes of the InheritedRequirement
+##      class?  If there wasn't a corresponding interface before, it must not
+##      be that important to have a particular "contract" for
+##      InheritedRequirements.  Especially since they already offer
+##      IRequirement.
+class IInheritedRequirement(IRequirement):
+    """A marker interface for the InheritedRequirement class."""
+
+
+class IExtendedRequirement(IRequirement):
+    """Extended Requirement
+
+    In order to correctly implement the ``IRequirement`` interface and not
+    make implementation-specific assumptions, we need some more methods. All
+    requirements properly implementing IExtendedRequirement should be able to
+    work together without any further assumptions.
+
+    This interface keeps track of all inherited requirements (``bases``) and all
+    sub-requirements (``subs``).
+    """
+    zope.app.container.constraints.contains('.IExtendedRequirement')
+    zope.app.container.constraints.containers('.IExtendedRequirement')
+
+    subs = zope.schema.List(
+        title=u'Sub-requirements',
+        description=u'An enumeration of sub-requirements.',
+        readonly=True)
+
+    def collectKeys(self):
+        """Collect all available keys without using any ``IContainer``
+        methods.
+
+        This method is needed to compute the newly available keys, once a base
+        was added or removed.
+        """
+
+    def distributeKey(self, key):
+        """Distribute a new key to itself and all sub-requirements."""
+
+    def undistributeKey(self, key):
+        """Un-distribute a new key to itself and all sub-requirements."""
+
+
+class IHaveRequirement(zope.interface.Interface):
+    """Marker interface for objects having requirements"""
+
+
+class IScoreSystem(zope.interface.Interface):
+    """A Score System"""
+
+    title = zope.schema.TextLine(
+        title=u'Title',
+        description=u'A brief title of the score system.',
+        required=False)
+
+    description = zope.schema.TextLine(
+        title=u'Description',
+        description=u'A brief description of the score system.',
+        required=False)
+
+    def isValidScore(score):
+        """Return whether score is a valid score.
+
+        The return value is a boolean.  The ``UNSCORED`` value is a valid
+        score.
+        """
+
+    def fromUnicode(rawScore):
+        """Convert a unicode representation of the score to a true value.
+
+        User input always comes as a (unicode) string. Only the scoresystem
+        contains the necessary information to convert those strings into real
+        values.
+        """
+
+
+class IValuesScoreSystem(IScoreSystem):
+    """A Score System that deal with specific score values."""
+
+    def isPassingScore(score):
+        """Return whether score meets a passing threshold.
+
+        The return value is a boolean. When it cannot be determined whether
+        the score is a passing score, then ``None`` is returned.
+        """
+
+    def getBestScore():
+        """Return the best score of the grading system.
+
+        The best score is required to compute statistics. It is also a helpful
+        piece of information for the grader.
+        """
+
+    def getNumericalValue(score):
+        """Return a numerical value for the score.
+
+        In order to compute grades and statistics, we need to be able to
+        assign a numerical value to a score.
+        """
+
+    def getFractionalValue(score):
+        """Return a decimal fraction between 0..1 for the score.
+        """
+
+
+class IDiscreteValuesScoreSystem(IValuesScoreSystem):
+    """A score system that consists of discrete values."""
+
+    scores = zope.schema.List(
+        title=u'Scores',
+        description=u'A list of 2-tuples of the form (score, numerical value).',
+        value_type=zope.schema.Tuple(),
+        required=True)
+
+
+class IRangedValuesScoreSystem(IValuesScoreSystem):
+    """A score system that allows for a randge of values."""
+
+    min = zope.schema.Int(
+        title=u'Minimum',
+        description=u'Minimum value in the score system',
+        required=True,
+        default=0)
+
+    max = zope.schema.Int(
+        title=u'Maximum',
+        description=u'Maximum value in the score system',
+        required=True,
+        default=100)
+
+
+class IHaveEvaluations(zope.interface.Interface):
+    """A marker interface for objects that can have evaluations"""
+
+
+class IEvaluation(zope.app.container.interfaces.IContained):
+    """An Evaluation"""
+
+    zope.app.container.constraints.containers(".IEvaluations")
+
+    scoreSystem = zope.schema.Object(
+        title=u'Score System',
+        description=u'The score system used for grading.',
+        schema=IScoreSystem)
+
+    requirement = zope.schema.Object(
+        title=u'Requirement',
+        description=u'The requirement being evaluated.',
+        schema=IRequirement)
+
+    value = zope.schema.Object(
+        title=u'Value',
+        description=u'A scoresystem-valid score that represents the grade.',
+        schema=zope.interface.Interface,
+        required=True)
+
+    time = zope.schema.Datetime(
+        title=u'Time',
+        description=u'The time the evaluation was made')
+
+    evaluatee = zope.schema.Object(
+        title=u'Evaluatee',
+        description=u'The entity receiving the evaluation',
+        schema=zope.interface.Interface,
+        readonly=True,
+        required=True)
+
+    evaluator = zope.schema.Object(
+        title=u'Evaluator',
+        description=u'The entity doing the evaluation',
+        schema=zope.interface.Interface,
+        required=True)
+
+
+class IEvaluations(zope.interface.common.mapping.IMapping):
+    """Evaluation storage
+
+    This object stores all evaluations of an entity. It is naturally a mapping
+    from requirement to the evaluation. Note that this object is not a classical
+    Zope container, because the key will **not** be a name, but some sort of
+    key reference to the requirement.
+    """
+    zope.app.container.constraints.contains(IEvaluation)
+
+    def __init__(self, items=None):
+        """Initialize object.
+
+        The items should be a list of tuples or dictionary of evaluation names
+        and objects.
+        """
+
+    def addEvaluation(evaluation):
+        """Add an evaluation."""
+
+    def getEvaluationsForRequirement(requirement, recursive=True):
+        """Match all evaluations that satisfy the requirement.
+
+        The return value is another ``IEvaluations`` object.  This allows for
+        chained queries.  For recursive queries, evaluations for all dependency
+        requirements will be returned as well.
+        """
+
+    def getEvaluationsOfEvaluator(evaluator):
+        """Match all evaluations done by the specified evaluator.
+
+        The return value is another ``IEvaluations`` object.  This allows for
+        chained queries.  For recursive queries, evaluations for all dependency
+        requirements will be returned as well.
+        """
+
+
+class IEvaluationsQuery(zope.interface.Interface):
+    """Evaluation Query
+
+    These objects query evaluations and return another evaluations object.
+    """
+
+    def __call__(self, *args, **kwargs):
+        """Execute the query and return an ``IEvaluations`` object.
+
+        The returned ``IEvaluations`` object *must* have the same parent and
+        name that the original ``IEvaluations`` object had.
+        """
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/requirement-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/requirement-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/requirement-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.requirement" />
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/requirement-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/requirement.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/requirement.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/requirement.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,320 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Requirement Implementation
+
+$Id: requirement.py 6770 2007-03-21 21:21:51Z pcardune $
+"""
+
+__docformat__ = 'restructuredtext'
+
+import BTrees.OOBTree
+import persistent
+import persistent.list
+import zope.event
+import zope.interface
+import zope.app.container.contained
+import zope.lifecycleevent
+from zope import component
+from zope import annotation
+from zope.app import zapi
+from zope.app.keyreference.interfaces import IKeyReference, NotYet
+from zope.app.container.interfaces import IObjectRemovedEvent
+
+from schooltool.requirement import interfaces
+
+
+REQUIREMENT_KEY = "schooltool.requirement"
+
+
+class InheritedRequirement(zope.app.container.contained.Contained):
+    """A simple requirement wrapper to mark inheritance.
+
+    However, once the inherited requirement is modified by adding a
+    sub-requirement, the inherited requirement is converted to a real one.
+    """
+    zope.interface.implements(interfaces.IInheritedRequirement)
+
+    def __init__(self, requirement, parent, name):
+        self.original = requirement
+        self.__parent__ = parent
+        self.__name__ = name
+
+    def __cmp__(self, other):
+        return cmp(self.original, other)
+
+    def __iter__(self):
+        return self.original.__iter__()
+
+    def values(self):
+        return [value for key, value in self.items()]
+
+    def __len__(self):
+        return len(self.original)
+
+    def items(self):
+        for key in self.keys():
+            yield key, InheritedRequirement(self[key],
+                                            self, key)
+
+    def __repr__(self):
+        return '%s(%r)' %(self.__class__.__name__, self.original)
+
+    def __getitem__(self, key):
+        return InheritedRequirement(self.original.__getitem__(key),
+                                    self, key)
+
+    def __setitem__(self, key, value):
+        req = self.original.__class__(self.original.title, self.original)
+        self.__parent__[self.__name__] = req
+        req[key] = value
+
+    def __getattr__(self, name):
+        return getattr(self.original, name)
+
+
+class PersistentInheritedRequirement(persistent.Persistent,
+                                     InheritedRequirement):
+    """A persistent version of an inherited requirement."""
+    zope.interface.implements(interfaces.IInheritedRequirement)
+
+def getRequirementKey(requirement):
+    """Get the reference key for any requirement.
+
+    This also includes ``InheritedRequirement`` objects in which case it
+    unwraps the ``InheritedRequirement`` into a regular ``Requirement``.
+    """
+    requirement = unwrapRequirement(requirement)
+    try:
+        return IKeyReference(requirement)
+    except NotYet: # occurs when transaction hasn't been finished
+        return None
+
+
+def unwrapRequirement(requirement):
+    """Remove all inherited requirement wrappers."""
+    while zapi.isinstance(requirement, InheritedRequirement):
+        requirement = requirement.original
+    return requirement
+
+
+class Requirement(persistent.Persistent,
+                  zope.app.container.contained.Contained):
+    """A persistent requirement using a BTree for sub-requirements"""
+    zope.interface.implements(interfaces.IExtendedRequirement)
+
+    def __init__(self, title, *bases):
+        super(Requirement, self).__init__()
+        # See interfaces.IRequirement
+        self.title = title
+        # See interfaces.IRequirement
+        self.bases = persistent.list.PersistentList()
+        # See interfaces.IExtendedRequirement
+        self.subs = persistent.list.PersistentList()
+        # Storage for contained requirements
+        self._data = BTrees.OOBTree.OOBTree()
+        # List of keys that describe the order of the contained requirements
+        self._order = persistent.list.PersistentList()
+        for base in bases:
+            self.addBase(base)
+
+    def collectKeys(self):
+        """See interfaces.IExtendedRequirement"""
+        keys = tuple(self._data.keys())
+        for base in self.bases:
+            keys += base.collectKeys()
+        return keys
+
+    def distributeKey(self, key):
+        """See interfaces.IExtendedRequirement"""
+        if key not in self._order:
+            self._order.append(key)
+        for sub in self.subs:
+            sub.distributeKey(key)
+
+    def undistributeKey(self, key):
+        """See interfaces.IExtendedRequirement"""
+        self._order.remove(key)
+        for sub in self.subs:
+            sub.undistributeKey(key)
+
+    def addBase(self, base):
+        """See interfaces.IRequirement"""
+        if base in self.bases:
+            return
+        self.bases.append(base)
+        base.subs.append(self)
+        for name, value in self._data.items():
+            if name in base:
+                value.addBase(base[name])
+        for name in base.keys():
+            if name not in self._order:
+                self.distributeKey(name)
+
+    def removeBase(self, base):
+        """See interfaces.IRequirement"""
+        self.bases.remove(base)
+        base.subs.remove(self)
+        for name, value in self._data.items():
+            if name in base:
+                value.removeBase(base[name])
+
+        collectedKeys = self.collectKeys()
+        for name in list(self._order):
+            if name not in collectedKeys:
+                self.undistributeKey(name)
+
+    def changePosition(self, name, pos):
+        """See interfaces.IRequirement"""
+        old_pos = self._order.index(name)
+        self._order.remove(name)
+        self._order.insert(pos, name)
+        zope.app.container.contained.notifyContainerModified(self)
+
+    def keys(self):
+        """See interface `IReadContainer`"""
+        return self._order
+
+    def __iter__(self):
+        """See interface `IReadContainer`"""
+        return iter(self.keys())
+
+    def __getitem__(self, key):
+        """See interface `IReadContainer`"""
+        try:
+            return self._data[key]
+        except KeyError:
+            for base in self.bases:
+                if key in base:
+                    return InheritedRequirement(base[key], self, key)
+
+            raise KeyError(key)
+
+    def get(self, key, default=None):
+        """See interface `IReadContainer`"""
+        try:
+            return self[key]
+        except KeyError:
+            return default
+
+    def values(self):
+        """See interface `IReadContainer`"""
+        return [value for key, value in self.items()]
+
+    def __len__(self):
+        """See interface `IReadContainer`"""
+        return len(self.keys())
+
+    def items(self):
+        """See interface `IReadContainer`"""
+        for key in self.keys():
+            yield key, self[key]
+
+    def __contains__(self, key):
+        """See interface `IReadContainer`"""
+        return key in self.keys()
+
+    has_key = __contains__
+
+    def __setitem__(self, key, object):
+        """See interface `IWriteContainer`"""
+        for base in self.bases:
+            if key in base:
+                object.addBase(base[key])
+        for sub in self.subs:
+            if key in sub:
+                sub[key].addBase(object)
+        # Now set the item
+        if object.__parent__:
+            newobject = PersistentInheritedRequirement(object, self, key)
+        else:
+            newobject = object
+        newobject, event = zope.app.container.contained.containedEvent(
+            newobject, self, key)
+        self._data[key] = newobject
+        if key not in self._order:
+            self.distributeKey(key)
+        # Notify all subs of the addition
+        for sub in self.subs:
+            if not key in sub._order:
+                sub._order.append(key)
+        if event:
+            zope.event.notify(event)
+            zope.lifecycleevent.modified(self)
+
+    def __delitem__(self, key):
+        """See interface `IWriteContainer`"""
+        zope.app.container.contained.uncontained(self._data[key], self, key)
+        del self._data[key]
+        # Remove the key only, if no inherited requirements remain
+        inherited_keys = []
+        for base in self.bases:
+            inherited_keys += base.collectKeys()
+        if key not in inherited_keys:
+            self.undistributeKey(key)
+
+    def updateOrder(self, order):
+        """See zope.app.container.interfaces.IOrderedContainer"""
+        if set(self._order) != set(order):
+            raise ValueError("Incompatible key set.")
+
+        self._order = persistent.list.PersistentList(order)
+        zope.app.container.contained.notifyContainerModified(self)
+
+    def __repr__(self):
+        return '%s(%r)' % (self.__class__.__name__, self.title)
+
+
+def getRequirement(context):
+    """Adapt an ``IHaveRequirement`` object to ``IRequirement``."""
+    annotations = annotation.interfaces.IAnnotations(context)
+    try:
+        return annotations[REQUIREMENT_KEY]
+    except KeyError:
+        ## TODO: support generic objects without titles
+        requirement = Requirement(getattr(context, "title", None))
+        annotations[REQUIREMENT_KEY] = requirement
+        zope.app.container.contained.contained(
+            requirement, context, u'++requirement++')
+        return requirement
+# Convention to make adapter introspectable
+getRequirement.factory = Requirement
+
+ at component.adapter(IObjectRemovedEvent)
+def garbageCollect(event):
+    """Removes all references to uncontained requirements.
+
+    When requirements that were contained in other requirements are deleted,
+    references to the deleted requirement still exist if that requirement
+    inherited from another requirement.  This ObjectRemovedEvent subscriber
+    removes those references so the deleted requirement is deleted forever.
+    """
+
+    if interfaces.IRequirement.providedBy(event.object):
+        for base in event.object.bases:
+            event.object.removeBase(base)
+
+class requirementNamespace(object):
+    """Used to traverse to the requirements of an object"""
+
+    def __init__(self, ob, request=None):
+        self.context = ob
+
+    def traverse(self, name, ignore):
+        reqs = interfaces.IRequirement(self.context)
+        return reqs


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/requirement.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/scoresystem.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/scoresystem.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/scoresystem.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,294 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""ScoreSystem Interfaces
+
+$Id: scoresystem.py 5787 2006-03-07 17:01:54Z srichter $
+"""
+__docformat__ = 'restructuredtext'
+
+import zope.interface
+import zope.schema
+import zope.security.checker
+
+from decimal import Decimal
+
+from schooltool.requirement import interfaces
+
+
+class UNSCORED(object):
+    """This object behaves like a string.
+
+    We want this to behave as a global, meaning it's pickled by name, rather
+    than value. We need to arrange that it has a suitable __reduce__.
+    """
+
+    def __reduce__(self):
+        return 'UNSCORED'
+
+    def __repr__(self):
+        return 'UNSCORED'
+
+zope.security.checker.BasicTypes[UNSCORED] = zope.security.checker.NoProxy
+UNSCORED = UNSCORED()
+
+class AbstractScoreSystem(object):
+    zope.interface.implements(interfaces.IScoreSystem)
+
+    def __init__(self, title, description=None):
+        self.title = title
+        self.description = description
+
+    def __repr__(self):
+        return '<%s %r>' % (self.__class__.__name__, self.title)
+
+    def isValidScore(self, score):
+        """See interfaces.IScoreSystem"""
+        raise NotImplementedError
+
+    def fromUnicode(self, rawScore):
+        """See interfaces.IScoreSystem"""
+        raise NotImplementedError
+
+
+class CommentScoreSystem(AbstractScoreSystem):
+
+    def isValidScore(self, score):
+        """See interfaces.IScoreSystem"""
+        if score is UNSCORED:
+            return True
+        return isinstance(score, (str, unicode))
+
+    def fromUnicode(self, rawScore):
+        """See interfaces.IScoreSystem"""
+        if not rawScore:
+            return UNSCORED
+        return rawScore
+
+    def __reduce__(self):
+        return 'CommentScoreSystem'
+
+# Singelton
+CommentScoreSystem = CommentScoreSystem(
+    u'Comments', u'Scores are commentary text.')
+
+
+class AbstractValuesScoreSystem(AbstractScoreSystem):
+    zope.interface.implements(interfaces.IValuesScoreSystem)
+
+    def __init__(self, title, description=None):
+        self.title = title
+        self.description = description
+
+    def isPassingScore(self, score):
+        """See interfaces.IScoreSystem"""
+        raise NotImplementedError
+
+    def getBestScore(self):
+        """See interfaces.IScoreSystem"""
+        raise NotImplementedError
+
+    def getNumericalValue(self, score):
+        """See interfaces.IScoreSystem"""
+        raise NotImplementedError
+
+    def getFractionValue(self, score):
+        """See interfaces.IScoreSystem"""
+        raise NotImplementedError
+
+
+class DiscreteValuesScoreSystem(AbstractValuesScoreSystem):
+    """Abstract Discrete Values Score System"""
+
+    zope.interface.implements(interfaces.IDiscreteValuesScoreSystem)
+
+    # See interfaces.IDiscreteValuesScoreSystem
+    scores = None
+    _minPassingScore = None
+    _bestScore = None
+
+    def __init__(self, title=None, description=None,
+                 scores=None, bestScore=None, minPassingScore=None):
+        self.title = title
+        self.description = description
+        self.scores = scores or []
+        self._bestScore = bestScore
+        self._minPassingScore = minPassingScore
+
+    def isPassingScore(self, score):
+        """See interfaces.IScoreSystem"""
+        if score is UNSCORED:
+            return None
+        if self._minPassingScore is None:
+            return None
+        scores = dict(self.scores)
+        return scores[score] >= scores[self._minPassingScore]
+
+    def isValidScore(self, score):
+        """See interfaces.IScoreSystem"""
+        scores = dict(self.scores).keys()
+        return score in scores + [UNSCORED]
+
+    def getBestScore(self):
+        """See interfaces.IScoreSystem"""
+        return self._bestScore
+
+    def fromUnicode(self, rawScore):
+        """See interfaces.IScoreSystem"""
+        if rawScore == '':
+            return UNSCORED
+
+        if not self.isValidScore(rawScore):
+            raise zope.schema.ValidationError(
+                "'%s' is not a valid score." %rawScore)
+        return rawScore
+
+    def getNumericalValue(self, score):
+        """See interfaces.IScoreSystem"""
+        if score is UNSCORED:
+            return None
+        scores = dict(self.scores)
+        return scores[score]
+
+    def getFractionalValue(self, score):
+        """See interfaces.IScoreSystem"""
+        # get maximum and minimum score to determine the range
+        maximum = self.scores[0][1]
+        minimum = self.scores[-1][1]
+        # normalized numerical score
+        value = self.getNumericalValue(score) - minimum
+        return value / (maximum - minimum)
+
+class GlobalDiscreteValuesScoreSystem(DiscreteValuesScoreSystem):
+
+    def __init__(self, name, *args, **kwargs):
+        self.__name__ = name
+        super(GlobalDiscreteValuesScoreSystem, self).__init__(*args, **kwargs)
+
+    def __reduce__(self):
+        return self.__name__
+
+PassFail = GlobalDiscreteValuesScoreSystem(
+    'PassFail',
+    u'Pass/Fail', u'Pass or Fail score system.',
+    [(u'Pass', Decimal(1)), (u'Fail', Decimal(0))], u'Pass', u'Pass')
+
+AmericanLetterScoreSystem = GlobalDiscreteValuesScoreSystem(
+    'AmericanLetterScoreSystem',
+    u'Letter Grade', u'American Letter Grade',
+    [('A', Decimal(4)), ('B', Decimal(3)), ('C', Decimal(2)),
+     ('D', Decimal(1)), ('F', Decimal(0))], 'A', 'D')
+
+ExtendedAmericanLetterScoreSystem = GlobalDiscreteValuesScoreSystem(
+    'ExtendedAmericanLetterScoreSystem',
+    u'Extended Letter Grade', u'American Extended Letter Grade',
+    [('A+', Decimal('4.0')), ('A', Decimal('4.0')), ('A-', Decimal('3.7')),
+     ('B+', Decimal('3.3')), ('B', Decimal('3.0')), ('B-', Decimal('2.7')),
+     ('C+', Decimal('2.3')), ('C', Decimal('2.0')), ('C-', Decimal('1.7')),
+     ('D+', Decimal('1.3')), ('D', Decimal('1.0')), ('D-', Decimal('0.7')),
+     ('F',  Decimal('0.0'))], 'A+', 'D-')
+
+
+class RangedValuesScoreSystem(AbstractValuesScoreSystem):
+    """Abstract Ranged Values Score System"""
+
+    zope.interface.implements(interfaces.IRangedValuesScoreSystem)
+
+    # See interfaces.IRangedValuesScoreSystem
+    min = None
+    max = None
+    _minPassingScore = None
+
+    def __init__(self, title=None, description=None,
+                 min=Decimal(0), max=Decimal(100), minPassingScore=None):
+        self.title = title
+        self.description = description
+        self.min, self.max = Decimal(min), Decimal(max)
+        if minPassingScore is not None:
+            minPassingScore = Decimal(minPassingScore)
+        self._minPassingScore = minPassingScore
+
+    def isPassingScore(self, score):
+        """See interfaces.IScoreSystem"""
+        if score is UNSCORED or self._minPassingScore is None:
+            return None
+        return score >= self._minPassingScore
+
+    def isValidScore(self, score):
+        """See interfaces.IScoreSystem"""
+        if score is UNSCORED:
+            return True
+        return score >= self.min and score <= self.max
+
+    def getBestScore(self):
+        """See interfaces.IScoreSystem"""
+        return self.max
+
+    def fromUnicode(self, rawScore):
+        """See interfaces.IScoreSystem"""
+        if rawScore == '':
+            return UNSCORED
+
+        score = Decimal(rawScore)
+
+        if not self.isValidScore(score):
+            raise zope.schema.ValidationError(
+                "%r is not a valid score." %score)
+        return score
+
+    def getNumericalValue(self, score):
+        """See interfaces.IScoreSystem"""
+        if score is UNSCORED:
+            return None
+        return Decimal(score)
+
+    def getFractionalValue(self, score):
+        """See interfaces.IScoreSystem"""
+        # normalized numerical score
+        value = self.getNumericalValue(score) - self.min
+        return value / (self.max - self.min)
+
+class GlobalRangedValuesScoreSystem(RangedValuesScoreSystem):
+
+    def __init__(self, name, *args, **kwargs):
+        self.__name__ = name
+        super(GlobalRangedValuesScoreSystem, self).__init__(*args, **kwargs)
+
+    def __reduce__(self):
+        return self.__name__
+
+
+PercentScoreSystem = GlobalRangedValuesScoreSystem(
+    'PercentScoreSystem',
+    u'Percent', u'Percent Score System', Decimal(0), Decimal(100), Decimal(60))
+
+HundredPointsScoreSystem = GlobalRangedValuesScoreSystem(
+    'HundredPointsScoreSystem',
+    u'100 Points', u'100 Points Score System',
+    Decimal(0), Decimal(100), Decimal(60))
+
+
+class ICustomScoreSystem(zope.interface.Interface):
+    """Marker interface for score systems created in the widget."""
+
+class IScoreSystemField(zope.schema.interfaces.IField):
+    """A field that represents score system."""
+
+class ScoreSystemField(zope.schema.Field):
+    """Score System Field."""
+    zope.interface.implements(IScoreSystemField)


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/scoresystem.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/security.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/security.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/security.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,107 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Requirement Security
+
+$Id: security.py 6268 2006-06-16 17:54:59Z ignas $
+"""
+from zope.component import adapts
+from zope.interface import implements
+
+from schooltool.course.interfaces import ISection
+from schooltool.course.section import LearnersCrowd
+from schooltool.course.section import InstructorsCrowd
+from schooltool.course.section import SectionCalendarSettingCrowd
+from schooltool.requirement.interfaces import IRequirement
+from schooltool.securitypolicy.crowds import ParentCrowd
+from schooltool.securitypolicy.crowds import AggregateCrowd
+from schooltool.app.security import LeaderCrowd
+from schooltool.securitypolicy.crowds import EverybodyCrowd
+from schooltool.securitypolicy.crowds import ParentCrowdTemplate
+from schooltool.securitypolicy.interfaces import ICrowd
+from schooltool.course.interfaces import ICourse
+
+
+class IRequirementParentCrowd(ICrowd):
+    """A crowd object that is used on a requirement's parent.
+
+    This is just a marker interface.
+    """
+
+
+RequirementViewersCrowd = ParentCrowd(
+    IRequirementParentCrowd, 'schooltool.view')
+
+
+RequirementEditorsCrowd = ParentCrowd(
+    IRequirementParentCrowd, 'schooltool.edit')
+
+
+class RequirementRequirementEditorsCrowd(ParentCrowdTemplate):
+    """People who can view subrequirements of a requirement.
+
+    Requirement editors crowd depends on the parent object, but if
+    that parent is a requirement we are retrieving permissions of it's
+    parent.
+    """
+    adapts(IRequirement)
+    implements(IRequirementParentCrowd)
+
+    permission = 'schooltool.edit'
+    interface = IRequirementParentCrowd
+
+
+class RequirementRequirementViewersCrowd(ParentCrowdTemplate):
+    """People who can view subrequirements of a requirement.
+
+    Requirement viewers crowd depends on the parent object, but if
+    that parent is a requirement we are retrieving permissions of it's
+    parent.
+    """
+    adapts(IRequirement)
+    implements(IRequirementParentCrowd)
+
+    permission = 'schooltool.view'
+    interface = IRequirementParentCrowd
+
+
+class CourseRequirementEditorsCrowd(LeaderCrowd):
+    """People who can edit requirements of a course"""
+    adapts(ICourse)
+    implements(IRequirementParentCrowd)
+
+
+class CourseRequirementViewersCrowd(EverybodyCrowd):
+    """People who can view requirements of a course"""
+    adapts(ICourse)
+    implements(IRequirementParentCrowd)
+
+
+class SectionRequirementEditorsCrowd(InstructorsCrowd):
+    """People who can edit requirements of a section"""
+    adapts(ISection)
+    implements(IRequirementParentCrowd)
+
+
+class SectionRequirementViewersCrowd(AggregateCrowd):
+    """People who can view requirements of a course"""
+    adapts(ISection)
+    implements(IRequirementParentCrowd)
+
+    def crowdFactories(self):
+        return [SectionCalendarSettingCrowd, InstructorsCrowd, LearnersCrowd]


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/security.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/security.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/security.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/security.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<configure xmlns="http://schooltool.org/securitypolicy"
+           xmlns:zope="http://namespaces.zope.org/zope">
+
+  <zope:adapter
+      for=".interfaces.IRequirement"
+      factory=".security.RequirementRequirementViewersCrowd"
+      provides=".security.IRequirementParentCrowd"
+      name="schooltool.view" />
+
+  <zope:adapter
+      for=".interfaces.IRequirement"
+      factory=".security.RequirementRequirementEditorsCrowd"
+      provides=".security.IRequirementParentCrowd"
+      name="schooltool.edit" />
+
+  <zope:adapter
+      for="schooltool.course.interfaces.ICourse"
+      factory=".security.CourseRequirementViewersCrowd"
+      provides=".security.IRequirementParentCrowd"
+      name="schooltool.view" />
+
+  <zope:adapter
+      for="schooltool.course.interfaces.ICourse"
+      factory=".security.CourseRequirementEditorsCrowd"
+      provides=".security.IRequirementParentCrowd"
+      name="schooltool.edit" />
+
+  <zope:adapter
+      for="schooltool.course.interfaces.ISection"
+      factory=".security.SectionRequirementViewersCrowd"
+      provides=".security.IRequirementParentCrowd"
+      name="schooltool.view" />
+
+  <zope:adapter
+      for="schooltool.course.interfaces.ISection"
+      factory=".security.SectionRequirementEditorsCrowd"
+      provides=".security.IRequirementParentCrowd"
+      name="schooltool.edit" />
+
+  <crowd
+      name="requirement_viewers"
+      factory=".security.RequirementViewersCrowd" />
+
+  <crowd
+      name="requirement_editors"
+      factory=".security.RequirementEditorsCrowd" />
+
+  <allow
+      interface=".interfaces.IRequirement"
+      permission="schooltool.view"
+      crowds="administration requirement_viewers" />
+
+  <allow
+      interface=".interfaces.IRequirement"
+      permission="schooltool.edit"
+      crowds="administration requirement_editors" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/security.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/testing.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/testing.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/testing.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,60 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Testing setup for schooltool.requirement
+
+$Id: testing.py 5631 2006-01-15 23:50:25Z srichter $
+"""
+__docformat__ = 'reStructuredText'
+
+import zope.component
+import zope.interface
+from zope.app import keyreference
+
+from schooltool.requirement import requirement, interfaces, evaluation
+
+class KeyReferenceStub(object):
+    """A stub implementation to allow testing of evaluations."""
+
+    key_type_id = 'tests.path'
+
+    def __init__(self, context):
+        self.context = context
+
+    def __call__(self):
+        return self.context
+
+    def __hash__(self):
+        return id(self.context)
+
+    def __cmp__(self, ref):
+        return cmp((self.key_type_id, self.__hash__()),
+                   (ref.key_type_id, ref.__hash__()))
+
+def setUpRequirement(test=None):
+    zope.component.provideAdapter(requirement.getRequirement,
+                                  (zope.interface.Interface,),
+                                  interfaces.IRequirement)
+
+def setUpEvaluation(test=None):
+    zope.component.provideAdapter(evaluation.getEvaluations,
+                                  (zope.interface.Interface,),
+                                  interfaces.IEvaluations)
+    zope.component.provideAdapter(KeyReferenceStub,
+                                  (zope.interface.Interface,),
+                                  keyreference.interfaces.IKeyReference)


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/testing.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/requirement/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/requirement/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/requirement/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,59 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Level-related Tests
+
+$Id: tests.py 5631 2006-01-15 23:50:25Z srichter $
+"""
+
+__docformat__ = 'restructuredtext'
+
+import unittest
+
+from zope.testing import doctest, doctestunit
+from zope.app.testing import setup
+
+from schooltool.requirement import testing
+
+def setUp(test):
+    setup.placefulSetUp()
+    testing.setUpRequirement()
+    testing.setUpEvaluation()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def test_suite():
+    return unittest.TestSuite((
+        doctest.DocFileSuite('README.txt',
+                             setUp=setUp, tearDown=tearDown,
+                             globs={'pprint': doctestunit.pprint},
+                             optionflags=doctest.NORMALIZE_WHITESPACE|
+                                         doctest.ELLIPSIS),
+        doctest.DocFileSuite('grades.txt',
+                             setUp=setUp, tearDown=tearDown,
+                             globs={'pprint': doctestunit.pprint},
+                             optionflags=doctest.NORMALIZE_WHITESPACE|
+                                         doctest.ELLIPSIS),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/requirement/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,20 @@
+# Make a package.
+
+def registerTestSetup():
+    from zope.interface import classImplements
+    from schooltool.testing import registry
+
+    def addResourceContainer(app):
+        from schooltool.resource import resource
+        app['resources'] = resource.ResourceContainer()
+    registry.register('ApplicationContainers', addResourceContainer)
+
+    def haveCalendar():
+        from schooltool.resource import resource
+        from schooltool.app.interfaces import IHaveCalendar
+        if not IHaveCalendar.implementedBy(resource.Resource):
+            classImplements(resource.Resource, IHaveCalendar)
+    registry.register('CalendarComponents', haveCalendar)
+
+registerTestSetup()
+del registerTestSetup


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/booking.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/booking.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/booking.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,166 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2007 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Resource Booking caledar and events
+
+$Id: booking.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+from zope.interface import implements
+from zope.app.session.interfaces import ISession
+from zope.location.location import locate
+
+from schooltool.calendar.simple import ImmutableCalendar
+from schooltool.resource.interfaces import IBookingCalendar
+from schooltool.calendar.simple import SimpleCalendarEvent
+from schooltool.resource.interfaces import IBookingCalendarEvent
+from schooltool.resource.interfaces import IBookingTimetableEvent
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.person.interfaces import IPerson
+from schooltool.timetable import TimetableActivity
+from schooltool.attendance.attendance import getRequestFromInteraction
+from schooltool.traverser.traverser import NameTraverserPlugin
+
+
+class BookingCalendarEvent(SimpleCalendarEvent):
+    implements(IBookingCalendarEvent)
+
+
+class BookingTimetableEvent(SimpleCalendarEvent):
+    implements(IBookingTimetableEvent)
+
+
+def createBookingCalendar(calendar, calendars, event_factory=BookingCalendarEvent):
+    events = []
+    for event in calendar:
+        resources = []
+        for resource_calendar in calendars:
+            evts = list(resource_calendar.expand(event.dtstart,
+                                                 event.dtstart + event.duration))
+            if not list(evts):
+                resources.append(resource_calendar.__parent__)
+
+        if resources:
+            event = event_factory(event.dtstart, event.duration,
+                                  event.title,
+                                  description=event.description,
+                                  unique_id=event.unique_id)
+            event.resources = resources
+            event.__parent__ = None
+            events.append(event)
+
+    return ImmutableCalendar(events)
+
+
+def getSelectedResourceCalendars(request):
+    rc = ISchoolToolApplication(None)['resources']
+    session = ISession(request)['schooltool.resource']
+    resource_calendars = [ISchoolToolCalendar(rc[resource_id])
+                          for resource_id in session['bookingSelection']]
+    return resource_calendars
+
+
+class ResourceBookingCalendar(ImmutableCalendar):
+    implements(IBookingCalendar)
+
+    def __init__(self, context):
+        self.context = context
+        self.__parent__ = self.context
+        self.__name__ = 'booking'
+        self.title = "Booking Calendar"
+
+    def createFullTimetable(self, school_timetable):
+        """Create a timetable with an activity for every possible period"""
+        timetable = school_timetable.createTimetable()
+
+        # must be set so event ids would get generated properly, as
+        # the ids use the absolutePath.
+        locate(timetable, self, 'booking-timetable')
+
+        for day_id, day in timetable.items():
+            for period_id in day.keys():
+                act = TimetableActivity(title=period_id, owner=None)
+                day.add(period_id, act, send_events=False)
+
+        return timetable
+
+    def expand(self, start, end):
+        app = ISchoolToolApplication(None)
+        terms = app["terms"]
+        school_timetables = app['ttschemas']
+
+        events = []
+        for term in terms.values():
+            # date component of these timestamps are in the right
+            # timezone already.
+            if (term.first > end.date()) or (term.last < start.date()):
+                # skip non overlapping terms
+                continue
+
+            timetable = self.createFullTimetable(school_timetables.getDefault())
+            calendar = timetable.model.createCalendar(term, timetable,
+                                                      start.date(),
+                                                      end.date())
+            events.extend(calendar.expand(start, end))
+
+        timetable_calendar = ImmutableCalendar(events)
+
+        resource_calendars = getSelectedResourceCalendars(self.request)
+        booking_calendar = createBookingCalendar(timetable_calendar,
+                                                 resource_calendars,
+                                                 event_factory=BookingTimetableEvent)
+        return booking_calendar.expand(start, end)
+
+    def __iter__(self):
+        return iter([])
+
+
+class ResourceBookingTraverserPlugin(NameTraverserPlugin):
+    """Traverse to an adapter by name."""
+
+    traversalName = 'booking'
+
+    def _traverse(self, request, name):
+        from zope.component import queryAdapter
+        bookingCalendar = queryAdapter(self.context, IBookingCalendar, name='')
+        if bookingCalendar is None:
+            from zope.publisher.interfaces import NotFound
+            raise NotFound(self.context, name, request)
+
+        bookingCalendar.request = request
+        return bookingCalendar
+
+
+class ResourceBookingCalendarProvider(object):
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getCalendars(self):
+        """Get a list of calendars to display.
+
+        Yields tuples (calendar, color1, color2).
+        """
+        person_calendar = ISchoolToolCalendar(IPerson(self.request.principal))
+        resource_calendars = getSelectedResourceCalendars(self.request)
+        booking_calendar = createBookingCalendar(person_calendar,
+                                                 resource_calendars)
+        yield (booking_calendar, '#9db8d2', '#7590ae')
+        yield (self.context, '#bfdaf4', '#99b2ce')


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/booking.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/booking.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/booking.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/booking.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,125 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2007 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Group Timetable caledar views.
+
+$Id: booking.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import urllib
+from datetime import datetime, timedelta
+from time import strptime
+
+from zope.publisher.browser import BrowserView
+from zope.traversing.browser.absoluteurl import absoluteURL
+from zope.security.interfaces import Unauthorized
+from zope.security.checker import canAccess
+
+from schooltool.app.browser.cal import CalendarViewBase
+from schooltool.app.browser.cal import DailyCalendarView
+from schooltool.app.browser.cal import WeeklyCalendarView
+from schooltool.app.browser.cal import MonthlyCalendarView
+from schooltool.app.browser.cal import YearlyCalendarView
+from schooltool.app.browser.cal import EventForDisplay
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.person.interfaces import IPerson
+from schooltool.app.cal import CalendarEvent
+
+
+class BookingCalendarViewBase(CalendarViewBase):
+
+    def getEvents(self, start_dt, end_dt):
+        """Get a list of EventForDisplay objects for a selected time interval.
+
+        `start_dt` and `end_dt` (datetime objects) are bounds (half-open) for
+        the result.
+        """
+        for calendar, color1, color2 in self.getCalendars():
+            for event in calendar.expand(start_dt, end_dt):
+                yield EventForDisplay(event, self.request, color1, color2,
+                                      calendar, self.timezone)
+
+    def canAddEvents(self):
+        """No one can add events to a booking calendar."""
+        return False
+
+    def canRemoveEvents(self):
+        """No one can remove events from a booking calendar."""
+        return False
+
+
+class DailyBookingCalendarView(DailyCalendarView, BookingCalendarViewBase):
+    pass
+
+
+class WeeklyBookingCalendarView(WeeklyCalendarView, BookingCalendarViewBase):
+    pass
+
+
+class MonthlyBookingCalendarView(MonthlyCalendarView, BookingCalendarViewBase):
+    pass
+
+
+class YearlyBookingCalendarView(YearlyCalendarView, BookingCalendarViewBase):
+    pass
+
+
+class CalendarEventBookOneResourceView(BrowserView):
+    """A view to book a resource to an event."""
+
+    def __call__(self):
+        app = ISchoolToolApplication(None)
+        person = IPerson(self.request.principal, None)
+        if not person:
+            raise Unauthorized("Only logged in users can book resources.")
+        cal = ISchoolToolCalendar(person)
+        if self.request.has_key('event_id'):
+            event = cal.find(self.request['event_id'])
+        else:
+            start_date = self.request.get('start_date')
+            start_time = self.request.get('start_time')
+            title = self.request.get('title')
+            start_datetime = "%s %s" % (start_date, start_time)
+            start_datetime = datetime(*strptime(start_datetime,
+                                                "%Y-%m-%d %H:%M:%S")[0:6])
+            duration = timedelta(seconds=int(self.request.get('duration')))
+            event = CalendarEvent(dtstart = start_datetime,
+                                  duration = duration,
+                                  title = title)
+            cal.addEvent(event)
+
+        if event:
+            for res_id, resource in app["resources"].items():
+                if res_id == self.request['resource_id']:
+                    resource_calendar = ISchoolToolCalendar(resource)
+                    if not canAccess(resource_calendar, "addEvent"):
+                        raise Unauthorized("You don't have the right to"
+                                           " book this resource!")
+                    event.bookResource(resource)
+        self.request.response.redirect(self.nextURL(event))
+
+    def nextURL(self, event):
+        """Return the URL to be displayed after the add operation."""
+        calURL = absoluteURL(event.__parent__, self.request)
+        cancel_url = calURL+'/delete.html?event_id=%s&date=%s' % (
+            event.unique_id,
+            event.dtstart.strftime("%Y-%m-%d"))
+        url = "%s/edit.html?cancel_url=%s" % (absoluteURL(event, self.request),
+                                               urllib.quote(cancel_url))
+        return url


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/booking.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/cal-booking.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/cal-booking.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/cal-booking.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,598 @@
+Functional doctest for calendaring
+==================================
+
+This test verifies the security checking for booked resources and
+events that book them.
+
+Set up
+------
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+Let's create a person so that we can fool around with his calendar:
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Frog', 'frog', 'pwd')
+
+Now let's create some resources that can be booked:
+
+    >>> manager.getLink('Resources').click()
+
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = 'lilly'
+    >>> manager.getControl('Add').click()
+
+After adding a lilly we should see the Resource in the resource type
+filter box available:
+
+    >>> print manager.contents
+    <BLANKLINE>
+    ...
+          <select id="SEARCH_TYPE" name="SEARCH_TYPE" size="1"
+                  onchange="javascript:this.form.submit()">
+                <option selected="1">Choose One</option>
+                <option disabled="disabled"
+                    class="dropdown-header"
+                    value="equipment|Equipment">Equipment</option>
+                <option disabled="disabled"
+                    class="dropdown-header"
+                    value="location|Location">Location</option>
+                <option disabled="disabled"
+                    class="dropdown-header"
+                    value="resource|Resource">Resource</option>
+                <option value="resource|Resource">Resource</option>
+    </select>
+    ...
+
+Let's click on it:
+
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> 'lilly' in manager.contents
+    True
+
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = 'mud'
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> 'mud' in manager.contents
+    True
+
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = 'fish'
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> 'fish' in manager.contents
+    True
+
+We log in as the frog
+
+    >>> frog = Browser()
+    >>> frog.open('http://localhost/')
+    >>> frog.getLink('Log In').click()
+    >>> frog.getControl('Username').value = 'frog'
+    >>> frog.getControl('Password').value = 'pwd'
+    >>> frog.getControl('Log in').click()
+
+and set up a calendar for Frog:
+
+    >>> print http(r"""
+    ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+    ... Host: localhost:7080
+    ... Authorization: Basic frog:pwd
+    ... Content-Length: 244
+    ... Content-Type: text/calendar
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:dummy-uid
+    ... SUMMARY:Test event
+    ... DTSTART:20050204T100000
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+Frog should not be capable of booking any resources yet:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-04')
+    >>> frog.getLink('Test event').click()
+
+    >>> import traceback
+    >>> from zope.exceptions.exceptionformatter import print_exception
+    >>> traceback.print_exception = print_exception
+
+    >>> frog.handleErrors = False
+    >>> frog.getLink('edit resources').click()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    <legend>Available resources</legend>
+    ...
+
+But we can give him that right by making him a leader of that
+resource:
+
+    >>> manager.open('http://localhost/resources/mud/@@leaders.html')
+    >>> manager.getControl('Frog').click()
+    >>> manager.getControl('Add').click()
+
+    >>> manager.open('http://localhost/resources/fish/@@leaders.html')
+    >>> manager.getControl('Frog').click()
+    >>> manager.getControl('Add').click()
+
+Frog should see the mud and the fish now:
+
+    >>> frog.reload()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+      <fieldset>
+          <legend>Available resources</legend>
+    ...
+          <input type="checkbox" name="add_item.fish" id="add_item.fish" />
+    ...
+          <input type="checkbox" name="add_item.mud" id="add_item.mud" />
+    ...
+        </table>
+    ...
+      </fieldset>
+    ...
+
+Let's book one of them:
+
+    >>> frog.getControl('mud').selected = True
+    >>> frog.getControl('Book').click()
+
+We should see the resource as a booked resource:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-04')
+    >>> frog.getLink('Test event').click()
+    >>> frog.getLink('edit resources').click()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+        <input type="checkbox" name="remove_item.mud" id="remove_item.mud" />
+    ...
+
+     <fieldset>
+          <legend>Available resources</legend>
+    ...
+          <input type="checkbox" name="add_item.fish" id="add_item.fish"/>
+    ...
+      </fieldset>
+    ...
+
+Let's unbook one of them and book another:
+
+    >>> frog.getControl('mud').selected = True
+    >>> frog.getControl('UnBook').click()
+    >>> frog.getControl('fish').selected = True
+    >>> frog.getControl('Book').click()
+
+Now another resource is booked
+
+Frog should see the event in the resource calendar too:
+
+    >>> frog.open(
+    ...     'http://localhost/resources/fish/calendar/2005-02-04/')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    <a href="http://localhost/resources/fish/calendar/ZHVtbXktdWlk"
+       title="Test event">
+      Test event
+      <span class="start-end">
+        (<span>10:00</span> -
+        <span>11:00</span>)
+      </span>
+    </a>
+    ...
+    <div class="booked-resources">
+      <h6 class="booked-resource-header"
+               style="background: #7590ae">
+        <a style="color: #000;"
+           href="...ZHVtbXktdWlk/booking.html?date=2005-02-04">Booked by</a></h6>
+      <a href="http://localhost/persons/frog">Frog</a>
+    </div>
+    ...
+
+If Frog decides to book another resource from the resource's calendar,
+and then changes his mind by clicking on Cancel, the resource won't be
+booked.
+
+    >>> frog.open('http://localhost/resources/fish/calendar')
+    >>> frog.getLink('10:00').click()
+    >>> frog.getControl('Title').value="Canceled Event"
+    >>> frog.getControl('Cancel').click()
+    >>> 'Canceled Event' not in frog.contents
+    True
+
+Now if we remove the permission to book the fish:
+
+    >>> manager.open('http://localhost/resources/fish/@@leaders.html')
+    >>> manager.getControl('Frog').click()
+    >>> manager.getControl('Remove').click()
+
+The fish should stay in the bookable resources list:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-04')
+    >>> frog.getLink('Test event').click()
+    >>> frog.getLink('edit resources').click()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+      <fieldset>
+        <legend>Booked resources</legend>
+    ...
+        <input type="checkbox" name="remove_item.fish" id="remove_item.fish" />
+    ...
+      </fieldset>
+    ...
+
+Unless unbooked:
+
+    >>> frog.getControl('fish').selected = True
+    >>> frog.getControl('UnBook').click()
+    >>> 'name="add_item.fish" id="add_item.fish"' not in frog.contents
+    True
+
+
+When adding a new event we should get redirected to resource booking
+if Book Resources is checked:
+
+    >>> frog.getLink('My Calendar').click()
+    >>> frog.getLink('New Event').click()
+    >>> frog.getControl('Title').value = 'Sleeping'
+    >>> frog.getControl('Date').value = '2005-02-03'
+    >>> frog.getControl('Time').value = '01:00'
+    >>> frog.getControl('Duration').value = '500'
+    >>> frog.getControl('Recurring').selected = True
+    >>> frog.getControl(name='field.recurrence.used').value = '1'
+    >>> frog.getControl('Book Resources').selected = True
+    >>> frog.getControl('Add').click()
+
+    >>> 'Resource Booking for Sleeping' in frog.contents
+    True
+
+Editing view should have a link to its booking view:
+
+    >>> frog.open(
+    ...   'http://localhost/persons/frog/calendar/ZHVtbXktdWlk/edit.html')
+    >>> frog.getLink('Book resources')
+    <Link text='Book resources'
+          url='.../frog/calendar/ZHVtbXktdWlk/booking.html'>
+
+Let's book the mud again (Regression test for 266, deletion of events that book
+resources should remove events from resource calendars):
+
+    >>> frog.getLink('Book resources').click()
+    >>> frog.getControl('mud').selected = True
+    >>> frog.getControl('Book').click()
+
+We can see the event in mud's calendar:
+
+    >>> frog.open('http://localhost/resources/mud/calendar/2005-02-04')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    <a style="color: #000;"
+       href="http://.../booking.html?date=2005-02-04">Booked by</a></h6>
+    ...
+
+If we will delete the event from mud's calendar the original event
+should stay in place, yet the resource should become unbooked:
+
+    XXX: Have to call URL, since I could not find the link!!!
+    >>> manager.open('http://localhost/resources/mud/calendar/'
+    ...           'delete.html?event_id=dummy-uid&date=2005-02-04')
+    >>> 'Test event' in manager.contents
+    False
+
+Frog still can see the event:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-04')
+    >>> 'Test event' in frog.contents
+    True
+
+Yet mud is not booked anymore:
+
+    >>> frog.getLink('Test event').click()
+    >>> frog.getLink('edit resources').click()
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+          <input type="checkbox" name="add_item.mud" id="add_item.mud" />
+    ...
+
+Let's book it again:
+
+    >>> frog.getControl('mud').selected = True
+    >>> frog.getControl('Book').click()
+
+It is in mud's calendar again:
+
+    >>> frog.open('http://localhost/resources/mud/calendar/2005-02-04')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    <a style="color: #000;"
+       href="http://.../booking.html?date=2005-02-04">Booked by</a></h6>
+    ...
+
+And delete the event from frog's calendar:
+
+    >>> manager.open(
+    ...     'http://localhost/persons/frog/calendar/2005-02-04')
+    >>> manager.getLink(url='delete.html?event_id=dummy-uid').click()
+
+The event should be gone from the frog's calendar:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-02-04')
+    >>> "dummy-uid" in frog.contents
+    False
+
+And it should not be seen in mud's calendar too:
+
+    >>> frog.open('http://localhost/resources/mud/calendar/2005-02-04')
+    >>> "dummy-uid" in frog.contents
+    False
+
+Let's do some event clashing, first we set up some overlapping events:
+
+    >>> print http(r"""
+    ... PUT /persons/frog/calendar/calendar.ics HTTP/1.1
+    ... Host: localhost:7080
+    ... Authorization: Basic frog:pwd
+    ... Content-Length: 244
+    ... Content-Type: text/calendar
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:dummy-uid1
+    ... SUMMARY:Test event1
+    ... DTSTART:20050204T093000
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... BEGIN:VEVENT
+    ... UID:dummy-uid2
+    ... SUMMARY:Test event2
+    ... DTSTART:20050204T100000
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... BEGIN:VEVENT
+    ... UID:dummy-uid3
+    ... SUMMARY:Test event3
+    ... DTSTART:20050204T103000
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+Now let's allow frog access all resources:
+
+    >>> manager.open('http://localhost')
+
+    >>> manager.getLink('Resources').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> manager.getLink('mud').click()
+    >>> manager.getLink('View Calendar').click()
+
+    >>> manager.open('http://localhost/resources/fish/@@leaders.html')
+    >>> manager.getControl('Frog').click()
+    >>> manager.getControl('Add').click()
+
+If we book some resources for the second event,
+
+    >>> frog.handleErrors = False
+    >>> frog.open(
+    ...     'http://localhost/persons/frog/calendar/ZHVtbXktdWlkMg%3D%3D')
+    >>> frog.getLink('edit resources').click()
+    >>> frog.getControl('mud').selected = True
+    >>> frog.getControl('fish').selected = True
+    >>> frog.getControl('Book').click()
+
+Unless we are looking at "Test event2" itself:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/ZHVtbXktdWlkMg%3D%3D')
+    >>> frog.getLink('edit resources').click()
+    >>> 'type="checkbox" name="remove_item.fish"' in frog.contents
+    True
+    >>> 'type="checkbox" name="remove_item.mud"' in frog.contents
+    True
+
+Let's add another person, frog's boss:
+
+    >>> addPerson('Stork', 'stork', 'pwd')
+
+The boss decides to take a mud bath, so he creates an event.
+
+    >>> print http(r"""
+    ... PUT /persons/stork/calendar/calendar.ics HTTP/1.1
+    ... Host: localhost:7080
+    ... Authorization: Basic stork:pwd
+    ... Content-Type: text/calendar
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:smartie-uid
+    ... SUMMARY:Mud bath
+    ... DTSTART:20050807T100000
+    ... DURATION:PT2H
+    ... DTSTAMP:20050818T150000
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+Stork should have access to the resources:
+
+    >>> manager.open('http://localhost/resources/mud/@@leaders.html')
+    >>> manager.getControl('Stork').click()
+    >>> manager.getControl('Add').click()
+
+And then stork books mud.
+
+    >>> stork = Browser()
+    >>> stork.open('http://localhost/')
+    >>> stork.getLink('Log In').click()
+    >>> stork.getControl('Username').value = 'stork'
+    >>> stork.getControl('Password').value = 'pwd'
+    >>> stork.getControl('Log in').click()
+
+    >>> stork.open(
+    ...     'http://localhost/persons/stork/calendar/c21hcnRpZS11aWQ%3D')
+    >>> stork.getLink('edit resources').click()
+    >>> stork.getControl('mud').selected = True
+    >>> stork.getControl('Book').click()
+
+Frog should still be able to see the resource's calendar
+(regression test for issue 352):
+
+    >>> frog.open('http://localhost/resources/mud/calendar/2005-08-07')
+    >>> print frog.contents
+    <BLANKLINE>
+    ...
+    <h6 ...>
+      <a href="http://localhost/resources/mud/calendar/c21hcnRpZS11aWQ%3D"
+         title="Mud bath">
+        Mud bath
+      ...
+    </h6>
+    ...
+
+Let's delete mud:
+
+    >>> manager.open('http://localhost/resources/')
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> manager.getControl(name='delete.mud').value = True
+    >>> manager.getControl('Delete').click()
+    >>> manager.getControl('Confirm').click()
+
+Stork should still be able to see his calendar:
+(regression test for issue 472: Deleting booked resource makes calendar
+ unviewable.)
+
+    >>> stork.open('http://localhost/persons/stork/calendar/2005-08-07')
+    >>> print stork.contents
+    <BLANKLINE>
+    ...
+    <h6 ...>
+      <a href="http://localhost/persons/stork/calendar/c21hcnRpZS11aWQ%3D"
+         title="Mud bath">
+        Mud bath
+      ...
+    </h6>
+    ...
+
+Now, let's test the paging, for that we'll need to create a profuse amount of resources.
+
+    >>> manager.open('http://localhost/resources')
+    >>> manager.getLink('Import Resources').click()
+    >>> moofest = """mooa
+    ... moob
+    ... mooc
+    ... mood
+    ... mooe
+    ... moof
+    ... moog
+    ... mooh
+    ... mooi
+    ... mooj
+    ... mook
+    ... mool
+    ... moom
+    ... moon
+    ... """
+    >>> manager.getControl('CSV Data').value = moofest
+    >>> manager.getControl('Submit').click()
+
+Now let's create an event for the manager.
+
+    >>> manager.getLink('My Calendar').click()
+    >>> manager.getLink('New Event').click()
+    >>> manager.getControl('Title').value = 'Moo Fest'
+    >>> manager.getControl('Date').value = '2005-02-03'
+    >>> manager.getControl('Time').value = '01:00'
+    >>> manager.getControl('Duration').value = '500'
+    >>> manager.getControl('Recurring').selected = True
+    >>> manager.getControl(name='field.recurrence.used').value = '1'
+    >>> manager.getControl('Book Resources').selected = True
+    >>> manager.getControl('Add').click()
+
+Now on to play with the paging! The default batch size is 10, keeping in mind the 2 reources created before
+the 11 item should be `mooi`.
+
+    >>> manager.getLink('2').click()
+    >>> print manager.contents
+    <BLANKLINE>
+    ...
+    <input type="checkbox" name="add_item.mooi" id="add_item.mooi" />
+    ...
+
+Howevever, `mooa` should not be in the list.
+
+    >>> '<input type="checkbox" name="add_item.mooa" id="add_item.mooa" />' not in manager.contents
+    True
+
+Let's test the searching, we have a bunch of moos, so let's search for `moo`.
+Now `mooj` should be the tenth in the item and `mooa` should be the first.
+
+    >>> manager.getControl(name="SEARCH_TITLE").value = "moo"
+    >>> manager.getControl(name="SEARCH_BUTTON").click()
+    >>> print manager.contents
+    <BLANKLINE>
+    ...
+    <input type="checkbox" name="add_item.mooa" id="add_item.mooa" />
+    ...
+    <input type="checkbox" name="add_item.mooj" id="add_item.mooj" />
+    ...
+
+The item `mud` should not be in the list.
+
+    >>> '<input type="checkbox" name="add_item.mud" id="add_item.mud" />' not in manager.contents
+    True
+
+Let's search for something specific.
+
+    >>> manager.getControl(name="SEARCH_TITLE").value = "fish"
+    >>> manager.getControl(name="SEARCH_BUTTON").click()
+    >>> print manager.contents
+    <BLANKLINE>
+    ...
+    <input type="checkbox" name="add_item.fish" id="add_item.fish" />
+    ...
+
+We shouldn't have any extra items after the search query:
+
+    >>> '<input type="checkbox" name="add_item.mud" id="add_item.mud" />' not in manager.contents
+    True


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/cal-booking.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,295 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <!-- Resource Traverser -->
+  <zope:view
+      for="..interfaces.IBaseResource"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.publisher.interfaces.browser.IBrowserPublisher"
+      factory="schooltool.traverser.browser.PluggableBrowserTraverser"
+      permission="zope.Public"
+      />
+
+  <zope:adapter
+      for="schooltool.resource.types.ResourceFactoryUtility
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory=".resource.ResourceTypeFilter"
+      />
+
+  <zope:adapter
+      for="schooltool.resource.types.LocationFactoryUtility
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory=".resource.LocationTypeFilter"
+      />
+
+  <zope:adapter
+      for="schooltool.resource.types.EquipmentFactoryUtility
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory=".resource.EquipmentTypeFilter"
+      />
+
+  <viewlet
+      name="resource-booking-info"
+      for="*"
+      manager="schooltool.app.browser.skin.ICalendarEventViewletManager"
+      template="event_booking_viewlet.pt"
+      permission="zope.Public"
+      order="20"
+      />
+
+  <viewlet
+      name="resource-booking-edit"
+      for="schooltool.resource.booking.IBookingCalendar"
+      class="schooltool.app.browser.skin.CalendarEventBookingViewlet"
+      manager="schooltool.app.browser.skin.ICalendarEventViewletManager"
+      template="event_edit_booking_viewlet.pt"
+      permission="zope.Public"
+      order="30"
+      />
+
+  <configure package="schooltool.skin">
+
+    <page
+        name="index.html"
+        for="schooltool.resource.interfaces.IResourceContainer"
+        class="schooltool.resource.browser.resource.ResourceContainerView"
+        permission="schooltool.view"
+        menu="zmi_views"
+        title="View"
+        />
+
+    <addform
+        label="Add a Resource"
+        name="addSchoolToolResource.html"
+        schema="schooltool.resource.interfaces.IResource"
+        fields="title description notes"
+        set_before_add="title description notes"
+        content_factory="schooltool.resource.resource.Resource"
+        template="templates/simple_add.pt"
+        class="schooltool.app.browser.app.BaseAddView"
+        permission="schooltool.edit">
+      <widget field="description" height="5" />
+    </addform>
+
+    <editform
+        for="schooltool.resource.interfaces.IResource"
+        name="edit.html"
+        label="Edit Resource Information"
+        schema="schooltool.resource.interfaces.IResource"
+        fields="title description notes"
+        permission="schooltool.edit"
+        template="templates/simple_edit.pt"
+        class="schooltool.resource.browser.resource.ResourceEditView"
+        menu="schooltool_actions"
+        title="Edit Info">
+      <widget field="description" height="5" />
+    </editform>
+
+    <!-- Location forms -->
+    <addform
+        label="Add a Location"
+        name="addSchoolToolLocation.html"
+        schema="schooltool.resource.interfaces.ILocation"
+        fields="title type description capacity notes"
+        set_before_add="title type description capacity notes"
+        content_factory="schooltool.resource.resource.Location"
+        template="templates/simple_add.pt"
+        class="schooltool.app.browser.app.BaseAddView"
+        permission="schooltool.edit">
+      <widget field="description" height="5" />
+      <widget field="type"
+	      class="schooltool.resource.browser.resource.ResourceSubTypeWidget"
+	      utility="location"/>
+    </addform>
+
+    <editform
+        for="schooltool.resource.interfaces.ILocation"
+        name="edit.html"
+        label="Edit Location Information"
+        schema="schooltool.resource.interfaces.ILocation"
+        fields="title type description capacity notes"
+        permission="schooltool.edit"
+        template="templates/simple_edit.pt"
+        class="schooltool.resource.browser.resource.ResourceEditView"
+        menu="schooltool_actions"
+        title="Edit Info">
+      <widget field="description" height="5" />
+      <widget field="type"
+	      class="schooltool.resource.browser.resource.ResourceSubTypeWidget"
+	      utility="location"/>
+    </editform>
+
+    <!-- Equipment forms -->
+    <addform
+        label="Add an Equipment"
+        name="addSchoolToolEquipment.html"
+        schema="schooltool.resource.interfaces.IEquipment"
+        fields="title description type manufacturer model serialNumber
+                purchaseDate notes"
+        set_before_add="title description notes type manufacturer model
+                        serialNumber purchaseDate"
+        content_factory="schooltool.resource.resource.Equipment"
+        template="templates/simple_add.pt"
+        class="schooltool.app.browser.app.BaseAddView"
+        permission="schooltool.edit">
+      <widget field="description" height="5" />
+      <widget field="type"
+	      class="schooltool.resource.browser.resource.ResourceSubTypeWidget"
+	      utility="equipment"/>
+    </addform>
+
+    <editform
+        for="schooltool.resource.interfaces.IEquipment"
+        name="edit.html"
+        label="Edit Equipment Information"
+        schema="schooltool.resource.interfaces.IEquipment"
+        fields="title description type manufacturer model serialNumber
+                purchaseDate notes"
+        permission="schooltool.edit"
+        template="templates/simple_edit.pt"
+        class="schooltool.resource.browser.resource.ResourceEditView"
+        menu="schooltool_actions"
+        title="Edit Info">
+      <widget field="description" height="5" />
+      <widget field="type"
+	      class="schooltool.resource.browser.resource.ResourceSubTypeWidget"
+	      utility="equipment"/>
+    </editform>
+
+    <navigationViewlet
+      name="resources"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.TopLevelContainerNavigationViewlet"
+      permission="schooltool.view"
+      link="resources"
+      title="Resources"
+      order="60"
+      />
+
+  </configure>
+
+
+  <containerViews
+      for="..interfaces.IResourceContainer"
+      contents="schooltool.view"
+      add="schooltool.edit"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="New Resource"
+      for="..interfaces.IResourceContainer"
+      action="+/addSchoolToolResource.html"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="New Location"
+      for="..interfaces.IResourceContainer"
+      action="+/addSchoolToolLocation.html"
+      />
+
+  <menuItem
+      menu="schooltool_actions"
+      title="New Equipment"
+      for="..interfaces.IResourceContainer"
+      action="+/addSchoolToolEquipment.html"
+      />
+
+  <addMenuItem
+      title="SchoolBell Resource"
+      description="A Resource"
+      class="..resource.Resource"
+      permission="schooltool.edit"
+      view="addSchoolToolResource.html"
+      />
+
+  <page
+      name="index.html"
+      for="..interfaces.IResource"
+      class=".resource.ResourceView"
+      permission="schooltool.view"
+      />
+
+  <page
+      name="index.html"
+      for="..interfaces.ILocation"
+      class=".resource.LocationView"
+      permission="schooltool.view"
+      />
+
+  <page
+      name="index.html"
+      for="..interfaces.IEquipment"
+      class=".resource.EquipmentView"
+      permission="schooltool.view"
+      />
+
+  <page
+      name="resource-csvimport.html"
+      for="..interfaces.IResourceContainer"
+      class=".csvimport.ResourceCSVImportView"
+      template="resource-csvimport.pt"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Import Resources"
+      />
+
+  <zope:adapter
+      for="schooltool.resource.interfaces.IResourceContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory=".resource.ResourceContainerFilterWidget" />
+
+  <zope:adapter
+      for="schooltool.resource.interfaces.IResourceContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory="schooltool.table.table.SchoolToolTableFormatter " />
+
+  <zope:configure package="schooltool.app.browser">
+    <page
+       name="daily.html"
+       for="schooltool.resource.interfaces.IBookingCalendar"
+       class="schooltool.resource.browser.booking.DailyBookingCalendarView"
+       template="templates/cal_daily.pt"
+       permission="schooltool.view"
+       />
+
+    <page
+       name="weekly.html"
+       for="schooltool.resource.interfaces.IBookingCalendar"
+       class="schooltool.resource.browser.booking.WeeklyBookingCalendarView"
+       template="templates/cal_weekly.pt"
+       permission="schooltool.view"
+       />
+
+    <page
+       name="monthly.html"
+       for="schooltool.resource.interfaces.IBookingCalendar"
+       class="schooltool.resource.browser.booking.MonthlyBookingCalendarView"
+       template="templates/cal_monthly.pt"
+       permission="schooltool.view"
+       />
+
+    <page
+       name="yearly.html"
+       for="schooltool.resource.interfaces.IBookingCalendar"
+       class="schooltool.resource.browser.booking.YearlyBookingCalendarView"
+       template="templates/cal_yearly.pt"
+       permission="schooltool.view"
+       />
+
+  </zope:configure>
+
+  <page
+      for="schooltool.resource.interfaces.IBookingCalendar"
+      name="book_one_resource.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class=".booking.CalendarEventBookOneResourceView"
+      permission="zope.View"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/container_delete.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/container_delete.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/container_delete.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,36 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title">
+    Delete items
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header" i18n:translate="">
+  Are you sure you want to delete selected items?
+</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="objects view/itemsToDelete">
+  <p tal:condition="not:objects" i18n:translate="">You have not
+  selected any items.</p>
+  <ul tal:condition="objects">
+    <form method="post"
+          action="delete.html">
+      <li tal:repeat="obj objects/sortby:title">
+        <input type="hidden" tal:attributes="name string:delete.${obj/zope:name}" />
+        <a tal:content="obj/title"
+           tal:attributes="href obj/@@absolute_url">Some Object</a>
+      </li>
+      <div class="controls">
+        <input type="submit" class="button-cancel" name="CONFIRM" value="Confirm"
+               i18n:attributes="value delete-button;" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+      </div>
+    </form>
+  </ul>
+
+</metal:block>
+</body></html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/container_delete.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/csvimport.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/csvimport.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/csvimport.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,71 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+csv importing.
+
+$Id: csvimport.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+from schooltool.app.browser.csvimport import BaseCSVImporter, BaseCSVImportView
+from schooltool.resource.resource import Resource, Location
+
+from schooltool import SchoolToolMessage as _
+
+
+def resourceFactory(self, title=u"", description=u"", isLocation=False):
+    if isLocation:
+        return Location(title=title, description=description)
+    else:
+        return Resource(title=title, description=description)
+
+
+class ResourceCSVImporter(BaseCSVImporter):
+    """Resource CSV Importer"""
+
+    factory = resourceFactory
+
+    def createAndAdd(self, data, dry_run=True):
+        """Create objects and add them to the container."""
+
+        if len(data) < 1:
+            self.errors.fields.append(_('Insufficient data provided.'))
+            return
+
+        if not data[0]:
+            self.errors.fields.append(_('Titles may not be empty'))
+            return
+
+        if len(data) > 1:
+            description = data[1]
+        else:
+            description = ''
+
+        isLocation =  len(data) > 2
+
+        obj = self.factory(title=data[0], description=description,
+                           isLocation=isLocation)
+        name = self.chooser.chooseName('', obj)
+
+        if not dry_run:
+            self.container[name] = obj
+
+
+class ResourceCSVImportView(BaseCSVImportView):
+    """View for Resource CSV importer."""
+
+    importer_class = ResourceCSVImporter


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/csvimport.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/event_booking_viewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/event_booking_viewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/event_booking_viewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,26 @@
+<tal:block define="event view/manager/event;
+                   resources event/getBookedResources;
+                   booker event/getBooker"
+           tal:condition="resources">
+<div class="booked-resources"
+     i18n:domain="schooltool"
+     tal:condition="resources">
+  <h6 class="booked-resource-header"
+      tal:attributes="style string:background: ${event/color2}">
+    <a style="color: #000;"
+       tal:attributes="href event/bookingLink">Booked resources</a></h6>
+  <tal:block tal:repeat="resource resources">
+    <a tal:attributes="href resource/@@absolute_url"
+       tal:content="resource/title">(A Pond)</a>
+  </tal:block>
+</div>
+<div class="booked-resources"
+     tal:condition="booker">
+  <h6 class="booked-resource-header"
+      tal:attributes="style string:background: ${event/color2}">
+    <a style="color: #000;"
+       tal:attributes="href event/bookingLink">Booked by</a></h6>
+  <a tal:attributes="href booker/@@absolute_url"
+     tal:content="booker/title">(A Dude)</a>
+</div>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/event_booking_viewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/event_edit_booking_viewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/event_edit_booking_viewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/event_edit_booking_viewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,17 @@
+<tal:block define="event view/manager/event;
+                   resources event/getBookedResources;
+                   booker event/getBooker;
+                   listResources view/listResources"
+            condition="event">
+<div class="booked-resources"
+     i18n:domain="schooltool">
+  <h6 class="booked-resource-header"
+      tal:attributes="style string:background: ${event/color2}">Add a resource</h6>
+  <ul>
+    <li tal:repeat="resource listResources">
+      <a href="" tal:content="resource/title"
+         tal:attributes="href python:view.bookingUrl(resource['id'])"/>
+    </li>
+  </ul>
+</div>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/event_edit_booking_viewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/ftests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/ftests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/ftests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,32 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.resource.
+
+$Id: ftests.py $
+"""
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+
+def test_suite():
+    return collect_ftests()
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/ftests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-booking.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-booking.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-booking.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,113 @@
+Functional test for Resource booking through the resource container
+===================================================================
+
+Let's log in:
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+And add a couple of resources to book:
+
+    >>> manager.getLink('Resources').click()
+    >>> manager.getLink('New Location').click()
+    >>> manager.getControl('Title').value = 'mud'
+    >>> manager.getControl(name='field.type.newSubType').value = 'Computer Lab'
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['location|Computer Lab']
+    >>> manager.getControl('Search').click()
+    >>> 'mud' in manager.contents
+    True
+
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = 'fish'
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> 'fish' in manager.contents
+    True
+
+And a few events to our calendar:
+
+    >>> manager.getLink('My Calendar').click()
+    >>> manager.getLink('New Event').click()
+    >>> manager.getControl('Title').value = "Some big event"
+    >>> manager.getControl('Date').value = "2005-01-15"
+    >>> manager.getControl('Time').value = "10:15"
+    >>> manager.getControl('Add').click()
+
+    >>> manager.getLink('New Event').click()
+    >>> manager.getControl('Title').value = "Some other big event"
+    >>> manager.getControl('Date').value = "2005-01-15"
+    >>> manager.getControl('Time').value = "12:35"
+    >>> manager.getControl('Add').click()
+
+    >>> manager.getLink('New Event').click()
+    >>> manager.getControl('Title').value = "Some other big event"
+    >>> manager.getControl('Date').value = "2005-01-16"
+    >>> manager.getControl('Time').value = "17:35"
+    >>> manager.getControl('Add').click()
+
+And a couple of events to our resource calendars:
+
+    >>> manager.getLink('Resources').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> manager.getLink('fish').click()
+    >>> manager.getLink('View Calendar').click()
+
+    >>> manager.getLink('New Event').click()
+    >>> manager.getControl('Title').value = "A small event"
+    >>> manager.getControl('Date').value = "2005-01-15"
+    >>> manager.getControl('Time').value = "11:55"
+    >>> manager.getControl('Add').click()
+
+
+    >>> manager.getLink('Resources').click()
+    >>> manager.getControl('Type').value = ['location|Computer Lab']
+    >>> manager.getControl('Search').click()
+    >>> manager.getLink('mud').click()
+    >>> manager.getLink('View Calendar').click()
+
+    >>> manager.getLink('New Event').click()
+    >>> manager.getControl('Title').value = "Another small event"
+    >>> manager.getControl('Date').value = "2005-01-15"
+    >>> manager.getControl('Time').value = "10:55"
+    >>> manager.getControl('Add').click()
+
+Now if we go to the resource container and select both resources for
+booking:
+
+    >>> manager.getLink('Resources').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+
+    >>> manager.getControl(name='delete.fish').value = ['delete.fish']
+
+And go to their booking calendar:
+
+    >>> manager.getControl('Book').click()
+
+When we select the right date we should see a booking event:
+
+    >>> manager.handleErrors = False
+    >>> manager.open("%s/%s" % (manager.url, '2005-01-15'))
+    >>> manager.getLink('fish').click()
+
+Now we should have booked a 'fish' for the '2005-01-15' and we have
+been redirected on the 2005-01-15 view:
+
+    >>> manager.getControl('Title').value
+    'Some big event'
+
+    >>> manager.getControl('Date').value
+    '2005-01-15'
+
+And the fish resource is well booked:
+
+    >>> manager.getLink('Book resources').click()
+    >>> print analyze.queryHTML('//label[@for="remove_item.fish"]', manager.contents)[0]
+    <label for="remove_item.fish">fish</label>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-booking.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-csvimport.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-csvimport.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-csvimport.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+<tal:defs define="update view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+  <head>
+    <title metal:fill-slot="title" i18n:translate="">
+      Upload schooltool resources as CSV
+    </title>
+  </head>
+  <body>
+
+    <metal:block metal:fill-slot="body">
+
+      <div class="info" tal:condition="view/success">
+        <p tal:repeat="msg view/success" tal:content="msg" />
+      </div>
+      <div class="error" tal:condition="view/errors"
+        tal:repeat="err view/errors" tal:content="err" />
+
+      <form method="POST" enctype="multipart/form-data" class="standalone"
+        tal:attributes="action request/URL">
+
+        <h3 i18n:translate="">
+          Import Resources
+        </h3>
+        <p i18n:translate="">
+          CSV data <strong>must</strong> include a resource title and
+          <strong>may</strong> include an optional resource description.  Any
+          extra information will be discarded.
+        </p>
+        <p i18n:translate="">Example:</p>
+
+<pre i18n:translate="">
+PRJ302, Overhead Projector #302
+Main Auditorium
+LC-805, Laptop Computer #805, <em>text after a second comma</em>
+</pre>
+        <p i18n:translate="">
+          The above example will create 3 resources titled 'PRJ302',
+          'Main Auditorium' and 'LC-805'.  The first and last
+          resource will have the descriptions 'Overhead Projector #302' and
+          'Laptop Computer #805' respectively.  The "Main Auditorium" resource
+          will have no description, and the "text after a second comma" text on
+          the third resource will be ignored.
+        </p>
+
+        <fieldset>
+          <legend i18n:translate="">Upload CSV File</legend>
+          <div class="row">
+            <label for="csvfile" i18n:translate="">CSV File</label>
+            <input id="csvfile" type="file" name="csvfile"/>
+          </div>
+
+          <div class="row">
+            <tal:block i18n:translate="">Charset:</tal:block>
+            <select name="charset">
+              <option value="UTF-8" i18n:translate="">Unicode (UTF-8)</option>
+              <option value="ISO-8859-1" i18n:translate="">Western (ISO-8859-1)</option>
+              <option value="ISO-8859-15" i18n:translate="">Western (ISO-8859-15)</option>
+              <option value="Windows-1252" i18n:translate="">Western (Windows-1252)</option>
+              <option value="other" i18n:translate="">Other (please specify)</option>
+            </select>
+          </div>
+          <div class="row" i18n:translate="">
+            Other charset: <input name="other_charset" type="text" i18n:name="other_charset" />
+          </div>
+        </fieldset>
+        <fieldset>
+          <legend i18n:translate="">Input CSV Data</legend>
+          <label for="csvtext" i18n:translate="">CSV Data</label>
+          <textarea name="csvtext" id="csvtext" cols="50" rows="10"></textarea>
+        </fieldset>
+        <div class="controls">
+          <input name="UPDATE_SUBMIT" class="button-ok" type="submit"
+                 value="Submit" i18n:attributes="value submit-button" />
+        </div>
+      </form>
+    </metal:block>
+  </body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource-csvimport.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,21 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="context/title" />
+</head>
+<body>
+<h1 metal:fill-slot="content-header"><span tal:replace="context/title" /></h1>
+<metal:block metal:fill-slot="body">
+
+  <div class="resource-info">
+    <p class="description" tal:content="context/description"/>
+    <tal:block define="widgets view/widgets">
+      <div metal:use-macro="context/@@form_macros/widget_rows" />
+    </tal:block>
+
+  </div>
+
+  <tal:block replace="structure context/@@notes|nothing"/>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,291 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+group views.
+
+$Id: resource.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+from zc.table import table
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.component import getUtilitiesFor
+from zope.component import queryAdapter
+from zope.component import queryMultiAdapter
+from zope.component import queryUtility
+from zope.formlib import form
+from zope.app.zapi import absoluteURL
+from zope.app.session.interfaces import ISession
+from zope.app.form.browser import widget
+
+from schooltool.app.browser.app import BaseEditView
+from schooltool.resource.interfaces import IBookingCalendar
+from schooltool.resource.interfaces import (IBaseResourceContained,
+             IResourceContainer, IResourceTypeInformation, IResourceSubTypes,
+             IResource, IEquipment, ILocation)
+from schooltool.table.interfaces import IFilterWidget
+from schooltool.table.table import url_cell_formatter
+from schooltool.table.table import CheckboxColumn
+from schooltool.table.table import FilterWidget
+from schooltool.person.browser.person import PersonFilterWidget
+from schooltool.resource.interfaces import IResourceFactoryUtility
+
+from schooltool import SchoolToolMessage as _
+
+
+class ResourceContainerView(form.FormBase):
+    """A Resource Container view."""
+
+    __used_for__ = IResourceContainer
+
+    index_title = _("Resource index")
+
+    prefix = "resources"
+    form_fields = form.Fields()
+    searchActions = form.Actions(
+        form.Action('Search', success='handle_search_action'),)
+
+    actions = form.Actions(
+                form.Action('Delete', success='handle_delete_action'),
+                form.Action('Book', success='handle_book_action'))
+    template = ViewPageTemplateFile("resourcecontainer.pt")
+    delete_template = ViewPageTemplateFile('container_delete.pt')
+
+    resourceType = None
+
+    def __init__(self, context, request):
+        form.FormBase.__init__(self, context, request)
+        self.resourceType = self.request.get('SEARCH_TYPE','|').split('|')[0]
+        self.filter_widget = queryMultiAdapter((self.getResourceUtility(),
+                                                self.request), IFilterWidget)
+
+
+    def getSubTypes(self):
+        utilities = sorted(getUtilitiesFor(IResourceFactoryUtility))
+
+        self.types = []
+        for name, utility in utilities:
+            if IResourceSubTypes.providedBy(utility):
+                subTypeAdapter = utility
+            else:
+                subTypeAdapter = queryAdapter(utility, IResourceSubTypes,
+                                          default=None)
+                if subTypeAdapter != None:
+                    subTypeAdapter = subTypeAdapter()
+
+            typeHeader = [name, utility.title, 'unclickable']
+            self.types.append(typeHeader)
+            for subtype in subTypeAdapter.types():
+                self.types.append([name, subtype, 'clickable'])
+        return self.types
+
+    def listIdsForDeletion(self):
+        return [key for key in self.context
+                if "delete.%s" % key in self.request]
+
+    def _listItemsForDeletion(self):
+        return [self.context[key] for key in self.listIdsForDeletion()]
+
+    itemsToDelete = property(_listItemsForDeletion)
+
+    def handle_delete_action(self, action, data):
+        self.template = self.delete_template
+
+    def handle_search_action(self, action, data):
+        pass
+
+    def handle_book_action(self, action, data):
+        sessionWrapper = ISession(self.request)
+        session = sessionWrapper['schooltool.resource']
+        session['bookingSelection'] = [''.join(key.split('.')[1:])
+                                       for key in self.request
+                                       if key.startswith('delete.')]
+        url = absoluteURL(IBookingCalendar(self.context), self.request)
+        return self.request.response.redirect(url)
+
+    def getResourceUtility(self):
+        return queryUtility(IResourceFactoryUtility,
+                            name=self.resourceType, default=None)
+
+    def columns(self):
+        return self.getResourceUtility().columns()
+
+    def sortOn(self):
+        return (('title', False), )
+
+    def filter(self, values):
+        return self.filter_widget.filter(values)
+
+    def renderResourceTable(self):
+        columns = [CheckboxColumn(prefix="delete", name='delete', title=u'')]
+        available_columns = self.columns()
+        available_columns[0].cell_formatter = url_cell_formatter
+
+        columns.extend(available_columns)
+        formatter = table.StandaloneFullFormatter(
+            self.context, self.request, self.filter(self.context.values()),
+            columns=columns,
+            sort_on=self.sortOn(),
+            prefix="available")
+        formatter.cssClasses['table'] = 'data'
+        return formatter()
+
+class BaseTypeFilter(FilterWidget):
+    """Base Type Filter"""
+
+    def render(self):
+        if 'CLEAR_SEARCH' in self.request:
+            self.request.form['SEARCH'] = ''
+        return self.template()
+
+    def filter(self, list):
+        resourceType = self.request.get('SEARCH_TYPE','|').split('|')[0]
+        list = [resource for resource in list
+                 if IResourceTypeInformation(resource).id == resourceType]
+        if 'SEARCH' in self.request and 'CLEAR_SEARCH' not in self.request:
+            searchstr = self.request['SEARCH'].lower()
+            results = [item for item in list
+                       if (searchstr in item.title.lower() and
+                           self.request.get('SEARCH_TYPE','|').split('|')[1] == item.type)]
+        elif 'SEARCH_TYPE' in self.request:
+            results = [item for item in list
+                       if self.request.get('SEARCH_TYPE','|').split('|')[1] == item.type]
+        else:
+            results = list
+
+        return results
+
+
+class EquipmentTypeFilter(BaseTypeFilter):
+    """Equipment Type Filter"""
+
+
+class LocationTypeFilter(BaseTypeFilter):
+    """Location Type Filter"""
+
+
+class ResourceTypeFilter(BaseTypeFilter):
+    """Resource Type Filter"""
+
+
+class ResourceSubTypeWidget(widget.SimpleInputWidget):
+
+    __call__ = ViewPageTemplateFile('subtype_widget.pt')
+
+    def subTypes(self):
+        util = queryUtility(IResourceFactoryUtility, name=self.utility, default=None)
+        if IResourceSubTypes.providedBy(util):
+            subtypes = util
+        else:
+            subtypes = queryAdapter(util, IResourceSubTypes, default=None)
+        if subtypes is not None:
+            return subtypes.types()
+        return []
+
+    def hasInput(self):
+        return self.request.get(self.name,None) != '' or self.request.get(self.name+'.newSubType',None)
+
+    def getInputValue(self):
+        subType = self.request.get(self.name)
+        newSubType = self.request.get(self.name+'.newSubType')
+        return newSubType or subType
+
+
+class ResourceView(form.DisplayFormBase):
+    """A Resource info view."""
+
+    __used_for__ = IResource
+
+    form_fields = form.Fields(IResource)
+
+    template = ViewPageTemplateFile("resource.pt")
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+
+class LocationView(ResourceView):
+    """A location info view."""
+    __used_for__ = ILocation
+    form_fields = form.Fields(ILocation)
+
+
+class EquipmentView(ResourceView):
+    """A equipment info view."""
+    __used_for__ = IEquipment
+    form_fields = form.Fields(IEquipment)
+
+
+class ResourceEditView(BaseEditView):
+    """A view for editing resource info."""
+
+    __used_for__ = IBaseResourceContained
+
+
+class ResourceContainerFilterWidget(PersonFilterWidget):
+
+    template = ViewPageTemplateFile('resource_filter.pt')
+    parameters = ['SEARCH_TITLE', 'SEARCH_TYPE']
+
+    def types(self):
+        utilities = sorted(getUtilitiesFor(IResourceFactoryUtility))
+        types = []
+        for name, utility in utilities:
+            if IResourceSubTypes.providedBy(utility):
+                subTypeAdapter = utility
+            else:
+                subTypeAdapter = queryAdapter(utility, IResourceSubTypes,
+                                          default=None)
+                if subTypeAdapter != None:
+                    subTypeAdapter = subTypeAdapter()
+
+            typeHeader = {'id':name,
+                          'title':utility.title,
+                          'clickable':False}
+            types.append(typeHeader)
+            for subtype in subTypeAdapter.types():
+                types.append({'id':name, 'title':subtype, 'clickable':True})
+        return types
+
+
+    def filter(self, list):
+        if 'CLEAR_SEARCH' in self.request:
+            for parameter in self.parameters:
+                self.request.form[parameter] = ''
+            return list
+
+        results = list
+
+        if 'SEARCH_TITLE' in self.request:
+            searchstr = self.request['SEARCH_TITLE'].lower()
+            results = [item for item in results
+                       if searchstr in item.title.lower()]
+
+        if 'SEARCH_TYPE' in self.request:
+            type = self.request['SEARCH_TYPE']
+            if not type:
+                return results
+            type = type.split('|')[0]
+            utility = queryUtility(IResourceFactoryUtility,
+                                   name=type, default=None)
+            filter_widget = queryMultiAdapter((utility,self.request), IFilterWidget)
+            if filter_widget:
+                results = filter_widget.filter(results)
+
+        return results


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource_filter.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/resource_filter.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/resource_filter.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,41 @@
+<tal:block i18n:domain="schooltool">
+    <input type="text" name="SEARCH_TITLE"
+           tal:attributes="value request/SEARCH|nothing"/>
+    <select name="SEARCH_TYPE">
+
+      <option selected="1" tal:condition="python:not request.get('SEARCH_TYPE', None)">Choose One</option>
+      <tal:block repeat="type view/types">
+        <tal:block
+                 define="optionValue string:${type/id}|${type/title};
+                         optionContent type/title;
+                         clickable type/clickable;
+                         selected python:request.get('SEARCH_TYPE') == optionValue">
+        <tal:if condition="not: selected">
+          <option tal:content="optionContent"
+                  tal:condition="clickable"
+                  tal:attributes="value optionValue">type</option>
+          <option tal:content="optionContent"
+                  tal:condition="not:clickable"
+                  disabled="disabled"
+                  class="dropdown-header"
+                  tal:attributes="value optionValue">type</option>
+        </tal:if>
+        <tal:if condition="selected">
+          <option tal:content="optionContent"
+                  tal:condition="clickable"
+                  selected="selected"
+                  tal:attributes="value optionValue">type</option>
+          <option tal:content="optionContent"
+                  tal:condition="not:clickable"
+                  disabled="disabled"
+                  class="dropdown-header"
+                  tal:attributes="value optionValue">type</option>
+        </tal:if>
+        </tal:block>
+      </tal:block>
+    </select>
+    <input type="submit" name="SEARCH_BUTTON" value="Find Now"
+           i18n:attributes="value"/>
+    <input type="submit" name="CLEAR_SEARCH" value="Clear"
+           i18n:attributes="value"/>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/resource_filter.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/resourcecontainer.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/resourcecontainer.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/resourcecontainer.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,80 @@
+<tal:define define="dummy view/update"/>
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="view/index_title" i18n:translate="">
+    Contents
+  </title>
+</head>
+<script type="text/javascript" metal:fill-slot="extrahead">
+function searchSelected(selectedResource){
+    this.form.submit();
+}
+</script>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/index_title" i18n:translate="">Contents</h1>
+
+<metal:block metal:fill-slot="body">
+  <form method="GET" tal:attributes="action view/context/@@absolute_url">
+
+      <!-- Type Searching -->
+      <div class="oneline-form">
+      <label for="SEARCH_TYPE" title="Type"
+             i18n:translate="">Type</label>
+      <select id="SEARCH_TYPE" name="SEARCH_TYPE" size="1"
+              onchange="javascript:this.form.submit()">
+        <option selected="1" tal:condition="python:not request.get('SEARCH_TYPE', None)">Choose One</option>
+        <tal:block repeat="term view/getSubTypes">
+          <tal:block
+                   define="optionValue python:'%s|%s'%(term[0],term[1]);
+                           optionContent python:term[1];
+                           clickable python:term[2]=='clickable';
+                           selected python:request.get('SEARCH_TYPE') == optionValue">
+          <tal:if condition="not: selected">
+            <option tal:content="optionContent"
+                    tal:condition="clickable"
+                    tal:attributes="value optionValue">type</option>
+            <option tal:content="optionContent"
+                    tal:condition="not:clickable"
+                    disabled="disabled"
+                    class="dropdown-header"
+                    tal:attributes="value optionValue">type</option>
+          </tal:if>
+          <tal:if condition="selected">
+            <option tal:content="optionContent"
+                    tal:condition="clickable"
+                    selected="selected"
+                    tal:attributes="value optionValue">type</option>
+            <option tal:content="optionContent"
+                    tal:condition="not:clickable"
+                    disabled="disabled"
+                    class="dropdown-header"
+                    tal:attributes="value optionValue">type</option>
+          </tal:if>
+          </tal:block>
+        </tal:block>
+      </select>
+      <input tal:repeat="action view/searchActions"
+             tal:replace="structure action/render" />
+      </div>
+
+      <!-- Filtering viewlet by type -->
+      <div tal:define="factory view/getResourceUtility"
+           tal:condition="factory"
+           tal:content="structure view/filter_widget/render"/>
+
+      <div>
+        <div tal:condition="view/getResourceUtility">
+          <tal:block replace="structure view/renderResourceTable" />
+        </div>
+      </div>
+      <div class="controls">
+        <input tal:condition="python:request.get('SEARCH_TYPE', False)"
+               tal:repeat="action view/actions"
+               tal:replace="structure action/render" />
+      </div>
+  </form>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/resourcecontainer.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/resources.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/resources.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/resources.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,75 @@
+Functional doctests for creating different resources
+====================================================
+
+This test shows how different types of resources can be created and accessed
+through the browser.
+
+Set up
+------
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+Creating Resources
+------------------
+
+We can create generic resources
+
+    >>> manager.getLink('Resources').click()
+
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = 'Book'
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> 'Book' in manager.contents
+    True
+
+We can create Location resources, which also have a capacity option
+
+    >>> manager.getLink('New Location').click()
+    >>> manager.getControl('Title').value = 'Room 101'
+    >>> manager.getControl(name='field.type.newSubType').value = 'class room'
+    >>> manager.getControl('Type').value = ['']
+    >>> manager.getControl('Capacity').value = '10'
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['location|class room']
+    >>> manager.getControl('Search').click()
+    >>> 'Room 101' in manager.contents
+    True
+
+We can create Equipment resources also:
+
+    >>> manager.getLink('New Equipment').click()
+    >>> manager.getControl('Title').value = 'Projector 1'
+    >>> manager.getControl(name='field.type.newSubType').value = 'Projector'
+    >>> manager.getControl('Manufacturer').value = 'Sony'
+    >>> manager.getControl('Model').value = 'RS-1'
+    >>> manager.getControl('Serial Number').value = 'ABC123-987'
+    >>> manager.getControl('Purchase Date') != None
+    True
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['equipment|Projector']
+    >>> manager.getControl('Search').click()
+    >>> 'Projector 1' in manager.contents
+    True
+
+If we go back and add more resources that have type fields, then we
+can choose an existing type from a drop down box.
+
+    >>> manager.getLink('New Equipment').click()
+    >>> manager.getControl('Title').value = 'Projector 2'
+    >>> manager.getControl('Type').value = ['Projector']
+    >>> manager.getControl('Manufacturer').value = 'Sony'
+    >>> manager.getControl('Model').value = 'RS-1'
+    >>> manager.getControl('Serial Number').value = 'ABC123-9876'
+    >>> manager.getControl('Purchase Date') != None
+    True
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['equipment|Projector']
+    >>> manager.getControl('Search').click()
+    >>> 'Projector 2' in manager.contents
+    True
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/resources.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/security.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/security.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/security.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,193 @@
+Functional doctest for Security
+===============================
+
+This test verifies the security checking for booked resources and
+events that book them.
+
+XXX: Review with David Welsh for accuracy.
+
+Setup / Create Manager
+----------------------
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+Let's create several people who have different permissions for resource booking:
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Teacher', 'teacher', 'pwd')
+    >>> addPerson('Leader', 'leader', 'pwd')
+
+Now lets create a resources that can be booked:
+
+    >>> manager.getLink('Resources').click()
+
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = 'Classroom'
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> manager.getLink('Classroom').click()
+
+Create new Browsers for 'Teacher' & 'Leader' and log them in
+
+    >>> teacher = Browser()
+    >>> teacher.addHeader('Authorization', 'Basic teacher:pwd')
+    >>> teacher.handleErrors = False
+    >>> teacher.open('http://localhost/')
+
+    >>> leader = Browser()
+    >>> leader.addHeader('Authorization', 'Basic leader:pwd')
+    >>> leader.handleErrors = False
+    >>> leader.open('http://localhost/')
+
+Our users are neither in the teacher group, nor leaders of
+the resource, but they should still be able to see the resource
+to know when it is in use because they are logged in.
+
+    >>> teacher.getLink('Resources').click()
+    >>> teacher.getControl('Type').value = ['resource|Resource']
+    >>> teacher.getControl('Search').click()
+    >>> teacher.getLink('Classroom').click()
+    >>> teacher.url
+    'http://localhost/resources/classroom'
+
+The teacher (as an authenticated user) should be able to view the
+calendar for a resource.
+
+    >>> teacher.getLink('View Calendar').click()
+    >>> teacher.getLink('New Event').click()
+    Traceback (most recent call last):
+    ...
+    Unauthorized: (<...>, 'browserDefault', 'schooltool.edit')
+
+Now we will put these people into the teacher group
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('Teachers').click()
+    >>> manager.getLink('edit members').click()
+    >>> manager.getControl('Teacher').click()
+    >>> manager.getControl('Add').click()
+
+Now the teacher should be able to schedule a new event
+
+    >>> teacher.open("http://localhost")
+    >>> teacher.getLink('Resources').click()
+    >>> teacher.getControl('Type').value = ['resource|Resource']
+    >>> teacher.getControl('Search').click()
+    >>> teacher.getLink('Classroom').click()
+    >>> teacher.getLink('View Calendar').click()
+    >>> teacher.getLink('New Event').click()
+    >>> teacher.getControl('Title').value = 'Classroom Event'
+    >>> teacher.getControl('Time').value = '08:00'
+    >>> teacher.getControl('Add').click()
+    >>> 'Classroom Event' in teacher.contents
+    True
+
+The teacher should be able to edit the event that they created.
+
+    >>> teacher.getLink('Classroom Event').click()
+    >>> teacher.getLink('edit event').click()
+    >>> teacher.getControl('Time').value = '09:00'
+    >>> teacher.getControl('Update', index=1).click()
+
+The leader should not be able to edit this event (yet) because the
+leader is not yet a member of the resource's leader list.
+
+    >>> leader.getLink('Resources').click()
+    >>> leader.getControl('Type').value = ['resource|Resource']
+    >>> leader.getControl('Search').click()
+    >>> leader.getLink('Classroom').click()
+    >>> leader.getLink('View Calendar').click()
+    >>> leader.getLink('Classroom Event').click()
+    >>> leader.getLink('edit event').click()
+    Traceback (most recent call last):
+    ...
+    Unauthorized: (<...>, 'browserDefault', 'schooltool.edit')
+
+So now we will make this leader the leader of the resource.
+
+    >>> manager.open('http://localhost/resources/classroom')
+    >>> manager.getLink('Edit Leaders').click()
+    >>> manager.getControl('Leader').click()
+    >>> manager.getControl('Add').click()
+
+Now 'Leader' is the leader of the resource and should be able to edit it.
+
+    >>> leader.goBack()
+    >>> leader.getLink('edit event').click()
+    >>> leader.getControl('Time').value = '10:00'
+    >>> leader.getControl('Update', index=1).click()
+
+The teacher should still be able to delete the event.
+
+    >>> teacher.getLink('Classroom Event').click()
+    >>> teacher.getLink('delete event').click()
+    >>> 'Classroom Event' in teacher.contents
+    False
+
+The teacher should also be able to schedule a new event from 
+their personal calendar.
+
+    >>> teacher.getLink('My Calendar').click()
+    >>> teacher.getLink('New Event').click()
+    >>> teacher.getControl('Title').value = 'Classroom Event'
+    >>> teacher.getControl('Time').value = '09:00'
+    >>> teacher.getControl('Book Resources').click()
+    >>> teacher.getControl('Add').click()
+    >>> teacher.getControl('Classroom').click()
+    >>> teacher.getControl('Book').click()
+    >>> teacher.getLink('My Calendar').click()
+    >>> 'Classroom Event' in teacher.contents
+    True
+
+Check to see that the classroom is booked as well.
+
+    >>> print teacher.contents
+    <BLANKLINE>
+    ...
+      <h6 class="booked-resource-header"
+          style="background: #7590ae">
+        <a style="color: #000;"
+           href="http://localhost/persons/teacher/calendar/.../booking.html?date=...">Booked resources</a></h6>
+    <BLANKLINE>
+        <a href="http://localhost/resources/classroom">Classroom</a>
+    ...
+
+Create another Resource.
+
+    >>> manager.getLink('Resources').click()
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = 'Lobby'
+    >>> manager.getControl('Add').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> manager.getLink('Classroom').click()
+
+Have Teacher book 'Lobby'
+
+    >>> teacher.getLink('Resources').click()
+    >>> teacher.getControl('Type').value = ['resource|Resource']
+    >>> teacher.getControl('Search').click()
+    >>> teacher.getLink('Lobby').click()
+    >>> teacher.getLink('View Calendar').click()
+    >>> teacher.getLink('New Event').click()
+    >>> teacher.getControl('Title').value = 'Lobby Event'
+    >>> teacher.getControl('Time').value = '08:00'
+    >>> teacher.getControl('Add').click()
+    >>> 'Lobby Event' in teacher.contents
+    True
+
+The Leader is not the leader of 'Lobby' but is of 'Classroom', make sure that
+Leader cannot edit an event in 'Lobby'.
+
+    >>> leader.open('http://localhost/resources/lobby')
+    >>> leader.getLink('View Calendar').click()
+    >>> leader.getLink('Lobby Event').click()
+    >>> leader.getLink('edit event').click()
+    Traceback (most recent call last):
+    ...
+    Unauthorized: (<...>, 'browserDefault', 'schooltool.edit')


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/security.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/subtype_widget.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/subtype_widget.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/subtype_widget.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<input type="text"
+       tal:attributes="id string:${view/name}.newSubType;
+		       name string:${view/name}.newSubType;
+		       value: view/_getFormValue"
+       />
+
+<select tal:attributes="id string:${view/name};
+			name string:${view/name}">
+  <option value="">Choose One</option>
+  <option tal:repeat="type view/subTypes"
+	  tal:attributes="value type"
+	  tal:content="type">subtype</option>
+</select>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/subtype_widget.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/browser/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/browser/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/browser/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,130 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for group views.
+
+$Id: tests.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import unittest
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+
+from schooltool.app.browser.testing import setUp, tearDown
+
+
+def doctest_ResourceView():
+    r"""Test for ResourceView
+
+    Let's create a view for a resource:
+
+        >>> from schooltool.resource.browser.resource import ResourceView
+        >>> from schooltool.resource.resource import Resource
+        >>> resource = Resource()
+        >>> request = TestRequest()
+        >>> view = ResourceView(resource, request)
+
+    """
+
+
+def doctest_ResourceCSVImporter():
+    r"""Tests for ResourceCSVImporter.
+
+    Create a resource container and an importer
+
+        >>> from schooltool.resource.browser.csvimport import \
+        ...     ResourceCSVImporter
+        >>> from schooltool.resource.resource import ResourceContainer
+        >>> container = ResourceContainer()
+        >>> importer = ResourceCSVImporter(container, None)
+
+    Import some sample data
+
+        >>> csvdata='''Resource 1, Resource 1 Description
+        ... Resource2
+        ... Resource3, Resource 3 Description, location
+        ... Resource4, , location'''
+        >>> importer.importFromCSV(csvdata)
+        True
+
+    Check that the resources exist
+
+        >>> [resource for resource in container]
+        [u'resource-1', u'resource2', u'resource3', u'resource4']
+
+    Check that descriptions were imported properly
+
+        >>> from schooltool.resource.interfaces import ILocation
+        >>> [resource.description for resource in container.values()]
+        ['Resource 1 Description', '', 'Resource 3 Description', '']
+        >>> [ILocation.providedBy(resource) for resource in container.values()]
+        [False, False, True, True]
+
+    """
+
+
+def doctest_ResourceCSVImportView():
+    r"""
+    We'll create a resource csv import view
+
+        >>> from schooltool.resource.browser.csvimport import \
+        ...     ResourceCSVImportView
+        >>> from schooltool.resource.resource import ResourceContainer
+        >>> container = ResourceContainer()
+        >>> request = TestRequest()
+
+    Now we'll try a text import.  Note that the description is not required
+
+        >>> request.form = {'csvtext' : "A Resource, The best Resource\nAnother Resource",
+        ...                 'charset' : 'UTF-8',
+        ...                 'UPDATE_SUBMIT': 1}
+        >>> view = ResourceCSVImportView(container, request)
+        >>> view.update()
+        >>> [resource for resource in container]
+        [u'a-resource', u'another-resource']
+
+    If no data is provided, we naturally get an error
+
+        >>> request.form = {'charset' : 'UTF-8', 'UPDATE_SUBMIT': 1}
+        >>> view.update()
+        >>> view.errors
+        [u'No data provided']
+
+    We also get an error if a line starts with a comma (no title)
+
+        >>> request.form = {'csvtext' : ", No title provided here",
+        ...                 'charset' : 'UTF-8',
+        ...                 'UPDATE_SUBMIT': 1}
+        >>> view = ResourceCSVImportView(container, request)
+        >>> view.update()
+        >>> view.errors
+        [u'Failed to import CSV text', u'Titles may not be empty']
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=doctest.ELLIPSIS|
+                                                   doctest.REPORT_NDIFF))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/browser/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,145 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <include file="security.zcml" />
+
+  <interface
+      interface=".interfaces.IResourceContainer"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".resource.ResourceContainer">
+    <allow interface="zope.app.container.interfaces.ISimpleReadContainer" />
+    <require permission="schooltool.view"
+             attributes="keys values items __iter__ __len__" />
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer" />
+  </class>
+
+  <interface
+      interface=".interfaces.IBaseResource"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".resource.Resource">
+    <implements interface="schooltool.app.interfaces.IHaveCalendar" />
+
+    <allow attributes="__cmp__" />
+    <require permission="schooltool.view"
+             attributes="title type description notes groups leaders" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.IResource" />
+  </class>
+
+  <class class=".resource.Location">
+    <implements interface="schooltool.app.interfaces.IHaveCalendar" />
+
+    <require like_class=".resource.Resource" />
+    <require permission="schooltool.view"
+             attributes="capacity" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.ILocation" />
+  </class>
+
+  <class class=".resource.Equipment">
+    <implements interface="schooltool.app.interfaces.IHaveCalendar" />
+
+    <require like_class=".resource.Resource" />
+    <require permission="schooltool.view"
+             attributes="type manufacturer model serialNumber purchaseDate" />
+    <require permission="schooltool.edit"
+             set_schema=".interfaces.IEquipment" />
+  </class>
+
+  <adapter
+      for=".interfaces.IResourceContainer"
+      factory="schooltool.app.app.SimpleNameChooser"
+      provides="zope.app.container.interfaces.INameChooser" />
+
+  <!-- Application hook -->
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".resource.addResourceContainerToApplication"
+      />
+
+  <!-- sample data -->
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+
+    <utility
+        factory=".sampledata.SampleResources"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="resources"
+        />
+
+  </configure>
+
+  <!-- resource types -->
+
+  <utility
+      factory=".types.ResourceFactoryUtility"
+      name="resource"
+      provides=".interfaces.IResourceFactoryUtility"
+      />
+
+  <utility
+      factory=".types.LocationFactoryUtility"
+      name="location"
+      provides=".interfaces.IResourceFactoryUtility"
+      />
+
+  <utility
+      factory=".types.EquipmentFactoryUtility"
+      name="equipment"
+      provides=".interfaces.IResourceFactoryUtility"
+      />
+
+  <adapter
+      factory=".types.ResourceTypeAdapter" />
+
+  <adapter
+      factory=".types.LocationTypeAdapter" />
+
+  <adapter
+      factory=".types.EquipmentTypeAdapter" />
+
+  <adapter
+      for="schooltool.resource.interfaces.IResourceContainer"
+      factory=".booking.ResourceBookingCalendar"
+      provides=".booking.IBookingCalendar" />
+
+  <subscriber
+      for=".interfaces.IResourceContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".booking.ResourceBookingTraverserPlugin"
+      permission="zope.Public"
+      />
+
+
+  <class class=".booking.ResourceBookingCalendar">
+    <require permission="schooltool.view"
+             interface=".interfaces.IBookingCalendar"
+             attributes="__cmp__" />
+  </class>
+
+  <class class=".booking.BookingCalendarEvent">
+    <require permission="schooltool.view"
+             interface=".interfaces.IBookingCalendarEvent"
+             />
+  </class>
+
+
+  <subscriber
+      for="schooltool.resource.interfaces.IBookingCalendar
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.app.browser.interfaces.ICalendarProvider"
+      factory=".booking.ResourceBookingCalendarProvider"
+      />
+
+  <include package=".browser" />
+  <include package=".rest" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,165 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Resource-related interfaces
+
+$Id: interfaces.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+import zope.interface
+import zope.schema
+
+import zope.app.container.constraints
+from zope.app import container
+
+from schooltool.calendar.interfaces import ICalendarEvent
+from schooltool.calendar.interfaces import ICalendar
+from schooltool import SchoolToolMessage as _
+
+
+class IBaseResource(zope.interface.Interface):
+    """Resource."""
+
+    title = zope.schema.TextLine(
+        title=_("Title"),
+        description=_("Title of the resource."))
+
+    type = zope.schema.TextLine(
+        title=_("Resource Type"),
+        description=_("Type of resource"),
+        required=True)
+
+
+    description = zope.schema.Text(
+        title=_("Description"),
+        required=False,
+        description=_("Description of the resource."))
+
+    notes = zope.schema.Text(
+        title=_("Notes"),
+        required=False,
+        description=_("Notes for the resource."))
+
+
+class IResourceContainer(container.interfaces.IContainer):
+    """Container of resources."""
+
+    container.constraints.contains(IBaseResource)
+
+
+class IBaseResourceContained(IBaseResource, container.interfaces.IContained):
+    """Resource contained in an IResourceContainer."""
+
+    container.constraints.containers(IResourceContainer)
+
+
+class IResource(IBaseResource):
+    """Marker for a regular old resource"""
+
+
+class ILocation(IBaseResource):
+    """Location."""
+
+    type = zope.schema.TextLine(
+        title=_("Location Type"),
+        description=_("Type of location (i.e. computer lab, class room, etc.)"),
+        required=True)
+
+
+    capacity = zope.schema.Int(
+        title=_("Capacity"),
+        description=_("Capacity of the room"),
+        required=False)
+
+
+class IEquipment(IBaseResource):
+    """Equipment."""
+
+    type = zope.schema.TextLine(
+        title=_("Equipment Type"),
+        description=_("Type of equipment (i.e. camcorder, computer, etc.)"),
+        required=True)
+
+    manufacturer = zope.schema.TextLine(
+        title=_("Manufacturer"),
+        description=_("Manufacturer of Equipment"),
+        required=False)
+
+    model = zope.schema.TextLine(
+        title=_("Model"),
+        description=_("Model of Equipment"),
+        required=False)
+
+    serialNumber = zope.schema.TextLine(
+        title=_("Serial Number"),
+        description=_("Serial Number of Equipment"),
+        required=False)
+
+    purchaseDate = zope.schema.Date(
+        title=_("Purchase Date"),
+        description=_("Purchase Date of Equipment"),
+        required=False)
+
+
+class IResourceTypeInformation(zope.interface.Interface):
+
+    id = zope.schema.TextLine(
+        title=_("Id of the resource type."),
+        description=_("""Used for lookup of named utilities that have resource
+        type specific information."""))
+
+    title = zope.schema.TextLine(
+        title=_("The title of a resource type."),
+        description=_("""A string that will be displayed to users in tables or
+        resource type selection widgets."""))
+
+
+class IResourceFactoryUtility(zope.interface.Interface):
+
+    title = zope.schema.TextLine(
+        title=_("The title of a resource type."),
+        description=_("""A string that will be displayed to users in tables or
+        resource type selection widgets."""))
+
+    def columns():
+        """Default columns for display of this resource in a table."""
+
+
+class IResourceTypeSource(zope.schema.interfaces.IIterableSource):
+    """Marker interface for a source of resource types."""
+
+
+class IResourceSubTypes(zope.interface.Interface):
+    """Contains a list of sub types for a given type."""
+
+    def types():
+        """returns Types among a type (subtypes)"""
+
+
+class IBookingCalendar(ICalendar):
+
+    title = zope.interface.Attribute("")
+
+
+class IBookingCalendarEvent(ICalendarEvent):
+    """Event that represents a possible booking on an existing event."""
+
+
+class IBookingTimetableEvent(ICalendarEvent):
+    """Event that represents a possible booking in a timetable slot."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/resource.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/resource.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/resource.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,126 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool resource object
+
+$Id: resource.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+__docformat__ = 'restructuredtext'
+from persistent import Persistent
+
+from zope.component import adapts
+from zope.interface import implements
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.container import btree
+from zope.app.container.contained import Contained
+
+from schooltool.app.app import Asset
+from schooltool.app.security import LeaderCrowd
+from schooltool.securitypolicy.crowds import TeachersCrowd
+from schooltool.app.interfaces import ICalendarParentCrowd
+from schooltool.resource import interfaces
+from schooltool.securitypolicy.crowds import ConfigurableCrowd
+from schooltool.securitypolicy.crowds import AuthenticatedCrowd
+from schooltool import SchoolToolMessage as _
+
+
+class ResourceContainer(btree.BTreeContainer):
+    """Container of resources."""
+
+    implements(interfaces.IResourceContainer, IAttributeAnnotatable)
+
+
+class BaseResource(Persistent, Contained, Asset):
+    """Base Resource."""
+
+    implements(interfaces.IBaseResource, IAttributeAnnotatable)
+
+    type = _(u"Resource")
+
+    def __init__(self, title=None, description=None):
+        self.title = title
+        self.description = description
+        self.notes = u""
+
+
+class Resource(BaseResource):
+    """Resource."""
+
+    implements(interfaces.IResource)
+
+    # BBB so that evolution scripts would work
+    isLocation = None
+
+
+class Location(BaseResource):
+    """Location."""
+
+    implements(interfaces.ILocation)
+
+    capacity = None
+
+
+class Equipment(BaseResource):
+    """Equipment."""
+
+    implements(interfaces.IEquipment)
+
+    type = u""
+    manufacturer = u""
+    model = u""
+    serialNumber = u""
+    purchaseDate = None
+
+
+def addResourceContainerToApplication(event):
+    event.object['resources'] = ResourceContainer()
+
+
+class ResourceViewersCrowd(ConfigurableCrowd):
+
+    setting_key = 'everyone_can_view_resource_info'
+
+
+class ResourceContainerViewersCrowd(ConfigurableCrowd):
+
+    setting_key = 'everyone_can_view_resource_list'
+
+
+class ResourceCalendarViewersCrowd(ConfigurableCrowd):
+
+    adapts(interfaces.IBaseResource)
+    implements(ICalendarParentCrowd)
+
+    setting_key = "everyone_can_view_resource_calendar"
+
+    def contains(self, principal):
+        return (ConfigurableCrowd.contains(self, principal) or
+                LeaderCrowd(self.context).contains(principal) or
+                AuthenticatedCrowd(self.context).contains(principal) or
+                TeachersCrowd(self.context).contains(principal))
+
+
+class ResourceCalendarEditorsCrowd(LeaderCrowd):
+
+    adapts(interfaces.IBaseResource)
+    implements(ICalendarParentCrowd)
+
+    def contains(self, principal):
+        return (LeaderCrowd.contains(self, principal) or
+                TeachersCrowd(self.context).contains(principal))


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/resource.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <view
+      for="..interfaces.IResourceContainer"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IBaseResource"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.IResourceContainer"
+      provides="zope.filerepresentation.interfaces.IFileFactory"
+      factory=".resource.ResourceFileFactory"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.IResource"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".resource.ResourceFile"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IResourceContainer"
+      name="GET"
+      factory=".resource.ResourceContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IResourceContainer"
+      name="POST"
+      factory=".resource.ResourceContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.IResource"
+      name="GET"
+      factory=".resource.ResourceView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,22 @@
+<resource xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:tal="http://xml.zope.org/namespaces/tal"
+          xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+          i18n:domain="schooltool">
+  <title tal:content="context/title"/>
+  <description tal:content="context/description" />
+  <relationships xlink:type="simple" xlink:title="Relationships"
+      i18n:attributes="xlink:title Relationships"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/relationships" />
+  <acl xlink:type="simple" xlink:title="ACL"
+      i18n:attributes="xlink:title ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/acl" />
+  <calendar xlink:type="simple" xlink:title="Calendar"
+      i18n:attributes="xlink:title Calendar"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar" />
+  <relationships xlink:type="simple" xlink:title="Calendar subscriptions"
+      i18n:attributes="xlink:title Calendar_relationships"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar/relationships" />
+  <acl xlink:type="simple" xlink:title="Calendar ACL"
+      i18n:attributes="xlink:title Calendar_ACL"
+      tal:attributes="xlink:href string:${context/@@absolute_url}/calendar/acl" />
+</resource>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,89 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for resource,
+
+$Id: resource.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+from zope.component import adapts
+
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.app import ApplicationObjectFile
+from schooltool.app.rest.app import ApplicationObjectFileFactory
+from schooltool.app.rest.app import GenericContainerView
+
+from schooltool.resource.resource import Resource
+from schooltool.resource.interfaces import IResourceContainer, IResource
+
+class ResourceFileFactory(ApplicationObjectFileFactory):
+    """Adapter that adapts ResourceContainer to FileFactory"""
+
+    adapts(IResourceContainer)
+
+    schema = '''<?xml version="1.0" encoding="UTF-8"?>
+        <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                 ns="http://schooltool.org/ns/model/0.1"
+                 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+          <start>
+            <element name="object">
+              <attribute name="title">
+                <text/>
+              </attribute>
+              <optional>
+                <attribute name="description">
+                  <text/>
+                </attribute>
+              </optional>
+            </element>
+          </start>
+        </grammar>
+        '''
+
+    factory = Resource
+
+    def parseDoc(self, doc):
+        """Get values from document, and puts them into a dict."""
+        kwargs = {}
+        node = doc.query('/m:object')[0]
+        kwargs['title'] = node['title']
+        kwargs['description'] = node.get('description')
+        return kwargs
+
+
+class ResourceFile(ApplicationObjectFile):
+    """Adapter that adapts IResource to IWriteFile"""
+
+    adapts(IResource)
+
+    def modify(self, title=None, description=None, isLocation=False):
+        """Modify underlying object."""
+        self.context.title = title
+        self.context.description = description
+
+
+class ResourceContainerView(GenericContainerView):
+    """RESTive view of a resource container."""
+
+
+class ResourceView(View):
+    """RESTive view for resources"""
+
+    template = Template("resource.pt",
+                        content_type="text/xml; charset=UTF-8")
+    factory = ResourceFile


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/rest/resource.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/rest/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/rest/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/rest/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,219 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for groups.
+
+$Id: tests.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+import unittest
+from cStringIO import StringIO
+
+from zope.publisher.browser import TestRequest
+
+from schooltool.app.rest.testing import ApplicationObjectViewTestMixin
+from schooltool.app.rest.testing import ContainerViewTestMixin
+from schooltool.app.rest.testing import FileFactoriesSetUp
+from schooltool.xmlparsing import XMLParseError
+from schooltool.resource.resource import Resource, ResourceContainer
+from schooltool.resource.rest.resource import ResourceView, ResourceFile
+from schooltool.resource.rest.resource import ResourceContainerView
+from schooltool.resource.rest.resource import ResourceFileFactory
+
+
+class TestResourceContainerView(ContainerViewTestMixin,
+                                unittest.TestCase):
+    """Test for ResourceContainerView"""
+
+    def setUp(self):
+        ContainerViewTestMixin.setUp(self)
+        self.resourceContainer = self.app['resources']
+        self.resource = self.app['resources']['root'] = Resource("Root resource")
+
+    def test_render(self):
+        view = ResourceContainerView(self.resourceContainer,
+                                  TestRequest())
+        result = view.GET()
+        response = view.request.response
+
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result, """
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <name>resources</name>
+              <items>
+                <item xlink:href="http://127.0.0.1/resources/root"
+                      xlink:type="simple" xlink:title="Root resource"/>
+              </items>
+              <acl xlink:href="http://127.0.0.1/resources/acl" xlink:title="ACL"
+                   xlink:type="simple"/>
+            </container>
+            """)
+
+    def test_post(self, suffix="", view=None,
+                  body="""<object xmlns="http://schooltool.org/ns/model/0.1"
+                                  title="New Resource"/>"""):
+        view = ResourceContainerView(self.resourceContainer,
+                                  TestRequest(StringIO(body)))
+        result = view.POST()
+        response = view.request.response
+
+        self.assertEquals(response.getStatus(), 201)
+        self.assertEquals(response._reason, "Created")
+
+        location = response.getHeader('location')
+        base = "http://127.0.0.1/resources/"
+        self.assert_(location.startswith(base),
+                     "%r.startswith(%r) failed" % (location, base))
+        name = location[len(base):]
+        self.assert_(name in self.app['resources'].keys())
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/plain; charset=UTF-8")
+        self.assert_(location in result)
+        return name
+
+    def test_post_with_a_description(self):
+        name = self.test_post(body='''
+            <object title="New Resource"
+                    description="A new resource"
+                    xmlns='http://schooltool.org/ns/model/0.1'/>''')
+        self.assertEquals(self.app['resources'][name].title, 'New Resource')
+        self.assertEquals(self.app['resources'][name].description, 'A new resource')
+        self.assertEquals(name, 'Resource')
+
+    def test_post_error(self):
+        view = ResourceContainerView(
+            self.resourceContainer,
+            TestRequest(StringIO('<element title="New Resource">')))
+        self.assertRaises(XMLParseError, view.POST)
+
+
+class TestResourceFileFactory(unittest.TestCase):
+
+    def setUp(self):
+        self.resourceContainer = ResourceContainer()
+        self.factory = ResourceFileFactory(self.resourceContainer)
+
+    def test_title(self):
+        resource = self.factory("new_resource", None,
+                     '''<object xmlns="http://schooltool.org/ns/model/0.1"
+                                title="New Resource"/>''')
+
+        self.assertEquals(resource.title, "New Resource")
+
+    def test_description(self):
+        resource = self.factory("new_resource", None,
+                     '''<object xmlns="http://schooltool.org/ns/model/0.1"
+                                title="New Resource"
+                                description="Boo"/>''')
+
+        self.assertEquals(resource.title, "New Resource")
+        self.assertEquals(resource.description, "Boo")
+
+
+
+class TestResourceFile(FileFactoriesSetUp, unittest.TestCase):
+    """A test for IResource IWriteFile adapter"""
+
+    def testWrite(self):
+        rc = ResourceContainer()
+        resource = Resource("Mud")
+        rc['resource'] = resource
+
+        file = ResourceFile(resource)
+        file.write('''<object xmlns="http://schooltool.org/ns/model/0.1"
+                              title="New Mud"
+                              description="Baa"/>''')
+
+        self.assertEquals(resource.title, "New Mud")
+        self.assertEquals(resource.description, "Baa")
+
+
+class TestResourceView(ApplicationObjectViewTestMixin, unittest.TestCase):
+    """A test for the RESTive view of a resource."""
+
+    def setUp(self):
+        ApplicationObjectViewTestMixin.setUp(self)
+
+        self.testObject = self.app['resources']['root'] = Resource("Root resource")
+
+    def makeTestView(self, object, request):
+        return ResourceView(object, request)
+
+    def testGET(self):
+        """Tests the GET method of the view."""
+
+        result, response = self.get()
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result,
+            """<resource xmlns:xlink="http://www.w3.org/1999/xlink">
+                   <title>Root resource</title>
+                   <description/>
+                   <relationships xlink:href="http://127.0.0.1/resources/root/relationships"
+                                  xlink:title="Relationships" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/resources/root/acl" xlink:title="ACL"
+                        xlink:type="simple"/>
+                   <calendar xlink:href="http://127.0.0.1/resources/root/calendar"
+                             xlink:title="Calendar" xlink:type="simple"/>
+                   <relationships
+                                  xlink:href="http://127.0.0.1/resources/root/calendar/relationships"
+                                  xlink:title="Calendar subscriptions" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/resources/root/calendar/acl"
+                        xlink:title="Calendar ACL" xlink:type="simple"/>
+               </resource>""")
+
+    def testGETDescription(self):
+
+        self.testObject.description = "Foo"
+
+        result, response = self.get()
+
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result,
+            """<resource xmlns:xlink="http://www.w3.org/1999/xlink">
+                   <title>Root resource</title>
+                   <description>Foo</description>
+                   <relationships xlink:href="http://127.0.0.1/resources/root/relationships"
+                                  xlink:title="Relationships" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/resources/root/acl" xlink:title="ACL"
+                        xlink:type="simple"/>
+                   <calendar xlink:href="http://127.0.0.1/resources/root/calendar"
+                             xlink:title="Calendar" xlink:type="simple"/>
+                   <relationships
+                                  xlink:href="http://127.0.0.1/resources/root/calendar/relationships"
+                                  xlink:title="Calendar subscriptions" xlink:type="simple"/>
+                   <acl xlink:href="http://127.0.0.1/resources/root/calendar/acl"
+                        xlink:title="Calendar ACL" xlink:type="simple"/>
+               </resource>""")
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTests([unittest.makeSuite(test) for test in
+                    (TestResourceContainerView,
+                     TestResourceFileFactory,
+                     TestResourceFile,
+                     TestResourceView)])
+
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/rest/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,45 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Person sample data generation
+
+$Id: sampledata.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+from zope.interface import implements
+
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.resource.resource import Resource, Location
+
+
+class SampleResources(object):
+
+    implements(ISampleDataPlugin)
+
+    name = 'resources'
+    dependencies = ()
+
+    def generate(self, app, seed=None):
+        for i in range(64):
+            app['resources']['room%02d' % i] = Location(title='Room %02d' % i)
+        for i in range(24):
+            resource = Resource(title='Projector %02d' % i)
+            app['resources']['projector%02d' % i] = resource
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/security.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/security.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/security.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,57 @@
+<?xml version="1.0"?>
+<configure xmlns="http://schooltool.org/securitypolicy"
+           xmlns:zope="http://namespaces.zope.org/zope">
+
+  <!-- security -->
+
+  <setting
+      key="everyone_can_view_resource_list"
+      text="Everyone can view resource lists."
+      default="False" />
+
+  <setting
+      key="everyone_can_view_resource_info"
+      text="Everyone can view resource information."
+      default="False" />
+
+  <setting
+      key="everyone_can_view_resource_calendar"
+      text="Everyone can view resource calendars."
+      default="False" />
+
+  <crowd
+      name="resource_viewers"
+      factory=".resource.ResourceViewersCrowd" />
+
+  <crowd
+      name="resource_list_viewers"
+      factory=".resource.ResourceContainerViewersCrowd" />
+
+  <allow
+      interface="schooltool.resource.interfaces.IResourceContainer"
+      crowds="administration resource_list_viewers authenticated"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.resource.interfaces.IResourceContainer"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <allow
+      interface="schooltool.resource.interfaces.IBaseResource"
+      crowds="administration leaders resource_viewers authenticated"
+      permission="schooltool.view" />
+  <allow
+      interface="schooltool.resource.interfaces.IBaseResource"
+      crowds="administration leaders"
+      permission="schooltool.edit" />
+
+  <zope:adapter
+      factory=".resource.ResourceCalendarViewersCrowd"
+      provides="schooltool.app.security.ICalendarParentCrowd"
+      name="schooltool.view" />
+  <zope:adapter
+      factory=".resource.ResourceCalendarEditorsCrowd"
+      provides="schooltool.app.security.ICalendarParentCrowd"
+      name="schooltool.edit" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/security.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/tests/test_resource.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/tests/test_resource.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/tests/test_resource.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,115 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for resources
+
+$Id: test_resource.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import unittest
+
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+
+from schooltool.testing.util import run_unit_tests
+
+def doctest_ResourceContainer():
+    """Tests for ResourceContainer
+
+        >>> from schooltool.resource.interfaces import IResourceContainer
+        >>> from schooltool.resource.resource import ResourceContainer
+        >>> c = ResourceContainer()
+        >>> verifyObject(IResourceContainer, c)
+        True
+
+    Let's make sure it acts like a proper container should act
+
+        >>> from zope.app.container.tests.test_btree import TestBTreeContainer
+        >>> class Test(TestBTreeContainer):
+        ...    def makeTestObject(self):
+        ...        return ResourceContainer()
+        >>> run_unit_tests(Test)
+    """
+
+
+def doctest_Resource():
+    r"""Tests for Resource
+
+        >>> from schooltool.resource.interfaces import IResource
+        >>> from schooltool.resource.resource import Resource
+        >>> resource = Resource()
+        >>> verifyObject(IResource, resource)
+        True
+
+    Resources can have titles and descriptions too
+
+        >>> blender = Resource(title='Blender', description="It's broken.")
+        >>> blender.title
+        'Blender'
+        >>> blender.description
+        "It's broken."
+
+        >>> blender.notes
+        u''
+
+    """
+
+def doctest_Location():
+    r"""Test for Location
+
+        >>> from schooltool.resource.interfaces import ILocation
+        >>> from schooltool.resource.resource import Location
+        >>> room = Location()
+        >>> verifyObject(ILocation, room)
+        True
+
+    Locations have several standard peices of information associated with
+    them:
+
+        >>> room.capacity
+
+    """
+
+def doctest_Equipment():
+    r"""Test for Equipment
+
+        >>> from schooltool.resource.interfaces import IEquipment
+        >>> from schooltool.resource.resource import Equipment
+        >>> projector = Equipment()
+        >>> verifyObject(IEquipment, projector)
+        True
+
+    In addition to standard attributes, equipment also has the following
+    attributes:
+
+        >>> projector.manufacturer
+        u''
+        >>> projector.model
+        u''
+        >>> projector.serialNumber
+        u''
+        >>> projector.purchaseDate
+    """
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/tests/test_resource.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/tests/test_sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/tests/test_sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/tests/test_sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.resource.sampledata
+
+$Id: test_sampledata.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+import unittest
+
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup
+
+from schooltool.testing import setup as stsetup
+
+def setUp(test):
+    setup.placefulSetUp()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def doctest_SampleResources():
+    """A sample data plugin that generates resources
+
+        >>> from schooltool.resource.interfaces import ILocation
+        >>> from schooltool.resource.sampledata import SampleResources
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleResources()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> len(app['resources'])
+        0
+
+        >>> plugin.generate(app, 42)
+
+        >>> len(app['resources'])
+        88
+
+        >>> for i in range(64):
+        ...     assert ILocation.providedBy(app['resources']['room%02d' % i])
+
+        >>> for i in range(24):
+        ...     assert not ILocation.providedBy(app['resources']['projector%02d' % i])
+
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS),
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/tests/test_sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/resource/types.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/resource/types.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/resource/types.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,161 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2007 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Registration of types of resources.
+
+$Id: types.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+from zope.component import adapts
+from zope.component import queryUtility
+from zope.interface import directlyProvides
+from zope.interface import implements
+
+from zc.table.column import GetterColumn
+from zc.table.interfaces import ISortableColumn
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.resource.interfaces import (IResource, IResourceFactoryUtility,
+                                            ILocation, IEquipment,
+                                            IResourceTypeInformation,
+                                            IResourceSubTypes)
+from schooltool.table.table import LocaleAwareGetterColumn
+
+
+class ResourceFactoryUtility(object):
+    implements(IResourceSubTypes, IResourceFactoryUtility)
+
+    def __init__(self):
+        self.interface = IResource
+
+    def types(self):
+        app = getSchoolToolApplication()
+        types = set()
+        for resource in app['resources'].values():
+            if self.interface.providedBy(resource):
+                types.add(resource.type)
+        return list(types)
+
+    title = _("Resource")
+
+    def columns(self):
+        title = LocaleAwareGetterColumn(
+            name='title',
+            title=_(u'Title'),
+            getter=lambda i, f: i.title,
+            subsort=True)
+        directlyProvides(title, ISortableColumn)
+        return [title]
+
+class LocationFactoryUtility(ResourceFactoryUtility):
+    implements(IResourceFactoryUtility)
+
+    title = _("Location")
+
+    def __init__(self):
+        self.interface = ILocation
+
+    def columns(self):
+        title = LocaleAwareGetterColumn(
+            name='title',
+            title=_(u'Title'),
+            getter=lambda i, f: i.title,
+            subsort=True)
+        directlyProvides(title, ISortableColumn)
+        capacity = GetterColumn(
+            name='capacity',
+            title=_(u'Capacity'),
+            getter=lambda i, f: i.capacity,
+            subsort=True)
+        directlyProvides(capacity, ISortableColumn)
+        return [title, capacity]
+
+
+class EquipmentFactoryUtility(ResourceFactoryUtility):
+    implements(IResourceFactoryUtility)
+
+    title = _("Equipment")
+
+    def __init__(self):
+        self.interface = IEquipment
+
+    def columns(self):
+        title = LocaleAwareGetterColumn(
+            name='title',
+            title=_(u'Title'),
+            getter=lambda i, f: i.title,
+            subsort=True)
+        directlyProvides(title, ISortableColumn)
+        type = GetterColumn(
+            name='type',
+            title=_(u'Type'),
+            getter=lambda i, f: i.type,
+            subsort=True)
+        directlyProvides(type, ISortableColumn)
+        manufacturer = GetterColumn(
+            name='manufacturer',
+            title=_(u'Manufacturer'),
+            getter=lambda i, f: i.manufacturer,
+            subsort=True)
+        directlyProvides(manufacturer, ISortableColumn)
+        model = GetterColumn(
+            name='model',
+            title=_(u'Model'),
+            getter=lambda i, f: i.model,
+            subsort=True)
+        directlyProvides(model, ISortableColumn)
+        serialNumber = GetterColumn(
+            name='serialNumber',
+            title=_(u'Serial Number'),
+            getter=lambda i, f: i.serialNumber,
+            subsort=True)
+        directlyProvides(serialNumber, ISortableColumn)
+        purchaseDate = GetterColumn(
+            name='purchaseDate',
+            title=_(u'Purchase Date'),
+            getter=lambda i, f: i.purchaseDate,
+            subsort=True)
+        directlyProvides(purchaseDate, ISortableColumn)
+        return [title, type, manufacturer, model, serialNumber, purchaseDate]
+
+
+class ResourceTypeAdapter(object):
+    implements(IResourceTypeInformation)
+    adapts(IResource)
+
+    id = "resource"
+
+    def __init__(self, context):
+        self.context = context
+
+    @property
+    def title(self):
+        return queryUtility(IResourceFactoryUtility, name=self.id).title
+
+
+class LocationTypeAdapter(ResourceTypeAdapter):
+    adapts(ILocation)
+
+    id = "location"
+
+
+class EquipmentTypeAdapter(ResourceTypeAdapter):
+    adapts(IEquipment)
+
+    id = "equipment"


Property changes on: schooltool/branches/upstream/current/src/schooltool/resource/types.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,419 @@
+SchoolTool REST API client
+==========================
+
+
+Big Fat Warning
+---------------
+
+This is currently science fiction, i.e. it doesn't work.  It represents an idea
+of the ideal restive client API.
+
+It is now a functional test that you can run by doing ::
+
+    ./test.py -s src/schooltool/restclient -f --all
+
+It is disabled by default because it is not implemented yet.
+
+
+Introduction
+------------
+
+Let us connect to the SchoolTool server running on localhost, port 7001:
+
+    >>> from schooltool.restclient.restclient import SchoolToolClient
+    >>> client = SchoolToolClient('localhost', port=7001, ssl=False)
+
+Since we do not want to make actual HTTP connections in a functional test,
+we'll use a stub connectionFactory.
+
+    >>> from schooltool.restclient.ftests import RestConnectionFactory
+    >>> client.connectionFactory = RestConnectionFactory
+    >>> client.connectionFactory.handleErrors = True
+
+We will authenticate as the user 'manager' with password 'schooltool'
+
+    >>> client.setUser('manager', 'schooltool')
+
+We can take a look around
+
+    >>> print client.get('/')
+    <schooltool xmlns:xlink="http://www.w3.org/1999/xlink">
+      <message>Welcome to the SchoolTool server</message>
+      <containers>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost:7001/terms"
+                   xlink:title="terms"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost:7001/persons"
+                   xlink:title="persons"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost:7001/courses"
+                   xlink:title="courses"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost:7001/levels"
+                   xlink:title="levels"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost:7001/groups"
+                   xlink:title="groups"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost:7001/ttschemas"
+                   xlink:title="ttschemas"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost:7001/sections"
+                   xlink:title="sections"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost:7001/resources"
+                   xlink:title="resources"/>
+      </containers>
+    </schooltool>
+
+
+XXX mg: idea: RESTiveClient() that has get/put/post/delete, and
+        SchoolToolClient which either subclasses or delegates and provides
+        high-level API.
+    ignas: +5
+
+
+High-level API
+--------------
+
+But working at this low level is not convenient.  SchoolTool client provides
+high-level access methods.
+
+Here's how you can look at the person list:
+
+    >>> all_persons = client.getPersons()
+    >>> all_persons
+    [<PersonRef SchoolTool Manager at http://localhost:7001/persons/manager>]
+
+Initially our server has only one user -- the manager
+
+    >>> manager = all_persons[0]
+    >>> manager.title
+    u'SchoolTool Manager'
+    >>> manager.url
+    u'http://localhost:7001/persons/manager'
+
+Here's how you can look at the group list:
+
+    >>> all_groups = client.getGroups()
+    >>> all_groups
+    [<GroupRef Manager at http://localhost:7001/groups/manager>]
+
+    >>> manager_group = all_groups[0]
+    >>> manager_group.title
+    u'Manager'
+    >>> manager_group.url
+    u'http://localhost:7001/groups/manager'
+
+You can take a closer look at that person or group
+
+    >>> person_info = manager.getInfo()
+    >>> person_info.title
+    u'SchoolTool Manager'
+
+    >>> group_info = manager_group.getInfo()
+    >>> group_info.title
+    u'Manager'
+    >>> group_info.description
+    u'Manager Group.'
+
+    >>> manager_group.getMembers()
+    []
+
+Initially there are no resources, courses nor sections:
+
+    >>> client.getResources()
+    []
+
+    >>> client.getCourses()
+    []
+
+    >>> client.getSections()
+    []
+
+
+Importing users
+---------------
+
+Suppose we need to import a list of users.  Some of the users have photos
+
+    >>> data = '''
+    ... Person1, username1, password1
+    ... Person5, username5, password5, face.txt
+    ... '''.strip()
+
+    >>> import os
+    >>> import schooltool.restclient.ftests
+    >>> basedir = os.path.dirname(schooltool.restclient.ftests.__file__)
+
+    >>> import csv
+    >>> for row in csv.reader(data.splitlines()):
+    ...     title, username, password = map(str.strip, row[:3])
+    ...     person = client.createPerson(title, username)
+    ...     person.setPassword(password)
+    ...     if len(row) > 3:
+    ...         filename = os.path.join(basedir, row[3].strip())
+    ...         photo = file(filename, 'rb').read()
+    ...         person.setPhoto(photo, 'image/jpeg')
+
+XXX TODO: getPhoto -- how do we get the content type?  What happens when there
+is no photo -- do we get None or an exception?
+
+
+Duplicate users
+---------------
+
+If you try to create a person which already exists, well, the new person
+overrides the old one.
+
+    >>> client.createPerson('John Smith', 'john')
+    <PersonRef John Smith at /persons/john>
+
+    >>> client.createPerson('John Doe', 'john')
+    <PersonRef John Doe at /persons/john>
+
+    >>> print client.get('/persons/john').read()
+    <person ...>
+      <title>John Doe</title>
+      ...
+    </person>
+
+
+Importing groups
+----------------
+
+Suppose we need to import a list of groups and persons, creating them on
+demand, or using existing ones, if they are already there.
+
+    >>> data = '''
+    ... Group1 Person1
+    ... Group1 Person2
+    ... Group2 Person1
+    ... '''.strip()
+
+We will need to know which groups and persons we have already created.
+
+    >>> group_map = {}
+    >>> person_map = {}
+
+First let us populate the maps with existing users and groups:
+
+    >>> for group in client.getGroups():
+    ...     group_map[group.title] = group
+
+    >>> for person in client.getPersons():
+    ...     person_map[person.title] = person
+
+Now we loop through the data line by line, creating persons and groups if
+necessary, and adding persons as group members.
+
+    >>> from schooltool.restclient.restclient import SchoolToolError
+    >>> for line in data.splitlines():
+    ...     group_title, person_title = line.split()
+    ...     group = group_map.get(group_title)
+    ...     if group is None:
+    ...         group = client.createGroup(group_title)
+    ...         group_map[group_title] = group
+    ...     person = person_map.get(person_title)
+    ...     if person is None:
+    ...         username = person_title.lower().replace(' ', '-')
+    ...         person = client.createPerson(person_title, username)
+    ...         person_map[person_title] = person
+    ...     try:
+    ...         group.addMember(person)
+    ...     except SchoolToolError, e:
+    ...         pass # already a member
+
+XXX mg: but if we get 500 ServerError, or http timeout/connection refused, then
+we don't want to ignore that exception!
+
+
+More imports
+------------
+
+We can add Resources, Sections, Courses in a similar way too:
+
+Resources:
+
+    >>> data = '''
+    ... Resource1, A simple resource
+    ... Resource2, A complex resource
+    ... beamer-1, A good new beamer
+    ... beamer-2, An old bad beamer
+    ... '''.strip()
+
+    >>> for row in csv.reader(data.splitlines()):
+    ...     title, description = map(str.strip, row)
+    ...     resource = client.createResource(title, description)
+
+Courses:
+
+    >>> data = '''
+    ... History, History for the sixth grade
+    ... English, English for the first grade
+    ... '''.strip()
+
+    >>> for row in csv.reader(data.splitlines()):
+    ...     title, description = map(str.strip, row)
+    ...     course = client.createCourse(title, description)
+
+Sections are a bit more difficult because most of the time they come
+attached to some course, have some learners and an instructor:
+
+    >>> data = '''
+    ... History, 6a, Hoffman
+    ... English, 6a, James
+    ... History, 7a, Nathaniel
+    ... '''.strip()
+
+We will need to know which groups and courses we have already created.
+
+    >>> person_map = {}
+    >>> group_map = {}
+    >>> course_map = {}
+
+First let us populate the maps with existing groups and courses:
+
+    >>> for person in client.getPersons():
+    ...     person_map[person.title] = person
+
+    >>> for group in client.getGroups():
+    ...     group_map[group.title] = group
+
+    >>> for course in client.getCourses():
+    ...     course_map[course.title] = course
+
+Now we loop through the data line by line, creating courses and groups if
+necessary, and adding sections as group members.
+
+    >>> for line in data.splitlines():
+    ...     course_title, group_title, person_title = line.split()
+    ...     group = group_map.get(group_title)
+    ...     if group is None:
+    ...         group = client.createGroup(group_title)
+    ...         group_map[group_title] = group
+    ...     course = course_map.get(course_title)
+    ...     if course is None:
+    ...         course = client.createCourse(course_title)
+    ...         course_map[course_title] = course
+    ...     person = person_map.get(person_title)
+    ...     if person is None:
+    ...         username = person_title.lower().replace(' ', '-')
+    ...         person = client.createPerson(person_title, username)
+    ...         person_map[person_title] = person
+    ...     section = client.createSection('%s %s' % (course_title, group_title))
+    ...     try:
+    ...         course.addSection(section)
+    ...         section.addInstructor(person)
+    ...         section.addLearner(group)
+    ...     except SchoolToolError, e:
+    ...         pass # already a member
+
+
+Timetabling
+-----------
+
+You can create a term
+
+    >>> import calendar
+    >>> from datetime import date
+    >>> client.createTerm(name='2004-fall', title='Fall of 2004',
+    ...                   first=date(2004, 9, 1), last=date(2004, 12, 31),
+    ...                   daysofweek=range(calendar.MONDAY, calendar.FRIDAY+1),
+    ...                   holidays=[date(2004, 10, 31),
+    ...                             date(2004, 12, 25)])
+    <TermRef Fall of 2004 at /terms/2004-fall>
+
+At the moment we can at least list existing terms:
+
+    >>> client.getTerms()
+    [<TermRef Fall of 2004 at http://localhost:7001/terms/2004-fall>]
+
+Same for school timetables:
+
+    >>> client.getSchoolTimetables()
+    [<SchoolTimetableRef Standard Weekly at http://localhost:7001/ttschemas/standard-weekly>]
+
+
+Information
+-----------
+
+Use case: download all information about a resource, edit it, upload it back.
+
+    >>> resource = client.getResource('/resources/beamer-2')
+    >>> resource.title
+    >>> resource.url
+    >>> resource_info = resource.getInfo()
+    >>> resource_info.title
+    '...'
+    >>> resource_info.description
+    '...'
+    >>> resource_info.is_location
+    False
+
+Modify!
+
+    >>> resource_info.is_location = True
+    >>> resource_info.description += '\n' + 'Tastes good with mustard.'
+    >>> resource.changeInfo(resource_info)
+
+You do it the same way with persons/groups/courses/sections.
+
+
+Deleting objects
+----------------
+
+Suppose we got bored of the second beamer.
+
+    >>> client.deleteObject(resource)
+
+It is gone now:
+
+    >>> client.get(resource.url)
+    <Response: 404 Not Found>
+
+
+Calendars
+---------
+
+    >>> manager.calendar
+    <CalendarRef http://localhost:7001/persons/manager/calendar>
+    >>> manager.calendar.get_iCalendar()
+    'BEGIN:VCALENDAR...'
+
+
+Arbitrary relationships
+-----------------------
+
+You can create new relationships
+
+    >>> manager.createRelationship(beamer.calendar,
+    ...                            URICalendarSubscription,
+    ...                            URICalendarProvider)
+
+You can see a list of all relationships.
+
+    >>> relationships = manager.getRelationships()
+    >>> relationships
+    [<Relationship /persons/manager (Member) -> /groups/manager (Group)>,
+     <Relationship /perosns/manbager (Member) -> /resources/beamer-1 (Resource)>]
+
+    >>> relationships[0].url
+    'http://localhost/persons/manager/relationships/1'
+    >>> relationships[0].target
+    <ObjectRef DaGroup#2 http:///localhost:7001/...>
+    >>> relationships[0].target.url
+    'http://loclahost:8001/resources/beamer-1'
+    >>> relationships[0].target.title
+    'Da group # 2'
+    >>> relationships[0].target_role
+    URIGroup
+    >>> relationships[0].arcrole
+    URIMememberthisp
+
+You can destroy existing ones
+
+    >>> relationships[-1].delete()
+
+Ta-da.


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/examples/export.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/examples/export.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/examples/export.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,108 @@
+#!/usr/bin/env python
+"""A script that exports a list of SchoolTool users into one CSV file
+and connections between groups and users into another one.
+
+Fields in persons.csv:
+  username, title
+
+Fields in groups.csv:
+  group_id, title, description, member1, member2, member3, ...
+
+"""
+
+# Configuration
+
+server_address = 'localhost'
+server_port = 7001
+username = 'manager'
+password = 'schooltool'
+
+# End of configuration
+
+import sys
+import os
+
+
+if sys.version_info < (2, 3):
+    print >> sys.stderr, '%s: need Python 2.3 or later.' % sys.argv[0]
+    print >> sys.stderr, 'Your python is %s' % sys.version
+    sys.exit(1)
+
+
+import csv    # This is one of the reasons why we need 2.3
+
+
+# SchoolTool should be in the Python path.  Let us make it run
+# directly in the source checkout
+basedir = os.path.normpath(os.path.join(os.path.dirname(__file__),
+                                        os.path.pardir,
+                                        os.path.pardir,
+                                        os.path.pardir,
+                                        os.path.pardir))
+sys.path.insert(0, os.path.join(basedir, 'src'))
+sys.path.insert(0, os.path.join(basedir, 'Zope3', 'src'))
+
+
+from schooltool.restclient.restclient import SchoolToolClient
+
+
+
+def get_id(ref):
+    """Get object ID from its URL."""
+    url = ref.url
+    return url.split("/")[-1]
+
+
+def process_persons(stc):
+    """Extract a sequence of person IDs and titles from the server.
+
+    Returned strings are in UTF-8.
+    """
+    for person_ref in stc.getPersons():
+        person_id = get_id(person_ref).encode("UTF-8")
+        person_title = person_ref.title.encode("UTF-8")
+        yield (person_id, person_title)
+
+
+def export_persons(file_name, persons):
+    """Write a list of person ID and title tuples to a CSV file."""
+    f = open(file_name, "w")
+    writer = csv.writer(f)
+    writer.writerows(persons)
+
+
+def process_groups(stc):
+    """Extract a sequence of groups and their members from the server.
+
+    Returned strings are in UTF-8.
+    """
+    for group_ref in stc.getGroups():
+        group_id = get_id(group_ref).encode("UTF-8")
+
+        group_info = group_ref.getInfo()
+        title = group_info.title.encode("UTF-8")
+        description = group_info.description.encode("UTF-8")
+
+        member_refs = group_ref.getMembers()
+        member_ids = [get_id(ref).encode("UTF-8") for ref in member_refs]
+
+        yield [group_id, title, description] + member_ids
+
+
+def export_groups(file_name, groups_and_members):
+    """Write a list of groups and their members to a CSV file."""
+    f = open(file_name, "w")
+    writer = csv.writer(f)
+    writer.writerows(groups_and_members)
+
+
+def main():
+    """Export groups and persons from a SchoolTool server."""
+    stc = SchoolToolClient(server_address, server_port)
+    stc.setUser(username, password)
+    export_persons("persons.csv", process_persons(stc))
+    export_groups("groups.csv", process_groups(stc))
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/examples/export.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/examples/groups.csv
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/examples/groups.csv	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/examples/groups.csv	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,22 @@
+group00,Marching band,,student917,student183,student950,student860,student182,student538,student699,student258,student382,student401,student042,student392,student528,student162,student569,student100,student195,student813,student362,student746
+group01,Swing chorus,,student791,student916,student299,student667,student805,student881,student853,student131,student607,student840,student697,student900,student617,student648,student596,student395,student075,student779,student831,student510
+group02,Chess club,,student232,student307,student701,student737,student611,student615,student540,student520,student197,student802,student030,student221,student485,student346,student488,student306,student178,student115,student716,student492
+group03,Dungeons and Dragons club,,student962,student657,student674,student896,student509,student455,student345,student953,student135,student193,student273,student059,student643,student067,student444,student384,student475,student410,student171,student670
+group04,Jazz dance,,student720,student073,student442,student781,student279,student250,student858,student292,student459,student533,student560,student693,student276,student325,student407,student921,student704,student804,student582,student169
+group05,Newspaper,,student630,student031,student105,student124,student516,student054,student958,student222,student911,student651,student572,student114,student767,student669,student888,student151,student341,student329,student214,student414
+group06,Yearbook,,student257,student519,student777,student947,student553,student598,student841,student792,student506,student344,student818,student256,student764,student785,student971,student525,student830,student150,student827,student339
+group07,Basketball,,student471,student083,student688,student285,student185,student056,student399,student584,student331,student431,student429,student348,student277,student689,student499,student811,student994,student204,student245,student599
+group08,Swimming,,student801,student163,student714,student000,student020,student381,student532,student970,student129,student489,student233,student132,student352,student772,student039,student591,student015,student061,student239,student783
+group09,Gymnastics,,student238,student426,student989,student408,student028,student587,student945,student728,student177,student543,student703,student810,student986,student622,student440,student518,student294,student559,student894,student984
+group10,Drama,,student934,student038,student037,student133,student013,student002,student358,student750,student008,student590,student698,student474,student941,student741,student683,student517,student380,student531,student314,student668
+group11,Computer club,,student556,student099,student230,student930,student876,student882,student326,student678,student854,student983,student094,student152,student807,student315,student926,student933,student641,student295,student275,student227
+group12,Hip-Hop,,student328,student398,student851,student975,student156,student508,student512,student284,student355,student043,student849,student367,student577,student388,student267,student437,student303,student301,student760,student756
+group13,Greenpeace,,student125,student713,student874,student332,student568,student992,student635,student416,student526,student586,student742,student820,student871,student687,student236,student775,student027,student051,student049,student347
+group14,Sewing,,student736,student241,student111,student456,student087,student729,student200,student375,student773,student213,student360,student110,student565,student117,student490,student095,student196,student045,student613,student666
+group15,Scouts,,student361,student495,student589,student366,student415,student790,student260,student937,student981,student305,student954,student166,student023,student680,student987,student234,student961,student730,student308,student333
+group16,Cart racing,,student885,student878,student564,student705,student608,student478,student029,student867,student768,student173,student068,student776,student580,student828,student304,student102,student417,student402,student391,student109
+group17,ST radio,,student890,student762,student365,student723,student497,student313,student800,student610,student815,student664,student448,student625,student066,student113,student350,student588,student403,student546,student253,student340
+group18,Cheerleading,,student793,student104,student609,student377,student287,student967,student798,student544,student208,student935,student091,student731,student593,student567,student473,student288,student170,student484,student021,student255
+group19,Aikido,,student973,student090,student700,student982,student955,student554,student952,student296,student634,student661,student740,student789,student168,student865,student795,student748,student460,student412,student614,student837
+manager,Manager,Manager Group.
+teachers,Teachers,,teacher000,teacher009,teacher010,teacher011,teacher012,teacher013,teacher014,teacher015,teacher016,teacher017,teacher018,teacher001,teacher019,teacher020,teacher021,teacher022,teacher023,teacher024,teacher025,teacher026,teacher027,teacher028,teacher002,teacher029,teacher030,teacher031,teacher032,teacher033,teacher034,teacher035,teacher036,teacher037,teacher038,teacher003,teacher039,teacher040,teacher041,teacher042,teacher043,teacher044,teacher045,teacher046,teacher047,teacher004,teacher005,teacher006,teacher007,teacher008

Added: schooltool/branches/upstream/current/src/schooltool/restclient/examples/import.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/examples/import.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/examples/import.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+"""A script for importing persons and groups into a running SchoolTool.
+
+It expects to find two CSV files in the current directory: persons.csv
+and groups.csv.
+
+Fields in persons.csv:
+  username, title
+
+Fields in groups.csv:
+  group_id, title, description, member1, member2, member3, ...
+
+"""
+
+# Configuration
+
+server_address = 'localhost'
+server_port = 7001
+username = 'manager'
+password = 'schooltool'
+
+# End of configuration
+
+import sys
+import os
+
+
+if sys.version_info < (2, 3):
+    print >> sys.stderr, '%s: need Python 2.3 or later.' % sys.argv[0]
+    print >> sys.stderr, 'Your python is %s' % sys.version
+    sys.exit(1)
+
+
+import csv    # This is one of the reasons why we need 2.3
+
+
+# SchoolTool should be in the Python path.  Let us make it run
+# directly in the source checkout
+basedir = os.path.normpath(os.path.join(os.path.dirname(__file__),
+                                        os.path.pardir,
+                                        os.path.pardir,
+                                        os.path.pardir,
+                                        os.path.pardir))
+sys.path.insert(0, os.path.join(basedir, 'src'))
+sys.path.insert(0, os.path.join(basedir, 'Zope3', 'src'))
+
+
+from schooltool.restclient.restclient import SchoolToolClient
+
+
+
+def import_persons(filename, stc):
+    """Read a CSV file and create all persons mentioned therein on the server.
+
+    Expects the CSV file to be in UTF-8.
+
+    Returns a mapping from usernames to PersonRefs.
+    """
+    persons = {}
+    data = open(filename)
+    reader = csv.reader(data)
+    for row in reader:
+        row = [cell.decode('UTF-8') for cell in row]
+        username, title = row
+        person = stc.createPerson(title, username)
+        persons[username] = person
+    return persons
+
+
+def add_members_to_groups(filename, stc, persons):
+    """Read a CSV file and create groups with members.
+
+    Expects the CSV file to be in UTF-8.
+    """
+    data = open(filename)
+    reader = csv.reader(data)
+    for row in reader:
+        row = [cell.decode('UTF-8') for cell in row]
+        group_id, title, description = row[:3]
+        group = stc.createGroup(title, description=description,
+                                name=group_id)
+        for member_id in row[3:]:
+            try:
+                person = persons[member_id]
+                group.addMember(person)
+            except KeyError:
+                print "Person with id '%s' was not mentioned in persons.csv" % member_id
+
+
+def main():
+    """Import groups and persons to a SchoolTool server."""
+    stc = SchoolToolClient(server_address, server_port)
+    stc.setUser(username, password)
+    persons = import_persons("persons.csv", stc)
+    add_members_to_groups("groups.csv", stc, persons)
+
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/examples/import.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/examples/persons.csv
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/examples/persons.csv	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/examples/persons.csv	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1049 @@
+manager,SchoolTool Manager
+student000,Florian Hart
+student001,Peg Jorgensen
+student002,Sherm Sullivan
+student003,Piotr Cooper
+student004,Piotr Bradley
+student005,Miriam Petersen
+student006,Kimmy Ellis
+student007,Emily Terry
+student008,Rick Hunt
+student009,Magnus Parks
+student010,Ted Barrett
+student011,Teddy Lynch
+student012,Nicolas Marshall
+student013,Sophie Dixon
+student014,Kaylee Fernandez
+student015,Katie Brown
+student016,Bengie Grant
+student017,Mary Pearson
+student018,Lotte Renard
+student019,Ana Norris
+student020,Andrew Hill
+student021,Al Pierce
+student022,Lea Madsen
+student023,Dylan Rhodes
+student024,Olivia Levi
+student025,Jill Jenkins
+student026,Daniel Webb
+student027,Christopher Richards
+student028,Ashley Moore
+student029,Hannah Andersen
+student030,Lukas Harrison
+student031,Wilma Vaughn
+student032,Leonie Peters
+student033,Erin Maes
+student034,Alejandro Janssens
+student035,Emily O'Connor
+student036,Krzysztof Bishop
+student037,Niklas Christensen
+student038,Daan Terry
+student039,Isabel Burke
+student040,Dave Rodriquez
+student041,Aoife Price
+student042,Steph Graham
+student043,Frederik Horton
+student044,Elena Holland
+student045,Camilla Reid
+student046,Lewis Gregory
+student047,Fabian Jackson
+student048,Lu O'Reilly
+student049,Matthew Jorgensen
+student050,Hugo Andersen
+student051,Liam Greene
+student052,Tobias Beck
+student053,Christopher Mitchell
+student054,Theodore Bush
+student055,Sammy Leclercq
+student056,Alexis Levi
+student057,Jim Miles
+student058,Margaret Bowman
+student059,Sherman Gallagher
+student060,Frederik Nguyen
+student061,Ivan Hernandez
+student062,Mick Dubois
+student063,Piotr Oliver
+student064,Nicholas Stevens
+student065,Eleanor Poulsen
+student066,Johnny Mason
+student067,Jose Morales
+student068,Nicky Morrison
+student069,Maximilian Kelly
+student070,Joey Reed
+student071,Steve Ferguson
+student072,Vanessa Lane
+student073,Marty Willis
+student074,Hannah Hicks
+student075,Daniel Rogers
+student076,Alejandro Bishop
+student077,Jeanette Nichols
+student078,Geoff White
+student079,Andrew Vargas
+student080,Nick Kelly
+student081,Nicolas Medina
+student082,Ed Knight
+student083,Cristian Fleming
+student084,Kim Bishop
+student085,Nicolas Lejeune
+student086,Tyler Perry
+student087,Nicolas Edwards
+student088,Aoife Bailey
+student089,Diego Shaw
+student090,Madison Sanchez
+student091,Jose Parker
+student092,Max Nichols
+student093,Daan White
+student094,Herb Carter
+student095,Scotty Patterson
+student096,Geoffery Jorgensen
+student097,Peggy Douglas
+student098,Willy Stewart
+student099,Maggie Jennings
+student100,Nathan Bell
+student101,Max Elliott
+student102,Dick Vaughn
+student103,Taylor O'Sullivan
+student104,Tara Cook
+student105,Emil Mortensen
+student106,Chuck Lambert
+student107,Tobias Gomez
+student108,Jo Renard
+student109,Cecilie Ellis
+student110,Jeanette Harper
+student111,Joanne Simon
+student112,Elena Powell
+student113,Bram Wright
+student114,Scotty Sullivan
+student115,Eleanor West
+student116,Klara White
+student117,Gillian Davies
+student118,Sergio Sanchez
+student119,Christian Alexander
+student120,Nicky Spencer
+student121,Freja Lawson
+student122,Sammy Rogers
+student123,Jesse Garza
+student124,Carla Mueller
+student125,Edward Beck
+student126,Madison Bishop
+student127,Sean Greene
+student128,Joe Morales
+student129,Helen Douglas
+student130,Janet Fletcher
+student131,Tim Willis
+student132,Francisco Taylor
+student133,Margarita Cooper
+student134,Sem Castro
+student135,Oscar Ellis
+student136,Nathan Powell
+student137,Philippa Santiago
+student138,David Rhodes
+student139,Emil Williams
+student140,Harry Campbell
+student141,Samantha Chavez
+student142,Ashley Sullivan
+student143,Stanislaw Cox
+student144,Jose Christiansen
+student145,Agnieszka Hamilton
+student146,Theodore Gibson
+student147,Caroline Soto
+student148,Andrzej Carlson
+student149,Margaret Dumont
+student150,Ciara Cooper
+student151,Mick Ramirez
+student152,Isabel Moreno
+student153,Cath Newman
+student154,Bill Andersen
+student155,Florian Santiago
+student156,Kaylee Lynch
+student157,Charles Fowler
+student158,Nicholas Mason
+student159,Hugo Craig
+student160,Jim Pearson
+student161,Andrzej Graham
+student162,Lu Kelly
+student163,Jace Castillo
+student164,Pete Phillips
+student165,Christopher Olsen
+student166,Daniela Schulz
+student167,Katarzyna O'Connor
+student168,Mary Robinson
+student169,Dave King
+student170,Eleanor Johansen
+student171,Amy Harper
+student172,Albert Ellis
+student173,Camila Gutierrez
+student174,Nate Simon
+student175,Bess Jensen
+student176,Trevor O'Reilly
+student177,Cathy Boyd
+student178,Cathy Stephens
+student179,Camilla Maes
+student180,Victor Mortensen
+student181,Ted Hart
+student182,Javier Harris
+student183,Betty Bryant
+student184,Willy Weber
+student185,Carolina O'Brien
+student186,Carlos Nguyen
+student187,Stephen Rhodes
+student188,Thelma Ortiz
+student189,Camilla Evans
+student190,Bess Alexander
+student191,Stephanie Gonzales
+student192,Andrzej Olsen
+student193,Cristian Burton
+student194,Alvaro Reynolds
+student195,Zoe Becker
+student196,Nerea Ryan
+student197,Jamie Stephens
+student198,Claudia West
+student199,Milan Hanson
+student200,Dorothy Santos
+student201,Megan Montgomery
+student202,Isak Hart
+student203,Lea Rasmussen
+student204,Hugo Armstrong
+student205,Lea Bryant
+student206,Drew Arnold
+student207,Christopher Brown
+student208,Marcin Marshall
+student209,Sam Price
+student210,Wilma Sutton
+student211,Ainhoa Burke
+student212,Vanessa Garza
+student213,Iris Hawkins
+student214,Janet Carroll
+student215,Leonie Lee
+student216,Katie Garrett
+student217,Zofia Nguyen
+student218,Isabelle Fox
+student219,Michael Hill
+student220,Lea Hunt
+student221,Luca Carter
+student222,Jeffery Holt
+student223,Lizzy Murray
+student224,Ross Turner
+student225,Lotte Carter
+student226,Rachel Renard
+student227,Eleanor Lowe
+student228,Andy Alvarez
+student229,Ashley Martin
+student230,Amy Thompson
+student231,Piotr Fuller
+student232,Jozef Ferguson
+student233,Trevor Wade
+student234,Sara Coleman
+student235,Viktor Gallagher
+student236,Tony Cox
+student237,Betty Porter
+student238,Theodore Lowe
+student239,Theodore Nielsen
+student240,John Cole
+student241,Theodore Olson
+student242,Jaclyn Griffin
+student243,Lara Gilbert
+student244,Louise Hopkins
+student245,Liam Cooper
+student246,Lukas Cruz
+student247,Karin Chambers
+student248,Edwyn King
+student249,Pedro Holland
+student250,Hannah West
+student251,Katharina Ortiz
+student252,Amy Ramirez
+student253,Benjamin Wilson
+student254,Ashley Hall
+student255,Frederik Lane
+student256,Liam O'Doherty
+student257,Theodore Rodriguez
+student258,Pedro Peterson
+student259,Jane Howell
+student260,Anne Curry
+student261,Sam Schneider
+student262,Nigel Diaz
+student263,Lizzy Hoffman
+student264,Cath Parker
+student265,Chloe Ortiz
+student266,Ruth Neal
+student267,Hiram O'Sullivan
+student268,Amber Mendoza
+student269,Nicholas Carr
+student270,Andrzej Nelson
+student271,Tyler Ortiz
+student272,Sydney Gregory
+student273,Simon Dubois
+student274,Mikkel Fischer
+student275,Nathan Edwards
+student276,Alexander Foster
+student277,Tara Bates
+student278,Jozef Johnson
+student279,Femke Daniels
+student280,Kim Cunningham
+student281,Milan Holland
+student282,Tomasz Wagner
+student283,Lara Reyes
+student284,Iris Montgomery
+student285,Ashley Foster
+student286,Nathan Nichols
+student287,Charlie Rasmussen
+student288,Joe Graham
+student289,Charles Black
+student290,Linnea Hansen
+student291,Isaac Owens
+student292,Jim Day
+student293,Pedro Quinn
+student294,Bill Goossens
+student295,Jose Laurent
+student296,Lucia Sims
+student297,Sophie Hayes
+student298,Jessica Neal
+student299,Alvaro Gonzalez
+student300,Victor Fleming
+student301,Lucas King
+student302,Camila Fischer
+student303,Fabian Long
+student304,Piotr Hunter
+student305,Sam De los Santos
+student306,Paula Christensen
+student307,Cecilie Watson
+student308,Charles Simon
+student309,Lauren Ramos
+student310,Andy Porter
+student311,Lewis De los Santos
+student312,Daniel Johnston
+student313,Katharina Nichols
+student314,Kay Turner
+student315,Samantha Garcia
+student316,Ewa Santiago
+student317,Andrea Nielsen
+student318,Sam Garcia
+student319,Matthew Crawford
+student320,Florian Baker
+student321,Lukas O'Sullivan
+student322,Willy Lambert
+student323,Sid Holmes
+student324,Leon Fields
+student325,Christian Montgomery
+student326,Joe Hunter
+student327,Jean Mortensen
+student328,Tom Watts
+student329,Marta George
+student330,Nicky O'Doherty
+student331,Charles Ryan
+student332,Dick Edwards
+student333,Lotte Baker
+student334,Trevor Jones
+student335,Lea Vargas
+student336,Kayleigh Mercado
+student337,Scotty Phillips
+student338,Mario Beck
+student339,Jaclyn Evans
+student340,Albert Sutton
+student341,Rich Sutton
+student342,Margaret Garrett
+student343,Pip Jorgensen
+student344,Alejandro Herrera
+student345,Anthony Peterson
+student346,Zoe Moore
+student347,Dylan Hamilton
+student348,Joshua Hunter
+student349,Maximilian Dixon
+student350,Herb Foster
+student351,Niklas Larsen
+student352,Scottie Janssens
+student353,Lara De los Santos
+student354,Jeffery Schneider
+student355,Sharon Peterson
+student356,Gill Reyes
+student357,Bengie Matthews
+student358,Cathy Williamson
+student359,Mathias Foster
+student360,Rick Fletcher
+student361,Isaac Anderson
+student362,Elena Watts
+student363,Jose Butler
+student364,Filip Arnold
+student365,Scotty Hamilton
+student366,Phil Wright
+student367,Drew Carroll
+student368,Drew Schulz
+student369,Elin Becker
+student370,Joey Lawson
+student371,Alvaro Harris
+student372,Annie Brewer
+student373,Ricky Price
+student374,Cameron Christensen
+student375,Dylan Morrison
+student376,Geoffery Boyd
+student377,Sherm Evans
+student378,Edward Harper
+student379,Ida Torres
+student380,Drew Meyer
+student381,Bram Russell
+student382,Jeanette Payne
+student383,Gabbie Curtis
+student384,Mads King
+student385,Manuel Smith
+student386,James White
+student387,Rick Willems
+student388,Leonie Christiansen
+student389,Ashley Peterson
+student390,Patricia Brewer
+student391,Scottie Dawson
+student392,Peggy Dumont
+student393,Jack Holt
+student394,Hugo Larsen
+student395,Kayleigh Mills
+student396,Ricky Robinson
+student397,Cian Willems
+student398,Vanessa Thomas
+student399,Kaylee Schmidt
+student400,Ted Schultz
+student401,Sophie Tucker
+student402,Pip Hardy
+student403,Mads Rogers
+student404,Mathilde Tucker
+student405,Steph Garrett
+student406,Iris Hart
+student407,Ross Horton
+student408,Hanna Cunningham
+student409,Rasmus Palmer
+student410,Liam Torres
+student411,Betty Santos
+student412,Philip Jimenez
+student413,Bill Weber
+student414,Leah Willems
+student415,Liam Vaughn
+student416,Chloe Boyd
+student417,Isak Anderson
+student418,Rolla Pedersen
+student419,Syd Walker
+student420,Sophie Thompson
+student421,Katarzyna Vasquez
+student422,Adam Mckinney
+student423,Samantha Gibson
+student424,Ivan Henderson
+student425,Sergio Herrera
+student426,Elzbieta Lawrence
+student427,Ollie Jenkins
+student428,Joe Wood
+student429,Cameron Pierce
+student430,Vanessa Harrison
+student431,Betty Morgan
+student432,Sean Flores
+student433,Lizzy Alvarez
+student434,Catharine Tucker
+student435,Lu Vaughn
+student436,Joey Hanson
+student437,Megan Lopez
+student438,Susan Bennett
+student439,Leah May
+student440,Cath Crawford
+student441,Ewa Morales
+student442,Megan Doyle
+student443,William O'Reilly
+student444,Sydney Davies
+student445,Daan Wells
+student446,Jane Campbell
+student447,Klara Perez
+student448,Emil Mortensen
+student449,Juana Horton
+student450,Georgina Spencer
+student451,Matthew Richards
+student452,Adam Foster
+student453,Lauren Welch
+student454,Carolina Mercado
+student455,Amber Wilson
+student456,Theodore Little
+student457,Drew Doyle
+student458,Sylvia Weaver
+student459,Mathias Sanchez
+student460,Christian Pierce
+student461,Sem Powell
+student462,Bengie Crawford
+student463,Ed Dunn
+student464,Trevor Little
+student465,Duncan Lawson
+student466,Rick Hansen
+student467,Sydney Morgan
+student468,Miriam McCarthy
+student469,Stanislaw Weber
+student470,Miriam Jennings
+student471,Nicolas Mckinney
+student472,Harry Poulsen
+student473,Edwyn Hudson
+student474,Marcin Ramos
+student475,Mathilde Watson
+student476,Elena Meyer
+student477,Will Andrews
+student478,Jozef Willis
+student479,Jean Franklin
+student480,Trevor Hoffmann
+student481,Maggie Olsen
+student482,Stephanie Young
+student483,Sofia Jackson
+student484,Ted Bennett
+student485,Katie Garza
+student486,Alva Rice
+student487,Sylvia Stewart
+student488,Mathias Fowler
+student489,Florian Lane
+student490,Lena Wells
+student491,Tom Chambers
+student492,Ana Mortensen
+student493,Ruth Sims
+student494,Bob Collins
+student495,Linnea Hamilton
+student496,Nerea Patterson
+student497,Mario Fleming
+student498,Hugo Cooper
+student499,Simon Mendez
+student500,Leonie Mcdaniel
+student501,Tim Doyle
+student502,Margaret Duncan
+student503,Alice Cohen
+student504,Alba Powell
+student505,Sharon Byrne
+student506,Joanne Byrd
+student507,Maggie O'Reilly
+student508,Ciara Knudsen
+student509,Harold Rose
+student510,Ruth Martinez
+student511,Maja Curry
+student512,Hank Turner
+student513,Daan Laurent
+student514,Maria Howard
+student515,Erik Robertson
+student516,Alice Holmes
+student517,Lucy Allen
+student518,Jan Sullivan
+student519,Erik Walsh
+student520,Laura Peters
+student521,Juana Moreno
+student522,Carlos Davidson
+student523,Margaret Dean
+student524,Magnus Daniels
+student525,Karin Matthews
+student526,Lincoln Ford
+student527,Dick Dixon
+student528,Lewis Tucker
+student529,Thomas Gonzales
+student530,Emily Jimenez
+student531,Herb Chapman
+student532,Vanessa Miller
+student533,Helen Ferguson
+student534,Tommy Byrne
+student535,Gill Carroll
+student536,Jace Bell
+student537,Sue Snyder
+student538,Raul Jensen
+student539,Amy Harvey
+student540,Diego Reid
+student541,Thomas Barnett
+student542,Ada Neal
+student543,Thelma Garcia
+student544,Joey Graves
+student545,Ewa Gibson
+student546,Elena Andrews
+student547,Ted Johansen
+student548,Sanne Laurent
+student549,Ana Davis
+student550,Jeanette Schulz
+student551,Sara Stone
+student552,Al Riley
+student553,Nerea Patterson
+student554,Ricky Romero
+student555,Liza Gutierrez
+student556,Nicolas Austin
+student557,Emily Fisher
+student558,Juan Roberts
+student559,Iris Russell
+student560,Henry Weaver
+student561,Wilma Soerensen
+student562,Marcin De los Reyes
+student563,Jacob Chambers
+student564,Andrzej Kim
+student565,Daan Collins
+student566,Ann Silva
+student567,Max Janssens
+student568,Alice Gordon
+student569,Malgorzata Ford
+student570,Kaylee Jacobs
+student571,Leon De los Reyes
+student572,Miriam James
+student573,Samantha Nguyen
+student574,Diego May
+student575,Juan Byrne
+student576,Miriam Boyd
+student577,Alice Douglas
+student578,Camilla Brewer
+student579,Nathan Hicks
+student580,Paula Little
+student581,Isaac Graham
+student582,Leonie Lambert
+student583,Julia Hicks
+student584,Bengie Meyer
+student585,Daniel Allen
+student586,Luca Gonzalez
+student587,Andrzej Gray
+student588,Adam Oliver
+student589,Benjy Baker
+student590,Scott Long
+student591,Sara Kim
+student592,Hank Burton
+student593,Oscar Dumont
+student594,Anna Freeman
+student595,Joshua Welch
+student596,Tobias Frazier
+student597,Benjamin Cruz
+student598,Dylan Murray
+student599,Liza Claes
+student600,Sylvia Johansen
+student601,Sid Butler
+student602,Cristina Davies
+student603,Philippa Douglas
+student604,Ellie Hernandez
+student605,Kay Chapman
+student606,Scotty Watts
+student607,Dick Mccoy
+student608,Frederik Dunn
+student609,Jesse Martin
+student610,Ada Johnson
+student611,Sally Simpson
+student612,Dorothy Watts
+student613,Dylan Newman
+student614,Camilla Gonzalez
+student615,Wilma Carlson
+student616,Ross Washington
+student617,Sue Hoffmann
+student618,Mike Neal
+student619,Trevor Byrd
+student620,Phil Levi
+student621,Katarzyna Bowman
+student622,Shermie Ramos
+student623,Sem Lane
+student624,Albert Morgan
+student625,Tomasz Poulsen
+student626,Manuel Harris
+student627,Andy Nguyen
+student628,Stephen Fowler
+student629,Jaclyn Doyle
+student630,Gill Ferguson
+student631,Alice Carpenter
+student632,Paul O'Neill
+student633,Kimberly Cole
+student634,Betty Wood
+student635,Francisco Nguyen
+student636,Ciara Walker
+student637,Tara Hardy
+student638,Paul Christensen
+student639,Malgorzata Laurent
+student640,Katarzyna Butler
+student641,Louise Richards
+student642,Luca Turner
+student643,Nicholas Payne
+student644,Klara Black
+student645,Jaclyn Austin
+student646,Jamie Alvarez
+student647,Emil Olson
+student648,Bob Rhodes
+student649,Ewa Jacobs
+student650,Catharine Nelson
+student651,Elzbieta Hernandez
+student652,Tim Leclercq
+student653,Emil Black
+student654,Hugo Meyer
+student655,Sophie Hayes
+student656,Richard Mendoza
+student657,Ellie Hunter
+student658,Vanessa Fields
+student659,Dorothy Crawford
+student660,Margaret Shelton
+student661,Samuel Kennedy
+student662,Alejandro Simmons
+student663,Philip Martinez
+student664,Leonie Shaw
+student665,Lucy Holmes
+student666,Isabel Hunt
+student667,Jean Murray
+student668,Adrian Berry
+student669,Edward Hall
+student670,Dorothy Watts
+student671,Ed Craig
+student672,Olivia Jennings
+student673,Sherman Petersen
+student674,Gabrielle Horton
+student675,Georgina Phillips
+student676,Fabian Owens
+student677,William Howard
+student678,Cristina Bowman
+student679,Kimmy Mertens
+student680,Joseph Gonzalez
+student681,Margarita Dupont
+student682,Sally Fields
+student683,Kaylee Mitchell
+student684,Rob Nichols
+student685,Jesse Hamilton
+student686,Emily Woods
+student687,Ryan Gomez
+student688,Erin Hunter
+student689,Charlotte Day
+student690,Ryan Gonzales
+student691,Ollie Vasquez
+student692,Rob Weber
+student693,Jaclyn Knudsen
+student694,Jorge Chapman
+student695,Ada O'Connor
+student696,Elizabeth Ward
+student697,Edwyn De los Reyes
+student698,Femke Carr
+student699,Caitlin Herrera
+student700,Alba Powell
+student701,Zoe Palmer
+student702,Francisco Carlson
+student703,Lotte Stevens
+student704,Marty Fuller
+student705,Krystyna Hansen
+student706,Anton Hernandez
+student707,Lucas Leclercq
+student708,Alvaro Parks
+student709,Lukas Owens
+student710,Herb Hoffman
+student711,Jean Carr
+student712,Alice Jimenez
+student713,Elin Graves
+student714,Anna Pearson
+student715,Jim Martin
+student716,Andrzej Cohen
+student717,Femke Lim
+student718,Louise Gilbert
+student719,Diego Burton
+student720,Frederik Snyder
+student721,Ed Watkins
+student722,Al Coleman
+student723,Benjy Gardner
+student724,Philippa Gallagher
+student725,Pawel Holmes
+student726,Phil Stanley
+student727,Marcin Howell
+student728,Laura Martinez
+student729,Stanislaw Roberts
+student730,Eleanor Day
+student731,Cristian Schulz
+student732,Iris Hansen
+student733,Karen Steele
+student734,Ann Dubois
+student735,Viktor Dunn
+student736,Sally Santos
+student737,Ashley Barnett
+student738,Samuel Dunn
+student739,Vanessa Bush
+student740,Kimberly Mitchell
+student741,Dorothy Petersen
+student742,Ross Torres
+student743,Nick Ramos
+student744,Javier Simmons
+student745,Olivia Coleman
+student746,Adam Frazier
+student747,Margaret Rose
+student748,Sophia Reyes
+student749,Aoife Bush
+student750,Joseph Carroll
+student751,Freja Boyd
+student752,Lisa Ramos
+student753,Sem Cruz
+student754,Florian Riley
+student755,Leah Jorgensen
+student756,Chuck Olsen
+student757,Marek Shaw
+student758,Lisa Steele
+student759,Marta Dixon
+student760,Sem Marshall
+student761,Duncan Norris
+student762,Dylan Montgomery
+student763,Wilma Wagner
+student764,Elizabeth Reid
+student765,Anton Sullivan
+student766,Javier Jackson
+student767,Manuel Reed
+student768,Steve Becker
+student769,David McCarthy
+student770,Dorothy Simon
+student771,Rolla Madsen
+student772,Duncan Little
+student773,Catherine Wallace
+student774,Klara Stevens
+student775,Ainhoa Holland
+student776,Femke Fields
+student777,Florian Quinn
+student778,Julian Richardson
+student779,Mikkel Matthews
+student780,Leon Thomas
+student781,Ida Gutierrez
+student782,Lucille Day
+student783,Hugo Little
+student784,Alice Byrne
+student785,Nick Brown
+student786,Trevor Robinson
+student787,Lara Carroll
+student788,Pawel Bradley
+student789,Izzy Pierce
+student790,Filip Shelton
+student791,Bob Herrera
+student792,Simon Gordon
+student793,Ainhoa Wilson
+student794,Emma Anderson
+student795,Javier De la Cruz
+student796,Martin Lynch
+student797,Shermie Walker
+student798,Henry Lee
+student799,Julian Harper
+student800,Isaac Spencer
+student801,Jaclyn Wright
+student802,Richard Franklin
+student803,Isaac Claes
+student804,Zoe Brooks
+student805,Zoe Johnson
+student806,Eleanor Carr
+student807,Richard George
+student808,Ryan Maes
+student809,Sharon Kristensen
+student810,Alexander Hunt
+student811,Camilla Campbell
+student812,Hannah Flores
+student813,Marcin Fletcher
+student814,Charles Pearson
+student815,Gillian Wood
+student816,Elzbieta Cohen
+student817,Jacob Simmons
+student818,Marty Stanley
+student819,Charles Shaw
+student820,Nathan Terry
+student821,Megan Gonzales
+student822,Jose Dupont
+student823,Maria Marshall
+student824,John Curtis
+student825,Willy Herrera
+student826,Tobias Richardson
+student827,Betty Tucker
+student828,Jozef Olson
+student829,Hiram Santiago
+student830,Ryan Craig
+student831,Emma Wagner
+student832,Andrea Santiago
+student833,Kimmy Shaw
+student834,Sanne Parker
+student835,Jace Tan
+student836,Louise Carlson
+student837,Pablo West
+student838,Louise Holmes
+student839,Annie George
+student840,Godfrey Butler
+student841,Matthew Castro
+student842,Isabelle Rice
+student843,Olivia Jones
+student844,Charles George
+student845,Sue Weber
+student846,Lara Hawkins
+student847,Bill Larsen
+student848,Herb Laurent
+student849,Vanessa Byrne
+student850,Henry Foster
+student851,Lu Frazier
+student852,Dorothy Schmidt
+student853,Maja Crawford
+student854,Sem Rodriquez
+student855,Tim Hunter
+student856,Cathy Hall
+student857,Alejandro Olson
+student858,Herb Rodriguez
+student859,Camila Duncan
+student860,Aoife Jordan
+student861,Anna Hall
+student862,Oscar Ortiz
+student863,Lea Morales
+student864,Claudia Lawson
+student865,Maja Franklin
+student866,Caroline Wood
+student867,Jace Mason
+student868,Bram Diaz
+student869,Maximilian Martinez
+student870,Matt Wells
+student871,Christian Bates
+student872,Max Thompson
+student873,Pedro O'Neill
+student874,Wilma Dunn
+student875,Chuck Black
+student876,Christian Scott
+student877,Peg Barnett
+student878,Lena Lim
+student879,Liza Little
+student880,Jane Curtis
+student881,Peter Hansen
+student882,Al Woods
+student883,Tara Torres
+student884,Lu Smith
+student885,Jacob Long
+student886,Phil Tucker
+student887,Hugo Byrne
+student888,Rob Scott
+student889,Susan Pedersen
+student890,Zoe Poulsen
+student891,Kay Russell
+student892,Hugo Morales
+student893,Katharina Grant
+student894,Carla Pierce
+student895,Marcin Spencer
+student896,Cameron Laurent
+student897,Lotte Stone
+student898,Anthony Kim
+student899,Lara Greene
+student900,Joe Carpenter
+student901,Femke Nguyen
+student902,Lucia Tucker
+student903,Gabrielle Boyd
+student904,Rob Frazier
+student905,Hiram Moore
+student906,Edwyn Burke
+student907,Philippa Woods
+student908,Fabian Garcia
+student909,Richard Gregory
+student910,Julian Schultz
+student911,Jamie Bush
+student912,Gabrielle Bennett
+student913,Rachel Green
+student914,Tony Hopkins
+student915,Malgorzata Foster
+student916,Elizabeth Elliott
+student917,Leah Morales
+student918,Sergio Burke
+student919,Vanessa Willis
+student920,Julia Peters
+student921,James Torres
+student922,Andrew Kennedy
+student923,Lewis Greene
+student924,Manuel Clark
+student925,Tom Hall
+student926,Andrew Richards
+student927,Jean Elliott
+student928,Niklas Turner
+student929,Sophie Gibson
+student930,Gabbie Larsen
+student931,Filip Simon
+student932,Kimberly Harris
+student933,Jaclyn Hunt
+student934,George Walsh
+student935,Niklas Brown
+student936,Femke Wouters
+student937,Miriam Morales
+student938,Steve Barker
+student939,Zofia Cox
+student940,Rolla Jenkins
+student941,Theodore Jacobs
+student942,Jill Griffin
+student943,Ben Sanchez
+student944,Elizabeth Carter
+student945,Jonas Morris
+student946,Daan Burke
+student947,Patricia Cunningham
+student948,Dave Owens
+student949,George Morales
+student950,Duncan Schultz
+student951,Helen Curtis
+student952,Sammy Woods
+student953,Mary Perry
+student954,Liza Montgomery
+student955,Rosa Fox
+student956,Sue Webb
+student957,Steve Shelton
+student958,Ricky Turner
+student959,Jozef Mitchell
+student960,Jessica Arnold
+student961,Carolina Mcdonald
+student962,Gillian Crawford
+student963,Piotr Ray
+student964,Madison Gregory
+student965,Caitlin Williams
+student966,Sam Holland
+student967,Sylvia Edwards
+student968,Patricia Mitchell
+student969,Iris Grant
+student970,Herb Porter
+student971,Matt Maes
+student972,Alexis Walker
+student973,Nick Day
+student974,George Weber
+student975,Ada Madsen
+student976,Lauren Ferguson
+student977,Izzy Hernandez
+student978,David Austin
+student979,Ricky Norris
+student980,Conor Thomsen
+student981,Lucille Watson
+student982,Amber Simpson
+student983,Andrew Rasmussen
+student984,Cathy Reyes
+student985,Ed Thomas
+student986,Jill Gordon
+student987,Andrzej Stanley
+student988,Javier Rose
+student989,Tobias Dean
+student990,Michael Black
+student991,Stephen Hughes
+student992,Isabelle King
+student993,Ross Sanders
+student994,Lea Andrews
+student995,Elzbieta Gardner
+student996,Tommy Riley
+student997,Jaclyn Vaughn
+student998,Conor Barnett
+student999,Juan Curtis
+teacher000,Lu Russell
+teacher001,Nathan Alvarez
+teacher002,Sophia Castro
+teacher003,Zofia Leclercq
+teacher004,Will De los Santos
+teacher005,Lewis Pena
+teacher006,Florian Mitchell
+teacher007,Hank Anderson
+teacher008,Ellie Harper
+teacher009,Lucille Gomez
+teacher010,Isabel Walsh
+teacher011,Herbert Dawson
+teacher012,Andrea Marshall
+teacher013,Syd Montgomery
+teacher014,Sharon Hayes
+teacher015,Victor Daniels
+teacher016,Bill Horton
+teacher017,Emily Carpenter
+teacher018,Jorge Chambers
+teacher019,Lucille Sims
+teacher020,Sofia Hansen
+teacher021,Bert Spencer
+teacher022,Piotr Lucas
+teacher023,Alejandro Davies
+teacher024,Cecilie Walsh
+teacher025,Edward Romero
+teacher026,Scott Bennett
+teacher027,Elena Weaver
+teacher028,Marie Mitchell
+teacher029,Peter Weaver
+teacher030,Magnus Stephens
+teacher031,Cristian Simpson
+teacher032,Rob De la Cruz
+teacher033,Sharon Payne
+teacher034,Daan Diaz
+teacher035,Pete Alexander
+teacher036,Susan Walker
+teacher037,Marta Weaver
+teacher038,Sid Bennett
+teacher039,Leah Barrett
+teacher040,Gill Powers
+teacher041,Jean Norris
+teacher042,Christian Romero
+teacher043,Jo Santiago
+teacher044,Niklas Levi
+teacher045,Katharina O'Sullivan
+teacher046,Helen Knudsen
+teacher047,Amber Goossens

Added: schooltool/branches/upstream/current/src/schooltool/restclient/ftests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/ftests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/ftests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,74 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.restclient.
+
+$Id: __init__.py 5228 2005-10-12 18:57:43Z mg $
+"""
+
+
+from schooltool.testing.functional import rest
+
+
+class RestConnectionFactory(object):
+    """Stub of httplib.HTTPConnectionFactory.
+
+    Short-circuits real HTTP connections to the rest() function.
+    """
+
+    handle_errors = True
+
+    def __init__(self, server, port):
+        self._response = None
+        self.server = server
+        self.port = port
+
+    def request(self, method, path, body, headers):
+        if body is None:
+            body = ''
+        assert path.startswith('/'), path
+        assert ' ' not in path, path
+        path = '/++vh++http:localhost:7001/++' + path
+        request = ["%s %s HTTP/1.1" % (method, path)]
+        for hdr, value in headers.items():
+            request.append("%s: %s" % (hdr, value))
+        request_string = "\n".join(request) + "\n\n" + body
+        self._response = rest(request_string, handle_errors=self.handle_errors)
+
+    def getresponse(self):
+        return RestResponse(self._response)
+
+    def close(self):
+        self._response = None
+
+
+class RestResponse(object):
+    """Adapter of Zope 3 response objects into httplib.HTTPResponse."""
+
+    def __init__(self, zope3_response):
+        self._zope3_response = zope3_response
+        self.status = zope3_response.getStatus()
+        status_and_reason = zope3_response.getStatusString()
+        self.reason = status_and_reason.split(' ', 1)[1]
+
+    def getheader(self, header):
+        return self._zope3_response.getHeader(header)
+
+    def read(self):
+        return self._zope3_response.getBody()


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/ftests/face.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/ftests/face.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/ftests/face.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+:-)


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/ftests/face.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/ftests/test_restclient.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/ftests/test_restclient.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/ftests/test_restclient.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,36 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.restclient
+
+$Id: test_restclient.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+
+
+def test_suite():
+    # 500 'cause it doesn't work yet
+    return collect_ftests(filenames=['../README.txt'], level=500)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/ftests/test_restclient.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/restclient.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/restclient.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/restclient.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,981 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Backend for the SchoolTool GUI client.  This module abstracts all communication
+with the SchoolTool server.
+
+Note that all strings used in data objects are Unicode strings.
+"""
+
+import httplib
+import socket
+import urlparse
+import base64
+import cgi
+
+from schooltool.common import UnicodeAwareException
+from schooltool.common import looks_like_a_uri
+from schooltool.xmlparsing import XMLDocument
+from schooltool import SchoolToolMessage as _
+
+__metaclass__ = type
+
+
+#
+# Client/server communication
+#
+
+
+def make_basic_auth(username, password):
+    r"""Generate HTTP basic authentication credentials.
+
+    Example:
+
+        >>> make_basic_auth('myusername', 'secret')
+        'Basic bXl1c2VybmFtZTpzZWNyZXQ='
+
+    Usernames and passwords that contain non-ASCII characters are converted to
+    UTF-8 before encoding.
+
+        >>> make_basic_auth('myusername', '\u263B')
+        'Basic bXl1c2VybmFtZTpcdTI2M0I='
+
+    """
+    creds = "%s:%s" % (username, password)
+    return "Basic " + base64.encodestring(creds.encode('UTF-8')).strip()
+
+
+def to_xml(s):
+    r"""Prepare `s` for inclusion into XML (convert to UTF-8 and escape).
+
+        >>> to_xml('foo')
+        'foo'
+        >>> to_xml(u'\u263B')
+        '\xe2\x98\xbb'
+        >>> to_xml('<brackets> & "quotes"')
+        '&lt;brackets&gt; &amp; &quot;quotes&quot;'
+        >>> to_xml(42)
+        '42'
+
+    """
+    return cgi.escape(unicode(s).encode('UTF-8'), True)
+
+
+class SchoolToolClient:
+    """Client for the SchoolTool HTTP server.
+
+    Every method that communicates with the server sets the status and version
+    attributes.
+
+    All URIs used to identify objects are relative and contain the absolute
+    path within the server.
+    """
+
+    # Hooks for unit tests.
+    connectionFactory = httplib.HTTPConnection
+    secureConnectionFactory = httplib.HTTPSConnection
+
+    def __init__(self, server='localhost', port=7001, ssl=False,
+                 user=None, password=''):
+        self.server = server
+        self.port = port
+        self.ssl = ssl
+        self.user = user
+        self.password = password
+        self.status = ''
+        self.version = ''
+
+
+    # Generic HTTP methods
+
+    def setServer(self, server, port, ssl=False):
+        """Set the server name and port number.
+
+        Tries to connect to the server and sets the status message.
+        """
+        self.server = server
+        self.port = port
+        self.ssl = ssl
+        self.tryToConnect()
+
+    def setUser(self, user, password):
+        """Set the server name and port number.
+
+        Tries to connect to the server and sets the status message.
+        """
+        if user:
+            self.user = user
+            self.password = password
+        else:
+            self.user = None
+            self.password = ""
+
+    def tryToConnect(self):
+        """Try to connect to the server and set the status message.
+
+        If connection is successful, try to update the URI list."""
+        try:
+            self.get('/')
+        except SchoolToolError, e:
+            # self.status has been set and will be shown on the status bar
+            pass
+
+    def get(self, url, headers=None):
+        """Perform an HTTP GET request for a given URL.
+
+        Returns the response object.
+
+        Sets status and version attributes if the communication succeeds.
+        Raises SchoolToolError if the communication fails.
+        """
+        return self._request('GET', url, headers=headers)
+
+    def post(self, url, body, headers=None):
+        """Perform an HTTP POST request for a given url.
+
+        Returns the response object.
+
+        Sets status and version attributes if the communication succeeds.
+        Raises SchoolToolError if the communication fails.
+        """
+        return self._request('POST', url, body, headers=headers)
+
+    def put(self, url, body, headers=None):
+        """Perform an HTTP PUT request for a given url.
+
+        Returns the response object.
+
+        Sets status and version attributes if the communication succeeds.
+        Raises SchoolToolError if the communication fails.
+        """
+        return self._request('PUT', url, body, headers=headers)
+
+    def delete(self, url, headers=None):
+        """Perform an HTTP DELETE request for a given url.
+
+        Returns the response object.
+
+        Sets status and version attributes if the communication succeeds.
+        Raises SchoolToolError if the communication fails.
+        """
+        return self._request('DELETE', url, '', headers=headers)
+
+    def canonizeUrl(self, url):
+        """Converts absolute urls to relative, leaving relative urls untouched.
+
+            >>> client = SchoolToolClient()
+            >>> client.canonizeUrl("/persons/john")
+            '/persons/john'
+            >>> client.canonizeUrl("http://localhost:7001/persons/john")
+            '/persons/john'
+
+        """
+        scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
+        my_scheme = self.ssl and "https" or "http"
+        my_netloc = "%s:%s" % (self.server, self.port)
+        if netloc == self.server:
+            netloc = "%s:%s" % (self.server, self.ssl and 443 or 80)
+        if scheme not in ('', my_scheme) or netloc not in ('', my_netloc):
+            raise SchoolToolError("won't follow external URL %s" % url)
+        if not path:
+            path = '/'
+        return urlparse.urlunsplit(('', '', path, query, fragment))
+
+    def _request(self, method, url, body=None, headers=None):
+        """Perform an HTTP request for a given URL.
+
+        The URL can be an absolute path (e.g. '/persons'), or a full
+        absolute URL, but only if it points to the right server.
+
+        Returns the response object.
+
+        Sets status and version attributes if the communication succeeds.
+        Raises SchoolToolError if the communication fails.
+        """
+        if self.ssl:
+            conn = self.secureConnectionFactory(self.server, self.port)
+        else:
+            conn = self.connectionFactory(self.server, self.port)
+        try:
+            hdrs = {}
+            if body:
+                hdrs['Content-Type'] = 'text/xml'
+                # Do *not* specify a Content-Length header here.  It will
+                # be provided by httplib automatically.  In fact, if you do
+                # specify it here, httplib will happily send out a request
+                # with two Content-Type headers and confuse proxies such as
+                # Apache.
+            if self.user is not None:
+                creds = make_basic_auth(self.user, self.password)
+                hdrs['Authorization'] = creds
+            if headers:
+                hdrs.update(headers)
+            path = self.canonizeUrl(url)
+            conn.request(method, path, body, hdrs)
+            response = Response(conn.getresponse())
+            conn.close()
+            self.status = "%d %s" % (response.status, response.reason)
+            self.version = response.getheader('Server')
+            return response
+        except socket.error, e:
+            conn.close()
+            errno, message = e.args
+            self.status = "%s (%d)" % (message, errno)
+            self.version = ""
+            raise SchoolToolError(self.status)
+
+    # SchoolTool specific methods
+
+    def getContainerItems(self, url, ref_class):
+        """Parse an XML representation of a container.
+
+        Returns a sequence of ref_class items.
+        """
+        response = self.get(url)
+        if response.status != 200:
+            raise ResponseStatusError(response)
+        return [ref_class(self, url, title)
+                for title, url in _parseContainer(response.read())]
+
+    def getPersons(self):
+        """Return the list of all persons.
+
+        Returns a sequence of PersonRef objects.
+        """
+        return self.getContainerItems('/persons', PersonRef)
+
+    def getGroups(self):
+        """Return the list of all groups.
+
+        Returns a sequence of GroupRef objects.
+        """
+        return self.getContainerItems('/groups', GroupRef)
+
+    def getResources(self):
+        """Return the list of all resources.
+
+        Returns a sequence of ResourceRef objects.
+        """
+        return self.getContainerItems('/resources', ResourceRef)
+
+    def getSections(self):
+        """Return the list of all sections.
+
+        Returns a sequence of SectionRef objects.
+        """
+        return self.getContainerItems('/sections', SectionRef)
+
+    def getCourses(self):
+        """Return the list of all courses.
+
+        Returns a sequence of CourseRef objects.
+        """
+        return self.getContainerItems('/courses', CourseRef)
+
+    def getLevels(self):
+        """Return the list of all levels.
+
+        Returns a sequence of LevelRef objects.
+        """
+        return self.getContainerItems('/levels', LevelRef)
+
+    def savePersonInfo(self, person_url, person_info):
+        """Put a PersonInfo object."""
+        body = """
+            <object xmlns:xlink="http://www.w3.org/1999/xlink"
+                    xmlns="http://schooltool.org/ns/model/0.1"
+                    title="%s" />
+        """ % to_xml(person_info.title)
+
+        response = self.put(person_url, body)
+        if response.status / 100 != 2:
+            raise ResponseStatusError(response)
+
+    def getPersonPhoto(self, person_url):
+        """Return the photo of a person.
+
+        Returns an 8-bit string with JPEG data.
+
+        Returns None if the person does not have a photo.
+        """
+        response = self.get(person_url + '/photo')
+        if response.status == 404:
+            return None
+        elif response.status != 200:
+            raise ResponseStatusError(response)
+        else:
+            return response.read()
+
+    def removePersonPhoto(self, person_url):
+        """Remove a person's photo."""
+        url = person_url + '/photo'
+        response = self.delete(url)
+        if response.status / 100 != 2:
+            raise ResponseStatusError(response)
+
+    def getObjectRelationships(self, object_url):
+        """Return relationships of an application object (group or person).
+
+        Returns a list of RelationshipInfo objects.
+        """
+        response = self.get('%s/relationships' % object_url)
+        if response.status != 200:
+            raise ResponseStatusError(response)
+        return _parseRelationships(response.read())
+
+    def getTerms(self):
+        """Return a list of terms.
+
+        Returns a sequence of TermRef objects.
+        """
+        return self.getContainerItems('/terms', TermRef)
+
+    def getTimetableSchemas(self):
+        """Return a list of timetable schemas.
+
+        Returns a sequence of tuples (term_title, term_url).
+        """
+        response = self.get("/ttschemas")
+        if response.status != 200:
+            raise ResponseStatusError(response)
+        return _parseContainer(response.read())
+
+    def createPerson(self, person_title, name, password=None):
+        """Create a person object.
+
+        Returns a PersonRef for the new person.
+        """
+        body = ('<object xmlns="http://schooltool.org/ns/model/0.1"'
+                ' title="%s"/>' % to_xml(person_title))
+
+        url = '/persons/' + name
+        response = self.put(url, body)
+
+        if response.status not in (200, 201):
+            raise ResponseStatusError(response)
+
+        if password is not None:
+            response = self.put(url + '/password', password)
+            if response.status != 200:
+                raise ResponseStatusError(response)
+        return PersonRef(self, url, person_title)
+
+    def createGroup(self, title, description="", name=None):
+        """Create a group object.
+
+        Returns a GroupRef for the new group.
+        """
+        return self._createGenericObject(GroupRef, '/groups',
+                                         title, description, name)
+
+    def createResource(self, title, description="", isLocation=False ,name=None):
+        """Create a resource object.
+
+        Returns a ResourceRef for the new resource.
+        """
+        body = ('<object xmlns="http://schooltool.org/ns/model/0.1"'
+                ' title="%s"'
+                ' isLocation="%s"'
+                ' description="%s"/>' % (to_xml(title),
+                                         isLocation and 'true' or 'false',
+                                         to_xml(description)))
+
+        if name:
+            where = "/resources/%s" % name
+            response = self.put(where, body)
+            acceptable_statuses = [200, 201]
+        else:
+            response = self.post('/resources', body)
+            acceptable_statuses = [201]
+
+        if response.status not in acceptable_statuses:
+            raise ResponseStatusError(response)
+
+        if name:
+            url = where
+        else:
+            url = self._pathFromResponse(response)
+
+        return ResourceRef(self, url, title)
+
+    def createCourse(self, title, description="", name=None):
+        """Create a course object.
+
+        Returns a CourseRef for the new course.
+        """
+        return self._createGenericObject(CourseRef, '/courses',
+                                         title, description, name)
+
+    def createSection(self, title, description="", name=None):
+        """Create a section object.
+
+        Returns a SectionRef for the new section.
+        """
+        return self._createGenericObject(SectionRef, '/sections',
+                                         title, description, name)
+
+    def createLevel(self, name, title, isInitial=False, nextLevel=None):
+        """Create a level object."""
+        body = """
+            <object xmlns="http://schooltool.org/ns/model/0.1"
+                    title="%s"
+                    isInitial="%s"
+                    nextLevel="%s"/>
+          """ % (to_xml(title),
+                 isInitial and 'true' or 'false',\
+                 nextLevel and to_xml(nextLevel) or "")
+        level_url = "/levels/%s" % name
+        response = self.put(level_url, body)
+        if response.status not in [200, 201]:
+            raise ResponseStatusError(response)
+        return LevelRef(self, level_url, title)
+
+
+    def _createGenericObject(self, ref_class, where, title, description="",
+                             name=None):
+        """Create a generic object that can be represented in XML as:
+
+            <object xmlns="http://schooltool.org/ns/model/0.1"
+                    title="$title" description="$description" />
+
+        Returns a ref_class instance for the new object.
+        """
+        body = ('<object xmlns="http://schooltool.org/ns/model/0.1"'
+                ' title="%s"'
+                ' description="%s"/>' % (to_xml(title), to_xml(description)))
+
+        if name:
+            where = "%s/%s" % (where, name)
+            response = self.put(where, body)
+            acceptable_statuses = [200, 201]
+        else:
+            response = self.post(where, body)
+            acceptable_statuses = [201]
+
+        if response.status not in acceptable_statuses:
+            raise ResponseStatusError(response)
+
+        if name:
+            url = where
+        else:
+            url = self._pathFromResponse(response)
+
+        return ref_class(self, url, title)
+
+    def createRelationship(self, obj1_url, obj2_url, reltype, obj2_role):
+        """Create a relationship between two objects.
+
+        reltype and obj2_role are simple string URIs, not URIObjects.
+
+        Example:
+          client.createRelationship('/persons/john', '/groups/teachers',
+                                    URIMembership_uri, URIMember_uri)
+        """
+        obj1_path = self.canonizeUrl(obj1_url)
+        obj2_path = self.canonizeUrl(obj2_url)
+        body = ('<relationship xmlns="http://schooltool.org/ns/model/0.1"'
+                ' xmlns:xlink="http://www.w3.org/1999/xlink"'
+                ' xlink:type="simple"'
+                ' xlink:href="%s" xlink:arcrole="%s" xlink:role="%s"/>'
+                % tuple(map(to_xml, [obj2_path, reltype, obj2_role])))
+        response = self.post('%s/relationships' % obj1_path, body)
+        if response.status != 201:
+            raise ResponseStatusError(response)
+        return self._pathFromResponse(response)
+
+    def createTerm(self, title, name, first, last, daysofweek, holidays=()):
+        """Create a term.
+
+        The term stats on `first` and ends on `last` (datetime.date objects).
+
+        `daysofweek` is a sequence of constants (calendar.MONDAY through
+        calendar.SUNDAY) that tell on which weekdays there are lessons, or,
+        in other words, which days are school days.
+
+        `holidays` is a list of dates (datetime.date objects) that are not
+        school days.
+
+        Returns a TermRef.
+        """
+        weekday_names = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
+                         'Friday', 'Saturday', 'Sunday']
+        daysofweek_xml = " ".join([weekday_names[day]
+                                   for day in range(7)
+                                   if day in daysofweek])
+        holidays_xml = "\n".join(['<holiday date="%s">Holiday</holiday>' % d
+                                  for d in holidays])
+        url = "/terms/%s" % name
+        body = """
+            <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+                        first="%s" last="%s">
+              <title>%s</title>
+              <daysofweek>%s</daysofweek>
+              %s
+            </schooldays>
+        """ % (to_xml(first), to_xml(last), to_xml(title), daysofweek_xml,
+               holidays_xml)
+        response = self.put(url, body)
+        if response.status not in (200, 201):
+            raise ResponseStatusError(response)
+        return TermRef(self, url, title)
+
+    def _pathFromResponse(self, response):
+        """Return the path portion of the Location header in the response."""
+        location = response.getheader('Location')
+        slashslash = location.index('//')
+        slash = location.index('/', slashslash + 2)
+        return location[slash:]
+
+    def deleteObject(self, object_ref_or_url):
+        """Delete an object."""
+        object_url = getattr(object_ref_or_url, 'url', object_ref_or_url)
+        response = self.delete(object_url)
+        if response.status != 200:
+            raise ResponseStatusError(response)
+
+    def saveLevelInfo(self, level_url, level_info):
+        """Put a LevelInfo object."""
+        body = """
+            <object xmlns="http://schooltool.org/ns/model/0.1"
+                    title="%s"
+                    isInitial="%s"
+                    nextLevel="%s"/>
+        """ % (to_xml(level_info.title),
+               level_info.isInitial and 'true' or 'false',\
+               level_info.nextLevel and to_xml(level_info.nextLevel) or "")
+        response = self.put(level_url, body)
+        if response.status / 100 != 2:
+            raise ResponseStatusError(response)
+
+
+class Response:
+    """HTTP response.
+
+    Wraps httplib.HTTPResponse and stores the response body as a string.
+    The whole point of this class is that you can get the response body
+    after the connection has been closed.
+    """
+
+    def __init__(self, response):
+        self.status = response.status
+        self.reason = response.reason
+        self.body = response.read()
+        self._response = response
+
+    def getheader(self, header):
+        return self._response.getheader(header)
+
+    def read(self):
+        return self.body
+
+    __str__ = read
+
+    def __repr__(self):
+        return '<Response: %s %s>' % (self.status, self.reason)
+
+
+#
+# Parsing utilities
+#
+
+def _parseContainer(body):
+    """Parse the contents of a container.
+
+    Returns a list of tuples (object_title, object_href).
+    """
+    doc = XMLDocument(body)
+    doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+    items = []
+    for node in doc.query("/container/items/item[@xlink:href]"):
+        href = node['xlink:href']
+        title = node.get('xlink:title', href.split('/')[-1])
+        items.append((title, href))
+    return items
+
+
+def _parseRelationships(body, uriobjects=None):
+    """Parse the list of relationships.
+
+    uriobjects is a mapping from URIs to URIObjects.  Note that new keys
+    may be added to this mapping, to register unknown URIs.
+    """
+    if uriobjects is None:
+        uriobjects = {}
+
+    doc = XMLDocument(body)
+    doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+    doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+    relationships = []
+    for node in doc.query("/m:relationships/m:existing/m:relationship"):
+        href = node.get('xlink:href')
+        role_uri = node.get('xlink:role')
+        arcrole_uri = node.get('xlink:arcrole')
+        if (not href
+            or not looks_like_a_uri(role_uri)
+            or not looks_like_a_uri(arcrole_uri)):
+            continue
+        title = node.get('xlink:title', href.split('/')[-1])
+        try:
+            role = uriobjects[role_uri]
+        except KeyError:
+            role = uriobjects[role_uri] = URIObject(role_uri)
+        try:
+            arcrole = uriobjects[arcrole_uri]
+        except KeyError:
+            arcrole = uriobjects[arcrole_uri] = URIObject(arcrole_uri)
+        manage_nodes = node.query("m:manage/@xlink:href")
+        if len(manage_nodes) != 1:
+            raise SchoolToolError(_("Could not parse relationship list"))
+        link_href = manage_nodes[0].content
+        relationships.append(RelationshipInfo(arcrole, role, title,
+                                              href, link_href))
+    return relationships
+
+
+def _parsePersonInfo(body):
+    """Parse the data provided by the person XML representation."""
+    doc = XMLDocument(body)
+    doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+    doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+    try:
+        node = doc.query("/m:person/m:title")[0]
+        return PersonInfo(node.content)
+    except IndexError:
+        raise SchoolToolError(_("Insufficient data in person info"))
+
+
+def _parseGroupInfo(body):
+    """Parse the data provided by the group XML representation."""
+    doc = XMLDocument(body)
+    doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+    doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+    try:
+        title = doc.query("/m:group/m:title")[0].content
+        description = doc.query("/m:group/m:description")[0].content
+        return GroupInfo(title, description)
+    except IndexError:
+        raise SchoolToolError(_("Insufficient data in group info"))
+
+
+def _parseLevelInfo(body):
+    """Parse the data provided by the level XML representation."""
+    doc = XMLDocument(body)
+    doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+    doc.registerNs('m', 'http://schooltool.org/ns/model/0.1')
+    try:
+        title = doc.query("/m:level/m:title")[0].content
+        isInitial_string = doc.query("/m:level/m:isInitial")[0].content
+        isInitial = isInitial_string == "true"
+        nextLevel = doc.query("/m:level/m:nextLevel")[0].content
+        return LevelInfo(title, isInitial, nextLevel)
+    except IndexError:
+        raise SchoolToolError(_("Insufficient data in level info"))
+
+
+#
+# Object representations
+#
+
+
+class ObjectRef(object):
+    """Reference to an object.
+
+    Pythonic equivalent of an xlink.  Has a URL and an (optional) title.  Knows
+    whence it came from (that is, has a reference to the SchoolToolClient).
+    """
+
+    def __init__(self, client, url, title=None):
+        """Create an object reference.
+
+            >>> client = SchoolToolClient()
+            >>> obj_ref = ObjectRef(client, 'http://localhost:7001/foo')
+            >>> obj_ref.client is client
+            True
+            >>> obj_ref.title
+            >>> obj_ref.url
+            'http://localhost:7001/foo'
+
+            >>> obj_ref = ObjectRef(client, 'http://localhost:7001/foo', 'Me!')
+            >>> obj_ref.title
+            'Me!'
+
+        """
+        self.client = client
+        self.url = url
+        self.title = title
+
+    def __eq__(self, other):
+        """Compare object references.
+
+            >>> client = SchoolToolClient()
+            >>> other_client = SchoolToolClient()
+            >>> r = ObjectRef(client, '/path/r1', 'Some title')
+            >>> r == ObjectRef(client, '/path/r1', 'Some other title')
+            True
+            >>> r == ObjectRef(client, '/path/r2', 'Some title')
+            False
+            >>> r == ObjectRef(other_client, '/path/r1', 'Some title')
+            False
+            >>> r == 42
+            False
+
+        """
+        return (type(self) == type(other)
+                and self.client == other.client and self.url == other.url)
+
+    def __repr__(self):
+        """Return a string representation of the object reference.
+
+            >>> ObjectRef(None, 'http://street.corner:7001/bar', 'A Bar')
+            <ObjectRef A Bar at http://street.corner:7001/bar>
+
+        """
+        return '<%s %s at %s>' % (self.__class__.__name__, self.title,
+                                  self.url)
+
+
+class PersonRef(ObjectRef):
+    """Reference to a person object.
+
+        >>> pr = PersonRef(None, 'http://street.corner:7001/bar', 'A Bar')
+        >>> pr
+        <PersonRef A Bar at http://street.corner:7001/bar>
+
+    References of different types are not equal.
+
+        >>> pr == ObjectRef(None, 'http://street.corner:7001/bar', 'A Bar')
+        False
+
+    """
+
+    def getInfo(self):
+        """Return information about a person.
+
+        Returns a PersonInfo object.
+        """
+        response = self.client.get(self.url)
+        if response.status != 200:
+            raise ResponseStatusError(response)
+        return _parsePersonInfo(response.read())
+
+    def setPassword(self, new_password):
+        """Change the password for this person."""
+        response = self.client.put('%s/password' % self.url, new_password,
+                                   headers={'Content-Type': 'text/plain'})
+        if response.status != 200:
+            raise ResponseStatusError(response)
+
+    def setPhoto(self, photo, content_type='application/octet-stream'):
+        """Upload a photo for a person.
+
+        photo should be an 8-bit string with image data.
+        """
+        url = self.url + '/photo'
+        response = self.client.put(url, photo,
+                                   headers={'Content-Type':
+                                            content_type})
+        if response.status not in (200, 201):
+            raise ResponseStatusError(response)
+
+    def getAcademicStatus(self):
+        """Get academic status of a person."""
+        response = self.client.get("%s/academicStatus" % self.url)
+        if response.status != 200:
+            raise ResponseStatusError(response)
+        return response.read()
+
+    def initiatePromotion(self):
+        """Create promotion workflow."""
+        response = self.client.put("%s/promotion" % self.url, "")
+        if response.status != 200:
+            raise ResponseStatusError(response)
+
+
+class GroupRef(ObjectRef):
+    """Reference to a group object."""
+
+    def getInfo(self):
+        """Return information about a group.
+
+        Returns a GroupInfo object.
+        """
+        response = self.client.get(self.url)
+        if response.status != 200:
+            raise ResponseStatusError(response)
+        return _parseGroupInfo(response.read())
+
+    def getMembers(self):
+        """Return a list of group members.
+
+        Returns a list of MemberRef objects.
+        """
+        relationships = self.client.getObjectRelationships(self.url)
+        member_relationships = [relationship for relationship in relationships
+                                if relationship.role.uri == URIMember_uri]
+        return [PersonRef(self.client, member_relationship.target_path)
+                for member_relationship in member_relationships]
+
+    def addMember(self, member):
+        """Add a member to this group."""
+        self.client.createRelationship(self.url, member.url,
+                                       URIMembership_uri, URIMember_uri)
+
+
+class ResourceRef(ObjectRef):
+    """Reference to a resource object."""
+
+
+class CourseRef(ObjectRef):
+    """Reference to a course object."""
+
+    def addSection(self, section):
+        """Add a section to this course."""
+        self.client.createRelationship(self.url, section.url,
+                                       URICourseSections_uri,
+                                       URISectionOfCourse_uri)
+
+
+class SectionRef(ObjectRef):
+    """Reference to a section object."""
+
+    def addInstructor(self, instructor):
+        """Add an instructor to this section."""
+        self.client.createRelationship(self.url, instructor.url,
+                                       URIInstruction_uri, URIInstructor_uri)
+
+    def addLearner(self, learner):
+        """Add a learner to this section."""
+        self.client.createRelationship(self.url, learner.url,
+                                       URIMembership_uri, URIMember_uri)
+
+
+class TermRef(ObjectRef):
+    """Reference to a term."""
+
+
+class LevelRef(ObjectRef):
+    """Reference to a level object."""
+
+
+class PersonInfo:
+    """An object containing the data for a person."""
+
+    def __init__(self, title=None):
+        self.title = title
+
+
+class GroupInfo:
+    """An object containing the data for a group."""
+
+    def __init__(self, title, description=None):
+        self.title = title
+        self.description = description
+
+class LevelInfo:
+    """An object containing the data for a level."""
+
+    def __init__(self, title, isInitial, nextLevel):
+        self.title = title
+        self.isInitial = isInitial
+        self.nextLevel = nextLevel
+
+#
+# Old-school application object representation
+# XXX mg: will go away *soon*, I promise.  Yes.  Really.  Err.  Yes.
+#
+
+
+Unchanged = "Unchanged"
+
+
+class URIObject:
+    """An object that represents an URI."""
+
+    def __init__(self, uri, name=None, description=''):
+        assert looks_like_a_uri(uri)
+        self.uri = uri
+        if name is None:
+            name = uri
+        self.name = name
+        self.description = description
+
+
+URIMembership_uri = 'http://schooltool.org/ns/membership'
+URIMember_uri = 'http://schooltool.org/ns/membership/member'
+URIGroup_uri = 'http://schooltool.org/ns/membership/group'
+
+URIInstruction_uri = 'http://schooltool.org/ns/instruction'
+URISection_uri = 'http://schooltool.org/ns/instruction/section'
+URIInstructor_uri = 'http://schooltool.org/ns/instruction/instructor'
+
+URICourseSections_uri = 'http://schooltool.org/ns/coursesections'
+URICourse_uri = 'http://schooltool.org/ns/coursesections/course'
+URISectionOfCourse_uri = 'http://schooltool.org/ns/coursesections/section'
+
+
+class RelationshipInfo:
+    """Information about a relationship."""
+
+    arcrole = None              # Role of the target (URIObject)
+    role = None                 # Role of the relationship (URIObject)
+    target_title = None         # Title of the target
+    target_path = None          # Path of the target
+    link_path = None            # Path of the link
+
+    def __init__(self, arcrole, role, title, path, link_path):
+        self.arcrole = arcrole
+        self.role = role
+        self.target_title = title
+        self.target_path = path
+        self.link_path = link_path
+
+    def __cmp__(self, other):
+        if not isinstance(other, RelationshipInfo):
+            raise NotImplementedError("cannot compare %r with %r"
+                                      % (self, other))
+        return cmp((self.arcrole, self.role, self.target_title,
+                    self.target_path, self.link_path),
+                   (other.arcrole, other.role, other.target_title,
+                    other.target_path, other.link_path))
+
+    def __repr__(self):
+        return "%s(%r, %r, %r, %r, %r)" % (self.__class__.__name__,
+                   self.arcrole, self.role, self.target_title,
+                   self.target_path, self.link_path)
+
+
+#
+# Exceptions
+#
+
+class SchoolToolError(UnicodeAwareException):
+    """Communication error"""
+
+
+class ResponseStatusError(SchoolToolError):
+    """The server returned an unexpected HTTP status code."""
+
+    def __init__(self, response):
+        errmsg = "%d %s" % (response.status, response.reason)
+        if (response.getheader('Content-Type') and
+            response.getheader('Content-Type').startswith('text/plain')):
+            errmsg += '\n%s' % response.read()
+        SchoolToolError.__init__(self, errmsg)
+        self.status = response.status
+        self.reason = response.reason


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/restclient.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/restclient/tests/test_restclient.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/restclient/tests/test_restclient.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/restclient/tests/test_restclient.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1857 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for restclient.py
+"""
+
+import unittest
+import socket
+import datetime
+import base64
+
+from zope.testing.doctest import DocTestSuite
+
+from schooltool.common import dedent
+from schooltool.testing.util import XMLCompareMixin
+from schooltool.testing.util import NiceDiffsMixin
+from schooltool.testing.util import QuietLibxml2Mixin
+from schooltool.xmlparsing import XMLParseError
+
+__metaclass__ = type
+
+
+class ConnectionFactory:
+
+    def __init__(self, response, error=None):
+        self.response = response
+        self.error = error
+        self.connections = []
+
+    def create(self, server, port):
+        c = ConnectionStub(server, port, self.response, self.error, False)
+        self.connections.append(c)
+        return c
+
+    def createSSL(self, server, port):
+        c = ConnectionStub(server, port, self.response, self.error, True)
+        self.connections.append(c)
+        return c
+
+
+class MultiConnectionFactory:
+
+    def __init__(self, responses):
+        self.responses = responses
+        self.connections = []
+
+    def create(self, server, port):
+        n = len(self.connections)
+        c = ConnectionStub(server, port, self.responses[n], None, False)
+        self.connections.append(c)
+        return c
+
+    def createSSL(self, server, port):
+        n = len(self.connections)
+        c = ConnectionStub(server, port, self.responses[n], None, True)
+        self.connections.append(c)
+        return c
+
+
+class ConnectionStub:
+
+    def __init__(self, server, port, response, error, ssl):
+        self.server = server
+        self.port = port
+        self.response = response
+        self.error = error
+        self.closed = False
+        self.request_called = False
+        self.ssl = ssl
+
+    def request(self, method, path, body=None, headers=None):
+        if self.request_called:
+            raise RuntimeError('ConnectionStub.request called more than once')
+        self.request_called = True
+        self.method = method
+        self.path = path
+        self.body = body
+        self.headers = headers
+        if self.error is not None:
+            raise self.error
+
+    def getresponse(self):
+        return self.response
+
+    def close(self):
+        self.closed = True
+        if self.response is not None:
+            self.response._body = ''
+
+
+class ResponseStub:
+
+    def __init__(self, status, reason, body='', **kw):
+        self.status = status
+        self.reason = reason
+        self._body = body
+        self._headers = {'server': 'UnitTest/0.0',
+                         'content-type': 'text/plain'}
+        for k, v in kw.items():
+            self._headers[k.replace('_', '-').lower()] = v
+        self._read_called = False
+
+    def read(self):
+        if self._read_called:
+            raise RuntimeError('ResponseStub.read called more than once')
+        self._read_called = True
+        return self._body
+
+    def getheader(self, name):
+        return self._headers[name.lower()]
+
+
+class SchoolToolClientTestMixin(QuietLibxml2Mixin, XMLCompareMixin,
+                                NiceDiffsMixin):
+
+    def setUp(self):
+        self.setUpLibxml2()
+
+    def tearDown(self):
+        self.tearDownLibxml2()
+
+    def newClient(self, response=None, error=None):
+        from schooltool.restclient.restclient import SchoolToolClient
+        client = SchoolToolClient()
+        factory = ConnectionFactory(response, error)
+        client._connections = factory.connections
+        client.connectionFactory = factory.create
+        client.secureConnectionFactory = factory.createSSL
+        return client
+
+    def oneConnection(self, client):
+        self.assertEquals(len(client._connections), 1)
+        return client._connections[0]
+
+    def checkConnPath(self, client, path):
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, path)
+
+
+class TestSchoolToolClient(SchoolToolClientTestMixin, unittest.TestCase):
+
+    def newClientMulti(self, responses):
+        from schooltool.restclient.restclient import SchoolToolClient
+        client = SchoolToolClient()
+        factory = MultiConnectionFactory(responses)
+        client._connections = factory.connections
+        client.connectionFactory = factory.create
+        client.secureConnectionFactory = factory.createSSL
+        return client
+
+    def checkConnPaths(self, client, paths):
+        self.assertEquals(len(client._connections),
+                          len(paths))
+        for conn, path in zip(client._connections, paths):
+            self.assertEquals(conn.path, path)
+
+    def test_init(self):
+        from schooltool.restclient.restclient import SchoolToolClient
+        client = SchoolToolClient()
+        self.assertEquals(client.server, 'localhost')
+        self.assertEquals(client.port, 7001)
+        self.assertEquals(client.ssl, False)
+        self.assertEquals(client.user, None)
+        self.assertEquals(client.password, '')
+
+        client = SchoolToolClient('uni.edu.mars', 32764, ssl=True)
+        self.assertEquals(client.server, 'uni.edu.mars')
+        self.assertEquals(client.port, 32764)
+        self.assertEquals(client.ssl, True)
+
+        client = SchoolToolClient(user='mangler', password='42')
+        self.assertEquals(client.user, 'mangler')
+        self.assertEquals(client.password, '42')
+
+    def test_setServer(self):
+        from schooltool.restclient.restclient import SchoolToolClient
+        server = 'example.com'
+        port = 8081
+        version = 'UnitTest/0.0'
+        dummy_uris = "<uriobjects></uriobjects>"
+        response = ResponseStub(200, 'OK', dummy_uris, server=version)
+        client = self.newClient(response)
+        client.setServer(server, port)
+        self.assertEquals(client.status, '200 OK')
+        self.assertEquals(client.version, version)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.server, server)
+        self.assertEquals(conn.port, port)
+        self.assertEquals(conn.ssl, False)
+        self.assertEquals(client.server, server)
+        self.assertEquals(client.port, port)
+        self.assertEquals(client.ssl, False)
+
+    def test_setServer_SSL(self):
+        from schooltool.restclient.restclient import SchoolToolClient
+        server = 'example.com'
+        port = 8443
+        version = 'UnitTest/0.0'
+        response = ResponseStub(200, 'OK', 'doesnotmatter', server=version)
+        client = self.newClient(response)
+        client.setServer(server, port, ssl=True)
+        self.assertEquals(client.status, '200 OK')
+        self.assertEquals(client.version, version)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.server, server)
+        self.assertEquals(conn.port, port)
+        self.assertEquals(conn.ssl, True)
+        self.assertEquals(client.server, server)
+        self.assertEquals(client.port, port)
+        self.assertEquals(client.ssl, True)
+
+    def test_setUser(self):
+        from schooltool.restclient.restclient import SchoolToolClient
+        client = self.newClient()
+        client.setUser("gandalf", "123")
+        self.assertEquals(client.user, "gandalf")
+        self.assertEquals(client.password, "123")
+
+        client.setUser("", "123")
+        self.assertEquals(client.user, None)
+        self.assertEquals(client.password, "")
+
+    def test_tryToConnect(self):
+        version = 'UnitTest/0.0'
+        response = ResponseStub(200, 'OK', 'doesnotmatter', server=version)
+        client = self.newClient(response)
+        client.tryToConnect()
+        self.assertEquals(client.status, '200 OK')
+        self.assertEquals(client.version, version)
+
+        e = socket.error(23, 'out of spam')
+        client = self.newClient(error=e)
+        client.tryToConnect()
+        self.assertEquals(client.status, 'out of spam (23)')
+        self.assertEquals(client.version, '')
+
+    def doctest_canonizeUrl(self):
+        """A test for SchoolToolClient.canonizeUrl
+
+            >>> from schooltool.restclient.restclient import SchoolToolClient
+            >>> client = SchoolToolClient()
+
+            >>> client.canonizeUrl("http://localhost:7001")
+            '/'
+
+            >>> client.canonizeUrl("/")
+            '/'
+
+            >>> client.canonizeUrl("http://localhost:7001/persons/john")
+            '/persons/john'
+
+            >>> client.canonizeUrl("http://localhost:7001/")
+            '/'
+
+            >>> client.canonizeUrl("http://localhost:7001")
+            '/'
+
+            >>> client.canonizeUrl("http://foo.com:7001/persons/john")
+            Traceback (most recent call last):
+              ...
+            SchoolToolError: won't follow external URL http://foo.com:7001/persons/john
+
+        """
+
+    def doctest_canonizeUrl_default_ports(self):
+        """A test for SchoolToolClient.canonizeUrl
+
+            >>> from schooltool.restclient.restclient import SchoolToolClient
+            >>> client = SchoolToolClient(port=80)
+
+            >>> client.canonizeUrl("http://localhost")
+            '/'
+
+            >>> client.canonizeUrl("http://localhost/persons/john")
+            '/persons/john'
+
+            >>> client.canonizeUrl("http://localhost:80/persons/john")
+            '/persons/john'
+
+            >>> client = SchoolToolClient(port=443, ssl=True)
+
+            >>> client.canonizeUrl("https://localhost")
+            '/'
+
+            >>> client.canonizeUrl("https://localhost/persons/john")
+            '/persons/john'
+
+            >>> client.canonizeUrl("https://localhost:443/persons/john")
+            '/persons/john'
+
+        """
+
+    def test_request(self):
+        path = '/path'
+        body = 'spam'
+        version = 'UnitTest/0.0'
+        response = ResponseStub(200, 'OK', body, server=version)
+        client = self.newClient(response)
+        result = client._request('FOO', path)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.server, 'localhost')
+        self.assertEquals(conn.port, 7001)
+        self.assertEquals(conn.method, 'FOO')
+        self.assertEquals(conn.path, path)
+        self.assertEquals(conn.headers, {})
+        self.assert_(conn.body is None)
+        self.assertEquals(result.status, 200)
+        self.assertEquals(result.reason, 'OK')
+        self.assertEquals(result.body, body)
+        self.assert_(result._response is response)
+        self.assertEquals(client.status, '200 OK')
+        self.assertEquals(client.version, version)
+        self.assert_(conn.closed)
+
+    def test_request_with_body_and_headers(self):
+        path = '/path'
+        body = 'spam'
+        version = 'UnitTest/0.0'
+        response = ResponseStub(200, 'OK', body, server=version)
+        client = self.newClient(response)
+        result = client._request('BAR', path, 'body body body',
+                                 {'X-Foo': 'Foo!'})
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.server, 'localhost')
+        self.assertEquals(conn.port, 7001)
+        self.assertEquals(conn.method, 'BAR')
+        self.assertEquals(conn.path, path)
+        self.assertEquals(conn.headers,
+                          {'X-Foo': 'Foo!',
+                           'Content-Type': 'text/xml'})
+        self.assertEquals(conn.body, 'body body body')
+        self.assertEquals(result.status, 200)
+        self.assertEquals(result.reason, 'OK')
+        self.assertEquals(result.body, body)
+        self.assert_(result._response is response)
+        self.assertEquals(client.status, '200 OK')
+        self.assertEquals(client.version, version)
+        self.assert_(conn.closed)
+
+    def test_request_auth(self):
+        response = ResponseStub(200, 'OK')
+        client = self.newClient(response)
+        result = client._request('GET', '/')
+        conn = self.oneConnection(client)
+        self.assert_('Authorization' not in conn.headers)
+
+        response = ResponseStub(200, 'OK')
+        client = self.newClient(response)
+        client.user = 'foo'
+        client.password = 'bar'
+        data = base64.encodestring("foo:bar").strip()
+        result = client._request('GET', '/')
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.headers['Authorization'], "Basic " + data)
+
+        response = ResponseStub(200, 'OK')
+        client = self.newClient(response)
+        client.user = 'erk'
+        client.password = 'frump'
+        data = base64.encodestring("erk:frump").strip()
+        result = client._request('GET', '/')
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.headers['Authorization'], "Basic " + data)
+
+    def test_request_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        path = '/path'
+        e = socket.error(23, 'out of spam')
+        client = self.newClient(error=e)
+        try:
+            result = client._request('GET', path)
+        except SchoolToolError, e:
+            self.assertEquals(str(e), 'out of spam (23)')
+        else:
+            self.fail("did not raise SchoolToolError")
+        conn = self.oneConnection(client)
+        self.assertEquals(client.status, "out of spam (23)")
+        self.assertEquals(client.version, '')
+        self.assert_(conn.closed)
+
+    def test_request_absolute_url(self):
+        response = ResponseStub(200, 'OK')
+        client = self.newClient(response)
+        result = client._request('GET', 'http://localhost:7001/test/me')
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.server, 'localhost')
+        self.assertEquals(conn.port, 7001)
+        self.assertEquals(conn.method, 'GET')
+        self.assertEquals(conn.path, '/test/me')
+
+    def test_getContainerItems(self):
+        body = dedent("""
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <items>
+                <item xlink:href="/objects/dumdum1" xlink:title="Dum" />
+                <item xlink:href="/objects/damdam2" xlink:title="Dam"/>
+              </items>
+            </container>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getContainerItems('/objects', lambda *args: args)
+        expected = [(client, '/objects/dumdum1', 'Dum'),
+                    (client, '/objects/damdam2', 'Dam')]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/objects')
+
+    def test_getContainerItems_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(error=socket.error(23, 'out of objects'))
+        self.assertRaises(SchoolToolError, client.getContainerItems, '/persons',
+                          lambda *args: args)
+
+        client = self.newClient(ResponseStub(500, 'Internal Error'))
+        self.assertRaises(SchoolToolError, client.getContainerItems, '/persons',
+                          lambda *args: args)
+
+    def test_getPersons(self):
+        from schooltool.restclient.restclient import PersonRef
+        body = dedent("""
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <items>
+                <item xlink:href="/persons/fred" xlink:title="Fred" />
+                <item xlink:href="/persons/barney" xlink:title="Barney"/>
+              </items>
+            </container>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getPersons()
+        expected = [PersonRef(client, '/persons/fred', 'Fred'),
+                    PersonRef(client, '/persons/barney', 'Barney')]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/persons')
+
+    def test_getGroups(self):
+        from schooltool.restclient.restclient import GroupRef
+        body = dedent("""
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <items>
+                <item xlink:href="/groups/fred" xlink:title="Fred" />
+                <item xlink:href="/groups/barney" xlink:title="Barney"/>
+              </items>
+            </container>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getGroups()
+        expected = [GroupRef(client, '/groups/fred', 'Fred'),
+                    GroupRef(client, '/groups/barney', 'Barney')]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/groups')
+
+    def test_getGroups_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(error=socket.error(23, 'out of groups'))
+        self.assertRaises(SchoolToolError, client.getGroups)
+
+        client = self.newClient(ResponseStub(500, 'Internal Error'))
+        self.assertRaises(SchoolToolError, client.getGroups)
+
+    def test_getResources(self):
+        from schooltool.restclient.restclient import ResourceRef
+        body = dedent("""
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <items>
+                <item xlink:href="/resources/nut" xlink:title="Nut" />
+                <item xlink:href="/resources/bolt" xlink:title="Bolt"/>
+              </items>
+            </container>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getResources()
+        expected = [ResourceRef(client, '/resources/nut', 'Nut'),
+                    ResourceRef(client, '/resources/bolt', 'Bolt')]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/resources')
+
+    def test_getResources_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(error=socket.error(23, 'out of resources'))
+        self.assertRaises(SchoolToolError, client.getResources)
+
+        client = self.newClient(ResponseStub(500, 'Internal Error'))
+        self.assertRaises(SchoolToolError, client.getResources)
+
+    def test_getSections(self):
+        from schooltool.restclient.restclient import SectionRef
+        body = dedent("""
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <items>
+                <item xlink:href="/sections/history1a" xlink:title="History 1A" />
+                <item xlink:href="/sections/history2a" xlink:title="History 2A"/>
+              </items>
+            </container>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getSections()
+        expected = [SectionRef(client, '/sections/history1a', 'History 1A'),
+                    SectionRef(client, '/sections/history2a', 'History 2A')]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/sections')
+
+    def test_getCourses(self):
+        from schooltool.restclient.restclient import CourseRef
+        body = dedent("""
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <items>
+                <item xlink:href="/courses/history" xlink:title="History" />
+                <item xlink:href="/courses/english" xlink:title="English"/>
+              </items>
+            </container>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getCourses()
+        expected = [CourseRef(client, '/courses/history', 'History'),
+                    CourseRef(client, '/courses/english', 'English')]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/courses')
+
+    def test_getLevels(self):
+        from schooltool.restclient.restclient import LevelRef
+        body = dedent("""
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <items>
+                <item xlink:href="/levels/level2" xlink:title="2nd Grade" />
+                <item xlink:href="/levels/level3" xlink:title="3rd Grade"/>
+              </items>
+            </container>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getLevels()
+        expected = [LevelRef(client, '/levels/level2', '2nd Grade'),
+                    LevelRef(client, '/levels/level3', '3rd Grade')]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/levels')
+
+    def test_savePersonInfo(self):
+        from schooltool.restclient.restclient import PersonInfo
+        body = dedent("""
+            <object title="Albertas Agejevas" xmlns="http://schooltool.org/ns/model/0.1"
+                    xmlns:xlink="http://www.w3.org/1999/xlink"/>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK'))
+        data = PersonInfo('Albertas Agejevas')
+        result = client.savePersonInfo('/persons/albert', data)
+        conn = self.oneConnection(client)
+        self.assertEqualsXML(conn.body, body)
+        self.assertEquals(conn.path, '/persons/albert')
+        self.assertEquals(conn.method, "PUT")
+
+    def test_getPersonPhoto(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        body = "[pretend this is JPEG]"
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        result = client.getPersonPhoto('/persons/jfk')
+        self.assertEquals(result, body)
+        self.checkConnPath(client, '/persons/jfk/photo')
+
+        client = self.newClient(ResponseStub(404, 'Not found', 'Not found'))
+        result = client.getPersonPhoto('/persons/jfk')
+        self.assert_(result is None)
+
+        client = self.newClient(ResponseStub(401, 'Unauthorized', 'errmsg'))
+        self.assertRaises(SchoolToolError, client.getPersonPhoto, '/persons/x')
+
+    def test_removePersonPhoto(self):
+        client = self.newClient(ResponseStub(200, 'OK', 'Deleted'))
+        client.removePersonPhoto('/persons/jfk')
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/persons/jfk/photo')
+        self.assertEquals(conn.method, "DELETE")
+
+    def test_getObjectRelationships(self):
+        from schooltool.restclient.restclient import RelationshipInfo, URIObject
+        from schooltool.restclient.restclient import URIMembership_uri
+        from schooltool.restclient.restclient import URIGroup_uri
+        URIMembership = URIObject(URIMembership_uri)
+        URIGroup = URIObject(URIGroup_uri)
+        body = dedent("""
+            <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                           xmlns="http://schooltool.org/ns/model/0.1">
+              <existing>
+                <relationship xlink:title="title1" xlink:href="href1"
+                              xlink:role="test://role1"
+                              xlink:arcrole="test://arcrole1">
+                    <manage xlink:href="mhref1"/>
+                </relationship>
+                <relationship xlink:title="title2" xlink:href="href2"
+                    xlink:role="http://schooltool.org/ns/membership/group"
+                    xlink:arcrole="http://schooltool.org/ns/membership">
+                    <manage xlink:href="mhref2"/>
+                </relationship>
+              </existing>
+              <valencies>
+                <relationship xlink:title="title3" xlink:href="href3"
+                              xlink:role="test://role3"
+                              xlink:arcrole="test://arcrole3" />
+              </valencies>
+            </relationships>
+        """)
+        group_id = '/groups/group1'
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        arcrole1 = URIObject('test://arcrole1')
+        role1 = URIObject('test://role1')
+        results = list(client.getObjectRelationships(group_id))
+        expected = [('test://role1',
+                     'test://arcrole1',
+                     'title1', 'href1', 'mhref1'),
+                    ('http://schooltool.org/ns/membership/group',
+                     'http://schooltool.org/ns/membership',
+                     'title2', 'href2', 'mhref2')]
+        results = [(result.role.uri, result.arcrole.uri,
+                    result.target_title, result.target_path, result.link_path)
+                   for result in results]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '%s/relationships' % group_id)
+
+    def test_getObjectRelationships_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        group_id = '/groups/group1'
+        client = self.newClient(error=socket.error(23, 'out of groups'))
+        self.assertRaises(SchoolToolError, client.getObjectRelationships,
+                          group_id)
+
+        client = self.newClient(ResponseStub(404, 'Not Found'))
+        self.assertRaises(SchoolToolError, client.getObjectRelationships,
+                          group_id)
+
+    def test_getTerms(self):
+        from schooltool.restclient.restclient import TermRef
+        body = """
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <name>terms</name>
+              <items>
+                <item xlink:type="simple"
+                      xlink:href="/terms/2003-fall"
+                      xlink:title="2003-fall"/>
+                <item xlink:type="simple"
+                      xlink:href="/terms/2004-spring"
+                      xlink:title="2003-fall"/>
+              </items>
+              <acl xlink:type="simple" xlink:title="ACL"
+                   xlink:href="http://localhost:7001/terms/acl"/>
+            </container>
+        """
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getTerms()
+        expected = [TermRef(client, '/terms/2003-fall', '2003-fall'),
+                    TermRef(client, '/terms/2004-spring', '2003-fall')]
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/terms')
+
+    def test_getTerms_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(ResponseStub(500, 'BSOD', "<xml>Error!</xml>"))
+        self.assertRaises(SchoolToolError, client.getTerms)
+
+    def test_getTimetableSchemas(self):
+        body = """
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <name>ttschemas</name>
+              <items>
+                <item xlink:type="simple"
+                      xlink:href="/ttschemas/six-day"
+                      xlink:title="six-day"/>
+                <item xlink:type="simple"
+                      xlink:href="/ttschemas/weekly"
+                      xlink:title="weekly"/>
+              </items>
+              <acl xlink:type="simple" xlink:title="ACL"
+                   xlink:href="http://localhost:7001/ttschemas/acl"/>
+            </container>
+        """
+        expected = [(u'six-day', u'/ttschemas/six-day'), (u'weekly', u'/ttschemas/weekly')]
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        results = client.getTimetableSchemas()
+        self.assertEquals(results, expected)
+        self.checkConnPath(client, '/ttschemas')
+
+    def test_getTimetableSchemas_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(ResponseStub(500, 'BSOD', "<xml>Error!</xml>"))
+        self.assertRaises(SchoolToolError, client.getTimetableSchemas)
+
+    def test_createPerson(self):
+        from schooltool.restclient.restclient import PersonRef
+        client = self.newClient(
+            ResponseStub(201, 'OK', 'Created',
+                         location='http://localhost/persons/john'))
+        result = client.createPerson('John "mad cat" Doe', "john")
+        expected = PersonRef(client, '/persons/john', 'John "mad cat" Doe')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/persons/john')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="John &quot;mad cat&quot; Doe"/>')
+
+        client = self.newClientMulti([
+            ResponseStub(201, 'OK', 'Created',
+                         location=('http://localhost/persons/root')),
+            ResponseStub(200, 'OK', 'Password set')])
+        result = client.createPerson('John "mad cat" Doe', "root", "foo")
+        expected = PersonRef(client, '/persons/root', 'John "mad cat" Doe')
+        self.assertEquals(result, expected)
+        self.assertEquals(len(client._connections), 2)
+        conn = client._connections[0]
+        self.assertEquals(conn.path, '/persons/root')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="John &quot;mad cat&quot; Doe"/>')
+        conn = client._connections[1]
+        self.assertEquals(conn.path, '/persons/root/password')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEqualsXML(conn.body, 'foo')
+
+    def test_createPerson_overrides(self):
+        from schooltool.restclient.restclient import PersonRef
+        client = self.newClient(
+            ResponseStub(200, 'OK', 'Updated',
+                         location='http://localhost/persons/john'))
+        result = client.createPerson('John "the other one" Smith', "john")
+        expected = PersonRef(client, '/persons/john',
+                             'John "the other one" Smith')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/persons/john')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="John &quot;the other one&quot; Smith"/>')
+
+    def test_createPerson_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(ResponseStub(400, 'Bad Request'))
+        self.assertRaises(SchoolToolError, client.createPerson,
+                          'John Doe', 'john')
+
+    def test_createGroup(self):
+        from schooltool.restclient.restclient import GroupRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                    location='http://localhost/groups/titlewithstrangechars'))
+        result = client.createGroup('Title<with"strange&chars')
+        expected = GroupRef(client, '/groups/titlewithstrangechars',
+                            'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/groups')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createGroup_wit_name(self):
+        from schooltool.restclient.restclient import GroupRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                    location='http://localhost/groups/group1'))
+        result = client.createGroup('Title<with"strange&chars', name="group1")
+        expected = GroupRef(client, '/groups/group1',
+                            'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/groups/group1')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createResource(self):
+        from schooltool.restclient.restclient import ResourceRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                                location='http://localhost/resources/a-res'))
+        result = client.createResource('Title<with"strange&chars')
+        expected = ResourceRef(client, '/resources/a-res',
+                               'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/resources')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' isLocation="false"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createResource_with_name(self):
+        from schooltool.restclient.restclient import ResourceRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                                location='http://localhost/resources/a-res'))
+        result = client.createResource('Title<with"strange&chars', name='a-res')
+        expected = ResourceRef(client, '/resources/a-res',
+                               'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/resources/a-res')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' isLocation="false"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createCourse(self):
+        from schooltool.restclient.restclient import CourseRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                                location='http://localhost/courses/ac'))
+        result = client.createCourse('Title<with"strange&chars')
+        expected = CourseRef(client, '/courses/ac',
+                            'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/courses')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createCourse_with_name(self):
+        from schooltool.restclient.restclient import CourseRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                                location='http://localhost/courses/ac'))
+        result = client.createCourse('Title<with"strange&chars', name="ac")
+        expected = CourseRef(client, '/courses/ac',
+                            'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/courses/ac')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createSection(self):
+        from schooltool.restclient.restclient import SectionRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                                location='http://localhost/sections/ac'))
+        result = client.createSection('Title<with"strange&chars')
+        expected = SectionRef(client, '/sections/ac',
+                              'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/sections')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createSection_with_name(self):
+        from schooltool.restclient.restclient import SectionRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                                location='http://localhost/sections/ac'))
+        result = client.createSection('Title<with"strange&chars', name='ac')
+        expected = SectionRef(client, '/sections/ac',
+                              'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/sections/ac')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createGenericObject(self):
+        from schooltool.restclient.restclient import ResourceRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                                    location='http://localhost/resources/ref'))
+        result = client._createGenericObject(ResourceRef, '/resources',
+                                             'Title<with"strange&chars')
+        expected = ResourceRef(client, '/resources/ref',
+                               'Title<with"strange&chars')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/resources')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Title&lt;with&quot;strange&amp;chars"'
+                       ' description=""/>')
+
+    def test_createGenericObject_description(self):
+        from schooltool.restclient.restclient import GroupRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                            location='http://localhost/groups/huba'))
+        result = client._createGenericObject(GroupRef, '/groups', '<Huba>',
+                                             description='<Buba>')
+        expected = GroupRef(client, '/groups/huba', '<Huba>')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/groups')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="&lt;Huba&gt;"'
+                       ' description="&lt;Buba&gt;"/>')
+
+    def test_createGenericObject_with_name(self):
+        from schooltool.restclient.restclient import GroupRef
+        client = self.newClient(
+            ResponseStub(201, 'OK', 'Created',
+                         location='http://localhost/groups/teachers'))
+        result = client._createGenericObject(GroupRef, '/groups',
+                                             'Teachers', name="teachers",
+                                             description="Group of teachers")
+        expected = GroupRef(client, '/groups/teachers', 'Teachers')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/groups/teachers')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Teachers"'
+                       ' description="Group of teachers" />')
+
+    def test_createGenericObject_with_name_overrides(self):
+        from schooltool.restclient.restclient import GroupRef
+        client = self.newClient(
+            ResponseStub(200, 'OK', 'Updated',
+                         location='http://localhost/groups/teachers'))
+        result = client._createGenericObject(GroupRef, '/groups',
+                                             'Teachers', name="teachers",
+                                             description="Group of teachers")
+        expected = GroupRef(client, '/groups/teachers', 'Teachers')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/groups/teachers')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="Teachers"'
+                       ' description="Group of teachers" />')
+
+    def test_createGenericObject_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(ResponseStub(400, 'Bad Request'))
+        self.assertRaises(SchoolToolError, client._createGenericObject,
+                          None, '/whatever', 'Slackers')
+
+    def test_createRelationship(self):
+        from schooltool.restclient.restclient import URIObject
+        from schooltool.restclient.restclient import URIMembership_uri
+        from schooltool.restclient.restclient import URIGroup_uri
+        client = self.newClient(ResponseStub(201, 'Created',
+                location='http://localhost/persons/john/relationships/004'))
+        result = client.createRelationship('/persons/john', '/groups/teachers',
+                                           URIMembership_uri, URIGroup_uri)
+        self.assertEquals(result, '/persons/john/relationships/004')
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/persons/john/relationships')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        expected = """
+            <relationship xmlns="http://schooltool.org/ns/model/0.1"
+                 xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="/groups/teachers"
+                 xlink:arcrole="http://schooltool.org/ns/membership"
+                 xlink:role="http://schooltool.org/ns/membership/group"
+                 />
+                 """
+        self.assertEqualsXML(conn.body, expected)
+
+    def test_createRelationship_absolute_urls(self):
+        from schooltool.restclient.restclient import URIObject
+        from schooltool.restclient.restclient import URIMembership_uri
+        from schooltool.restclient.restclient import URIGroup_uri
+        client = self.newClient(ResponseStub(201, 'Created',
+                location='http://localhost/persons/john/relationships/004'))
+        result = client.createRelationship(
+                    'http://localhost:7001/persons/john',
+                    'http://localhost:7001/groups/teachers',
+                    URIMembership_uri, URIGroup_uri)
+        self.assertEquals(result, '/persons/john/relationships/004')
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/persons/john/relationships')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        expected = """
+            <relationship xmlns="http://schooltool.org/ns/model/0.1"
+                 xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="/groups/teachers"
+                 xlink:arcrole="http://schooltool.org/ns/membership"
+                 xlink:role="http://schooltool.org/ns/membership/group"
+                 />
+                 """
+        self.assertEqualsXML(conn.body, expected)
+
+    def test_createRelationship_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        from schooltool.restclient.restclient import URIObject
+        from schooltool.restclient.restclient import URIMembership_uri
+        from schooltool.restclient.restclient import URIGroup_uri
+        URIMembership = URIObject(URIMembership_uri)
+        URIGroup = URIObject(URIGroup_uri)
+        client = self.newClient(ResponseStub(400, 'Bad Request'))
+        self.assertRaises(SchoolToolError, client.createRelationship,
+                '/persons/john', '/groups/teachers', URIMembership, URIGroup)
+
+    def test_createTerm(self, response_code=201):
+        from schooltool.restclient.restclient import TermRef
+        client = self.newClient(ResponseStub(response_code, 'Created',
+                        location='http://localhost/terms/2005-fall'))
+        result = client.createTerm('2005 Fall', '2005-fall',
+                                   datetime.date(2005, 9, 1),
+                                   datetime.date(2005, 12, 31),
+                                   daysofweek=[0, 2, 3, 4, 6],
+                                   holidays=[datetime.date(2005, 12, 25),
+                                             datetime.date(2005, 11, 1)])
+        expected = TermRef(client, '/terms/2005-fall', '2005 Fall')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/terms/2005-fall')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body, """
+            <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+                        first="2005-09-01" last="2005-12-31">
+              <title>2005 Fall</title>
+              <daysofweek>Monday Wednesday Thursday Friday Sunday</daysofweek>
+              <holiday date="2005-12-25">Holiday</holiday>
+              <holiday date="2005-11-01">Holiday</holiday>
+            </schooldays>
+                """)
+
+    def test_createTerm_overrides(self):
+        self.test_createTerm(response_code=200)
+
+    def test_createTerm_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(ResponseStub(401, 'Unauthorized'))
+        self.assertRaises(SchoolToolError,
+                          client.createTerm,
+                          '2005 Fall', '2005-fall',
+                          datetime.date(2005, 9, 1),
+                          datetime.date(2005, 12, 31),
+                          daysofweek=[0, 2, 3, 4, 6],
+                          holidays=[datetime.date(2005, 12, 25),
+                                    datetime.date(2005, 11, 1)])
+
+    def test_deleteObject(self):
+        client = self.newClient(ResponseStub(200, 'OK', 'Deleted'))
+        client.deleteObject('/path/to/object')
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/path/to/object')
+        self.assertEquals(conn.method, 'DELETE')
+        self.assertEquals(conn.body, '')
+
+    def test_deleteObject_object_ref(self):
+        from schooltool.restclient.restclient import ObjectRef
+        client = self.newClient(ResponseStub(200, 'OK', 'Deleted'))
+        ref = ObjectRef(client, '/path/to/object')
+        client.deleteObject(ref)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/path/to/object')
+        self.assertEquals(conn.method, 'DELETE')
+        self.assertEquals(conn.body, '')
+
+    def test_deleteObject_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        client = self.newClient(ResponseStub(400, 'Bad Request'))
+        self.assertRaises(SchoolToolError, client.deleteObject, '/path')
+
+    def test__pathFromResponse(self):
+        client = self.newClient(None)
+        response = ResponseStub(200, 'OK',
+                                location='http://localhost/path/to/something')
+        self.assertEquals(client._pathFromResponse(response),
+                          '/path/to/something')
+
+        # XXX What if the server is broken and does not return a Location
+        #     header, or returns an ill-formed location header, or something
+        #     unexpected like 'mailto:jonas at example.com' or 'http://webserver'
+        #     without a trailing slash?
+
+    def test_saveLevelInfo(self):
+        from schooltool.restclient.restclient import LevelInfo
+        body = dedent("""
+            <object title="1st Grade"
+                    isInitial="true"
+                    nextLevel="level2"
+                    xmlns="http://schooltool.org/ns/model/0.1" />
+        """)
+        client = self.newClient(ResponseStub(200, 'OK'))
+        data = LevelInfo('1st Grade', True, 'level2')
+        result = client.saveLevelInfo('/levels/level1', data)
+        conn = self.oneConnection(client)
+        self.assertEqualsXML(conn.body, body)
+        self.assertEquals(conn.path, '/levels/level1')
+        self.assertEquals(conn.method, "PUT")
+
+    def test_createLevel(self):
+        from schooltool.restclient.restclient import LevelRef
+        client = self.newClient(ResponseStub(201, 'OK', 'Created',
+                    location='http://localhost/levels/level2'))
+        result = client.createLevel('level2', '2nd Grade', False, None)
+        expected = LevelRef(client, '/levels/level2',
+                            '2nd Grade')
+        self.assertEquals(result, expected)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/levels/level2')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        self.assertEqualsXML(conn.body,
+                '<object xmlns="http://schooltool.org/ns/model/0.1"'
+                       ' title="2nd Grade"'
+                       ' isInitial="false"'
+                       ' nextLevel=""/>')
+
+
+class TestResponse(unittest.TestCase):
+
+    class RealResponseStub:
+        status = 42
+        reason = 'of life, the universe, and everything'
+        _used = False
+        _headers = {'Beauty': 'True'}
+
+        def read(self):
+            if self._used: raise EOFError
+            self._used = True
+            return '<body/>'
+
+        def getheader(self, header):
+            return self._headers[header]
+
+    def test(self):
+        from schooltool.restclient.restclient import Response
+        real_response = self.RealResponseStub()
+        response = Response(real_response)
+        self.assertEquals(response.status, real_response.status)
+        self.assertEquals(response.reason, real_response.reason)
+        self.assertEquals(response.body, '<body/>')
+        self.assertEquals(response.getheader('Beauty'), 'True')
+        self.assertEquals(str(response), '<body/>')
+        self.assertEquals(response.read(), '<body/>')
+        # can do that multiple times, and it doesn't call real_response.read()
+        # again
+        self.assertEquals(response.read(), '<body/>')
+        # just to make sure -- if response did call real_response.read() again,
+        # it would get an error
+        self.assertRaises(EOFError, real_response.read)
+
+
+class TestParseFunctions(NiceDiffsMixin, QuietLibxml2Mixin, unittest.TestCase):
+
+    def setUp(self):
+        self.setUpLibxml2()
+
+    def tearDown(self):
+        self.tearDownLibxml2()
+
+    def test__parseContainer(self):
+        from schooltool.restclient.restclient import _parseContainer
+        body = dedent("""
+            <container xmlns:xlink="http://www.w3.org/1999/xlink">
+              <items>
+                <item xlink:href="/persons/fred" xlink:title="Fred \xc5\xbe."/>
+                <item xlink:href="/persons/barney"/>
+              </items>
+            </container>
+        """)
+        results = _parseContainer(body)
+        expected = [(u'Fred \u017e.', '/persons/fred'),
+                    (u'barney', '/persons/barney')]
+        self.assertEquals(results, expected)
+
+    def test__parseContainer_errors(self):
+        from schooltool.restclient.restclient import _parseContainer
+        body = "<This is not XML"
+        self.assertRaises(XMLParseError, _parseContainer, body)
+
+    def test__parseRelationships(self):
+        from schooltool.restclient.restclient import _parseRelationships
+        from schooltool.restclient.restclient import RelationshipInfo, URIObject
+        from schooltool.restclient.restclient import URIMembership_uri
+        from schooltool.restclient.restclient import URIGroup_uri
+        URIMembership = URIObject(URIMembership_uri)
+        URIGroup = URIObject(URIGroup_uri)
+        body = dedent("""
+            <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                           xmlns="http://schooltool.org/ns/model/0.1">
+              <existing>
+                <relationship xlink:title="title1 \xe2\x9c\xb0"
+                              xlink:href="href1"
+                              xlink:role="test://role1"
+                              xlink:arcrole="test://arcrole1">
+                    <manage xlink:href="mhref1"/>
+                </relationship>
+                <relationship xlink:title="title2 \xe2\x9c\xb0"
+                    xlink:href="href2"
+                    xlink:role="http://schooltool.org/ns/membership/group"
+                    xlink:arcrole="http://schooltool.org/ns/membership">
+                    <manage xlink:href="mhref2"/>
+                </relationship>
+                <relationship xlink:href="/objects/href3"
+                              xlink:role="test://role3"
+                              xlink:arcrole="test://arcrole3">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+                <!-- the rest are ignored for because of missing/empty
+                     attributes -->
+                <relationship xlink:title="title4"
+                              xlink:role="test://role4"
+                              xlink:arcrole="test://arcrole4">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+                <relationship xlink:href=""
+                              xlink:role="test://role4b"
+                              xlink:arcrole="test://arcrole4b">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+                <relationship xlink:title="title5"  xlink:href="href5"
+                              xlink:arcrole="test://arcrole5">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+                <relationship xlink:title="title5b" xlink:href="href5b"
+                              xlink:role=""
+                              xlink:arcrole="test://arcrole5b">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+                <relationship xlink:title="title6"  xlink:href="href6"
+                              xlink:role="test://role6">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+                <relationship xlink:title="title6b" xlink:href="href6b"
+                              xlink:role="test://role6b" xlink:arcrole="">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+                <relationship xlink:title="title7b" xlink:href="href7b"
+                              xlink:role="not-a-uri"
+                              xlink:arcrole="test://arcrole7">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+                <relationship xlink:title="title8b" xlink:href="href8b"
+                              xlink:role="test://role7"
+                              xlink:arcrole="not a uri">
+                    <manage xlink:href="mhref3"/>
+                </relationship>
+              </existing>
+              <valencies>
+                <relationship xlink:title="title0" xlink:href="href0"
+                              xlink:role="test://role0"
+                              xlink:arcrole="test://arcrole0" />
+              </valencies>
+            </relationships>
+        """)
+        role1 = URIObject('test://role1')
+        arcrole1 = URIObject('test://arcrole1')
+        uriobjects = {role1.uri: role1,
+                      arcrole1.uri: arcrole1,
+                      URIMembership_uri: URIMembership,
+                      URIGroup_uri: URIGroup}
+        result = _parseRelationships(body, uriobjects)
+        role3 = uriobjects['test://role3']
+        self.assertEquals(role3.uri, role3.name)
+        arcrole3 = uriobjects['test://arcrole3']
+        self.assertEquals(arcrole3.uri, arcrole3.name)
+
+        expected = [RelationshipInfo(*args) for args in [
+                (arcrole1, role1, u'title1 \u2730', 'href1', 'mhref1'),
+                (URIMembership, URIGroup, u'title2 \u2730', 'href2', 'mhref2'),
+                (arcrole3, role3, u'href3', '/objects/href3', 'mhref3'),
+            ]]
+        self.assertEquals(list(result), expected)
+
+    def test__parseRelationships_errors(self):
+        from schooltool.restclient.restclient import _parseRelationships
+        from schooltool.restclient.restclient import SchoolToolError
+        body = "<This is not XML"
+        self.assertRaises(XMLParseError, _parseRelationships, body, {})
+
+        # Two manage elements
+        body = dedent("""
+            <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                           xmlns="http://schooltool.org/ns/model/0.1">
+              <existing>
+                <relationship xlink:title="title1" xlink:href="href1"
+                              xlink:role="test://role1"
+                              xlink:arcrole="test://arcrole1">
+                    <manage xlink:href="mhref1"/>
+                    <manage xlink:href="mhref2"/>
+                </relationship>
+              </existing>
+            </relationships>
+        """)
+        self.assertRaises(SchoolToolError, _parseRelationships, body, {})
+
+        # No manage elements
+        body = dedent("""
+            <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                           xmlns="http://schooltool.org/ns/model/0.1">
+              <existing>
+                <relationship xlink:title="title1" xlink:href="href1"
+                              xlink:role="test://role1"
+                              xlink:arcrole="test://arcrole1" />
+              </existing>
+            </relationships>
+        """)
+        self.assertRaises(SchoolToolError, _parseRelationships, body, {})
+
+    def test__parsePersonInfo(self):
+        from schooltool.restclient.restclient import _parsePersonInfo
+        from schooltool.restclient.restclient import SchoolToolError
+        body = """
+            <person xmlns:xlink="http://www.w3.org/1999/xlink"
+                    xmlns="http://schooltool.org/ns/model/0.1">
+              <title>John \xe2\x9c\xb0 Doe \xe2\x9c\xb0</title>
+              <relationships xlink:type="simple"
+                             xlink:title="Relationships"
+                             xlink:href="/persons/john/relationships"/>
+              <acl xlink:type="simple" xlink:title="ACL"
+                   xlink:href="/persons/john/acl"/>
+              <calendar xlink:type="simple" xlink:title="Calendar"
+                        xlink:href="/persons/john/calendar"/>
+              <relationships xlink:type="simple"
+                             xlink:title="Calendar subscriptions"
+                             xlink:href="/persons/john/calendar/relationships"/>
+              <acl xlink:type="simple" xlink:title="Calendar ACL"
+                   xlink:href="/persons/john/calendar/acl"/>
+            </person>
+        """
+        result = _parsePersonInfo(body)
+        self.assertEquals(result.title, u'John \u2730 Doe \u2730')
+
+    def test__parsePersonInfo_errors(self):
+        from schooltool.restclient.restclient import _parsePersonInfo
+        from schooltool.restclient.restclient import SchoolToolError
+        body = "<This is not XML"
+        self.assertRaises(XMLParseError, _parsePersonInfo, body)
+        body = """
+            <person xmlns:xlink="http://www.w3.org/1999/xlink"
+                    xmlns="http://schooltool.org/ns/model/0.1">
+              <relationships xlink:type="simple"
+                             xlink:title="Relationships"
+                             xlink:href="/persons/john/relationships"/>
+              <acl xlink:type="simple" xlink:title="ACL"
+                   xlink:href="/persons/john/acl"/>
+              <calendar xlink:type="simple" xlink:title="Calendar"
+                        xlink:href="/persons/john/calendar"/>
+              <relationships xlink:type="simple"
+                             xlink:title="Calendar subscriptions"
+                             xlink:href="/persons/john/calendar/relationships"/>
+              <acl xlink:type="simple" xlink:title="Calendar ACL"
+                   xlink:href="/persons/john/calendar/acl"/>
+            </person>
+        """
+        self.assertRaises(SchoolToolError, _parsePersonInfo, body)
+
+    def test__parseGroupInfo(self):
+        from schooltool.restclient.restclient import _parseGroupInfo
+        from schooltool.restclient.restclient import SchoolToolError
+        body = """
+            <group xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+              <title>Managers</title>
+              <description>We are the managers.</description>
+              <relationships xlink:type="simple"
+                             xlink:title="Relationships"
+                             xlink:href="/groups/managers/relationships"/>
+              <acl xlink:type="simple" xlink:title="ACL"
+                   xlink:href="/groups/managers/acl"/>
+              <calendar xlink:type="simple" xlink:title="Calendar"
+                        xlink:href="/groups/managers/calendar"/>
+              <relationships xlink:type="simple"
+                             xlink:title="Calendar subscriptions"
+                             xlink:href="/groups/managers/calendar/relationships"/>
+              <acl xlink:type="simple" xlink:title="Calendar ACL"
+                   xlink:href="/groups/managers/calendar/acl"/>
+            </group>
+        """
+        result = _parseGroupInfo(body)
+        self.assertEquals(result.title, u'Managers')
+        self.assertEquals(result.description, u'We are the managers.')
+
+    def test__parseLevelInfo(self):
+        from schooltool.restclient.restclient import _parseLevelInfo
+        from schooltool.restclient.restclient import SchoolToolError
+        body = """
+            <level xmlns:xlink="http://www.w3.org/1999/xlink"
+                   xmlns="http://schooltool.org/ns/model/0.1">
+              <title>1st Grade</title>
+              <isInitial>true</isInitial>
+              <nextLevel>level2</nextLevel>
+              <relationships xlink:type="simple"
+                             xlink:title="Relationships"
+                             xlink:href="http://localhost/levels/level1/relationships"/>
+              <acl xlink:type="simple" xlink:title="ACL"
+                   xlink:href="http://localhost/levels/level1/acl"/>
+            </level>
+        """
+        result = _parseLevelInfo(body)
+        self.assertEquals(result.title, u'1st Grade')
+        self.assertEquals(result.isInitial, True)
+        self.assertEquals(result.nextLevel, "level2")
+
+
+class InfoClassTestMixin:
+    """Mixin for testing classes that are tuple replacements."""
+
+    def _test_repr(self, cls, nargs):
+        """Test the __repr__ method of a class."""
+        obj = cls(*range(nargs))
+
+        result = repr(obj)
+        expected = "%s(%s)" % (cls.__name__, ', '.join(map(str, range(nargs))))
+        self.assertEquals(result, expected)
+
+    def _test_cmp(self, cls, nargs, attrs=()):
+        """Test the __cmp__ method of a class.
+
+        nargs is the number of arguments the constructor takes
+
+        attrs is a sequence of attributes that should be more important for
+        ordering.
+        """
+        clsname = cls.__name__
+        obj1 = cls(*range(nargs))
+        self.assertEquals(obj1, obj1,
+                          "%s does not compare equal to itself:\n  %r != %r"
+                          % (clsname, obj1, obj1))
+
+        for i in range(nargs):
+            args = range(nargs)
+            args[i] = -1
+            obj2 = cls(*args)
+            self.assertNotEquals(obj1, obj2,
+                          "%s does not notice changes in the %dth argument:\n"
+                          "  %r == %r" % (clsname, i + 1, obj1, obj2))
+
+        obj1 = cls(*([1] * nargs))
+        obj2 = cls(*([2] * nargs))
+        self.assert_(obj1 < obj2, "%r >= %r" % (obj1, obj2))
+
+        for attrname in attrs:
+            setattr(obj1, attrname, 2)
+            setattr(obj2, attrname, 1)
+            self.assert_(obj1 > obj2,
+                         "%s is not sorted by %s:\n  %r <= %r"
+                         % (clsname, attrname, obj1, obj2))
+            setattr(obj1, attrname, 3)
+            setattr(obj2, attrname, 3)
+
+
+class TestInfoClasses(unittest.TestCase, InfoClassTestMixin):
+
+    def test_RelationshipInfo(self):
+        from schooltool.restclient.restclient import RelationshipInfo
+        self._test_repr(RelationshipInfo, 5)
+        self._test_cmp(RelationshipInfo, 5,
+                       ('arcrole', 'role', 'target_title'))
+
+    def test_URIObject(self):
+        from schooltool.restclient.restclient import URIObject
+        uriobj = URIObject('http://foo')
+        self.assertEquals(uriobj.uri, 'http://foo')
+        self.assertEquals(uriobj.name, 'http://foo')
+        uriobj = URIObject('http://foo', "name", "desc")
+        self.assertEquals(uriobj.uri, 'http://foo')
+        self.assertEquals(uriobj.name, 'name')
+        self.assertEquals(uriobj.description, 'desc')
+
+        self.assertRaises(AssertionError, URIObject, "invalid_uri")
+
+
+class TestPersonRef(SchoolToolClientTestMixin, unittest.TestCase):
+
+    def test_getInfo(self):
+        """A test for PersonRef.getInfo."""
+        from schooltool.restclient.restclient import PersonRef
+        body = dedent("""
+            <person xmlns:xlink="http://www.w3.org/1999/xlink"
+                    xmlns="http://schooltool.org/ns/model/0.1">
+              <title>SchoolTool Manager</title>
+              <relationships xlink:type="simple"
+                             xlink:title="Relationships"
+                             xlink:href="/persons/manager/relationships"/>
+              <acl xlink:type="simple" xlink:title="ACL"
+                   xlink:href="/persons/manager/acl"/>
+              <calendar xlink:type="simple" xlink:title="Calendar"
+                        xlink:href="/persons/manager/calendar"/>
+              <relationships xlink:type="simple"
+                             xlink:title="Calendar subscriptions"
+                             xlink:href="/persons/manager/calendar/relationships"/>
+              <acl xlink:type="simple" xlink:title="Calendar ACL"
+                   xlink:href="/persons/manager/calendar/acl"/>
+            </person>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        ref = PersonRef(client, '/persons/manager')
+        result = ref.getInfo()
+        self.assertEquals(result.title, 'SchoolTool Manager')
+
+    def test_setPassword(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        from schooltool.restclient.restclient import PersonRef
+        client = self.newClient(ResponseStub(200, 'OK', 'Password set'))
+        ref = PersonRef(client, '/persons/luser1')
+        ref.setPassword('wp')
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/persons/luser1/password')
+        self.assertEquals(conn.method, 'PUT')
+        self.assertEquals(conn.headers['Content-Type'], 'text/plain')
+        self.assertEqualsXML(conn.body, 'wp')
+
+    def test_setPassword_with_errors(self):
+        from schooltool.restclient.restclient import SchoolToolError
+        from schooltool.restclient.restclient import PersonRef
+        client = self.newClient(ResponseStub(400, 'Bad Request'))
+        ref = PersonRef(client, '/persons/luser1')
+        self.assertRaises(SchoolToolError,
+                          ref.setPassword, 'wp')
+
+    def test_setPhoto(self):
+        from schooltool.restclient.restclient import PersonRef
+        body = "[pretend this is JPEG]"
+        client = self.newClient(ResponseStub(200, 'OK', 'Uploaded'))
+        ref = PersonRef(client, '/persons/jfk')
+        ref.setPhoto(body)
+        conn = self.oneConnection(client)
+        self.assertEqualsXML(conn.body, body)
+        self.assertEquals(conn.path, '/persons/jfk/photo')
+        self.assertEquals(conn.headers['Content-Type'],
+                          'application/octet-stream')
+        self.assertEquals(conn.method, "PUT")
+
+    def test_setPhoto_alternative_content_type(self):
+        from schooltool.restclient.restclient import PersonRef
+        body = "[pretend this is PNG]"
+        client = self.newClient(ResponseStub(200, 'OK', 'Uploaded'))
+        ref = PersonRef(client, '/persons/jfk')
+        ref.setPhoto(body, 'image/png')
+        conn = self.oneConnection(client)
+        self.assertEqualsXML(conn.body, body)
+        self.assertEquals(conn.path, '/persons/jfk/photo')
+        self.assertEquals(conn.headers['Content-Type'],
+                          'image/png')
+        self.assertEquals(conn.method, "PUT")
+
+    def test_getAcademicStatus(self):
+        """A test for PersonRef.getAcademicStatus."""
+        from schooltool.restclient.restclient import PersonRef
+        body = "Enrolled"
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        ref = PersonRef(client, '/persons/manager')
+        result = ref.getAcademicStatus()
+        self.assertEquals(result, "Enrolled")
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.method, "GET")
+        self.assertEquals(conn.path, '/persons/manager/academicStatus')
+
+    def test_getAcademicStatus_errors(self):
+        """A test for PersonRef.getAcademicStatus."""
+        from schooltool.restclient.restclient import PersonRef
+        from schooltool.restclient.restclient import ResponseStatusError
+        body = ""
+        client = self.newClient(ResponseStub(400, 'Bad Request', body))
+        ref = PersonRef(client, '/persons/manager')
+        self.assertRaises(ResponseStatusError, ref.getAcademicStatus)
+
+    def test_initiatePromotion(self):
+        from schooltool.restclient.restclient import PersonRef
+        client = self.newClient(ResponseStub(200, 'OK', 'Created'))
+        ref = PersonRef(client, '/persons/jfk')
+        ref.initiatePromotion()
+        conn = self.oneConnection(client)
+        self.assertEqualsXML(conn.body, "")
+        self.assertEquals(conn.path, '/persons/jfk/promotion')
+        self.assertEquals(conn.method, "PUT")
+
+    def test_initiatePromotion_errors(self):
+        from schooltool.restclient.restclient import PersonRef
+        from schooltool.restclient.restclient import ResponseStatusError
+        client = self.newClient(ResponseStub(400, 'Bad Request', ""))
+        ref = PersonRef(client, '/persons/manager')
+        self.assertRaises(ResponseStatusError, ref.initiatePromotion)
+
+
+class TestGroupRef(SchoolToolClientTestMixin, unittest.TestCase):
+
+    def test_getInfo(self):
+        """A test for PersonRef.getInfo."""
+        from schooltool.restclient.restclient import GroupRef
+        body = dedent("""
+            <group xmlns:xlink="http://www.w3.org/1999/xlink"
+                    xmlns="http://schooltool.org/ns/model/0.1">
+              <title>Manager</title>
+              <description>Manager Group.</description>
+              <relationships xlink:type="simple"
+                             xlink:title="Relationships"
+                             xlink:href="/groups/manager/relationships"/>
+              <acl xlink:type="simple" xlink:title="ACL"
+                   xlink:href="/groups/manager/acl"/>
+              <calendar xlink:type="simple" xlink:title="Calendar"
+                        xlink:href="/groups/manager/calendar"/>
+              <relationships xlink:type="simple"
+                             xlink:title="Calendar subscriptions"
+                             xlink:href="/groups/manager/calendar/relationships"/>
+              <acl xlink:type="simple" xlink:title="Calendar ACL"
+                   xlink:href="/groups/manager/calendar/acl"/>
+            </group>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        ref = GroupRef(client, '/groups/manager')
+        result = ref.getInfo()
+        self.assertEquals(result.title, 'Manager')
+        self.assertEquals(result.description, 'Manager Group.')
+
+    def test_getMembers(self):
+        from schooltool.restclient.restclient import PersonRef
+        from schooltool.restclient.restclient import GroupRef
+        body = dedent("""
+            <relationships xmlns:xlink="http://www.w3.org/1999/xlink"
+                           xmlns="http://schooltool.org/ns/model/0.1">
+              <existing>
+                <relationship xlink:type="simple"
+                              xlink:role="http://schooltool.org/ns/membership/member"
+                              xlink:arcrole="http://schooltool.org/ns/membership"
+                              xlink:href="/persons/person1">
+                  <manage xlink:type="simple"
+                          xlink:href="/groups/manager/relationships/1"/>
+                </relationship>
+              </existing>
+            </relationships>
+        """)
+        client = self.newClient(ResponseStub(200, 'OK', body))
+        expected = [PersonRef(client, '/persons/person1')]
+        ref = GroupRef(client, '/groups/group1')
+        group_relationships = '/groups/group1/relationships'
+        result = ref.getMembers()
+        self.assertEquals(list(result), expected)
+        self.checkConnPath(client, group_relationships)
+
+    def test_getMembers_with_errors(self):
+        from schooltool.restclient.restclient import GroupRef
+        from schooltool.restclient.restclient import SchoolToolError
+        group_id = '/groups/group1'
+        client = self.newClient(error=socket.error(23, 'out of groups'))
+        ref = GroupRef(client, group_id)
+        self.assertRaises(SchoolToolError, ref.getMembers)
+
+        client = self.newClient(ResponseStub(404, 'Not Found'))
+        self.assertRaises(SchoolToolError, ref.getMembers)
+
+    def test_addMember(self):
+        from schooltool.restclient.restclient import GroupRef
+        from schooltool.restclient.restclient import PersonRef
+        client = self.newClient(ResponseStub(201, 'Created',
+                location='http://localhost/groups/teachers/relationships/004'))
+        group = GroupRef(client, '/groups/teachers', 'Teachers')
+        person = PersonRef(client, '/persons/john')
+        group.addMember(person)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/groups/teachers/relationships')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        expected = """
+            <relationship xmlns="http://schooltool.org/ns/model/0.1"
+                 xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="/persons/john"
+                 xlink:arcrole="http://schooltool.org/ns/membership"
+                 xlink:role="http://schooltool.org/ns/membership/member"
+                 />
+                 """
+        self.assertEqualsXML(conn.body, expected)
+
+
+class TestCourseRef(SchoolToolClientTestMixin, unittest.TestCase):
+
+    def test_addSection(self):
+        from schooltool.restclient.restclient import CourseRef
+        from schooltool.restclient.restclient import SectionRef
+        client = self.newClient(ResponseStub(201, 'Created',
+                location='http://localhost/courses/history/relationships/004'))
+        course = CourseRef(client, '/courses/history', 'History')
+        section = SectionRef(client, '/sections/history1a')
+        course.addSection(section)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/courses/history/relationships')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        expected = """
+            <relationship xmlns="http://schooltool.org/ns/model/0.1"
+                 xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="/sections/history1a"
+                 xlink:arcrole="http://schooltool.org/ns/coursesections"
+                 xlink:role="http://schooltool.org/ns/coursesections/section"
+                 />
+                 """
+        self.assertEqualsXML(conn.body, expected)
+
+
+class TestSectionRef(SchoolToolClientTestMixin, unittest.TestCase):
+
+    def test_addInstructor(self):
+        from schooltool.restclient.restclient import SectionRef
+        from schooltool.restclient.restclient import PersonRef
+        client = self.newClient(ResponseStub(201, 'Created',
+                location='http://localhost/sections/history1a/relationships/004'))
+        section = SectionRef(client, '/sections/history1a', 'History for 1A')
+        instructor = PersonRef(client, '/persons/john')
+        section.addInstructor(instructor)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/sections/history1a/relationships')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        expected = """
+            <relationship xmlns="http://schooltool.org/ns/model/0.1"
+                 xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="/persons/john"
+                 xlink:arcrole="http://schooltool.org/ns/instruction"
+                 xlink:role="http://schooltool.org/ns/instruction/instructor"
+                 />
+                 """
+        self.assertEqualsXML(conn.body, expected)
+
+    def test_addLearner(self):
+        from schooltool.restclient.restclient import SectionRef
+        from schooltool.restclient.restclient import GroupRef
+        client = self.newClient(ResponseStub(201, 'Created',
+                location='http://localhost/sections/history1a/relationships/004'))
+        section = SectionRef(client, '/sections/history1a', 'History for 1A')
+        member = GroupRef(client, '/groups/managers')
+        section.addLearner(member)
+        conn = self.oneConnection(client)
+        self.assertEquals(conn.path, '/sections/history1a/relationships')
+        self.assertEquals(conn.method, 'POST')
+        self.assertEquals(conn.headers['Content-Type'], 'text/xml')
+        expected = """
+            <relationship xmlns="http://schooltool.org/ns/model/0.1"
+                 xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="/groups/managers"
+                 xlink:arcrole="http://schooltool.org/ns/membership"
+                 xlink:role="http://schooltool.org/ns/membership/member"
+                 />
+                 """
+        self.assertEqualsXML(conn.body, expected)
+
+
+def doctest_ResponseStatusError():
+    """Test for ResponseStatusError
+
+    We will need a sample response:
+
+        >>> response = ResponseStub(500, 'Internal Error',
+        ...                         "You are trying to create a duplicate"
+        ...                         " relationship.")
+
+    Let's instantiante an error:
+
+        >>> from schooltool.restclient.restclient import ResponseStatusError
+        >>> error = ResponseStatusError(response)
+
+        >>> error.status
+        500
+        >>> error.reason
+        'Internal Error'
+
+    and raise it:
+
+        >>> raise error
+        Traceback (most recent call last):
+        ...
+        ResponseStatusError: 500 Internal Error
+        You are trying to create a duplicate relationship.
+
+    We should not print the body of the response if it is not a
+    plain text (so users would not get binary data printed into
+    their terminals):
+
+        >>> response = ResponseStub(500, 'Internal Error',
+        ...                         "I am a PNG", content_type="image/png")
+        >>> raise ResponseStatusError(response)
+        Traceback (most recent call last):
+        ...
+        ResponseStatusError: 500 Internal Error
+
+    Though texts with charset set should be printed:
+
+        >>> response = ResponseStub(500, 'Internal Error',
+        ...                         "I am a UTF text!",
+        ...                         content_type="text/plain;charset=UTF-8")
+        >>> raise ResponseStatusError(response)
+        Traceback (most recent call last):
+        ...
+        ResponseStatusError: 500 Internal Error
+        I am a UTF text!
+
+    If content-type header is None - the body should be ignored:
+
+        >>> response = ResponseStub(400, 'Unauthorized',
+        ...                         "",
+        ...                         content_type=None)
+        >>> raise ResponseStatusError(response)
+        Traceback (most recent call last):
+        ...
+        ResponseStatusError: 400 Unauthorized
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(DocTestSuite('schooltool.restclient.restclient'))
+    suite.addTest(DocTestSuite())
+    suite.addTest(unittest.makeSuite(TestSchoolToolClient))
+    suite.addTest(unittest.makeSuite(TestResponse))
+    suite.addTest(unittest.makeSuite(TestParseFunctions))
+    suite.addTest(unittest.makeSuite(TestInfoClasses))
+    suite.addTest(unittest.makeSuite(TestPersonRef))
+    suite.addTest(unittest.makeSuite(TestGroupRef))
+    suite.addTest(unittest.makeSuite(TestCourseRef))
+    suite.addTest(unittest.makeSuite(TestSectionRef))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/restclient/tests/test_restclient.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,124 @@
+==============================================
+Pluggable sample data framework for SchoolTool
+==============================================
+
+There are several goals to this framework:
+
+- provide the developers with a SchoolTool setup that is close to
+  real-world use in amounts of data in the database, so various
+  performance and usability problems are noticed and taken care of
+  early
+
+- provide the users with an easy setup for evaluating SchoolTool with
+  plausible data
+
+The framework is pluggable and allows the creators of SchoolTool
+extensions to provide their own plugins that generate sample data for
+those extensions.
+
+
+What data does it generate?
+---------------------------
+
+Currently, the framework generates a school with a 1000 students, 48
+teachers, 64 rooms and 24 projectors, 240 sections of 24 courses,
+sets up a 6 day 6 period rotating timetable schema, and sets up
+timetables for all teachers and students.  All sections and people get
+random events added to their calendars every now and then.
+
+
+How to use it?
+--------------
+
+Sample data generation is available in the developer mode.  In order
+to enable it, uncomment the `devmode on` line in your schooltool.conf.
+If you only have schooltool.conf.in, copy it to schooltool.conf and
+then edit it.
+
+You need to run the sample data generation with an empty database, so
+most probably you need to remove the Data.fs file.  Start the
+SchoolTool server, log in as `manager`, choose Sample Data from the
+developer mode menu, change the random seed if you want to, and press
+'Generate'.  Be patient, it takes several minutes even on fast machines.
+
+When the generation is done, you'll get a summary of how much CPU time
+each plugin took.  Unfortunately, generating this amount of data
+imposes significant overhead, so the run time of the plugins does not
+quite sum up to the amount of wall time the generation took.
+
+
+How do I create a sample data plugin?
+-------------------------------------
+
+In order to create a sample data plugin, you only have to register a
+named utility that implements the interface
+`schooltool.sampledata.interfaces.ISampleDataPlugin`.  This interface
+is very simple, it requires only the `name` attribute with the unique
+name of the plugin, the `dependencies` attribute with names of plugins
+this one depends on, and a `generate` method that generates its data
+given that the dependencies have already been satisfied.
+
+If your plugin depends on some objects, such as persons, groups,
+courses, timetable setup, you can find out the names of the
+appropriate plugins by looking at the source of the existing plugins
+in these modules::
+
+  schooltool.person.sampledata
+  schooltool.group.sampledata
+  schooltool.resource.sampledata
+  schooltool.course.sampledata
+  schooltool.level.sampledata
+  schooltool.timetable.sampledata
+
+
+Crude example
+-------------
+
+Let's say you want to create a plugin that adds a 'favorite_color' annotation
+to all persons, with randomly chosen values of 'red', 'green', or 'blue'.
+Obviously, your plugin depends on teachers and students already being in the
+database, so you will depend on plugins 'teachers' and 'students'.
+
+You need to define a plugin::
+
+  import random
+  import zope.interface
+  from zope.annotation.interfaces import IAnnotations
+  from schooltool.sampledata.interfaces import ISampleDataPlugin
+
+  class PersonColorPlugin(object):
+      zope.interface.implements(ISampleDataPlugin)
+      name = 'person_color'
+      dependencies = ('teachers', 'students')
+
+      def generate(self, app, seed=None):
+          rng = random.Random(seed)
+          for person in app['persons'].values():
+              color = rng.choice(['red', 'green', 'blue'])
+              IAnnotations(person)['favorite_color'] = color
+
+Now, you need to register it in your configure.zcml.  You need to
+conditionally include your registration of the sample data plugin for
+the developer mode::
+
+  <configure xmlns="http://namespaces.zope.org/zope">
+
+    <!-- ... -->
+
+    <configure
+        xmlns:zcml="http://namespaces.zope.org/zcml"
+        zcml:condition="have devmode">
+
+      <utility
+          factory=".PersonColorPlugin"
+          provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+          name="person_color"
+          />
+
+    </configure>
+
+  </configure>
+
+Voila!  Remove Data.fs, regenerate sample data, and all your teachers
+and students should know their colours!
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,81 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Views for the sample data generation
+
+$Id: browser.py 6384 2006-08-03 14:19:01Z pcardune $
+"""
+from zope.app import zapi
+from zope.publisher.browser import BrowserView
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.component import queryMultiAdapter
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.sampledata.generator import generate
+
+from interfaces import ISampleDataPlugin
+
+class SampleDataView(BrowserView):
+
+    seed = 'SchoolTool'
+    __used_for__ = ISchoolToolApplication
+
+    template = ViewPageTemplateFile("sampledata.pt")
+
+    work_done = property(lambda self: hasattr(self, 'times'))
+
+    def __call__(self):
+        self.update()
+        return self.template()
+
+    def update(self):
+        if 'seed' in self.request:
+            self.seed = self.request['seed']
+            if self.seed == '':
+                self.seed = None
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(
+                zapi.absoluteURL(self.context, self.request))
+        if 'SUBMIT' in self.request:
+            # TODO: maybe clear database here
+            self.times = generate(self.context, self.seed,
+                                  pluginNames=self._getSelectedPlugins())
+
+    def _getSelectedPlugins(self):
+        for key in self.request.keys():
+            if key.startswith('plugin'):
+                yield key.split('.')[1]
+
+    def getPlugins(self):
+        selectedPlugins = self._getSelectedPlugins()
+        times = generate(self.context, self.seed,
+                         dry_run=True, pluginNames=selectedPlugins)
+        plugins = [obj for name, obj in zapi.getUtilitiesFor(ISampleDataPlugin)]
+        result = []
+        if 'CLEAR' in self.request:
+            return plugins
+        for plugin in plugins:
+            data = {'name':plugin.name}
+            if plugin.name in times.keys():
+                data['selected'] = True
+                view = queryMultiAdapter((plugin, self.request),
+                                         name="options")
+                data['view'] = view
+            result.append(data)
+        return result


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="schooltool">
+
+  <browser:page
+      name="sampledata.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      class=".browser.SampleDataView"
+      permission="schooltool.edit"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/first_names.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/first_names.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/first_names.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,336 @@
+Ada
+Adam
+Adrian
+Agnieszka
+Ainhoa
+Al
+Alba
+Albert
+Alejandro
+Alex
+Alexander
+Alexis
+Alice
+Alva
+Alvaro
+Amber
+Amy
+Ana
+Andy
+Andrea
+Andrew
+Andrzej
+Ann
+Anna
+Anne
+Annie
+Anthony
+Anton
+Aoife
+Ashley
+Barbara
+Ben
+Bengie
+Benjamin
+Benjy
+Bert
+Bess
+Betty
+Bill
+Bob
+Bram
+Caitlin
+Callum
+Cameron
+Camila
+Camilla
+Carla
+Carlos
+Carolina
+Caroline
+Cath
+Catharine
+Catherine
+Cathy
+Cecilie
+Charles
+Charlie
+Charlotte
+Chloe
+Christian
+Christopher
+Chuck
+Cian
+Ciara
+Claudia
+Conor
+Cristian
+Cristina
+Daan
+Daniel
+Daniela
+Dave
+David
+Dick
+Diego
+Dylan
+Dorothy
+Drew
+Duncan
+Ed
+Edward
+Edwyn
+Eleanor
+Elena
+Elin
+Elizabeth
+Ellie
+Elzbieta
+Emil
+Emily
+Emma
+Erik
+Erin
+Ewa
+Fabian
+Femke
+Filip
+Florian
+Francisco
+Frederik
+Freja
+Gabbie
+Gabrielle
+Geoff
+Geoffery
+George
+Georgina
+Gill
+Gillian
+Godfrey
+Hank
+Hanna
+Hannah
+Harold
+Harry
+Helen
+Henry
+Herb
+Herbert
+Hiram
+Hugo
+Ida
+Ike
+Iris
+Isaac
+Isabel
+Isabelle
+Isak
+Ivan
+Izzy
+Jace
+Jack
+Jaclyn
+Jacob
+James
+Jamie
+Jan
+Jane
+Janet
+Javier
+Jean
+Jeanette
+Jeffery
+Jesse
+Jessica
+Jill
+Jim
+Jo
+Joanne
+Joe
+Joey
+John
+Johnny
+Jonas
+Jorge
+Jose
+Joseph
+Joshua
+Jozef
+Juan
+Juana
+Julia
+Julian
+Kay
+Kaylee
+Kayleigh
+Karen
+Karin
+Katarzyna
+Katharina
+Katie
+Kim
+Kimberly
+Kimmy
+Klara
+Krystyna
+Krzysztof
+Lara
+Lars
+Laura
+Lauren
+Lea
+Leah
+Lena
+Leon
+Leonie
+Lewis
+Liam
+Lincoln
+Linnea
+Lisa
+Liza
+Lizzy
+Lotte
+Louise
+Lu
+Luca
+Lucas
+Lucia
+Lucille
+Lucy
+Luis
+Lukas
+Luke
+Madison
+Mads
+Maggie
+Magnus
+Maja
+Malgorzata
+Manuel
+Marcin
+Marek
+Margaret
+Margarita
+Maria
+Marie
+Mario
+Mary
+Marta
+Martin
+Marty
+Mathias
+Mathilde
+Matt
+Matthew
+Max
+Maximilian
+Megan
+Michael
+Mick
+Mike
+Mikkel
+Milan
+Miriam
+Nate
+Nathan
+Nerea
+Nicholas
+Nick
+Nicky
+Nicolas
+Nigel
+Niklas
+Oliver
+Olivia
+Ollie
+Oscar
+Pablo
+Patricia
+Paul
+Paula
+Pawel
+Pedro
+Peg
+Peggy
+Pete
+Peter
+Phil
+Philip
+Philippa
+Piotr
+Pip
+Rachael
+Rachel
+Rasmus
+Raul
+Rich
+Richard
+Rick
+Ricky
+Ryan
+Rob
+Robert
+Rolla
+Rosa
+Ross
+Ruth
+Sally
+Sam
+Samantha
+Sammy
+Samuel
+Sanne
+Sara
+Sarah
+Scott
+Scottie
+Scotty
+Sean
+Sem
+Sergio
+Sharon
+Sherm
+Sherman
+Shermie
+Sid
+Simon
+Syd
+Sydney
+Sylvia
+Sofia
+Sophia
+Sophie
+Stanislaw
+Steph
+Stephanie
+Stephen
+Steve
+Steven
+Sue
+Susan
+Taylor
+Tara
+Ted
+Teddy
+Thelma
+Theodore
+Thomas
+Tim
+Tyler
+Tobias
+Tom
+Tomasz
+Tommy
+Tony
+Trevor
+Vanessa
+Victor
+Viktor
+Will
+William
+Willy
+Wilma
+Zoe
+Zofia


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/first_names.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,20 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:meta="http://namespaces.zope.org/meta"
+           i18n_domain="zope">
+
+  <meta:provides feature="devmode" />
+
+  <include package="schooltool.help" file="meta.zcml" />
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.attendance" />
+  <include package="schooltool.devmode" />
+
+  <!-- Provide local overrides of standard configurations-->
+  <includeOverrides package="schooltool.devmode" file="overrides.zcml" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/sampledata.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/sampledata.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/sampledata.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,59 @@
+Sample Data Generation
+======================
+
+A manager logs in.
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+He sees an entry for Sample Data Generation in the Developer Tools box and
+clicks on it
+
+    >>> print analyze.queryHTML("//div[@id='devtools']", manager.contents)[0]
+    <div id="devtools" style="display:none;">
+        <div class="body">
+          ...<a href="/@@sampledata.html">Sample data</a>...
+        </div>
+      </div>
+
+    >>> manager.getLink('Sample data').click()
+
+The Sample Data Generation page appears
+
+    >>> print analyze.queryHTML("//title", manager.contents)[0]
+    <title> Sample Data Generation </title>
+
+    >>> print analyze.queryHTML("//h1", manager.contents)[0]
+    <h1>Sample Data Generation</h1>
+
+    >>> print analyze.queryHTML("//form", manager.contents)[0]
+    <form method="POST" class="standalone" action="http://localhost/@@sampledata.html">
+    ...<input name="seed" value="SchoolTool">...
+    ...<input type="submit" class="button-ok" name="SUBMIT" value="Generate">...
+    </form>
+
+Let's do it, thinks our valiant manager, and pushes the button.
+
+  Since the full data set requires HUGE amounts of RAM (on the order of 700 megs)
+  and time, we will cheat and ask the attendance sample data plugin to 
+  only generate data for 2 weeks.
+
+    >>> from zope.component import queryUtility
+    >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+    >>> plugin = queryUtility(ISampleDataPlugin, 'attendance')
+    >>> if plugin is not None:
+    ...     plugin.only_last_n_days = 14
+
+    >>> manager.getControl('Generate').click()
+
+Several minutes later he gets a result
+
+    >>> print manager.contents
+    <BLANKLINE>
+    ...<title> Sample Data Generation </title>...
+    ...<h1>Sample Data Generation</h1>...
+    ...<p>Sample data generated...
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/sampledata.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,44 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.sampledata.
+
+$Id: test_all.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+import os
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+sampledata_functional_layer = ZCMLLayer(filename,
+                                        __name__,
+                                        'sampledata_functional_layer')
+
+def test_suite():
+    return collect_ftests(layer=sampledata_functional_layer,
+                          level=2) # 'cause it is slow and a memory hog
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/generator.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/generator.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/generator.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,110 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool pluggable sample data generator
+
+In order to be able to test SchoolTool with data sets comparable in
+size to those used in real life routinely, we have this sample data
+generation system.  Sample data is created by a variety of plugins
+that can state their dependencies on other plugins explicitly.
+Extension writers can provide plugins for sample data for their
+extensions, building upon the data constructed by the plugins provided
+with schooltool.  Dependencies must be acyclic.
+
+Sample data generation plugins are named local utilities with an
+interface schooltool.sampledata.interfaces.ISampleDataGeneratorPlugin.
+
+$Id: generator.py 6470 2006-11-08 16:44:06Z ignas $
+"""
+import time
+
+import transaction
+from zope.app import zapi
+
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.sampledata.interfaces import CyclicDependencyError
+
+
+def generate(app, seed=None, dry_run=False, pluginNames=[]):
+    """Generate sample data provided by all plugins.
+
+    Runs the generate functions of all plugins in an order such that
+    the dependencies are all generated before the dependents.
+
+    In essence, this function performs a topological sort in a
+    directed acyclic graph.
+
+    Raises a CyclicDependencyError if the dependency graph has a cycle.
+
+    Returns a dict with names of plugins run as keys and CPU times as
+    values.
+    """
+
+    plugins = dict([(obj.name, obj) for name, obj in
+                    zapi.getUtilitiesFor(ISampleDataPlugin)])
+
+
+    # status is a dict plugin names as keys and statuses as values.
+    # Statuses can be as follows:
+    #
+    #   new    -- not yet visited
+    #   closed -- already processed
+    #   open   -- being processed
+    #
+    # Stumbling over an 'open' node means there is a cyclic dependency
+
+    new = 'new'
+    open = 'open'
+    closed = 'closed'
+    status = dict([(name, new) for name in plugins])
+
+    # dict with used CPU cycles for each plugin
+    times = {}
+
+    def visit(name):
+        """The recursive part of the topological sort
+
+        Raises a CyclicDependencyError if cyclic depencencies are found.
+        """
+        if status[name] == new:
+            status[name] = open
+            plugin = plugins[name]
+            for dep in plugin.dependencies:
+                visit(dep)
+            start = time.clock()
+            if not dry_run:
+                plugin.generate(app, seed)
+                # Some plugins can generate a lot of data, so we are
+                # using savepoints to save on memory consuption.
+                transaction.savepoint(optimistic=True)
+
+            times[name] = time.clock() - start
+            status[name] = closed
+
+        elif status[name] == closed:
+            return
+
+        elif status[name] == open:
+            raise CyclicDependencyError("cyclic dependency at '%s'" % name)
+
+
+    for name in pluginNames:
+        visit(name)
+
+    return times


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/generator.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,55 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool sample data generator interfaces
+
+$Id: interfaces.py 5231 2005-10-12 19:45:06Z alga $
+"""
+import zope.interface
+import zope.schema
+
+
+class ISampleDataPlugin(zope.interface.Interface):
+    """A plugin that generates some sample data.
+
+    These plugins may depend on other sample data plugins.  Say,
+    calendar event generators depend on person generators.  All
+    plugins have unique names and other plugins reference their
+    dependencies by these names.
+    """
+
+    name = zope.schema.Id(title=u"Sample data generator name")
+
+    dependencies = zope.schema.List(
+        title=u"A list of dependenies",
+        value_type=zope.schema.Id(title=u"Sample data generator name"),
+        description=u"""
+        A list of names of sample data generators this one depends on.
+        """)
+
+    def generate(app, seed=None):
+        """Generate sample data of this plugin.
+
+        This method assumes the sample data this plugin depends on has
+        been created.
+        """
+
+
+class CyclicDependencyError(ValueError):
+    """Cyclic dependency of sample data plugins"""


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/last_names.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/last_names.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/last_names.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,379 @@
+Adams
+Alexander
+Allen
+Alvarez
+Andersen
+Anderson
+Andrews
+Armstrong
+Arnold
+Austin
+Bailey
+Baker
+Banks
+Barker
+Barnes
+Barnett
+Barrett
+Bates
+Beck
+Becker
+Bell
+Bennett
+Berry
+Bishop
+Byrd
+Byrne
+Black
+Boyd
+Bowman
+Bradley
+Brewer
+Bryant
+Brooks
+Brown
+Burke
+Burns
+Burton
+Bush
+Butler
+Caldwell
+Campbell
+Carlson
+Carpenter
+Carr
+Carroll
+Carter
+Castillo
+Castro
+Chambers
+Chapman
+Chavez
+Christensen
+Christiansen
+Claes
+Clark
+Cohen
+Cole
+Coleman
+Collins
+Cook
+Cooper
+Cox
+Craig
+Crawford
+Cruz
+Cunningham
+Curry
+Curtis
+Day
+Daniels
+Davidson
+Davies
+Davis
+Dawson
+Dean
+De la Cruz
+De los Reyes
+De los Santos
+Diaz
+Dixon
+Doyle
+Douglas
+Dubois
+Dumont
+Duncan
+Dunn
+Dupont
+Edwards
+Elliott
+Ellis
+Evans
+Ferguson
+Fernandez
+Fields
+Fischer
+Fisher
+Fleming
+Fletcher
+Flores
+Ford
+Foster
+Fowler
+Fox
+Franklin
+Frazier
+Freeman
+Fuller
+Gallagher
+Garcia
+Gardner
+Garrett
+Garza
+George
+Gibson
+Gilbert
+Gomez
+Gonzales
+Gonzalez
+Goossens
+Gordon
+Graham
+Gray
+Grant
+Graves
+Green
+Greene
+Gregory
+Griffin
+Gutierrez
+Hayes
+Haynes
+Hale
+Hall
+Hamilton
+Hansen
+Hanson
+Hardy
+Harper
+Harris
+Harrison
+Hart
+Harvey
+Hawkins
+Henderson
+Henry
+Hernandez
+Herrera
+Hicks
+Hill
+Hoffman
+Hoffmann
+Holland
+Holmes
+Holt
+Hopkins
+Horton
+Howard
+Howell
+Hudson
+Hughes
+Hunt
+Hunter
+Young
+Jackson
+Jacobs
+James
+Janssens
+Jenkins
+Jennings
+Jensen
+Jimenez
+Johansen
+Johnson
+Johnston
+Jones
+Jordan
+Jorgensen
+Kelley
+Kelly
+Kennedy
+Kim
+King
+Knight
+Knudsen
+Kristensen
+Lambert
+Lane
+Larsen
+Larson
+Laurent
+Lawrence
+Lawson
+Leclercq
+Lee
+Lejeune
+Levi
+Lewis
+Lim
+Little
+Lynch
+Long
+Lopez
+Love
+Lowe
+Lucas
+Madsen
+Maes
+May
+Marshall
+Martin
+Martinez
+Mason
+Matthews
+McCarthy
+Mccoy
+Mcdaniel
+Mcdonald
+Mckinney
+Medina
+Meyer
+Mendez
+Mendoza
+Mercado
+Mertens
+Miles
+Miller
+Mills
+Mitchell
+Myers
+Montgomery
+Moore
+Morales
+Moreno
+Morgan
+Morris
+Morrison
+Mortensen
+Mueller
+Murphy
+Murray
+Neal
+Nelson
+Newman
+Nguyen
+Nichols
+Nielsen
+Norris
+O'Brien
+Obrien
+O'Connor
+O'Doherty
+Oliver
+Olsen
+Olson
+O'Neill
+O'Reilly
+Ortiz
+O'Sullivan
+Owens
+Payne
+Palmer
+Parker
+Parks
+Patterson
+Pearson
+Pedersen
+Peeters
+Pena
+Perez
+Perkins
+Perry
+Peters
+Petersen
+Peterson
+Phillips
+Pierce
+Porter
+Poulsen
+Powell
+Powers
+Price
+Quinn
+Ray
+Ramirez
+Ramos
+Rasmussen
+Reed
+Reid
+Reyes
+Reynolds
+Renard
+Rhodes
+Rice
+Richards
+Richardson
+Riley
+Rivera
+Ryan
+Roberts
+Robertson
+Robinson
+Rodriguez
+Rodriquez
+Rogers
+Romero
+Rose
+Ross
+Ruiz
+Russell
+Sanchez
+Sanders
+Santiago
+Santos
+Schmidt
+Schneider
+Schultz
+Schulz
+Scott
+Shaw
+Shelton
+Silva
+Simmons
+Simon
+Simpson
+Sims
+Smith
+Snyder
+Soerensen
+Soto
+Spencer
+Stanley
+Steele
+Stephens
+Stevens
+Stewart
+Stone
+Sullivan
+Sutton
+Taylor
+Tan
+Terry
+Thomas
+Thompson
+Thomsen
+Torres
+Tucker
+Turner
+Vargas
+Vasquez
+Vaughn
+Wade
+Wagner
+Walker
+Wallace
+Walsh
+Walters
+Ward
+Warren
+Washington
+Watkins
+Watson
+Watts
+Weaver
+Webb
+Weber
+Welch
+Wells
+West
+Wheeler
+White
+Willems
+Williams
+Williamson
+Willis
+Wilson
+Wood
+Woods
+Wouters
+Wright


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/last_names.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/name.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/name.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/name.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,58 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool person name generator
+
+$Id: name.py 6120 2006-05-26 15:24:43Z faassen $
+"""
+import os.path
+import random
+
+
+class NameGenerator(object):
+    """Person name generator
+
+    Generates random full names.  Names can recur.
+    """
+
+    def __init__(self, seed):
+        self.random = random.Random()
+        self.random.seed(seed)
+        self.first_names = self._readLines('first_names.txt')
+        self.last_names = self._readLines('last_names.txt')
+
+    def _readLines(self, filename):
+        """Read in lines from file
+
+        Filename is relative to the module.
+        Returned lines are stripped.
+        """
+        fullpath = os.path.join(os.path.dirname(__file__), filename)
+        lines = file(fullpath).readlines()
+        return [line.strip() for line in lines]
+
+    def generate(self):
+        """Generates name information, returns tuple of
+        first name, last name, full name
+        """
+        first_name = self.random.choice(self.first_names)
+        last_name = self.random.choice(self.last_names)
+        full_name = "%s %s" % (first_name, last_name)
+        return first_name, last_name, full_name
+    


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/name.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/sampledata.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/sampledata.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/sampledata.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,102 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Sample Data Generation
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    i18n:translate="">Sample Data Generation</h1>
+
+<metal:block metal:fill-slot="body">
+<tal:block condition="not: view/work_done">
+<p i18n:translate="" class="error">
+Warning: proceeding will populate
+the database with randomly generated data.  Do not do this if you have
+any valuable data in your SchoolTool instance.
+</p>
+
+<p i18n:translate="">
+Setting a random seed allows you to to reproduce
+the same set of sample data by generating it again with the same value
+of the random seed.
+</p>
+
+<form tal:attributes="action request/URL" method="POST"
+      class="standalone">
+  <div class="row">
+    <div class="label">
+       <label>Random seed</label>
+    </div>
+    <div class="field">
+       <input name="seed" tal:attributes="value view/seed"/>
+    </div>
+  </div>
+  <fieldset>
+    <legend i18n:translate="">Plugins</legend>
+    <div class="item_list">
+    <div tal:repeat="plugin view/getPlugins">
+      <label tal:condition="python: not plugin.get('selected') 
+                                 or not plugin.get('view')">
+        <input tal:attributes="name string:plugin.${plugin/name};"
+               tal:condition="not: plugin/selected|nothing"
+               type="checkbox" />
+          <input tal:attributes="name string:plugin.${plugin/name};"
+                 tal:condition="plugin/selected|nothing"
+                 checked="yes"
+                 type="checkbox" />
+        <span tal:replace="plugin/name" />
+      </label>
+      <fieldset tal:condition="python: plugin.get('selected')
+                                   and plugin.get('view')">
+        <legend>
+          <label>
+          <input tal:attributes="name string:plugin.${plugin/name};"
+                 tal:condition="plugin/selected|nothing"
+                 checked="yes"
+                 type="checkbox" />
+          <span tal:replace="plugin/name" />
+          </label>
+        </legend>
+          <div tal:replace="structure python:plugin.get('view')()"/>
+      </fieldset>
+    </div>
+    <div class="controls">
+      <input type="submit" class="button-ok" name="DEPENDENCIES"
+             value="View Dependencies"
+             i18n:attributes="value" />
+      <input type="submit" class="button-ok" name="CLEAR"
+             value="Clear"
+             i18n:attributes="value" />
+    </div>
+  </fieldset>
+  <div class="controls">
+    <input type="submit" class="button-ok" name="SUBMIT"
+           value="Generate" i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value cancel-button" />
+  </div>
+</form>
+</tal:block>
+
+<tal:block condition="view/work_done">
+
+<p>Sample data generated.  Below is the list of plugins executed along
+with the CPU time it took to run them</p>
+
+<table>
+  <tr>
+    <th>Plugin Name</th>
+    <th>CPU time used (seconds)</th>
+  </tr>
+  <tr tal:repeat="name view/times">
+    <td tal:content="name"></td>
+    <td tal:content="python: view.times[name]"></td>
+  </tr>
+</table>
+</tal:block>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/sampledata.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,256 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.sampledata.generator
+
+$Id: test_browser.py 6383 2006-07-31 15:55:31Z pcardune $
+"""
+
+
+import unittest
+from pprint import pprint
+
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+from zope.publisher.browser import TestRequest
+from schooltool.testing.setup import setUpSchoolToolSite
+from schooltool.testing.setup import setUpApplicationPreferences
+import schooltool.app.browser.testing
+
+def setUp(test):
+    setup.placefulSetUp()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def doctest_SampleDataView_update():
+    """Tests for SampleDataView.update method
+
+        >>> app = setUpSchoolToolSite()
+
+    When seed is not provided in the request, the seed is set to
+    'SchoolTool', so that sample data is reproducible:
+
+        >>> from schooltool.sampledata.browser import SampleDataView
+        >>> request = TestRequest()
+        >>> view = SampleDataView(app, request)
+        >>> view.update()
+        >>> view.seed
+        'SchoolTool'
+
+    Otherwise update picks up the seed value:
+
+        >>> request = TestRequest(form={'seed': 'random-data-123'})
+        >>> view = SampleDataView(app, request)
+        >>> view.update()
+        >>> view.seed
+        'random-data-123'
+
+    If the seed is an empty string, the seed value is None, so that
+    the random number generators initialize from current time.
+
+        >>> request = TestRequest(form={'seed': ''})
+        >>> view = SampleDataView(app, request)
+        >>> view.update()
+        >>> view.seed
+
+    Now, let's set up some stub sample data plugins.
+
+        >>> from schooltool.sampledata.tests.test_generator import DummyPlugin
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> p1 = DummyPlugin("work", ())
+        >>> p2 = DummyPlugin("play", ("work", ))
+        >>> ztapi.provideUtility(ISampleDataPlugin, p1, 'work')
+        >>> ztapi.provideUtility(ISampleDataPlugin, p2, 'play')
+
+    If we fill in the seed and press the submit button, we get sample
+    data plugins called.
+
+        >>> DummyPlugin.log = []
+        >>> request = TestRequest(form={'seed': 'data', 'SUBMIT': 'Generate',
+        ...                             'plugin.work': 'checked',
+        ...                             'plugin.play': 'checked'})
+        >>> view = SampleDataView(app, request)
+        >>> view.update()
+        >>> pprint(DummyPlugin.log)
+        [('work',
+          <schooltool.app.app.SchoolToolApplication object at ...>,
+          'data'),
+         ('play',
+          <schooltool.app.app.SchoolToolApplication object at ...>,
+          'data')]
+
+    When the work is done the times attribute is set on the view:
+
+        >>> sorted(view.times)
+        ['play', 'work']
+        >>> for item, time in view.times.items():
+        ...     assert time < 0.1   # 100 ms ought to be enough to do nothing
+        >>> view.work_done
+        True
+
+    If we press the cancel button, we also get redirected to the main page:
+
+        >>> request = TestRequest(form={'seed': 'data', 'CANCEL': 'Cancel'})
+        >>> view = SampleDataView(app, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1'
+
+    Clean up:
+
+        >>> DummyPlugin.log = []
+    """
+
+def doctest_SampleDataView__call__():
+    """Tests for SampleDataView rendering
+
+    We'll need a massive browser views setup here.
+
+        >>> schooltool.app.browser.testing.setUp()
+        >>> setUpApplicationPreferences()
+
+    Let's set up some plugins so they are called:
+
+        >>> from schooltool.sampledata.tests.test_generator import DummyPlugin
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> p1 = DummyPlugin("work", ())
+        >>> p2 = DummyPlugin("play", ("work", ))
+        >>> ztapi.provideUtility(ISampleDataPlugin, p1, 'work')
+        >>> ztapi.provideUtility(ISampleDataPlugin, p2, 'play')
+
+    Let's create an application object and a view:
+
+        >>> from schooltool.sampledata.browser import SampleDataView
+        >>> app = setUpSchoolToolSite()
+        >>> request = TestRequest(form={'seed': 'test'})
+        >>> view = SampleDataView(app, request)
+
+    Let's render the view.  The default value of the seed is displayed there.
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <h1>Sample Data Generation</h1>
+        ...
+        <form method="POST" class="standalone"
+              action="http://127.0.0.1">
+          <div class="row">
+            <div class="label">
+               <label>Random seed</label>
+            </div>
+            <div class="field">
+               <input name="seed" value="test" />
+            </div>
+          </div>
+          <fieldset>
+            <legend>Plugins</legend>
+            <div class="item_list">
+            <div>
+              <label>
+                <input type="checkbox" name="plugin.play" />
+                play
+              </label>
+            </div>
+            <div>
+              <label>
+                <input type="checkbox" name="plugin.work" />
+                work
+              </label>
+            </div>
+            <div class="controls">
+              <input type="submit" class="button-ok"
+                     name="DEPENDENCIES" value="View Dependencies" />
+              <input type="submit" class="button-ok" name="CLEAR"
+                     value="Clear" />
+            </div>
+          </div></fieldset>
+          <div class="controls">
+            <input type="submit" class="button-ok" name="SUBMIT"
+                   value="Generate" />
+            <input type="submit" class="button-cancel" name="CANCEL"
+                   value="Cancel" />
+          </div>
+        </form>
+        ...
+
+    Let's render the view.  The default value of the seed is displayed there.
+
+        >>> request = TestRequest(form={'seed': 'test', 'SUBMIT': 'Generate',
+        ...                             'plugin.work': 'checked',
+        ...                             'plugin.play': 'checked'})
+        >>> view = SampleDataView(app, request)
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <p>Sample data generated.  Below is the list of plugins executed along
+        with the CPU time it took to run them</p>
+        <BLANKLINE>
+        <table>
+          <tr>
+            <th>Plugin Name</th>
+            <th>CPU time used (seconds)</th>
+          </tr>
+          <tr>
+            <td>play</td>
+            <td>...</td>
+          </tr>
+          <tr>
+            <td>work</td>
+            <td>...</td>
+          </tr>
+        </table>
+        ...
+    """
+
+def doctest_SampleDataView_work_done():
+    """Tests for SampleDataView.work_done propery.
+
+        >>> from schooltool.sampledata.browser import SampleDataView
+        >>> request = TestRequest()
+        >>> view = SampleDataView(object(), request)
+
+    Before any processing is done, work_done is False:
+
+        >>> view.work_done
+        False
+
+    When the update sets the times attribute, it becomes True:
+
+        >>> view.times = {}
+        >>> view.work_done
+        True
+
+    """
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp,
+                             tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS
+                             |doctest.NORMALIZE_WHITESPACE
+                             |doctest.REPORT_NDIFF),
+        ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_generator.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_generator.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_generator.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,134 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.sampledata.generator
+
+$Id: test_generator.py 6383 2006-07-31 15:55:31Z pcardune $
+"""
+
+import unittest
+
+from zope.testing import doctest
+from zope.interface import implements
+from zope.app.testing import setup, ztapi
+
+from schooltool.sampledata.interfaces  import ISampleDataPlugin
+
+
+class DummyPlugin:
+    """A dummy sample data plugin that logs the args to a class attribute"""
+    implements(ISampleDataPlugin)
+
+    log = []  # one for all
+
+    def __init__(self, name, deps=()):
+        self.name = name
+        self.dependencies = deps
+
+    def generate(self, app, seed=None):
+        self.log.append((self.name, app, seed))
+
+
+def doctest_generate():
+    """Unit test for schooltool.sampledata.generator.generate
+
+    This function finds all the utilities registered with the sample
+    data plugin interface and runs the generate methods of them.
+
+    First, let's register several plugins:
+
+        >>> p1 = DummyPlugin("p1", ())
+        >>> p2 = DummyPlugin("p2", ())
+        >>> p3 = DummyPlugin("p3", ())
+        >>> ztapi.provideUtility(ISampleDataPlugin, p1, 'p1')
+        >>> ztapi.provideUtility(ISampleDataPlugin, p2, 'p2')
+        >>> ztapi.provideUtility(ISampleDataPlugin, p3, 'p3')
+
+    Now, let's run the generator:
+
+        >>> DummyPlugin.log = []
+        >>> import schooltool.sampledata.generator
+
+        >>> app = 'app'
+        >>> result = schooltool.sampledata.generator.generate(app,
+        ...                 pluginNames=['p1','p2','p3'])
+
+    The order of the plugins is undefined, so let's sort to see if
+    they're all there.
+
+        >>> DummyPlugin.log.sort()
+        >>> DummyPlugin.log
+        [('p1', 'app', None), ('p2', 'app', None), ('p3', 'app', None)]
+
+    The result returned by this function is a dict of plugin names as
+    keys and CPU times consumed as values:
+
+        >>> sorted(result.keys())
+        ['p1', 'p2', 'p3']
+        >>> for v in result.values():
+        ...     v < 0.1
+        True
+        True
+        True
+
+    Let's make p1 and p2 depend on p3:
+
+        >>> p1.dependencies = 'p3',
+        >>> p2.dependencies = 'p3',
+
+    Now p3 must be the first plugin run:
+
+        >>> DummyPlugin.log = []
+        >>> result = schooltool.sampledata.generator.generate(app,
+        ...                 pluginNames=['p1','p2','p3'])
+        >>> DummyPlugin.log[0]
+        ('p3', 'app', None)
+
+    If we add a dependency on p2 to p1, the order becomes defined:
+
+        >>> p1.dependencies = 'p2',
+        >>> DummyPlugin.log = []
+        >>> result = schooltool.sampledata.generator.generate(app,
+        ...                 pluginNames=['p1','p2','p3'])
+        >>> DummyPlugin.log
+        [('p3', 'app', None), ('p2', 'app', None), ('p1', 'app', None)]
+
+    If we add an extra dependency and close the cycle, we get an error:
+
+        >>> p3.dependencies = 'p1',
+        >>> DummyPlugin.log = []
+        >>> result = schooltool.sampledata.generator.generate(app,
+        ...                 pluginNames=['p1','p2','p3'])
+        Traceback (most recent call last):
+          ...
+        CyclicDependencyError: cyclic dependency at ...
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setup.placelessSetUp,
+                             tearDown=setup.placelessTearDown,
+                             optionflags=doctest.ELLIPSIS
+                             |doctest.NORMALIZE_WHITESPACE),
+        ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_generator.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_name.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_name.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_name.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,97 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.sampledata.name
+
+$Id: test_name.py 6120 2006-05-26 15:24:43Z faassen $
+"""
+
+import unittest
+from zope.testing import doctest
+
+
+def doctest_NameGenerator():
+    """Person name generator
+
+    First, let's instantiate the generator, passing the random seed as
+    a parameter:
+
+        >>> from schooltool.sampledata.name import NameGenerator
+        >>> gen = NameGenerator(42)
+
+    It's got its own random generator seeded with the seed passed:
+
+        >>> other = NameGenerator(42)
+        >>> gen.random.random() == other.random.random()
+        True
+
+        >>> gen = NameGenerator(42)
+        >>> other = NameGenerator(43)
+        >>> gen.random.random() != other.random.random()
+        True
+
+    It's got lists of first names and last names:
+
+        >>> import repr
+        >>> print repr.repr(gen.first_names)
+        ['Ada', 'Adam', 'Adrian', 'Agnieszka', 'Ainhoa', 'Al', ...]
+        >>> print repr.repr(gen.last_names)
+        ['Adams', 'Alexander', 'Allen', 'Alvarez', 'Andersen', 'Anderson', ...]
+
+    Now, we can ask for a name:
+
+        >>> gen.random.seed(42)
+        >>> gen.generate()
+        ('Margarita', 'Austin', 'Margarita Austin')
+        >>> gen.generate()
+        ('Erin', 'Duncan', 'Erin Duncan')
+
+    The names can and will repeat:
+
+        >>> seen = set()
+        >>> count = 0
+        >>> while True:
+        ...     count +=1
+        ...     first_name, last_name, name = gen.generate()
+        ...     if name in seen:
+        ...         break
+        ...     else:
+        ...         seen.add(name)
+
+        >>> print count, name
+        334 Joanne Snyder
+
+    We'll have approximately this many matching pairs of names in the school:
+
+        >>> seen = set()
+        >>> for i in range(1000):
+        ...     seen.add(gen.generate()[2])
+        >>> 1000 - len(seen)
+        3
+
+    """
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(optionflags=doctest.ELLIPSIS
+                             |doctest.NORMALIZE_WHITESPACE),
+        ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sampledata/tests/test_name.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,27 @@
+SchoolBell
+==========
+
+SchoolBell is a calendaring server that speaks WebDAV and has a traditional
+browser application.  It is built on top of Zope 3 and uses the SchoolBell
+calendaring library for Zope 3.
+
+Installation
+------------
+
+This is an early development version of SchoolBell.  To get it running
+
+1. Check out schooltool from source.schooltool.org
+2. Go into the Zope 3 subdirectory
+3. Copy sample_principals.zcml to principals.zcml
+4. Copy zope.conf.in to zope.conf and add
+
+      path ../src
+
+5. Create a file named schoolbell-configure.zcml in package-includes/ with the
+   following content:
+
+      <include package="schooltool.sbapp" />
+
+6. Start z3.py
+7. Go to http://localhost:8080/@@manage, log in as 'gandalf' with
+   password '123', add a SchoolBell instance from the menu on the left.


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,29 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+The SchoolBell application.
+
+SchoolBell is a calendaring server built on Zope 3.
+
+TODO: feature list
+
+TODO: mention that schoolbell libraries are reusable for all Zope 3 apps.
+"""
+
+VERSION="SVN"


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,42 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Browser views for the SchoolBell application.
+
+$Id: __init__.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+from zope.publisher.browser import BrowserView
+from schooltool.app.app import getSchoolToolApplication
+
+class NavigationView(BrowserView):
+    """View for the navigation portlet.
+
+    A separate view lets us vary the content of the navigation portlet
+    according to the currently logged in user and/or context.  Currently
+    we do not make use of this flexibility, though.
+
+    This view finds the schoolbell application from context and makes it
+    available to the page template as view/app.  Rendering this view on
+    an object that is not a part of a SchoolBell instance will raise an error,
+    so don't do that.
+    """
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+        self.app = getSchoolToolApplication()


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/cal.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/cal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/cal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,82 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolBell calendar views.
+
+$Id: cal.py 6078 2006-05-18 17:39:46Z mg $
+"""
+
+from datetime import datetime, time, timedelta
+from pytz import utc
+
+from zope.publisher.browser import BrowserView
+from zope.security.proxy import removeSecurityProxy
+from zope.security.checker import canAccess
+
+from schooltool.app.browser import ViewPreferences
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.person.interfaces import IPerson
+
+
+class DailyCalendarRowsView(BrowserView):
+    """Daily calendar rows view."""
+
+    def calendarRows(self, cursor, starthour, endhour):
+        """Iterate over (title, start, duration) of time slots that make up
+        the daily calendar.
+
+        Returns a generator.
+        """
+        today = datetime.combine(cursor, time(tzinfo=utc))
+        row_ends = [today + timedelta(hours=hour + 1)
+                    for hour in range(starthour, endhour)]
+
+        start = today + timedelta(hours=starthour)
+        for end in row_ends:
+            duration = end - start
+            yield (self.rowTitle(start.hour, start.minute), start, duration)
+            start = end
+
+    def rowTitle(self, hour, minute):
+        """Return the row title as HH:MM or H:MM am/pm."""
+        prefs = ViewPreferences(self.request)
+        return time(hour, minute).strftime(prefs.timeformat)
+
+
+class CalendarListView(BrowserView):
+    """A simple view that can tell which calendars should be displayed."""
+
+    __used_for__ = ISchoolToolCalendar
+
+    def getCalendars(self):
+        """Get a list of calendars to display.
+
+        Yields tuples (calendar, color1, color2).
+        """
+        yield (self.context, '#9db8d2', '#7590ae')
+        user = IPerson(self.request.principal, None)
+        if user is None:
+            return
+
+        unproxied_context = removeSecurityProxy(self.context)
+        unproxied_calendar = removeSecurityProxy(ISchoolToolCalendar(user))
+        if unproxied_context is unproxied_calendar:
+            for item in user.overlaid_calendars:
+                if item.show and canAccess(item.calendar, '__iter__'):
+                    yield (item.calendar, item.color1, item.color2)


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/cal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,102 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+
+  <!-- Views for the application -->
+
+  <page
+      name="index.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      class="schooltool.app.browser.app.ApplicationView"
+      template="templates/index.pt"
+      permission="zope.Public"
+      layer="schooltool.sbapp.browser.skin.ISchoolBellLayer"
+      />
+
+<!-- Views for everything -->
+
+
+<!-- Calendar views -->
+
+  <page
+      for="*"
+      name="calendar_overlay"
+      layer=".skin.ISchoolBellLayer"
+      class="schooltool.app.browser.overlay.CalendarOverlayView"
+      template="templates/calendar_overlay.pt"
+      permission="schooltool.view"
+      />
+
+  <page
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      name="calendar_list"
+      layer=".skin.ISchoolBellLayer"
+      class=".cal.CalendarListView"
+      permission="schooltool.view"
+      />
+
+  <page
+      for="schooltool.app.interfaces.ISchoolToolCalendar"
+      name="daily_calendar_rows"
+      layer=".skin.ISchoolBellLayer"
+      class=".cal.DailyCalendarRowsView"
+      permission="schooltool.view"
+      />
+
+<!-- Skin and resources -->
+
+  <zope:subscriber
+      handler=".skin.schoolBellTraverseSubscriber"
+      for="zope.app.publication.interfaces.IBeforeTraverseEvent"
+      />
+
+  <zope:interface
+      interface="schooltool.sbapp.browser.skin.ISchoolBellSkin"
+      type="zope.publisher.interfaces.browser.IBrowserSkinType"
+      name="SchoolBell"
+      />
+
+  <page
+      name="generic_macros"
+      for="*"
+      permission="zope.View"
+      template="templates/generic_macros.pt"
+      layer=".skin.ISchoolBellLayer"
+      />
+
+  <resource
+      name="logo.png"
+      file="resources/schoolbell.png"
+      layer=".skin.ISchoolBellLayer"
+      />
+
+<!-- Navigation -->
+
+  <!-- XXX: Necessary for now, but we might find a macro way of doing this. -->
+  <page
+      for="*"
+      name="schooltool_navigation"
+      layer=".skin.ISchoolBellLayer"
+      template="templates/navigation.pt"
+      class=".NavigationView"
+      permission="zope.View"
+      />
+
+  <!-- XXX: Needs to be here until we switch to viewlet system or -->
+  <!--      write a macro -->
+   <!--
+  <page
+      name="index.html"
+      for="schooltool.person.interfaces.IPerson"
+      class="schooltool.person.browser.person.PersonView"
+      template="templates/person.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="View"
+      layer=".skin.ISchoolBellLayer"
+      />
+  -->
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/csvimport.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/csvimport.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/csvimport.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,25 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Classes for csv importing.
+
+$Id: csvimport.py 4814 2005-08-18 19:37:17Z srichter $
+"""
+
+# XXX: person stuff might come here.


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/csvimport.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/app.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/app.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/app.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1024 @@
+Functional doctest for schooltool.sbapp
+=======================================
+
+This is a functional doctest for schooltool.sbapp.  To find out more about
+functional doctests, read Zope3/src/zope/app/ftests/doctest.txt
+
+
+SchoolBell as a Zope 3 content object
+-------------------------------------
+
+First, we'll go to the Zope 3 management interface and verify that you can add
+SchoolBell instances from the add menu.
+
+    >>> print http(r"""
+    ... GET /@@contents.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <h4>Add:</h4>
+    ...
+    <a href="http://localhost/@@contents.html?type_name=BrowserAdd__schooltool.app.app.SchoolToolApplication"
+       class="">SchoolBell</a>
+    ...
+
+Let's add one!
+
+    >>> print http(r"""
+    ... POST /@@contents.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... type_name=BrowserAdd__schooltool.app.app.SchoolToolApplication&new_value=frogpond""")
+    HTTP/1.1 303 See Other
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    Location: http://localhost/@@contents.html
+    ...
+
+Ok, it is there:
+
+    >>> print http(r"""
+    ... GET /@@contents.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+              <tr class="...">
+                <td>
+                  <input type="checkbox" class="noborder"
+                         name="ids:list" id="frogpond"
+                         value="frogpond" />
+                </td>
+                <td><a href="frogpond/@@SelectedManagementView.html"><img src="http://localhost/@@/schoolbell-app-interfaces-ISchoolToolApplication-zmi_icon.png" alt="SchoolToolApplication" width="16" height="16" border="0" /></a><span>
+                      <a href="frogpond/@@SelectedManagementView.html">frogpond</a><a
+        href="http://localhost/@@contents.html?rename_ids:list=frogpond">&nbsp;&nbsp;</a></span></td>
+                <td>
+    ...
+
+How does it look inside?
+
+    >>> print http(r"""
+    ... GET /frogpond/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    ...
+    <h1>Welcome to SchoolBell</h1>
+    ...
+
+We can traverse to the person index
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <h1>Person index</h1>
+    ...
+
+We can traverse to the group index too
+
+    >>> print http(r"""
+    ... GET /frogpond/groups/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <h1>Group index</h1>
+    ...
+
+We can traverse to the resource index too
+
+    >>> print http(r"""
+    ... GET /frogpond/resources/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <h1>Resource index</h1>
+    ...
+
+
+Persons
+-------
+
+When you are logged in as a manager, you can see the "new person" action in the
+person index:
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <a href="@@add.html">New Person</a>
+    ...
+
+We can click on it and get a form:
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/add.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+         <form class="standalone" method="post"
+               enctype="multipart/form-data"
+               action="http://localhost/frogpond/persons/add.html">
+    ...<input class="textType" id="field.title" name="field.title" size="20" type="text" value=""  />...
+    ...<input class="textType" id="field.username" name="field.username" size="20" type="text" value=""  />...
+    ...<input class="passwordType" id="field.password" name="field.password" size="20" type="password" value=""  />...
+    ...<input class="passwordType" id="field.verify_password" name="field.verify_password" size="20" type="password" value=""  />...
+    ...<input class="fileType" id="field.photo" name="field.photo" size="20" type="file"  />...
+      </form>
+    ...
+
+After submitting the form:
+
+    >>> print http(r"""
+    ... POST /frogpond/persons/add.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 1318
+    ... Content-Type: multipart/form-data; boundary=---------------------------705046721187019535891597004
+    ...
+    ... -----------------------------705046721187019535891597004
+    ... Content-Disposition: form-data; name="field.title"
+    ...
+    ... Frog
+    ... -----------------------------705046721187019535891597004
+    ... Content-Disposition: form-data; name="field.username"
+    ...
+    ... frog
+    ... -----------------------------705046721187019535891597004
+    ... Content-Disposition: form-data; name="field.password"
+    ...
+    ... pwd
+    ... -----------------------------705046721187019535891597004
+    ... Content-Disposition: form-data; name="field.verify_password"
+    ...
+    ... pwd
+    ... -----------------------------705046721187019535891597004
+    ... Content-Disposition: form-data; name="field.photo"; filename=""
+    ... Content-Type: application/octet-stream
+    ...
+    ...
+    ... -----------------------------705046721187019535891597004
+    ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
+    ...
+    ... Add
+    ... -----------------------------705046721187019535891597004--
+    ... """)
+    HTTP/1.1 303 See Other
+    Content-Length: ...
+    Location: http://localhost/frogpond/persons
+    ...
+
+We should see a new user in the user table:
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+                  <a href="http://localhost/frogpond/persons/frog">Frog</a>
+    ...
+
+We should have a view for that person as well, and the person
+themselves can see it:
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/frog HTTP/1.1
+    ... Authorization: Basic frog:pwd
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    ...Person info: Frog...
+    ...
+    ...Username:...
+          frog
+    ...
+          <h5>Groups</h5>
+    <BLANKLINE>
+          <a class="modify"
+    ...
+
+If we try to create a person with the same login name, we get a nice error:
+
+    >>> print http(r"""
+    ... POST /frogpond/persons/add.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 1342
+    ... Content-Type: multipart/form-data; boundary=---8<---
+    ...
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.title"
+    ...
+    ... Other frog with the same id
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.username"
+    ...
+    ... frog
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.password"
+    ...
+    ... pwd
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.verify_password"
+    ...
+    ... pwd
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.photo"; filename=""
+    ... Content-Type: application/octet-stream
+    ...
+    ...
+    ... -----8<---
+    ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
+    ...
+    ... Add
+    ... -----8<-----
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    ...This username is already used!...
+    ...
+
+We should have a view for editing him as well:
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/frog/edit.html HTTP/1.1
+    ... Authorization: Basic frog:pwd
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    ...<form action="http://localhost/frogpond/persons/frog/edit.html"...
+    ...
+    ...Change info for Frog...
+    ...
+    ...Full name...
+    ...
+    ...<input class="textType" id="field.title" name="field.title" size="20" type="text" value="Frog"  />...
+    ...
+    ...New photo...
+    ...
+    ...<input class="fileType" id="field.photo" name="field.photo" size="20" type="file"  />...
+    ...
+    ...<input class="hiddenType" id="field.clear_photo.used" name="field.clear_photo.used" type="hidden" value="" /> <input class="checkboxType" id="field.clear_photo" name="field.clear_photo" type="checkbox" value="on"  />...
+    ...Clear photo...
+    ...
+    ...New password...
+    ...
+    ...<input class="passwordType" id="field.new_password" name="field.new_password" size="20" type="password" value=""  />...
+    ...
+    ...Verify password...
+    ...
+    ...<input class="passwordType" id="field.verify_password" name="field.verify_password" size="20" type="password" value=""  />...
+    ...
+    ...</form>...
+    ...
+
+You can create a person without providing a password:
+
+    >>> print http(r"""
+    ... POST /frogpond/persons/add.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 1314
+    ... Content-Type: multipart/form-data; boundary=---8<---
+    ...
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.title"
+    ...
+    ... Frog2
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.username"
+    ...
+    ... frog2
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.password"
+    ...
+    ...
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.verify_password"
+    ...
+    ...
+    ... -----8<---
+    ... Content-Disposition: form-data; name="field.photo"; filename=""
+    ... Content-Type: application/octet-stream
+    ...
+    ...
+    ... -----8<---
+    ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
+    ...
+    ... Add
+    ... -----8<-----
+    ... """)
+    HTTP/1.1 303 See Other
+    Content-Length: ...
+    Location: http://localhost/frogpond/persons
+    ...
+
+Groups
+------
+
+When you are logged in as a manager, you can see the "new group" action in the
+group index:
+
+    >>> print http(r"""
+    ... GET /frogpond/groups/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <a href="+/addSchoolToolGroup.html">New Group</a>
+    ...
+
+We can click on it and get a form:
+
+    >>> print http(r"""
+    ... GET /frogpond/groups/+/addSchoolToolGroup.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+      <form method="post" enctype="multipart/form-data"
+          class="standalone"
+          action="http://localhost/frogpond/groups/+/addSchoolToolGroup.html">
+    ...
+           <input class="textType" id="field.title" name="field.title" size="20" type="text" value=""  />
+    ...
+      </form>
+    ...
+
+After submitting the form
+
+    >>> print http(r"""
+    ... POST /frogpond/groups/+/addSchoolToolGroup.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 433
+    ... Content-Type: multipart/form-data; boundary=---------------------------68355286210571712431437723486
+    ...
+    ... -----------------------------68355286210571712431437723486
+    ... Content-Disposition: form-data; name="field.title"
+    ... 
+    ... Venerable Frogs
+    ... -----------------------------68355286210571712431437723486
+    ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
+    ... 
+    ... Add
+    ... -----------------------------68355286210571712431437723486
+    ... Content-Disposition: form-data; name="add_input_name"
+    ... 
+    ... 
+    ... -----------------------------68355286210571712431437723486--
+    ... """)
+    HTTP/1.1 303 See Other
+    ...
+    Location: http://localhost/frogpond/groups
+    ...
+
+We should see a new group in the group index:
+
+    >>> print http(r"""
+    ... GET /frogpond/groups HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <a href="...venerable-frogs">Venerable Frogs</a>
+    ...
+
+We should have a view for that group as well:
+
+    >>> print http(r"""
+    ... GET /frogpond/groups/venerable-frogs HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    ...Venerable Frogs...
+    ...
+
+We should see the group in this person's possible group list.
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/frog/groups.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <input type="checkbox" name="add_group.venerable-frogs" />
+    Venerable Frogs
+    ...
+
+Let's add the person to the group.
+
+    >>> print http("""
+    ... POST /frogpond/persons/frog/groups.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ... ADD_GROUPS=Apply&add_group.venerable-frogs=on\
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+The person's info view should show the group:
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/frog HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    ...
+    <a href=".../groups/venerable-frogs">Venerable Frogs</a>
+    ...
+
+And the group page shows the group in the 'current groups' section.
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/frog/groups.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    ...
+    <fieldset>
+      <legend>Current Groups</legend>
+    ...
+            <input type="checkbox"
+                   name="remove_group.venerable-frogs" />
+            Venerable Frogs
+    ...
+    <fieldset>
+      <legend>Available Groups</legend>
+    ...
+
+The group members view reflects the change that we have done:
+
+    >>> print http(r"""
+    ... GET /frogpond/groups/venerable-frogs/members_persons.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <input type="checkbox" name="REMOVE_MEMBER.frog" />
+    Frog
+    ...
+
+
+Resources
+---------
+
+When you are logged in as a manager, you can see the "new resource" action in
+the resource index:
+
+    >>> print http(r"""
+    ... GET /frogpond/resources/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <a href="+/addSchoolToolResource.html">New Resource</a>
+    ...
+
+We can click on it and get a form:
+
+    >>> print http(r"""
+    ... GET /frogpond/resources/+/addSchoolToolResource.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+      <form method="post" enctype="multipart/form-data"
+            class="standalone"
+            action="http://localhost/frogpond/resources/+/addSchoolToolResource.html">
+    ...<input class="textType" id="field.title" name="field.title" size="20" type="text" value=""  />...
+    ...<label for="field.isLocation" title="Indicate this resource is a location, like a classroom.">A Location.</label>...
+      </form>
+    ...
+
+After submitting the form
+
+    >>> print http("""
+    ... POST /frogpond/resources/+/addSchoolToolResource.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... field.title=Lily&field.isLocation=on&UPDATE_SUBMIT=Add&add_input_name=\
+    ... """)
+    HTTP/1.1 303 See Other
+    ...
+    Location: http://localhost/frogpond/resources
+    ...
+
+We should see a new resource in the resource index:
+
+    >>> print http(r"""
+    ... GET /frogpond/resources/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    <a href="http://localhost/frogpond/resources/lily">Lily</a>
+    ...
+
+We should have a view for that resource as well:
+
+    >>> print http(r"""
+    ... GET /frogpond/resources/lily HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+    ...Lily...
+    ...
+    ...<strong>Location</strong>...
+    ...
+
+Cancelling the resource addition redirects us to the resource index:
+
+    >>> print http("""
+    ... POST /frogpond/resources/+/addSchoolToolResource.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... field.title=Rose&CANCEL=Cancel&add_input_name=\
+    ... """)
+    HTTP/1.1 303 See Other
+    ...
+    Location: http://localhost/frogpond/resources
+    ...
+
+    >>> r = http("GET /frogpond/resources HTTP/1.1")
+    >>> 'Rose' not in str(r)
+    True
+
+
+Group editing
+-------------
+
+Groups have an edit page
+
+    >>> print http("""
+    ... GET /frogpond/groups/venerable-frogs/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+       <form method="post" enctype="multipart/form-data"
+             class="standalone"
+             action="http://localhost/frogpond/groups/venerable-frogs/edit.html">
+    ...
+           <h3>Edit Group Information</h3>
+    ...
+    ...<input class="textType" id="field.title" name="field.title" size="20" type="text" value="Venerable Frogs"  />...
+    ...
+           <input type="submit" class="button-ok"
+                  name="UPDATE_SUBMIT" value="Apply"
+                  title="Shortcut: Alt-A" accesskey="A" />
+           <input type="submit" class="button-cancel"
+                  name="CANCEL" value="Cancel" />
+    ...
+
+If the Cancel button is hit, we get redirected to the group info view:
+
+    >>> print http("""
+    ... POST /frogpond/groups/venerable-frogs/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... field.title=Foo&CANCEL=Cancel\
+    ... """)
+    HTTP/1.1 303 See Other
+    ...
+    Location: http://localhost/frogpond/groups/venerable-frogs
+    ...
+
+and the context is unchanged:
+
+    >>> print http("""
+    ... GET /frogpond/groups/venerable-frogs/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    ...<input ... name="field.title" size="20" type="text" value="Venerable Frogs"  />...
+    ...
+
+When the form is successfully submitted, we also get redirected to the info
+view:
+
+    >>> print http("""
+    ... POST /frogpond/groups/venerable-frogs/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... field.title=Very+Venerable+Frogs&UPDATE_SUBMIT=Apply\
+    ... """)
+    HTTP/1.1 303 See Other
+    ...
+    Location: http://localhost/frogpond/groups/venerable-frogs
+    ...
+
+Now the group info is indeed updated:
+
+    >>> print http("""
+    ... GET /frogpond/groups/venerable-frogs HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    ...Very Venerable Frogs...
+
+
+Resource editing
+----------------
+
+Resources have an edit page
+
+    >>> print http("""
+    ... GET /frogpond/resources/lily/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+       <form method="post" enctype="multipart/form-data"
+             class="standalone"
+             action="http://localhost/frogpond/resources/lily/edit.html">
+    ...
+           <h3>Edit Resource Information</h3>
+    ...
+    ...<input class="textType" id="field.title" name="field.title" size="20" type="text" value="Lily"  />...
+    ...
+           <input type="submit" class="button-ok"
+                  name="UPDATE_SUBMIT" value="Apply"
+                  title="Shortcut: Alt-A" accesskey="A" />
+           <input type="submit" class="button-cancel"
+                  name="CANCEL" value="Cancel" />
+    ...
+
+If the Cancel button is hit, we get redirected to the resource info view:
+
+    >>> print http("""
+    ... POST /frogpond/resources/lily/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... field.title=Foo&CANCEL=Cancel\
+    ... """)
+    HTTP/1.1 303 See Other
+    ...
+    Location: http://localhost/frogpond/resources/lily
+    ...
+
+and the context is unchanged:
+
+    >>> print http("""
+    ... GET /frogpond/resources/lily/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    ...<input ... name="field.title" size="20" type="text" value="Lily"  />...
+    ...
+
+When the form is successfully submitted, we also get redirected to the info
+view:
+
+    >>> print http("""
+    ... POST /frogpond/resources/lily/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... field.title=Pretty+Lily&UPDATE_SUBMIT=Apply\
+    ... """)
+    HTTP/1.1 303 See Other
+    ...
+    Location: http://localhost/frogpond/resources/lily
+    ...
+
+Now the resource info is indeed updated:
+
+    >>> print http("""
+    ... GET /frogpond/resources/lily HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    ...Pretty Lily...
+
+
+Container Batching
+------------------
+
+Let's import a bunch of people we can play with:
+
+    >>> print http("""
+    ... POST /frogpond/persons/@@person-csvimport.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: multipart/form-data; boundary=---------------------------68355286210571712431437723486
+    ...
+    ... -----------------------------68355286210571712431437723486
+    ... Content-Disposition: form-data; name="csvtext"
+    ...
+    ... aaa, Person 01
+    ... aab, Person 02
+    ... aac, Person 03
+    ... aad, Duplicate Username
+    ... aae, Person 05
+    ... aaf, Person 06
+    ... aag, Person 07
+    ... aah, Person 08
+    ... aai, Person 09
+    ... aaj, Person 10
+    ... aak, Person 11
+    ... aal, Person 12
+    ... aam, Person 13
+    ... aan, Person 14
+    ... aao, Person 15
+    ... aap, Person 16
+    ... aaq, Person 17
+    ... aar, Person 18
+    ... aas, Person 19
+    ... aat, Person 20
+    ... aau, Person 21
+    ... aav, Person 22
+    ... aaw, Person 23
+    ... aax, Person 24
+    ... aay, Person 25
+    ... aaz, Person 26
+    ... aba, Person 27
+    ... aca, Person 28
+    ... ada, Person 29
+    ... aea, Person 30
+    ... afa, Person 31
+    ... aga, Person 32
+    ... -----------------------------68355286210571712431437723486
+    ... Content-Disposition: form-data; name="charset"
+    ...
+    ... UTF-8
+    ... -----------------------------68355286210571712431437723486
+    ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
+    ...
+    ... 1
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+          <div class="error">Failed to import CSV text</div>
+          <div class="error">Duplicate username: aad, Duplicate Username</div>
+    <BLANKLINE>
+    ...
+
+Now we have a batched view, showing the first 10 items
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    ...
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+            <a href="http://localhost/frogpond/persons/frog">Frog</a>
+    ...
+            <a href="http://localhost/frogpond/persons/frog2">Frog2</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aaa">Person 01</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aab">Person 02</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aac">Person 03</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aad">Person 04</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aae">Person 05</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aaf">Person 06</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aag">Person 07</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aah">Person 08</a>
+    ...
+
+
+The next batch (starting at index 10) shows the next 10 people
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/?batch_start=10 HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    ...
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+            <a href="http://localhost/frogpond/persons/aai">Person 09</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aaj">Person 10</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aak">Person 11</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aal">Person 12</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aam">Person 13</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aan">Person 14</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aao">Person 15</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aap">Person 16</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aaq">Person 17</a>
+    ...
+            <a href="http://localhost/frogpond/persons/aar">Person 18</a>
+    ...
+
+
+Sorting is done by the 'title' attribute, so we can change a persons title
+(fullname) and see them re-sorted into the batch:
+
+    >>> print http(r"""
+    ... POST /frogpond/persons/frog2/edit.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 1318
+    ... Content-Type: multipart/form-data; boundary=---------------------------705046721187019535891597004
+    ...
+    ... -----------------------------705046721187019535891597004
+    ... Content-Disposition: form-data; name="field.title"
+    ...
+    ... Adam
+    ... -----------------------------705046721187019535891597004
+    ... Content-Disposition: form-data; name="UPDATE_SUBMIT"
+    ...
+    ... Edit
+    ... -----------------------------705046721187019535891597004--
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    ...
+
+Now 'Adam' is at the top of the list.
+
+    >>> print http(r"""
+    ... GET /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    ...
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+          <ul>
+    ...
+              <a href="http://localhost/frogpond/persons/frog2">Adam</a>
+    ...
+              <a href="http://localhost/frogpond/persons/frog">Frog</a>
+    ...
+
+If we perform a search, the search value will be passed through to the batch
+navigation links allowing us to navigation through the search results.
+
+    >>> print http(r"""
+    ... POST /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ... 
+    ... SEARCH=Person&SEARCH_BUTTON=Find%20Now""")
+    ... GET /frogpond/persons/?SEARCH=3 HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    ...
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+          <a class="next"
+             href="?batch_start=10&amp;batch_size=10&amp;SEARCH=Person">
+            <span>Next</span>
+            <span>10</span> &raquo;
+          </a>
+    ...
+      <a href="?batch_start=0&amp;batch_size=10&amp;SEARCH=Person"
+         class="current">1</a>
+    ...
+      <a href="?batch_start=10&amp;batch_size=10&amp;SEARCH=Person">2</a>
+    ...
+      <a href="?batch_start=20&amp;batch_size=10&amp;SEARCH=Person">3</a>
+    ...
+      <a href="?batch_start=30&amp;batch_size=10&amp;SEARCH=Person">4</a>
+    ...
+
+If we click 'Clear' on the search, any search value is ignored and our batching
+links return to normal:
+
+    >>> print http(r"""
+    ... POST /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: application/x-www-form-urlencoded
+    ... 
+    ... SEARCH=Person&CLEAR_SEARCH=Clear""")
+    ... GET /frogpond/persons/?SEARCH=3 HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    ...
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/html;charset=utf-8
+    <BLANKLINE>
+    ...
+          <a class="next"
+             href="?batch_start=10&amp;batch_size=10">
+            <span>Next</span>
+            <span>10</span> &raquo;
+          </a>
+    ...
+      <a href="?batch_start=0&amp;batch_size=10"
+         class="current">1</a>
+    ...
+      <a href="?batch_start=10&amp;batch_size=10">2</a>
+    ...
+      <a href="?batch_start=20&amp;batch_size=10">3</a>
+    ...
+      <a href="?batch_start=30&amp;batch_size=10">4</a>
+    ...
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/app.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.sbapp.browser.
+
+$Id: test_all.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+
+
+def test_suite():
+    return collect_ftests(level=500) # level 500 'cause these tests fail now
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/resources/schoolbell.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/resources/schoolbell.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/skin.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/skin.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/skin.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,48 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolBell skin.
+
+$Id: skin.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+from zope.publisher.browser import applySkin
+from zope.publisher.interfaces.browser import ILayer, IDefaultBrowserLayer
+from zope.publisher.interfaces.browser import IBrowserRequest
+from schooltool.app.interfaces import ISchoolToolApplication
+
+from schooltool.skin import ISchoolToolLayer
+
+
+class ISchoolBellLayer(ILayer, IBrowserRequest):
+    """SchoolBell layer."""
+
+
+class ISchoolBellSkin(ISchoolBellLayer, ISchoolToolLayer, IDefaultBrowserLayer):
+    """The SchoolBell skin"""
+
+
+def schoolBellTraverseSubscriber(event):
+    """A subscriber to BeforeTraverseEvent.
+
+    Sets the SchoolBell skin if the object traversed is a SchoolBell
+    application instance.
+    """
+    if (ISchoolToolApplication.providedBy(event.object) and
+        IBrowserRequest.providedBy(event.request)):
+        applySkin(event.request, ISchoolBellSkin)


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/skin.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/calendar_overlay.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/calendar_overlay.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/calendar_overlay.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+<div id="portlet-calendar-overlay" class="portlet"
+     i18n:domain="schoolbell" tal:condition="view/show_overlay">
+
+  <h4 i18n:translate="">Calendars</h4>
+
+  <form method="post" action="" tal:attributes="action request/URL"
+        tal:define="dummy view/update">
+
+    <div class="row" style="background: #9db8d2">
+      <label class="disabled">
+        <input type="checkbox" checked="checked" disabled="disabled" />
+        <tal:translate i18n:translate="">My Calendar</tal:translate>
+      </label>
+    </div>
+
+    <div class="row" tal:repeat="item view/items"
+         tal:attributes="style string:background: ${item/color1}">
+      <label>
+        <input type="checkbox" name="overlay:list"
+               tal:attributes="value item/id; checked item/checked" />
+        <span tal:content="item/title">Title</span>
+      </label>
+      <a class="go"
+         tal:attributes="href item/calendar/@@absolute_url;
+                         style string:background: ${item/color2};;
+                                      color: ${item/color2}"
+      >&nbsp;</a>
+    </div>
+
+    <div class="controls">
+      <input name="OVERLAY_APPLY" type="submit" value="Apply"
+            i18n:attributes="value"/>
+      <input name="OVERLAY_MORE" type="submit" value="More..."
+            i18n:attributes="value"/>
+    </div>
+  </form>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/calendar_overlay.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/generic_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/generic_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/generic_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<tal:block i18n:domain="schooltool">
+<metal:block define-macro="stylesheets">
+</metal:block>
+
+<metal:block define-macro="title">
+  <title i18n:translate="">SchoolBell</title>
+</metal:block>
+
+<metal:block define-macro="serverinfo">
+  <span i18n:translate="">Server Running SchoolBell</span>
+  <span tal:content="modules/schooltool/sbapp/VERSION"/>
+</metal:block>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/generic_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/index.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/index.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/index.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,17 @@
+<tal:dummy define="dummy view/update"/>
+<html metal:use-macro="context/@@standard_macros/view"
+      i18n:domain="schoolbell">
+<body>
+
+<h1 metal:fill-slot="content-header" 
+  i18n:translate="">Welcome to SchoolBell</h1>
+
+<div metal:fill-slot="body">
+
+<p><a href="persons" i18n:translate="">Persons</a></p>
+<p><a href="groups" i18n:translate="">Groups</a></p>
+<p><a href="resources" i18n:translate="">Resources</a></p>
+</div>
+</body>
+
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/index.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/navigation.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/navigation.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/navigation.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<div class="portlet" i18n:domain="schoolbell">
+<h4 i18n:translate="">Navigation</h4>
+<ul>
+   <li><a tal:attributes="href view/app/persons/@@absolute_url"
+          i18n:translate="">Persons</a></li>
+   <li><a tal:attributes="href view/app/groups/@@absolute_url"
+          i18n:translate="">Groups</a></li>
+   <li><a tal:attributes="href view/app/resources/@@absolute_url"
+          i18n:translate="">Resources</a></li>
+</ul>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/navigation.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/person.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/person.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/person.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,59 @@
+<metal:block use-macro="view/@@standard_macros/page" i18n:domain="schoolbell">
+
+  <metal:block fill-slot="title">
+    <title i18n:translate="">Person info: <span tal:replace="context/title"
+        i18n:name="title"/></title>
+  </metal:block>
+
+  <metal:block fill-slot="content-header">
+
+    <tal:if condition="context/photo">
+      <img src="photo" class="person-photo" alt="photo" i18n:attributes="alt"
+           tal:attributes="src string:${context/@@absolute_url}/photo" />
+    </tal:if>
+    <h1 tal:content="context/title" />
+    <strong i18n:translate="">Username:</strong>
+    <span tal:replace="context/zope:name">not_doe</span>
+    <br />
+    <a class="modify" href=""
+       title="Change this person's name, picture, or password"
+       tal:attributes="href string:${context/@@absolute_url}/@@edit.html"
+       i18n:attributes="title"
+       i18n:translate="">
+       edit name
+    </a>
+
+  </metal:block>
+
+  <metal:block metal:fill-slot="body">
+
+    <tal:block replace="structure context/@@notes|nothing"/>
+
+    <div class="person-info">
+
+      <tal:block tal:define="groups context/groups/sortby:title">
+        <div class="info-block person-groups">
+          <h5 i18n:translate="">Groups</h5>
+          <ul tal:condition="groups">
+            <tal:loop repeat="group groups">
+              <li>
+                <a title=""
+                  tal:attributes="href group/@@absolute_url;
+                  title group/description|group/title"
+                  tal:content="group/title"></a>
+              </li>
+            </tal:loop>
+          </ul>
+          <a class="modify" href="" title="Manage this person's memberships"
+             tal:attributes="href string:${context/@@absolute_url}/@@groups.html"
+             i18n:attributes="title"
+             i18n:translate="">
+             edit groups
+          </a>
+        </div>
+      </tal:block>
+    </div>
+
+  </metal:block>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/templates/person.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_cal.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_cal.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_cal.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,131 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for SchoolBell calendaring views.
+
+$Id: test_cal.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+
+from zope.interface import implements
+from zope.publisher.browser import TestRequest
+
+from schooltool.app.browser.testing import setUp as browserSetUp, tearDown
+from schooltool.testing import setup as sbsetup
+
+# Used for the PrincipalStub
+# XXX: Bad, it depends on the person package.
+from schooltool.person.person import Person
+from schooltool.person.interfaces import IPerson
+from schooltool.person.interfaces import IPersonPreferences
+
+
+def setUp(test=None):
+    browserSetUp(test)
+    sbsetup.setUpSchoolToolSite()
+    sbsetup.setUpCalendaring()
+    sbsetup.setUpTimetabling()
+
+def doctest_CalendarListView(self):
+    """Tests for CalendarListView.
+
+    This view only has the getCalendars() method.  The view was introduced to
+    enhance pluggability.
+
+    CalendarListView.getCalendars returns a list of calendars that
+    should be displayed.  This list always includes the context of
+    the view, but it may also include other calendars as well.
+
+        >>> from schooltool.app.browser.cal import CalendarListView
+        >>> import calendar as pycalendar
+        >>> class CalendarStub:
+        ...     __parent__ = Person()
+        ...     def __init__(self, title):
+        ...         self.title = title
+        >>> calendar = CalendarStub('My Calendar')
+        >>> request = TestRequest()
+        >>> view = CalendarListView(calendar, request)
+        >>> for c, col1, col2 in view.getCalendars():
+        ...     print '%s (%s, %s)' % (getattr(c, 'title', 'null'), col1, col2)
+        My Calendar (#9db8d2, #7590ae)
+        null (#9db8d2, #7590ae)
+
+    XXX: No clue if the above is still correct.
+
+    If the authenticated user is looking at his own calendar, then
+    a list of overlaid calendars is taken into consideration
+
+        >>> class OverlayInfoStub:
+        ...     def __init__(self, title, color1, color2, show=True):
+        ...         self.calendar = CalendarStub(title)
+        ...         self.color1 = color1
+        ...         self.color2 = color2
+        ...         self.show = show
+        >>> class PreferenceStub:
+        ...     def __init__(self):
+        ...         self.weekstart = pycalendar.MONDAY
+        ...         self.timeformat = "%H:%M"
+        ...         self.dateformat = "%Y-%m-%d"
+        ...         self.timezone = 'UTC'
+        >>> from zope.annotation.interfaces import IAttributeAnnotatable
+        >>> from schooltool.app.interfaces import IHaveCalendar
+        >>> from schooltool.app.cal import CALENDAR_KEY
+        >>> class PersonStub:
+        ...     implements(IHaveCalendar, IAttributeAnnotatable)
+        ...     def __conform__(self, interface):
+        ...         if interface is IPersonPreferences:
+        ...             return PreferenceStub()
+        ...     __annotations__ = {CALENDAR_KEY: calendar}
+        ...     overlaid_calendars = [
+        ...         OverlayInfoStub('Other Calendar', 'red', 'blue'),
+        ...         OverlayInfoStub('Hidden', 'green', 'red', False)]
+        >>> class PrincipalStub:
+        ...     def __conform__(self, interface):
+        ...         if interface is IPerson:
+        ...             return PersonStub()
+        >>> request.setPrincipal(PrincipalStub())
+        >>> for c, col1, col2 in view.getCalendars():
+        ...     print '%s (%s, %s)' % (getattr(c, 'title', 'null'), col1, col2)
+        My Calendar (#9db8d2, #7590ae)
+        Other Calendar (red, blue)
+
+    XXX: No clue if the above is still correct.
+
+    No calendars are overlaid if the user is looking at a different
+    calendar
+
+        >>> view = CalendarListView(CalendarStub('Some Calendar'), request)
+        >>> for c, col1, col2 in view.getCalendars():
+        ...     print '%s (%s, %s)' % (getattr(c, 'title', 'null'), col1, col2)
+        Some Calendar (#9db8d2, #7590ae)
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    # XXX: Temporary till I find out what's wrong.
+    #suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+    #                                   optionflags=doctest.ELLIPSIS))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_cal.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_skin.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_skin.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_skin.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,68 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schoolbell.skin.
+
+$Id: test_skin.py 4824 2005-08-19 14:39:13Z srichter $
+"""
+
+import unittest
+from zope.testing import doctest
+
+
+def doctest_schoolBellTraverseSubscriber():
+    r"""Tests for schoolBellTraverseSubscriber.
+
+    We subscribe to Zope's BeforeTraverseEvent and apply the SchoolBell skin
+    whenever an ISchoolToolApplication is traversed during URL traversal.
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> from zope.app.publication.zopepublication import BeforeTraverseEvent
+        >>> from schooltool.sbapp.browser.skin import \
+        ...     schoolBellTraverseSubscriber
+        >>> from schooltool.sbapp.browser.skin import ISchoolBellSkin
+        >>> from schooltool.app.app import SchoolToolApplication
+
+        >>> ob = SchoolToolApplication()
+        >>> request = TestRequest()
+        >>> ev = BeforeTraverseEvent(ob, request)
+        >>> schoolBellTraverseSubscriber(ev)
+        >>> ISchoolBellSkin.providedBy(request)
+        True
+
+    The skin is, obviously, not applied if you traverse some other object
+
+        >>> ob = object()
+        >>> request = TestRequest()
+        >>> ev = BeforeTraverseEvent(ob, request)
+        >>> schoolBellTraverseSubscriber(ev)
+        >>> ISchoolBellSkin.providedBy(request)
+        False
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(),
+           ])
+
+
+if __name__ == "__main__":
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/browser/tests/test_skin.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="schooltool">
+
+
+<!-- Generations -->
+
+  <utility
+      name="schoolbell.app"
+      provides="zope.app.generations.interfaces.ISchemaManager"
+      component=".generations.schemaManager"
+      />
+
+<!-- Subpackages -->
+
+  <include package=".browser" />
+  <include package=".rest" />
+
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,30 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Generations for database version upgrades.
+
+$Id: __init__.py 6303 2006-06-22 13:13:02Z ignas $
+"""
+
+from zope.app.generations.generations import SchemaManager
+
+schemaManager = SchemaManager(
+    minimum_generation=8,
+    generation=8,
+    package_name='schooltool.sbapp.generations')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve1.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve1.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve1.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade to generation 1.
+
+The first incompatible change from 0 was introduced in rev 3232.
+
+$Id: evolve1.py 4814 2005-08-18 19:37:17Z srichter $
+"""
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from schooltool.app.interfaces import ISchoolToolApplication
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        for person in app['persons'].values():
+            person.overlaid_calendars.__parent__ = person
+            for info in person.overlaid_calendars:
+                info.__parent__ = person
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve1.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve2.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve2.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve2.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,41 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade to generation 2.
+
+The first incompatible change from 1 was introduced in rev .
+
+$Id: evolve2.py 5288 2005-10-18 22:32:34Z srichter $
+"""
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from schooltool.app.interfaces import ISchoolToolApplication, IHaveNotes
+from schooltool.notes import getNotes
+import datetime
+import random
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        for noted in findObjectsProviding(root, IHaveNotes):
+            for note in getNotes(noted):
+                note.unique_id = '%d.%d' % (
+                    datetime.datetime.utcnow().microsecond,
+                    random.randrange(10 ** 6, 10 ** 7))
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve2.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve3.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve3.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve3.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,57 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade to generation 3.
+
+The first incompatible change from 2 was introduced in rev .
+
+$Id: evolve3.py 5982 2006-04-27 14:25:47Z faassen $
+"""
+
+from zope.annotation.interfaces import IAnnotations
+from zope.app.generations.utility import findObjectsProviding
+from zope.app.publication.zopepublication import ZopePublication
+
+from schooltool.app.interfaces import ICalendarOwner
+from schooltool.relationship.annotatable import getRelationshipLinks
+from schooltool.relationship.relationship import LinkSet
+
+def setRelationshipLinks(context, linkset):
+    annotations = IAnnotations(context)
+    key = 'schooltool.relationship.RelationshipLinks'
+    annotations[key] = linkset
+    linkset.__name__ = "relationships"
+    linkset.__parent__ = context
+
+def upgradeLinkSet(relatable):
+    linkSet = LinkSet()
+    for link in getRelationshipLinks(relatable)._links:
+        linkSet.add(link)
+    setRelationshipLinks(relatable, linkSet)
+
+def evolve(context):
+    """We have changed underlying LinkSet container.
+
+    LinkSet was replaced with BTreeContainer, LinkSet as well as
+    Link became ILocations."""
+
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for calendarOwner in findObjectsProviding(root, ICalendarOwner):
+        upgradeLinkSet(calendarOwner)
+        upgradeLinkSet(calendarOwner.calendar)


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve3.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve4.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve4.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve4.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,43 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade to generation 4.
+
+Revision 3554 changed the format of the weekstart preference from an string to
+an int.
+
+$Id: evolve4.py 5459 2005-12-15 17:28:45Z mg $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.app.interfaces import ISchoolToolApplication, IHavePreferences
+from schooltool.app.app import getPersonPreferences
+
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        for person in findObjectsProviding(root, IHavePreferences):
+            preferences = getPersonPreferences(person)
+            if preferences.weekstart == "Sunday":
+                preferences.weekstart = 6
+            else:
+                preferences.weekstart = 0


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve4.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve5.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve5.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve5.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,50 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade to generation 5.
+
+Moving to TZ aware events requires copying the old events to new non-naive
+events.
+
+$Id: evolve5.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+from pytz import timezone
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+from schooltool.app.interfaces import ICalendarOwner
+from schooltool.app.cal import CalendarEvent, Calendar
+
+utc = timezone('UTC')
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for owner in findObjectsProviding(root, ICalendarOwner):
+        new_calendar = Calendar(owner)
+        for event in owner.calendar:
+            ev = CalendarEvent(event.dtstart.replace(tzinfo=utc),
+                               event.duration,
+                               event.title,
+                               description=event.description,
+                               location=event.location,
+                               unique_id=event.unique_id,
+                               recurrence=event.recurrence)
+            new_calendar.addEvent(ev)
+        owner.calendar = new_calendar


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve5.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve6.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve6.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve6.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,49 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade to generation 6.
+
+Changing time and date formatting preferences requires changing the preferences
+currently stored on existing Person instances.
+
+$Id: evolve6.py 4814 2005-08-18 19:37:17Z srichter $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.app.interfaces import IHavePreferences, IPersonPreferences
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for person in findObjectsProviding(root, IHavePreferences):
+        prefs = IPersonPreferences(person)
+
+        if prefs.timeformat == 'HH:MM':
+            prefs.timeformat = '%H:%M'
+        elif prefs.timeformat == 'H:MM am/pm':
+            prefs.timeformat = '%I:%M %p'
+
+        if prefs.dateformat == 'MM/DD/YY':
+            prefs.dateformat = '%m/%d/%y'
+        elif prefs.dateformat == 'YYYY-DD-MM':
+            prefs.dateformat = '%Y-%m-%d'
+        elif prefs.dateformat == 'Day Month, Year':
+            prefs.dateformat = '%d %B, %Y'
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve6.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve7.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve7.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve7.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade to generation 7.
+
+We need to add a calendar to the root SchoolToolApplication object.
+
+$Id: evolve7.py 4814 2005-08-18 19:37:17Z srichter $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.cal import Calendar
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for app in findObjectsProviding(root, ISchoolToolApplication):
+        app.calendar = Calendar(app)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve7.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve8.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve8.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve8.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,40 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Upgrade to generation 8.
+
+Issue349 - while the original evolution script (evolve6) evolved
+properties that were set properly. Default settings 'YYYY-MM-DD' were
+left unmodified.
+
+$Id: evolve8.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+from zope.app.publication.zopepublication import ZopePublication
+from zope.app.generations.utility import findObjectsProviding
+
+from schoolbell.app.interfaces import IHavePreferences, IPersonPreferences
+
+def evolve(context):
+    root = context.connection.root().get(ZopePublication.root_name, None)
+    for person in findObjectsProviding(root, IHavePreferences):
+        prefs = IPersonPreferences(person)
+
+        if prefs.dateformat == 'YYYY-MM-DD':
+            prefs.dateformat = '%Y-%m-%d'


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/generations/evolve8.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/main.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/main.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/main.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,68 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Main SchoolBell script.
+
+This module is not necessary if you use SchoolBell as a Zope 3 content object.
+It is only used by the standalone SchoolBell executable.
+
+$Id: main.py 6590 2007-01-24 13:42:57Z ignas $
+"""
+import locale
+import gettext
+import os.path
+from schooltool.app import main
+
+locale_charset = locale.getpreferredencoding()
+
+localedir = os.path.join(os.path.dirname(__file__), '..', 'locales')
+catalog = gettext.translation('schoolbell', localedir, fallback=True)
+_ = lambda us: catalog.ugettext(us).encode(locale_charset, 'replace')
+_._domain = 'schoolbell'
+
+sb_incompatible_db_error_msg = _("""
+This is not a SchoolBell 1.0 database file, aborting.
+""").strip()
+
+
+sb_old_db_error_msg = _("""
+This is not a SchoolBell 1.0 database file, aborting.
+
+Please run the standalone database upgrade script.
+""").strip()
+
+
+class Options(main.Options):
+    """SchoolBell process options."""
+
+    config_filename = 'schoolbell.conf'
+
+
+class StandaloneServer(main.StandaloneServer):
+
+    incompatible_db_error_msg = sb_incompatible_db_error_msg
+    old_db_error_msg = sb_old_db_error_msg
+
+    system_name = "SchoolBell"
+
+    Options = Options
+
+
+if __name__ == '__main__':
+    StandaloneServer().main()


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/main.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,47 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Restive XML views for the SchoolBell application.
+
+$Id: __init__.py 4824 2005-08-19 14:39:13Z srichter $
+"""
+from zope.interface import directlyProvidedBy, directlyProvides
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.publisher.interfaces.http import IHTTPRequest
+
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+# XXX: This should really become an IRESTRequest; this is really a hack to
+#      simulate a layer.
+
+class ISchoolBellRequest(IHTTPRequest):
+    """A request in SchoolBell (rather than SchoolBell) application"""
+
+
+def restSchoolBellSubscriber(event):
+    """This event subscriber to BeforeTraverseEvent sets a marker
+    interface on a RESTive request if we traverse into a SchoolBell
+    instance.
+    """
+
+    if (ISchoolToolApplication.providedBy(event.object)
+        and not IBrowserRequest.providedBy(event.request)):
+        interfaces = directlyProvidedBy(event.request)
+        directlyProvides(event.request, interfaces + ISchoolBellRequest)


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <subscriber
+      handler=".restSchoolBellSubscriber"
+      for="zope.app.publication.interfaces.IBeforeTraverseEvent"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/app.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/app.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/app.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,914 @@
+Functional tests for SchoolBell app RESTive views
+=================================================
+
+First of all, we will need a schoolbell instance.  We will add it via
+the web ZMI:
+
+    >>> print http("""
+    ... POST /@@contents.html HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 81
+    ... Content-Type: application/x-www-form-urlencoded
+    ...
+    ... type_name=BrowserAdd__schooltool.app.app.SchoolToolApplication&\
+    ... new_value=frogpond""")
+    HTTP/1.1 303 See Other
+    ...
+    Location: http://localhost/@@contents.html
+    ...
+
+Also, we need the REST HTTP caller:
+
+    >>> from schooltool.app.rest.ftests import rest
+
+Now, we can run the REST page tests:
+
+    >>> print rest("""
+    ... GET /frogpond HTTP/1.1
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <schooltool xmlns:xlink="http://www.w3.org/1999/xlink">
+      <message>Welcome to the SchoolBell server</message>
+      <containers>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost/frogpond/persons"
+                   xlink:title="persons"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost/frogpond/groups"
+                   xlink:title="groups"/>
+        <container xlink:type="simple"
+                   xlink:href="http://localhost/frogpond/resources"
+                   xlink:title="resources"/>
+      </containers>
+    </schooltool>
+    <BLANKLINE>
+
+There are no groups at the moment:
+
+    >>> print rest("""
+    ... GET /frogpond/groups/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>groups</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/groups/acl"/>
+    </container>
+    <BLANKLINE>
+
+no resources:
+
+    >>> print rest("""
+    ... GET /frogpond/resources/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>resources</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/resources/acl"/>
+    </container>
+    <BLANKLINE>
+
+and no persons:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>persons</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/persons/acl"/>
+    </container>
+    <BLANKLINE>
+
+We can add some groups with POST:
+
+    >>> print rest("""
+    ... POST /frogpond/groups/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="A Group"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    Location: http://localhost/frogpond/groups/a-group
+    <BLANKLINE>
+    Object created: http://localhost/frogpond/groups/a-group
+
+We can add some groups with PUT:
+
+    >>> print rest("""
+    ... PUT /frogpond/groups/another-group HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Another Group"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    <BLANKLINE>
+
+Both groups were created:
+
+    >>> print rest("""
+    ... GET /frogpond/groups/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>groups</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/groups/a-group"
+              xlink:title="A Group"/>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/groups/another-group"
+              xlink:title="Another Group"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/groups/acl"/>
+    </container>
+    <BLANKLINE>
+
+We can delete groups as well:
+
+    >>> print rest("""
+    ... DELETE /frogpond/groups/another-group HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+Only one group is left:
+
+    >>> print rest("""
+    ... GET /frogpond/groups/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>groups</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/groups/a-group"
+              xlink:title="A Group"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/groups/acl"/>
+    </container>
+    <BLANKLINE>
+
+Same with the resources:
+
+We can add some resources with POST:
+
+    >>> print rest("""
+    ... POST /frogpond/resources/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="A Resource" isLocation="true" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    Location: http://localhost/frogpond/resources/a-resource
+    <BLANKLINE>
+    Object created: http://localhost/frogpond/resources/a-resource
+
+This resource is a location:
+
+    >>> print rest("""
+    ... GET /frogpond/resources/a-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    <resource xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...
+      <isLocation>True</isLocation>
+    ...
+    <BLANKLINE>
+
+
+We can add some resources with PUT:
+
+    >>> print rest("""
+    ... PUT /frogpond/resources/another-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Another Resource"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    <BLANKLINE>
+
+
+This resource is not a location:
+
+    >>> print rest("""
+    ... GET /frogpond/resources/another-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    <resource xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...
+      <isLocation>False</isLocation>
+    ...
+    <BLANKLINE>
+
+Both resources were created:
+
+    >>> print rest("""
+    ... GET /frogpond/resources/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>resources</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/resources/a-resource"
+              xlink:title="A Resource"/>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/resources/another-resource"
+              xlink:title="Another Resource"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/resources/acl"/>
+    </container>
+    <BLANKLINE>
+
+We can delete resources as well:
+
+    >>> print rest("""
+    ... DELETE /frogpond/resources/another-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+Only one resource is left:
+
+    >>> print rest("""
+    ... GET /frogpond/resources/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>resources</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/resources/a-resource"
+              xlink:title="A Resource"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/resources/acl"/>
+    </container>
+    <BLANKLINE>
+
+Persons are a bit different, they don't have description yet they have
+username:
+
+The id of the user is same as his username:
+
+    >>> print rest("""
+    ... PUT /frogpond/persons/john HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="John"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+We don't have to supply a username when making a PUT:
+
+    >>> print rest("""
+    ... PUT /frogpond/persons/peter HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Peter"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+    <BLANKLINE>
+
+Both persons were created:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>persons</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/persons/john"
+              xlink:title="John"/>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/persons/peter"
+              xlink:title="Peter"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/persons/acl"/>
+    </container>
+    <BLANKLINE>
+
+We can delete persons as well:
+
+    >>> print rest("""
+    ... DELETE /frogpond/persons/peter HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+Only one person is left:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/ HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>persons</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/frogpond/persons/john"
+              xlink:title="John"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/persons/acl"/>
+    </container>
+    <BLANKLINE>
+
+Let's look how our group looks now:
+
+    >>> print rest("""
+    ... GET /frogpond/groups/a-group HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """, handle_errors = False)
+    HTTP/1.1 200 Ok
+    ...
+    <group xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>A Group</title>
+      <description></description>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/frogpond/groups/a-group/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/groups/a-group/acl"/>
+      <calendar xlink:type="simple" xlink:title="Calendar"
+                xlink:href="http://localhost/frogpond/groups/a-group/calendar"/>
+      <relationships xlink:type="simple"
+                     xlink:title="Calendar subscriptions"
+                     xlink:href="http://localhost/frogpond/groups/a-group/calendar/relationships"/>
+      <acl xlink:type="simple" xlink:title="Calendar ACL"
+           xlink:href="http://localhost/frogpond/groups/a-group/calendar/acl"/>
+    </group>
+    <BLANKLINE>
+
+
+We can change the title of the group that we just created:
+
+    >>> print rest("""
+    ... PUT /frogpond/groups/a-group HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="The group"/>
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+
+Now the title of the group should be different:
+
+    >>> print rest("""
+    ... GET /frogpond/groups/a-group HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <group xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>The group</title>
+      <description></description>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/frogpond/groups/a-group/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/groups/a-group/acl"/>
+      <calendar xlink:type="simple" xlink:title="Calendar"
+                xlink:href="http://localhost/frogpond/groups/a-group/calendar"/>
+      <relationships xlink:type="simple"
+                     xlink:title="Calendar subscriptions"
+                     xlink:href="http://localhost/frogpond/groups/a-group/calendar/relationships"/>
+      <acl xlink:type="simple" xlink:title="Calendar ACL"
+           xlink:href="http://localhost/frogpond/groups/a-group/calendar/acl"/>
+    </group>
+    <BLANKLINE>
+
+Resource:
+
+    >>> print rest("""
+    ... GET /frogpond/resources/a-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <resource xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>A Resource</title>
+      <description></description>
+      <isLocation>True</isLocation>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/frogpond/resources/a-resource/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/resources/a-resource/acl"/>
+      <calendar xlink:type="simple" xlink:title="Calendar"
+                xlink:href="http://localhost/frogpond/resources/a-resource/calendar"/>
+      <relationships xlink:type="simple"
+                     xlink:title="Calendar subscriptions"
+                     xlink:href="http://localhost/frogpond/resources/a-resource/calendar/relationships"/>
+      <acl xlink:type="simple" xlink:title="Calendar ACL"
+           xlink:href="http://localhost/frogpond/resources/a-resource/calendar/acl"/>
+    </resource>
+    <BLANKLINE>
+
+
+We can change the title of the resource that we just created:
+
+    >>> print rest("""
+    ... PUT /frogpond/resources/a-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="The resource" isLocation="true" />
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+
+Now the title of the resource should be different:
+
+    >>> print rest("""
+    ... GET /frogpond/resources/a-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <resource xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>The resource</title>
+      <description></description>
+      <isLocation>True</isLocation>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/frogpond/resources/a-resource/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/resources/a-resource/acl"/>
+      <calendar xlink:type="simple" xlink:title="Calendar"
+                xlink:href="http://localhost/frogpond/resources/a-resource/calendar"/>
+      <relationships xlink:type="simple"
+                     xlink:title="Calendar subscriptions"
+                     xlink:href="http://localhost/frogpond/resources/a-resource/calendar/relationships"/>
+      <acl xlink:type="simple" xlink:title="Calendar ACL"
+           xlink:href="http://localhost/frogpond/resources/a-resource/calendar/acl"/>
+    </resource>
+    <BLANKLINE>
+
+We can decide this resource isn't really a usable location:
+
+    >>> print rest("""
+    ... PUT /frogpond/resources/a-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="The resource" isLocation="false" />
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+
+Now the resource isn't a location
+
+    >>> print rest("""
+    ... GET /frogpond/resources/a-resource HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <resource xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>The resource</title>
+      <description></description>
+      <isLocation>False</isLocation>
+    ...
+
+Person:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/john HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <person xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>John</title>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/frogpond/persons/john/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/persons/john/acl"/>
+      <calendar xlink:type="simple" xlink:title="Calendar"
+                xlink:href="http://localhost/frogpond/persons/john/calendar"/>
+      <relationships xlink:type="simple"
+                     xlink:title="Calendar subscriptions"
+                     xlink:href="http://localhost/frogpond/persons/john/calendar/relationships"/>
+      <acl xlink:type="simple" xlink:title="Calendar ACL"
+           xlink:href="http://localhost/frogpond/persons/john/calendar/acl"/>
+    </person>
+    <BLANKLINE>
+
+
+We can change the title of the person that we just created:
+
+    >>> print rest("""
+    ... PUT /frogpond/persons/john HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="The person"/>
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+
+Now the title of the person should be different:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/john HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <person xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>The person</title>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/frogpond/persons/john/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/persons/john/acl"/>
+      <calendar xlink:type="simple" xlink:title="Calendar"
+                xlink:href="http://localhost/frogpond/persons/john/calendar"/>
+      <relationships xlink:type="simple"
+                     xlink:title="Calendar subscriptions"
+                     xlink:href="http://localhost/frogpond/persons/john/calendar/relationships"/>
+      <acl xlink:type="simple" xlink:title="Calendar ACL"
+           xlink:href="http://localhost/frogpond/persons/john/calendar/acl"/>
+    </person>
+    <BLANKLINE>
+
+
+We should be capable of viewing his calendar:
+
+    >>> print str(rest("""
+    ... GET /frogpond/persons/john/calendar HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """, handle_errors=False)).replace("\r\n", "\n")
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    BEGIN:VEVENT
+    UID:empty-calendar-placeholder at schooltool.org
+    SUMMARY:Empty calendar
+    ...
+    DURATION:P0D
+    ...
+    END:VEVENT
+    END:VCALENDAR
+    <BLANKLINE>
+
+We can access group and resource calendars too:
+
+    >>> print str(rest("""
+    ... GET /frogpond/groups/a-group/calendar HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)).replace("\r\n", "\n")
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    BEGIN:VEVENT
+    UID:empty-calendar-placeholder at schooltool.org
+    SUMMARY:Empty calendar
+    ...
+    DURATION:P0D
+    ...
+    END:VEVENT
+    END:VCALENDAR
+    <BLANKLINE>
+
+    >>> print str(rest("""
+    ... GET /frogpond/resources/a-resource/calendar HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)).replace("\r\n", "\n")
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    BEGIN:VEVENT
+    UID:empty-calendar-placeholder at schooltool.org
+    SUMMARY:Empty calendar
+    ...
+    DURATION:P0D
+    ...
+    END:VEVENT
+    END:VCALENDAR
+    <BLANKLINE>
+
+Let's put a new calendar in there:
+
+    >>> print rest(r"""
+    ... PUT /frogpond/resources/a-resource/calendar HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 244
+    ... Content-Type: text/calendar
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:some-uid at example.com
+    ... SUMMARY:Sample event (modified)
+    ... DTSTART:20050204T100000Z
+    ... DURATION:PT2H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... BEGIN:VEVENT
+    ... UID:some-uid2 at example.com
+    ... SUMMARY:New event
+    ... DTSTART:20050204T120000Z
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    <BLANKLINE>
+
+Let's get it back:
+
+    >>> print str(rest("""
+    ... GET /frogpond/resources/a-resource/calendar HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)).replace("\r\n", "\n")
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    BEGIN:VEVENT
+    UID:some-uid at example.com
+    SUMMARY:Sample event (modified)
+    DTSTART:20050204T100000Z
+    DURATION:PT2H
+    ...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:some-uid2 at example.com
+    SUMMARY:New event
+    DTSTART:20050204T120000Z
+    DURATION:PT1H
+    ...
+    END:VEVENT
+    END:VCALENDAR
+    <BLANKLINE>
+
+Calendars should support other charsets too:
+
+    >>> print rest(r"""
+    ... PUT /frogpond/resources/a-resource/calendar HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 244
+    ... Content-Type: text/calendar; charset=latin-1
+    ...
+    ... BEGIN:VCALENDAR
+    ... VERSION:2.0
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    ... BEGIN:VEVENT
+    ... UID:some-uid at example.com
+    ... SUMMARY:Sample event 200 %s (pounds)
+    ... DTSTART:20050204T100000
+    ... DURATION:PT2H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... BEGIN:VEVENT
+    ... UID:some-uid2 at example.com
+    ... SUMMARY:New event
+    ... DTSTART:20050204T120000
+    ... DURATION:PT1H
+    ... DTSTAMP:20050203T150000
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """ % chr(163))
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    <BLANKLINE>
+
+The event should be there now:
+
+    >>> print str(rest("""
+    ... GET /frogpond/resources/a-resource/calendar HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """, handle_errors=False)).replace("\r\n", "\n")
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    VERSION:2.0
+    PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+    BEGIN:VEVENT
+    UID:some-uid at example.com
+    SUMMARY:Sample event 200 ... (pounds)
+    DTSTART:20050204T100000Z
+    DURATION:PT2H
+    ...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:some-uid2 at example.com
+    SUMMARY:New event
+    DTSTART:20050204T120000Z
+    DURATION:PT1H
+    ...
+    END:VEVENT
+    END:VCALENDAR
+    <BLANKLINE>
+
+
+We should be capable of giving a password to a person:
+
+    >>> print rest("""
+    ... PUT /frogpond/persons/john/password HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ...
+    ... super-secret-password
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    <BLANKLINE>
+
+He should be capable of logging in with this password now:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/john HTTP/1.1
+    ... Authorization: Basic john:super-secret-password
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+    <BLANKLINE>
+    <person xmlns:xlink="http://www.w3.org/1999/xlink">
+      <title>The person</title>
+      <relationships xlink:type="simple"
+                     xlink:title="Relationships"
+                     xlink:href="http://localhost/frogpond/persons/john/relationships"/>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/frogpond/persons/john/acl"/>
+      <calendar xlink:type="simple" xlink:title="Calendar"
+                xlink:href="http://localhost/frogpond/persons/john/calendar"/>
+      <relationships xlink:type="simple"
+                     xlink:title="Calendar subscriptions"
+                     xlink:href="http://localhost/frogpond/persons/john/calendar/relationships"/>
+      <acl xlink:type="simple" xlink:title="Calendar ACL"
+           xlink:href="http://localhost/frogpond/persons/john/calendar/acl"/>
+    </person>
+    <BLANKLINE>
+
+We can give our user a new photo if we want to:
+
+    >>> print rest("""
+    ... PUT /frogpond/persons/john/photo HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ...
+    ... really-nice-photo %s !
+    ... """ % chr(163)) # non ascii symbol
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    <BLANKLINE>
+
+Get it back:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/john/photo HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Type: image/jpeg
+    <BLANKLINE>
+    really-nice-photo ... !
+    <BLANKLINE>
+
+Delete it:
+
+    >>> print rest("""
+    ... DELETE /frogpond/persons/john/photo HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    ...
+
+
+And it should raise a not found if the photo is missing:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/john/photo HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 404 Not Found
+    Content-Length: 0
+    <BLANKLINE>
+
+We can view the preferences of our user:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/john/preferences HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    <BLANKLINE>
+    <preferences xmlns:xlink="http://www.w3.org/1999/xlink">
+    <BLANKLINE>
+      <preference id="timezone" value="UTC"/>
+      <preference id="timeformat" value="%H:%M"/>
+      <preference id="dateformat" value="%Y-%m-%d"/>
+      <preference id="weekstart" value="0"/>
+    <BLANKLINE>
+    </preferences>
+    <BLANKLINE>
+
+We can change the preferences:
+
+    >>> print rest(r"""
+    ... PUT /frogpond/persons/john/preferences HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... Content-Length: 244
+    ... Content-Type: text/xml; charset=latin-1
+    ...
+    ... <?xml version="1.0"?>
+    ... <preferences xmlns="http://schooltool.org/ns/model/0.1">
+    ...  <preference id="timezone" value="US/Eastern"/>
+    ... </preferences>
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    <BLANKLINE>
+    Preferences updated
+
+And verify that the preference was changed:
+
+    >>> print rest("""
+    ... GET /frogpond/persons/john/preferences HTTP/1.1
+    ... Authorization: Basic mgr:mgrpw
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    ...
+      <preference id="timezone" value="US/Eastern"/>
+    ...


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/app.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.sbapp.rest.
+
+$Id: test_all.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+
+
+def test_suite():
+    return collect_ftests(level=500) # level 500 'cause these tests fail now
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_app.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_app.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_app.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,183 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schollbell.rest.app
+
+$Id: test_app.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+from StringIO import StringIO
+
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app.testing import ztapi, setup
+
+from schooltool.person.person import Person
+from schooltool.xmlparsing import XMLDocument
+from schooltool.testing import setup as sbsetup
+from schooltool.testing.util import XMLCompareMixin
+
+
+class TestAppView(XMLCompareMixin, unittest.TestCase):
+
+    def setUp(self):
+        setup.placefulSetUp()
+        self.app = sbsetup.setUpSchoolToolSite()
+        from schooltool.app.rest.app import ApplicationView
+        self.view = ApplicationView(self.app, TestRequest())
+
+    def tearDown(self):
+        setup.placefulTearDown()
+
+    def test_render_Usingxpath(self):
+        result = self.view.GET()
+
+        doc = XMLDocument(result)
+        doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+
+        def oneNode(expr):
+            nodes = doc.query(expr)
+            self.assertEquals(len(nodes), 1,
+                              "%s matched %d nodes" % (expr, len(nodes)))
+            return nodes[0]
+
+        try:
+            nodes = doc.query('/schooltool/containers')
+            self.assertEquals(len(nodes), 1)
+            nodes = doc.query('/schooltool/containers/container')
+            self.assert_(len(nodes) >= 3)
+
+            persons = oneNode('/schooltool/containers/container'
+                              '[@xlink:href="http://127.0.0.1/persons"]')
+            self.assertEquals(persons['xlink:type'], 'simple')
+            self.assertEquals(persons['xlink:title'], 'persons')
+
+            groups = oneNode('/schooltool/containers/container'
+                             '[@xlink:href="http://127.0.0.1/groups"]')
+            self.assertEquals(groups['xlink:type'], 'simple')
+            self.assertEquals(groups['xlink:title'], 'groups')
+
+            notes = oneNode('/schooltool/containers/container'
+                            '[@xlink:href="http://127.0.0.1/resources"]')
+            self.assertEquals(notes['xlink:type'], 'simple')
+            self.assertEquals(notes['xlink:title'], 'resources')
+        finally:
+            doc.free()
+
+    def test_render(self):
+        result = self.view.GET()
+        response = self.view.request.response
+        self.assertEquals(response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        # XXX: Very fragile test that depends on setup.
+        #self.assertEqualsXML(result, """
+        #    <schooltool xmlns:xlink="http://www.w3.org/1999/xlink">
+        #      <message>Welcome to the SchoolTool server</message>
+        #      <containers>
+        #        <container xlink:type="simple"
+        #                   xlink:href="http://127.0.0.1/persons"
+        #                   xlink:title="persons"/>
+        #        <container xlink:href="http://127.0.0.1/resources"
+        #                   xlink:title="resources"
+        #                   xlink:type="simple"/>
+        #        <container xlink:type="simple"
+        #                   xlink:href="http://127.0.0.1/groups"
+        #                   xlink:title="groups"/>
+        #      </containers>
+        #    </schooltool>
+        #    """, recursively_sort=["schooltool"])
+
+
+def doctest_CalendarView():
+    r"""Tests for CalendarView.
+
+        >>> from zope.app.testing import setup
+        >>> setup.placelessSetUp()
+        >>> setup.setUpAnnotations()
+
+        >>> from schooltool.testing import setup as sbsetup
+        >>> sbsetup.setUpCalendaring()
+
+    First lets create a view:
+
+        >>> from schooltool.app.rest.app import CalendarView
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> from schooltool.app.cal import WriteCalendar
+        >>> from schooltool.app.interfaces import IWriteCalendar
+        >>> ztapi.provideAdapter(ISchoolToolCalendar, IWriteCalendar,
+        ...                      WriteCalendar)
+
+        >>> person = Person()
+        >>> calendar = ISchoolToolCalendar(person)
+        >>> view = CalendarView(calendar, TestRequest())
+
+        >>> print view.GET().replace("\r\n", "\n")
+        BEGIN:VCALENDAR
+        VERSION:2.0
+        PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        BEGIN:VEVENT
+        UID:empty-calendar-placeholder at schooltool.org
+        SUMMARY:Empty calendar
+        DTSTART:19700101T000000Z
+        DURATION:P0D
+        DTSTAMP:...
+        END:VEVENT
+        END:VCALENDAR
+        <BLANKLINE>
+
+        >>> calendar_text = '''\
+        ... BEGIN:VCALENDAR
+        ... VERSION:2.0
+        ... PRODID:-//SchoolTool.org/NONSGML SchoolBell//EN
+        ... BEGIN:VEVENT
+        ... UID:some-random-uid at example.com
+        ... SUMMARY:LAN party %s
+        ... DTSTART:20050226T160000Z
+        ... DURATION:PT6H
+        ... DTSTAMP:20050203T150000
+        ... END:VEVENT
+        ... END:VCALENDAR
+        ... ''' %  chr(163)
+
+        >>> view.request = TestRequest(StringIO(calendar_text),
+        ...     environ={'CONTENT_TYPE': 'text/plain; charset=latin-1'})
+
+        >>> view.PUT()
+        ''
+        >>> titles = [e.title for e in calendar]
+        >>> titles[0]
+        u'LAN party \xa3'
+
+    Cleanup:
+
+        >>> setup.placelessTearDown()
+
+    """
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestAppView))
+    suite.addTest(doctest.DocTestSuite(optionflags=doctest.ELLIPSIS|
+                                                   doctest.REPORT_NDIFF))
+    suite.addTest(doctest.DocTestSuite('schooltool.app.rest.app'))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_rest.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_rest.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_rest.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,80 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.sbapp.rest.
+
+$Id: test_rest.py 4962 2005-09-12 21:53:17Z srichter $
+"""
+from StringIO import StringIO
+
+from zope.testing import doctest
+import unittest
+
+
+def doctest_restSchoolBellSubscriber():
+    """
+    This event subscriber will mark the request with the
+    ISchoolBellRequest interface once the SchoolTool application is
+    traversed.  This interface will be used in order to override SB
+    REST views.
+
+        >>> from schooltool.sbapp.rest import restSchoolBellSubscriber
+        >>> from schooltool.sbapp.rest import ISchoolBellRequest
+        >>> from zope.app.publication.interfaces import BeforeTraverseEvent
+        >>> from zope.publisher.http import HTTPRequest
+
+    On an arbitrary object, the subscriber does nothing:
+
+        >>> context = object()
+        >>> request = HTTPRequest(StringIO(), {})
+        >>> event = BeforeTraverseEvent(context, request)
+        >>> restSchoolBellSubscriber(event)
+        >>> ISchoolBellRequest.providedBy(request)
+        False
+
+    However, if the object is a SchoolToolApplication, the request is
+    marked as an ISchoolBellRequest.
+
+        >>> from schooltool.app.app import SchoolToolApplication
+        >>> context = SchoolToolApplication()
+        >>> event = BeforeTraverseEvent(context, request)
+        >>> restSchoolBellSubscriber(event)
+        >>> ISchoolBellRequest.providedBy(request)
+        True
+
+    Even if the object is a SchoolToolApplication, the request is
+    unchanged if it is a browser request:
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> context = SchoolToolApplication()
+        >>> request = TestRequest()
+        >>> event = BeforeTraverseEvent(context, request)
+        >>> restSchoolBellSubscriber(event)
+        >>> ISchoolBellRequest.providedBy(request)
+        False
+
+    """
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/rest/tests/test_rest.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/tests/empty.conf
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/tests/empty.conf	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/tests/empty.conf	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2 @@
+<zodb>
+</zodb>

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/tests/sample.conf
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/tests/sample.conf	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/tests/sample.conf	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,19 @@
+path /xxxxx
+path /yyyyy/zzzzz
+module schooltool.tests.test_main
+listen 123
+listen 10.20.30.40:9999
+web 48080
+rest 47001
+listen_ssl 10.20.30.41:10000
+web_ssl 48081
+ssl_certificate moon.pem
+thread-pool-size 42
+domain schoolbell
+lang lt_LT
+app-log-file app.log
+<zodb>
+  <mappingstorage>
+  </mappingstorage>
+</zodb>
+devmode on
\ No newline at end of file

Added: schooltool/branches/upstream/current/src/schooltool/sbapp/tests/test_main.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/sbapp/tests/test_main.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/sbapp/tests/test_main.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,314 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.sbapp.main.
+
+$Id: test_main.py 6504 2006-11-30 12:19:39Z ignas $
+"""
+
+import os
+import sys
+import unittest
+
+from zope.testing import doctest
+
+
+def doctest_Options():
+    """Tests for Options.
+
+    The only interesting thing Options does is find the default configuration
+    file.
+
+        >>> from schooltool.sbapp.main import Options
+        >>> options = Options()
+        >>> options.config_file
+        '...schoolbell.conf...'
+
+    """
+
+def doctest_main():
+    """Tests for main().
+
+    Main does nothing more but configures SchoolTool, prints the startup time,
+    and starts the main loop.
+
+    Since we don't want to actually create disk files and start a web server in
+    a test, we will set up some stubs.
+
+        >>> from schooltool.sbapp.main import Options
+        >>> options = Options()
+        >>> class ConfigStub:
+        ...     pid_file = ''
+        >>> options.config = ConfigStub()
+
+        >>> def load_options_stub(argv):
+        ...     return options
+        >>> def setup_stub(opts):
+        ...     print "Performing setup..."
+        ...     assert opts is options
+        >>> def run_stub():
+        ...     print "Running..."
+        >>> def before_run_stub(options, db):
+        ...     print "before Running..."
+        >>> def after_run_stub(options):
+        ...     print "after Running..."
+        >>> from schooltool.app import main
+        >>> from schooltool.sbapp.main import StandaloneServer
+        >>> server = StandaloneServer()
+        >>> old_run = main.run
+        >>> server.load_options = load_options_stub
+        >>> server.setup = setup_stub
+        >>> server.beforeRun = before_run_stub
+        >>> server.afterRun = after_run_stub
+        >>> main.run = run_stub
+
+    Now we will run main().
+
+        >>> server.main(['sb.py', '-d'])
+        Performing setup...
+        Startup time: ... sec real, ... sec CPU
+        Running...
+
+    Clean up
+
+        >>> main.run = old_run
+
+    """
+
+
+def doctest_load_options():
+    """Tests for load_options().
+
+    We will use a sample configuration file that comes with these tests.
+
+        >>> from schooltool.sbapp import tests
+        >>> test_dir = os.path.dirname(tests.__file__)
+        >>> sample_config_file = os.path.join(test_dir, 'sample.conf')
+        >>> empty_config_file = os.path.join(test_dir, 'empty.conf')
+
+    load_options will report errors to stderr.  We need to temporarily
+    redirect stderr to stdout, because otherwise doctests will not see the
+    output.
+
+        >>> old_stderr = sys.stderr
+        >>> sys.stderr = sys.stdout
+
+    Load options parses command line arguments and the configuration file.
+    Warnings about obsolete options are shown.
+
+        >>> from schooltool.sbapp.main import StandaloneServer
+        >>> server = StandaloneServer()
+        >>> o = server.load_options(['sb.py', '-c', sample_config_file,
+        ...                          '-r schooltool'])
+        Reading configuration from ...sample.conf
+
+    Some options come from the command line
+
+        >>> o.config_file
+        '...sample.conf'
+        >>> o.daemon
+        False
+        >>> o.restore_manager
+        True
+
+    Some come from the config file
+
+        >>> o.config.web in ([('', 48080)],          # Unix
+        ...                  [('localhost', 48080)]) # Windows
+        True
+        >>> o.config.rest in ([('', 47001)],          # Unix
+        ...                  [('localhost', 47001)])  # Windows
+        True
+        >>> o.config.listen
+        [('...', 123), ('10.20.30.40', 9999)]
+
+    Note that "listen 123" in config.py produces ('localhost', 123) on
+    Windows, but ('', 123) on other platforms.
+
+    The developer mode can also be turned on via the configuration file:
+
+        >>> o.config.devmode
+        True
+
+    `load_options` can also give you a nice help message and exit with status
+    code 0.
+
+        >>> try:
+        ...     o = server.load_options(['sb.py', '-h'])
+        ... except SystemExit, e:
+        ...     print '[exited with status %s]' % e
+        Usage: sb.py [options]
+        Options:
+          -c, --config xxx       use this configuration file instead of the default
+          -h, --help             show this help message
+          -d, --daemon           go to background after starting
+          -r, --restore-manager password
+                                 restore the manager user with the provided password
+                                 (read password from the standart input if 'password'
+                                 is '-')
+          --manage               only do management tasks, don't run the server
+        [exited with status 0]
+
+    Here's what happens, when you use an unknown command line option.
+
+        >>> try:
+        ...     o = server.load_options(['sb.py', '-q'])
+        ... except SystemExit, e:
+        ...     print '[exited with status %s]' % e
+        sb.py: option -q not recognized
+        Run sb.py -h for help.
+        [exited with status 1]
+
+    Here's what happens when the configuration file cannot be found
+
+        >>> try:
+        ...     o = server.load_options(['sb.py', '-c', 'nosuchfile'])
+        ... except SystemExit, e:
+        ...     print '[exited with status %s]' % e
+        Reading configuration from nosuchfile
+        sb.py: error opening file ...nosuchfile: ...
+        [exited with status 1]
+
+    Here's what happens if you do not specify a storage section in the
+    configuration file.
+
+        >>> try:
+        ...     o = server.load_options(['sb.py', '-c', empty_config_file])
+        ... except SystemExit, e:
+        ...     print '[exited with status %s]' % e
+        Reading configuration from ...empty.conf
+        sb.py: No storage defined in the configuration file.
+        <BLANKLINE>
+        If you're using the default configuration file, please edit it now and
+        uncomment one of the ZODB storage sections.
+        [exited with status 1]
+
+    Cleaning up.
+
+        >>> sys.stderr = old_stderr
+
+    """
+
+
+def doctest_setup():
+    """Tests for setup()
+
+    setup() does everything except enter the main application loop:
+
+    - sets up loggers
+    - configures Zope 3 components
+    - opens the database
+    - starts tcp servers
+
+    It is difficult to unit test, but we'll try.
+
+        >>> from zope.testing import cleanup
+        >>> cleanup.setUp()
+
+        >>> from schooltool.sbapp.main import Options, StandaloneServer
+        >>> from ZODB.MappingStorage import MappingStorage
+        >>> from ZODB.DB import DB
+        >>> options = Options()
+        >>> class DatabaseConfigStub:
+        ...     def open(self):
+        ...         return DB(MappingStorage())
+        >>> class ConfigStub:
+        ...     web = []
+        ...     rest = []
+        ...     listen = []
+        ...     thread_pool_size = 1
+        ...     database = DatabaseConfigStub()
+        ...     pid_file = ''
+        ...     path = []
+        ...     error_log_file = ['STDERR']
+        ...     web_access_log_file = ['STDOUT']
+        ...     attendance_log_file = ['STDOUT']
+        ...     lang = 'lt'
+        ...     reportlab_fontdir = ''
+        ...     devmode = True
+        ...     site_definition = 'schoolbell-site.zcml'
+        >>> options.config = ConfigStub()
+
+    Workaround to fix a Windows failure:
+
+        >>> import logging
+        >>> del logging.getLogger(None).handlers[:]
+
+    And go!
+
+        >>> server = StandaloneServer()
+        >>> server.setup(options)
+        <ZODB.DB.DB object at ...>
+
+    A web access logger has been set up:
+
+        >>> logger1 = logging.getLogger('accesslog')
+        >>> logger1.propagate
+        False
+        >>> logger1.handlers
+        [<logging.StreamHandler instance at 0x...>]
+
+    A generic access logger has been set up too:
+
+        >>> logger2 = logging.getLogger(None)
+        >>> logger2.handlers
+        [<logging.StreamHandler instance at 0x...>]
+
+    As well as an attendance access logger:
+
+        >>> logger3 = logging.getLogger('attendance')
+        >>> logger3.handlers
+        [<logging.StreamHandler instance at 0x...>]
+
+    A custom language adapter has been installed:
+
+        >>> from zope.i18n.interfaces import IUserPreferredLanguages
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> IUserPreferredLanguages(request).getPreferredLanguages()
+        ('lt',)
+
+    ZODB.lock_file has been shut up:
+
+        >>> logging.getLogger('ZODB.lock_file').disabled
+        True
+
+    We better clean up logging before we leave:
+
+        >>> logging.getLogger('ZODB.lock_file').disabled = False
+        >>> for logger in [logger1, logger2, logger3]:
+        ...     del logger.handlers[:]
+        ...     logger.propagate = True
+        ...     logger.disabled = False
+
+        >>> for logger in [logger1, logger3]:
+        ...     logger.setLevel(0)
+
+        >>> cleanup.tearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(optionflags=doctest.ELLIPSIS),
+           ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/sbapp/tests/test_main.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,135 @@
+SchoolTool Security Policy
+==========================
+
+SchoolTool does not use the default Zope 3 security policy, but implements
+a custom one.
+
+The most important difference from the default policy is that we do not have
+the three-tier group-role-permission model (i.e, a principal can belong to a
+group, roles can be assigned to a group or a principal, and permissions can be
+assigned to a role).  Instead, we have a two-tier crowd-permission model.
+
+Notably local grants have also been removed, although it is easy to implement
+similar functionality using crowds.
+
+Crowds
+------
+
+A crowd is somewhat like a group of principals.  While a group is an explicitly
+enumerated set of principals (mathematically speaking, g={a,b,c,d}), a crowd is
+a set of principals defined by a membership operation (mathematically speaking,
+c={x | P(x)}.  The advantage of using crowds is that unlike groups, which are
+static, crowds can also react to context objects.  For example, you could have
+an 'owner' crowd which only includes the accessing principal if he is looking
+at an object that 'belongs' to him.  Therefore, for different context objects
+the same crowd could include different principals.
+
+
+Implementing crowds
+-------------------
+
+In Python code, a crowd is an adapter which adapts a context object to ICrowd.
+The ICrowd interface only includes one method: contains(principal).
+The context object is the object that we want to access.  A crowd could look
+like this:
+
+    >>> from schooltool.securitypolicy.crowds import Crowd
+    >>> class OwnerCrowd(Crowd):
+    ...     def contains(self, principal):
+    ...         owner = self.context.owner
+    ...         return owner == principal
+
+
+Registering crowds
+------------------
+
+Crowds are registered in ZCML using the <crowd> directive, like this:
+
+  <security:crowd
+      name="owner"
+      factory=".crowds.OwnerCrowd" />
+
+(We are using the namespace http://schooltool.org/securitypolicy for the
+security XML prefix.)
+
+As you can see, the crowd is assigned an identifier which can later be used
+in security declarations for objects.
+
+
+Using crowds
+------------
+
+Just declaring a crowd is obviously not enough.  You also have to specify
+which crowds have what permissions on which objects.  You can do this
+in ZCML like this:
+
+  <security:allow
+      interface="schooltool.app.interfaces.ISchoolToolApplication"
+      crowds="owner managers clerks"
+      permission="schooltool.edit" />
+
+The set of objects that should be adaptable by the crowds are specified by
+interface.  The `crowds` attribute provides a list of crowd ids.If any of the
+crowds includes the accessing principal, permission is granted, otherwise it is
+denied.
+
+You can have several <allow> directives for the same interface and permission.
+In that case the lists of crowds will be summed.
+
+In some cases it makes sense to provide a permission to a crowd no matter
+what the context interface is.  In that case you can just leave the `interface`
+attribute out, like this:
+
+  <security:allow
+      crowds="owner managers clerks"
+      permission="schooltool.edit" />
+
+
+Inheriting permissions
+----------------------
+
+It is sometimes not feasible to specify crowds for each and every object, and
+the Zope3-style parent traversal would be handy.  This is particularly useful
+for permissions on views, which typically have the context object as their
+parent.  A limited form of such traversal has been implemented.
+
+Basically, if no <allow> declaration (with an explicit interface) is found
+for an object, the object's parent is taken (from the attribute `__parent__`).
+If the parent does not have a matching <allow> declaration either, its parent
+is taken, etc., until a matching declaration is found.  Note that at this
+point the traversal upwards is not continued no matter whether the principal
+was in the given crowds or not.
+
+For example, imagine this structure:
+
+Application -> GroupContainer -> Group -> GroupView
+
+Here, if one <allow> directive allowed access to the group container, but
+another one disallowed access to the group, accessing GroupView would fail:
+
+1. GroupView would be checked, no matching declarations would be found
+2. Its parent Group would be checked, a matching declaration would be found.
+3. The crowds in the declaration would be checked and access denied
+4. There is no step 4.  Note that even though step 3 did not grant access,
+   traversal to the parent is not continued.
+
+
+Permission lookup order
+-----------------------
+
+Here is a brief summary of how a permission is checked:
+
+1. All crowds for a permission (specified as <allow> directives without an
+explicit interface) are checked.  If any one contains the principal, permit
+access.
+
+2. While an <allow> directive with an explicit interface is not found for the
+context object, take the context's parent.
+
+3. If the principal is in any of the crowds specified in the matching <allow>
+directive, permit access.
+
+4. If neither of the previous steps permit access, deny.
+
+(see schooltool.securitypolicy.policy.SchoolToolSecurityPolicy for the
+implementation)


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <page
+      name="access_control.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      class=".views.AccessControlView"
+      template="templates/access_control.pt"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Access Control"
+      />
+
+  <configure package="schooltool.skin">
+    <navigationViewlet
+        name="access_control_customisation"
+        for="*"
+        manager="schooltool.skin.INavigationManager"
+        template="templates/navigationViewlet.pt"
+        class="schooltool.skin.NavigationViewlet"
+        permission="schooltool.edit"
+        link="access_control.html"
+        title="Access Control"
+        order="100"
+        />
+  </configure>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/helpers.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/helpers.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/helpers.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,462 @@
+"""
+Helper functions for functional tests.
+
+$Id: helpers.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+from zope.security.interfaces import Unauthorized
+from mechanize import LinkNotFoundError
+
+def person_container_view(browser, subject):
+    browser.open('http://localhost/persons')
+    if subject in browser.contents:
+        return True
+
+def person_container_edit(browser, subject):
+    person_container_view(browser, subject)
+    return browser.getControl('Delete')
+
+
+def person_data_view(browser, subject):
+    browser.open('http://localhost/persons/%s/' % subject)
+    return 'name info' in browser.contents
+
+def person_data_edit(browser, subject):
+    browser.open('http://localhost/persons/%s/@@edit.html' % subject)
+    ctrl = browser.getControl('Preferred name')
+    ctrl.value = ctrl.value + ' ook'
+    browser.getControl('Apply', index=0).click()
+    return 'Updated' in browser.contents
+
+
+def person_calendar_view(browser, subject):
+    browser.open('http://localhost/persons/%s/calendar' % subject)
+    return 'Calendar for' in browser.contents
+
+def person_calendar_edit(browser, subject):
+    person_calendar_view(browser, subject)
+    browser.getLink('9:00').click()
+    browser.getControl('Title').value = 'Test event'
+    browser.getControl('Add').click()
+    return 'Calendar for' in browser.contents
+
+
+def gradebook_scores_view(browser, section):
+    browser.open('http://localhost/sections/%s' % section)
+    browser.getLink('Gradebook').click()
+    return 'SchoolTool origin' in browser.contents
+
+def gradebook_scores_edit(browser, section):
+    gradebook_scores_view(browser, section)
+    browser.getLink('SchoolTool origin').click()
+    browser.getControl(name='student1').value = '2'
+    browser.getControl('Update').click()
+    return 'SchoolTool origin' in browser.contents
+
+
+def section_attendance_view(browser, section):
+    browser.open('http://localhost/sections/%s/attendance/2005-09-12/09:30-10:25' % section)
+    return 'Section attendance' in browser.contents
+
+def section_attendance_edit(browser, section):
+    section_attendance_view(browser, section)
+    browser.getControl('Submit').click()
+    return 'Section attendance' in browser.contents
+
+
+def person_attendance_view(browser, subject):
+    browser.open('http://localhost/persons/%s/@@attendance.html' % subject)
+    return 'Attendance of' in browser.contents
+
+def person_attendance_edit(browser, subject):
+    return False
+
+
+def calendar_overlays_edit(browser, subject):
+    browser.open('http://localhost/persons/%s/calendar' % subject)
+    browser.getControl('Apply').click()
+    browser.getControl('More...').click()
+    browser.getControl('SchoolTool site-wide calendar').click()
+    browser.getControl('Apply').click()
+    return 'Calendar for' in browser.contents
+
+
+def person_preferences_view(browser, subject):
+    browser.open('http://localhost/persons/%s/preferences' % subject)
+    return 'Calendar Preferences' in browser.contents
+
+def person_preferences_edit(browser, subject):
+    person_preferences_view(browser, subject)
+    browser.getControl('Show periods').click()
+    browser.getControl('Apply').click()
+    browser.getControl('Show periods').click()
+    browser.getControl('Apply').click()
+    return 'Calendar Preferences' in browser.contents
+
+
+def group_container_view(browser):
+    browser.open('http://localhost/groups')
+    return 'Group index' in browser.contents
+
+def group_container_edit(browser):
+    group_container_view(browser)
+    browser.getLink('New Group').click()
+    browser.getControl('Title').value = 'Test Group'
+    browser.getControl('Identifier').value = 'testgroup'
+    browser.getControl('Add').click()
+    browser.getControl(name='delete.testgroup').value = True
+    browser.getControl('Delete').click()
+    browser.getControl('Confirm').click()
+    return 'Teachers' in browser.contents
+
+
+def group_data_view(browser):
+    browser.open('http://localhost/groups/teachers')
+    return 'Teachers' in browser.contents
+
+def group_data_edit(browser):
+    group_data_view(browser)
+    browser.getLink('edit members').click()
+    browser.getControl('Frog').click()
+    browser.getControl('Add').click()
+    browser.getControl('Frog').click()
+    browser.getControl('Remove').click()
+    return True
+
+
+def group_calendar_view(browser):
+    browser.open('http://localhost/groups/teachers/calendar')
+    return 'Calendar for' in browser.contents
+
+def group_calendar_edit(browser):
+    group_calendar_view(browser)
+    browser.getLink('9:00').click()
+    browser.getControl('Title').value = 'Test event'
+    browser.getControl('Add').click()
+    return 'Calendar for' in browser.contents
+
+
+def resource_container_view(browser):
+    browser.open('http://localhost/resources/')
+    return 'Resources' in browser.contents
+
+def resource_container_edit(browser):
+    resource_container_view(browser)
+    browser.getLink('New Resource').click()
+    browser.getControl('Title').value = 'Test Resource'
+    browser.getControl('Identifier').value = 'testresource'
+    browser.getControl('Add').click()
+    browser.getControl('Type').value = ['resource|Resource']
+    browser.getControl('Search').click()
+    browser.getControl(name='delete.testresource').value = True
+    browser.getControl('Delete').click()
+    browser.getControl('Confirm').click()
+    browser.getControl('Type').value = ['resource|Resource']
+    browser.getControl('Search').click()
+    return 'Time travel machine' in browser.contents
+
+
+def resource_data_view(browser):
+    browser.open('http://localhost/resources/ttm')
+    return 'Time travel machine' in browser.contents
+
+def resource_data_edit(browser):
+    resource_data_view(browser)
+    browser.getLink('Edit Info').click()
+    ctrl = browser.getControl('Description')
+    ctrl.value = ctrl.value + 'broken. '
+    browser.getControl('Apply').click()
+    return True
+
+
+def resource_calendar_view(browser):
+    browser.open('http://localhost/resources/ttm/calendar')
+    return 'Calendar for' in browser.contents
+
+def resource_calendar_edit(browser):
+    resource_calendar_view(browser)
+    browser.getLink('9:00').click()
+    browser.getControl('Title').value = 'Test event'
+    browser.getControl(name='UPDATE_SUBMIT').click()
+    return 'Calendar for' in browser.contents
+
+
+def section_view(browser):
+    browser.open('http://localhost/sections/history6a')
+    return 'Section of' in browser.contents
+
+def section_edit(browser):
+    section_view(browser)
+    browser.getLink('edit individuals').click()
+    browser.getControl('Student3').click()
+    browser.getControl('Add').click()
+    browser.getControl('Student3').click()
+    browser.getControl('Remove').click()
+    return True
+
+
+def section_activities_view(browser):
+    section_view(browser)
+    browser.getLink('Activities').click()
+    return 'Activities' in browser.contents
+
+def section_activities_edit(browser):
+    section_activities_view(browser)
+    browser.getLink('New Activity').click()
+    browser.getControl('Title').value = 'Natural History'
+    browser.getControl('Identifier').value = 'nathist'
+    browser.getControl('Custom score system').click()
+    browser.getControl('Add').click()
+    browser.getControl(name='delete:list').value = ['nathist']
+    browser.getControl('Delete').click()
+    return 'Activities' in browser.contents
+
+
+def section_calendar_view(browser):
+    browser.open('http://localhost/sections/history6a/calendar')
+    return 'Calendar for' in browser.contents
+
+def section_calendar_edit(browser):
+    section_calendar_view(browser)
+    browser.getLink('9:00').click()
+    browser.getControl('Title').value = 'Test event'
+    browser.getControl('Add').click()
+    return 'Calendar for' in browser.contents
+
+
+def course_view(browser):
+    browser.open('http://localhost/courses')
+    browser.getLink('History 6').click()
+    return 'History 6' in browser.contents
+
+def course_edit(browser):
+    course_view(browser)
+    try:
+        browser.getLink('Edit Leaders').click()
+    except LinkNotFoundError:
+        return False
+    browser.getControl('Frog').click()
+    browser.getControl('Add').click()
+    browser.getControl('Frog').click()
+    browser.getControl('Remove').click()
+    return 'History 6' in browser.contents
+
+
+def course_activities_view(browser):
+    browser.open('http://localhost/courses/history6/activities')
+    return 'Activities' in browser.contents
+
+def course_activities_edit(browser):
+    course_activities_view(browser)
+    try:
+        browser.getLink('New Activity').click()
+    except LinkNotFoundError:
+        return False
+    browser.getControl('Title').value = 'Natural History'
+    browser.getControl('Identifier').value = 'nathist'
+    browser.getControl('Custom score system').click()
+    browser.getControl('Add').click()
+    browser.getControl(name='delete:list').value = ['nathist']
+    browser.getControl('Delete').click()
+    return 'Activities' in browser.contents
+
+
+def schooltool_view(browser):
+    browser.open('http://localhost/')
+    return 'SchoolTool' in browser.contents
+
+
+def schooltool_info_view(browser):
+    browser.open('http://localhost/persons/manager/@@site-preferences.html')
+    return 'Change site preferences' in browser.contents
+
+def schooltool_info_edit(browser):
+    schooltool_info_view(browser)
+    browser.getControl('Title').value = 'ToolSchool'
+    browser.getControl('Apply').click()
+    browser.getControl('Title').value = 'SchoolTool'
+    browser.getControl('Apply').click()
+    return True
+
+
+def schooltool_calendar_view(browser):
+    schooltool_view(browser)
+    return 'Calendar for SchoolTool' in browser.contents
+
+def schooltool_calendar_edit(browser):
+    schooltool_calendar_view(browser)
+    browser.getLink('9:00').click()
+    try:
+        browser.getControl('Title').value = 'Test event'
+    except LookupError:
+        return False # XXX is this right? -- gintas
+    browser.getControl('Add').click()
+    return 'Calendar for' in browser.contents
+
+
+def timetables_view(browser):
+    browser.open('http://localhost/ttschemas')
+    return 'School Timetables' in browser.contents
+
+def timetables_edit(browser):
+    timetables_view(browser)
+    try:
+        browser.getLink('New Timetable').click()
+    except LinkNotFoundError:
+        return False
+    browser.getControl('Title').value = 'test timetable'
+    browser.getControl('Next').click()
+    browser.getControl('Days of the week').click()
+    browser.getControl('Same time each day').click()
+    browser.getControl('Next').click()
+    browser.getControl('Designated by time').click()
+    browser.getControl('No').click()
+    return 'School Timetables' in browser.contents
+
+
+def level_view(browser):
+    browser.open('http://localhost/levels')
+    browser.getLink('Levels').click()
+    return 'Level index' in browser.contents
+
+def level_edit(browser):
+    level_view(browser)
+    browser.getLink('New Level').click()
+    browser.getControl('Title').value = 'Bonus level'
+    browser.getControl('Identifier').value = 'bonuslevel'
+    browser.getControl('Add').click()
+    browser.getControl(name='delete.bonuslevel').value = True
+    browser.getControl('Delete').click()
+    browser.getControl('Confirm').click()
+    return 'Level index' in browser.contents
+
+
+def permissions_view(browser):
+    browser.open('http://localhost/access_control.html')
+    return 'Everyone can view the application calendar' in browser.contents
+
+def permissions_edit(browser):
+    permissions_view(browser)
+    browser.getControl('Everyone can view the application calendar').click()
+    browser.getControl('Apply').click()
+    browser.getControl('Everyone can view the application calendar').click()
+    browser.getControl('Apply').click()
+    return 'Everyone can view the application calendar' in browser.contents
+
+
+def term_view(browser):
+    browser.open('http://localhost/terms')
+    return 'Terms' in browser.contents # XXX not too specific -- gintas
+
+def term_edit(browser):
+    term_view(browser)
+    browser.getLink('New Term').click()
+    browser.getControl('Title').value = 'SchoolTool summer term'
+    browser.getControl('Start date').value = '2006-06-01'
+    browser.getControl('End date').value = '2006-09-01'
+    browser.getControl('Next').click()
+    browser.getControl('Add term').click()
+    return 'SchoolTool summer term' in browser.contents
+
+
+def do_test(func, *args):
+    try:
+        return bool(func(*args))
+    except Unauthorized, e:
+        return False
+    except Exception, e:
+        pass # XXX to be removed -- gintas
+#        import sys
+#        print >> sys.stderr, 'Failed:', func, args, e.__class__
+
+
+def raw_column(browser, subject, section):
+    result = {'person container': (
+              do_test(person_container_view, browser, subject),
+              do_test(person_container_edit, browser, subject)),
+              'person data': (
+              do_test(person_data_view, browser, subject),
+              do_test(person_data_edit, browser, subject)),
+              'person calendar': (
+              do_test(person_calendar_view, browser, subject),
+              do_test(person_calendar_edit, browser, subject)),
+              'gradebook scores': (
+              do_test(gradebook_scores_view, browser, section),
+              do_test(gradebook_scores_edit, browser, section)),
+              'section attendance': (
+              do_test(section_attendance_view, browser, section),
+              do_test(section_attendance_edit, browser, section)),
+              'person attendance': (
+              do_test(person_attendance_view, browser, subject),
+              do_test(person_attendance_edit, browser, subject)),
+              'overlay calendar': (
+              None,
+              do_test(calendar_overlays_edit, browser, subject)),
+              'person preferences': (
+              do_test(person_preferences_view, browser, subject),
+              do_test(person_preferences_edit, browser, subject)),
+              'group container': (
+              do_test(group_container_view, browser),
+              do_test(group_container_edit, browser)),
+              'group data': (
+              do_test(group_data_view, browser),
+              do_test(group_data_edit, browser)),
+              'group calendar': (
+              do_test(group_calendar_view, browser),
+              do_test(group_calendar_edit, browser)),
+              'resource container': (
+              do_test(resource_container_view, browser),
+              do_test(resource_container_edit, browser)),
+              'resource data': (
+              do_test(resource_data_view, browser),
+              do_test(resource_data_edit, browser)),
+              'resource calendar': (
+              do_test(resource_calendar_view, browser),
+              do_test(resource_calendar_edit, browser)),
+              'section': (
+              do_test(section_view, browser),
+              do_test(section_edit, browser)),
+              'section activities': (
+              do_test(section_activities_view, browser),
+              do_test(section_activities_edit, browser)),
+              'section calendar': (
+              do_test(section_calendar_view, browser),
+              do_test(section_calendar_edit, browser)),
+              'course': (
+              do_test(course_view, browser),
+              do_test(course_edit, browser)),
+              'course activities': (
+              do_test(course_activities_view, browser),
+              do_test(course_activities_edit, browser)),
+              'schooltool': (
+              do_test(schooltool_view, browser),
+              None),
+              'schooltool info': (
+              do_test(schooltool_info_view, browser),
+              do_test(schooltool_info_edit, browser)),
+              'schooltool calendar': (
+              do_test(schooltool_calendar_view, browser),
+              do_test(schooltool_calendar_edit, browser)),
+              'timetables': (
+              do_test(timetables_view, browser),
+              do_test(timetables_edit, browser)),
+              'level': (
+              do_test(level_view, browser),
+              do_test(level_edit, browser)),
+              'term': (
+              do_test(term_view, browser),
+              do_test(term_edit, browser)),
+              'permissions': (
+              do_test(permissions_view, browser),
+              do_test(permissions_edit, browser)),
+              }
+    return result
+
+
+def column(browser, subject, section):
+    result = raw_column(browser, subject, section)
+    for name, (view, edit) in sorted(result.items()):
+        sview = view and 'view' or ''
+        sedit = edit and 'edit' or ''
+        out = '%-20s %-5s %-5s' % (name + ':', sview, sedit)
+        print out.strip()


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/helpers.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/policy_table.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/policy_table.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/policy_table.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,529 @@
+Functional doctest for schooltool security policy
+=================================================
+
+This test verifies the security policy.
+
+Set up
+------
+
+We will obviously need a SchoolTool instance.
+
+    >>> from schooltool.app.browser.ftests import setup
+    >>> from schooltool.securitypolicy.browser.ftests.helpers import column
+    >>> from schooltool.securitypolicy.browser.ftests.helpers import do_test
+    >>> from schooltool.securitypolicy.browser.ftests import helpers
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = setup.logInManager()
+
+    >>> 'SchoolTool' in manager.contents
+    True
+
+Let's create some persons:
+
+    >>> from schooltool.demographics.browser.ftests import addPerson
+    >>> addPerson('Student1', 'student1', 'student1', groups=['students'])
+    >>> addPerson('Student2', 'student2', 'student2', groups=['students'])
+    >>> addPerson('Student3', 'student3', 'student3', groups=['students'])
+    >>> addPerson('Teacher1', 'teacher1', 'teacher1', groups=['teachers'])
+    >>> addPerson('Teacher2', 'teacher2', 'teacher2', groups=['teachers'])
+    >>> addPerson('Teacher3', 'teacher3', 'teacher3', groups=['teachers'])
+
+    >>> addPerson('Frog', 'instructor1', 'instructor1')
+    >>> setup.setUpTimetabling('instructor1')
+
+Section and resources:
+
+    >>> manager.getLink('SchoolTool').click()
+    >>> manager.getLink('Resources').click()
+    >>> manager.getLink('New Resource').click()
+    >>> manager.getControl('Title').value = 'Time travel machine'
+    >>> manager.getControl('Identifier').value = 'ttm'
+    >>> manager.getControl('Add').click()
+
+    >>> manager.getLink('Sections').click()
+    >>> manager.getLink('history-6a').click()
+    >>> manager.getLink('edit individuals').click()
+    >>> manager.getControl('Student1').click()
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('history-6a').click()
+    >>> manager.getLink('book resources').click()
+    >>> manager.getControl('Time travel machine').click()
+    >>> manager.getControl('Add').click()
+
+Set up activities and put marks:
+
+    >>> manager.getLink('SchoolTool').click()
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('History 6').click()
+    >>> manager.getLink('history-6a').click()
+    >>> manager.getLink('Activities').click()
+    >>> manager.getLink('New Activity').click()
+    >>> manager.getControl('Title').value = 'SchoolTool origin'
+    >>> manager.getControl('Custom score system').click()
+    >>> manager.getControl('Minimum').value = '1'
+    >>> manager.getControl('Maximum').value = '5'
+    >>> manager.getControl('Identifier').value = 'storig'
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('history-6a').click()
+    >>> manager.getLink('Gradebook').click()
+    >>> manager.getLink('SchoolTool origin').click()
+    Traceback (most recent call last):
+    ...
+    Unauthorized: ...
+
+Administration can't grade students by default, but can give itself
+the permission to do it:
+
+    >>> manager.open('http://localhost')
+    >>> manager.getLink('Access Control').click()
+    >>> manager.getControl('Administration can grade students').click()
+    >>> manager.getControl('Apply').click()
+
+And try again:
+
+    >>> manager.getLink('SchoolTool').click()
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('History 6').click()
+    >>> manager.getLink('history-6a').click()
+    >>> manager.getLink('Gradebook').click()
+    >>> manager.getLink('SchoolTool origin').click()
+    >>> manager.getControl(name='student1').value = '8'
+    >>> manager.getControl('Update').click()
+
+Let's set the setting back to cover our tracks:
+
+    >>> manager.getLink('Access Control').click()
+    >>> manager.getControl('Administration can grade students').click()
+    >>> manager.getControl('Apply').click()
+
+Set up leader for everything:
+
+    >>> manager.open('http://localhost/')
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('Teachers').click()
+    >>> manager.getLink('Edit Leaders').click()
+    >>> manager.getControl('Teacher2').click()
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('Resources').click()
+    >>> manager.getControl('Type').value = ['resource|Resource']
+    >>> manager.getControl('Search').click()
+    >>> manager.getLink('Time travel machine').click()
+    >>> manager.getLink('Edit Leaders').click()
+    >>> manager.getControl('Teacher2').click()
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('History 6').click()
+    >>> manager.getLink('Edit Leaders').click()
+    >>> manager.getControl('Teacher2').click()
+    >>> manager.getControl('Add').click()
+
+Manager can see almost everything:
+
+    >>> column(manager, 'student1', 'history6a')
+    course:              view  edit
+    course activities:   view  edit
+    gradebook scores:    view
+    group calendar:      view  edit
+    group container:     view  edit
+    group data:          view  edit
+    level:               view  edit
+    overlay calendar:
+    permissions:         view  edit
+    person attendance:   view
+    person calendar:     view  edit
+    person container:    view  edit
+    person data:         view  edit
+    person preferences:  view  edit
+    resource calendar:   view  edit
+    resource container:  view  edit
+    resource data:       view  edit
+    schooltool:          view
+    schooltool calendar: view  edit
+    schooltool info:     view  edit
+    section:             view  edit
+    section activities:  view  edit
+    section attendance:  view  edit
+    section calendar:    view  edit
+    term:                view  edit
+    timetables:          view  edit
+
+Create anonymous browser:
+
+    >>> alien = Browser()
+    >>> alien.handleErrors = False
+    >>> alien.open('http://localhost/')
+    >>> column(alien, 'student1', 'history6a')
+    course:              view
+    course activities:   view
+    gradebook scores:
+    group calendar:
+    group container:
+    group data:
+    level:               view
+    overlay calendar:
+    permissions:
+    person attendance:
+    person calendar:
+    person container:
+    person data:
+    person preferences:
+    resource calendar:
+    resource container:
+    resource data:
+    schooltool: view
+    schooltool calendar: view
+    schooltool info:
+    section:
+    section activities:
+    section attendance:
+    section calendar:
+    term: view
+    timetables:          view
+
+Student looking at another student:
+
+    >>> student1 = setup.logIn('student1', 'student1')
+    >>> column(student1, 'student2', 'history6a')
+    course:              view
+    course activities:   view
+    gradebook scores:
+    group calendar:
+    group container:
+    group data:
+    level:               view
+    overlay calendar:
+    permissions:
+    person attendance:
+    person calendar:
+    person container:
+    person data:
+    person preferences:
+    resource calendar:   view
+    resource container:  view
+    resource data:       view
+    schooltool:          view
+    schooltool calendar: view
+    schooltool info:
+    section:             view
+    section activities:  view
+    section attendance:
+    section calendar:    view
+    term:                view
+    timetables:          view
+
+Student looking at himself (his section):
+
+    >>> column(student1, 'student1', 'history6a')
+    course:              view
+    course activities:   view
+    gradebook scores:
+    group calendar:
+    group container:
+    group data:
+    level:               view
+    overlay calendar:          edit
+    permissions:
+    person attendance:   view
+    person calendar:     view  edit
+    person container:
+    person data:         view
+    person preferences:  view  edit
+    resource calendar:   view
+    resource container:  view
+    resource data:       view
+    schooltool:          view
+    schooltool calendar: view
+    schooltool info:
+    section:             view
+    section activities:  view
+    section attendance:
+    section calendar:    view
+    term:                view
+    timetables:          view
+
+Student looking at another student and not his section:
+
+    >>> student2 = setup.logIn('student2', 'student2')
+    >>> column(student2, 'student1', 'history6a')
+    course:              view
+    course activities:   view
+    gradebook scores:
+    group calendar:
+    group container:
+    group data:
+    level:               view
+    overlay calendar:
+    permissions:
+    person attendance:
+    person calendar:
+    person container:
+    person data:
+    person preferences:
+    resource calendar:   view
+    resource container:  view
+    resource data:       view
+    schooltool:          view
+    schooltool calendar: view
+    schooltool info:
+    section:
+    section activities:
+    section attendance:
+    section calendar:
+    term:                view
+    timetables:          view
+
+Instructor looking at his student and section:
+
+    >>> instructor = setup.logIn('instructor1', 'instructor1')
+    >>> column(instructor, 'student1', 'history6a')
+    course:              view
+    course activities:   view
+    gradebook scores:    view  edit
+    group calendar:
+    group container:
+    group data:
+    level:               view
+    overlay calendar:
+    permissions:
+    person attendance:   view
+    person calendar:
+    person container:
+    person data:         view
+    person preferences:
+    resource calendar:   view
+    resource container:  view
+    resource data:       view
+    schooltool:          view
+    schooltool calendar: view
+    schooltool info:
+    section:             view  edit
+    section activities:  view  edit
+    section attendance:  view  edit
+    section calendar:    view  edit
+    term:                view
+    timetables:          view
+
+Group member:
+
+    >>> teacher3 = setup.logIn('teacher3', 'teacher3')
+    >>> column(teacher3, 'student1', 'history6a')
+    course:              view
+    course activities:   view
+    gradebook scores:
+    group calendar:      view
+    group container:
+    group data:          view
+    level:               view
+    overlay calendar:
+    permissions:
+    person attendance:
+    person calendar:
+    person container:
+    person data:
+    person preferences:
+    resource calendar:   view  edit
+    resource container:  view
+    resource data:       view
+    schooltool:          view
+    schooltool calendar: view
+    schooltool info:
+    section:
+    section activities:
+    section attendance:
+    section calendar:
+    term:                view
+    timetables:          view
+
+Leader stuff:
+
+    >>> leader = setup.logIn('teacher2', 'teacher2')
+    >>> column(leader, 'student1', 'history6a')
+    course:              view  edit
+    course activities:   view  edit
+    gradebook scores:
+    group calendar:      view  edit
+    group container:
+    group data:          view  edit
+    level:               view
+    overlay calendar:
+    permissions:
+    person attendance:
+    person calendar:
+    person container:
+    person data:
+    person preferences:
+    resource calendar:   view  edit
+    resource container:  view
+    resource data:       view  edit
+    schooltool:          view
+    schooltool calendar: view
+    schooltool info:
+    section:
+    section activities:
+    section attendance:
+    section calendar:
+    term:                view
+    timetables:          view
+
+
+Configurable options
+====================
+
+Make personal calendar public:
+
+    >>> student1.open('http://localhost')
+    >>> student1.getLink('Student1').click()
+    >>> student1.getLink('Change Preferences').click()
+    >>> student1.getControl('Make calendar public').click()
+    >>> student1.getControl('Apply').click()
+    >>> helpers.person_calendar_view(alien, 'student1')
+    True
+
+Site wide access control:
+
+    >>> manager.open('http://localhost/')
+    >>> manager.getLink('Access Control').click()
+
+    >>> manager.getControl('Everyone can view the application calendar').click()
+    >>> manager.getControl('Apply').click()
+    >>> do_test(helpers.schooltool_calendar_view, alien)
+    False
+
+    >>> manager.getControl('Everyone can view the application calendar').click()
+    >>> manager.getControl('Everyone can view section information and ').click()
+    >>> manager.getControl('Apply').click()
+    >>> column(alien, 'student1', 'history6a')
+    course:              view
+    course activities:   view
+    gradebook scores:
+    group calendar:
+    group container:
+    group data:
+    level:               view
+    overlay calendar:
+    permissions:
+    person attendance:
+    person calendar:     view
+    person container:
+    person data:
+    person preferences:
+    resource calendar:
+    resource container:
+    resource data:
+    schooltool:          view
+    schooltool calendar: view
+    schooltool info:
+    section:             view
+    section activities:  view
+    section attendance:
+    section calendar:    view
+    term:                view
+    timetables:          view
+
+    >>> manager.getControl('Everyone can view section information and ').click()
+
+#   >>> manager.getControl('Everyone can view group lists').click()
+#   >>> manager.getControl('Apply').click()
+#   >>> do_test(helpers.group_container_view, alien)
+#   True
+
+#   >>> manager.getControl('Everyone can view group lists').click()
+
+    >>> manager.getControl('Everyone can view group information').click()
+    >>> manager.getControl('Apply').click()
+    >>> do_test(helpers.group_data_view, alien)
+    True
+
+    >>> manager.getControl('Everyone can view group information').click()
+    >>> manager.getControl('Everyone can view group calendars').click()
+    >>> manager.getControl('Apply').click()
+    >>> do_test(helpers.group_calendar_view, alien)
+    True
+
+    >>> manager.getControl('Everyone can view group calendars').click()
+
+#   >>> manager.getControl('Everyone can view resource lists').click()
+#   >>> manager.getControl('Apply').click()
+#   >>> helpers.resource_container_view(alien)
+#   True
+
+#   >>> manager.getControl('Everyone can view resource lists').click()
+
+    >>> manager.getControl('Everyone can view resource information').click()
+    >>> manager.getControl('Apply').click()
+    >>> helpers.resource_data_view(alien)
+    True
+
+    >>> manager.getControl('Everyone can view resource information').click()
+
+    >>> manager.getControl('Everyone can view resource calendars').click()
+    >>> manager.getControl('Apply').click()
+    >>> helpers.resource_calendar_view(alien)
+    True
+
+    >>> manager.getControl('Everyone can view resource calendars').click()
+
+    >>> manager.getControl('Everyone can view the list of persons').click()
+    >>> manager.getControl('Apply').click()
+    >>> helpers.person_container_view(alien, 'student1')
+    True
+
+    >>> manager.getControl('Everyone can view the list of persons').click()
+
+    >>> manager.getControl('Everyone can view info of persons').click()
+    >>> manager.getControl('Apply').click()
+    >>> helpers.person_data_view(alien, 'student1')
+    True
+
+    >>> manager.getControl('Everyone can view info of persons').click()
+    >>> manager.getControl('Persons can set their own preferences').click()
+    >>> manager.getControl('Apply').click()
+    >>> do_test(helpers.person_preferences_view, student1, 'student1')
+    False
+
+XXX: preferences should be still viewable
+
+    >>> do_test(helpers.person_preferences_edit, student1, 'student1')
+    False
+
+    >>> manager.getControl('Persons can set their own preferences').click()
+    >>> manager.getControl('Group members can edit group calendars').click()
+    >>> manager.getControl('Apply').click()
+    >>> helpers.group_calendar_edit(teacher3)
+    True
+
+    >>> manager.getControl('Group members can edit group calendars').click()
+    >>> manager.getControl('Administration can grade students').click()
+    >>> manager.getControl('Apply').click()
+
+#   >>> helpers.gradebook_scores_edit(manager, 'history6a')
+#   True
+
+Instructor - section relations:
+
+    >>> manager.getLink('SchoolTool').click()
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('New Group').click()
+    >>> manager.getControl('Title').value = 'Some Students'
+    >>> manager.getControl('Identifier').value = 'somestudents'
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('Some Students').click()
+    >>> manager.getLink('edit members').click()
+    >>> manager.getControl('Student3').click()
+    >>> manager.getControl('Add').click()
+    >>> manager.getLink('Sections').click()
+    >>> manager.getLink('history-6a').click()
+    >>> manager.getLink('edit groups').click()
+    >>> manager.getControl('Some Students').click()
+    >>> manager.getControl('Add').click()
+
+Instructor should be able to see group which is member of his section:
+
+    >>> instructor = setup.logIn('instructor1', 'instructor1')
+    >>> instructor.open('http://localhost/')
+    >>> instructor.getLink('Frog').click()
+    >>> instructor.getLink('schooldata').click()
+    >>> instructor.getLink('Frog -- History 6').click()
+    >>> instructor.getLink('edit groups').click()
+    >>> 'Some Students' in instructor.contents
+    True


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/policy_table.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.securitypolicy
+
+$Id: test_all.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.securitypolicy.ftesting import securitypolicy_functional_layer
+
+def test_suite():
+    return collect_ftests(layer=securitypolicy_functional_layer)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Access control</title>
+</head>
+<body>
+<metal:block metal:fill-slot="body">
+
+  <form method="post" tal:attributes="action request/URL"
+        class="standalone">
+    <fieldset>
+      <label i18n:translate="">Access Control</label>
+      <div tal:repeat="setting view/settings"
+           class="row">
+        <input type="checkbox"
+               tal:attributes="checked setting/getValue;
+                               name string:setting.${setting/key};
+                               id setting/key" />
+        <label tal:content="setting/text"
+               tal:attributes="for setting/key"/>
+      </div>
+      <div class="controls">
+        <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Apply"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+      </div>
+    </fieldset>
+  </form>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control_viewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control_viewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control_viewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/templates/access_control_viewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/test_views.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/test_views.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/test_views.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,98 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for customisation of SchoolTool security policy.
+
+$Id: test_views.py 6117 2006-05-26 13:18:41Z ignas $
+"""
+
+import unittest
+from zope.testing import doctest
+from zope.component import provideAdapter
+from zope.app.testing import setup
+from zope.interface import Interface
+from zope.interface import implements
+from zope.publisher.browser import TestRequest
+
+
+def doctest_AccessControlView():
+    r"""Tests for AccessControlView.
+
+    The view should display a list of all settings provided by the
+    AccessControlCustomisations of the SchoolToolApplication:
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+        >>> class CustomisationsStub(object):
+        ...     implements(IAccessControlCustomisations)
+        ...     def __iter__(self):
+        ...         return iter(['Access', 'control', 'settings'])
+
+        >>> class AppStub(object):
+        ...     implements(ISchoolToolApplication)
+        ...     def __conform__(self, iface):
+        ...         if iface == IAccessControlCustomisations:
+        ...             return CustomisationsStub()
+
+        >>> from zope.component import provideAdapter
+        >>> provideAdapter(lambda context: AppStub(),
+        ...                adapts=[None],
+        ...                provides=ISchoolToolApplication)
+
+        >>> from schooltool.securitypolicy.browser.views import AccessControlView
+        >>> view = AccessControlView(None, None)
+        >>> view.settings()
+        ['Access', 'control', 'settings']
+
+    """
+
+
+def doctest_AccessControlView_update():
+    """Tests for AccessControlView.update()
+
+        >>> from schooltool.securitypolicy.browser.views import AccessControlView
+        >>> request = TestRequest()
+        >>> view = AccessControlView(None, request)
+
+    If there is nothing in the form, update does nothing:
+
+        >>> view.update()
+
+    If we click on Update, it should update all the settings with data
+    in the form:
+
+        >>> class SettingStub(object):
+        ...     def __init__(self, key):
+        ...         self.key = key
+        ...     def setValue(self, value):
+        ...         print "Setting value of '%s' to '%s'" % (self.key, value)
+        >>> view.settings = lambda: [SettingStub('one'), SettingStub('two')]
+        >>> request.form = {'UPDATE_SUBMIT': '', 'setting.one': 'checked'}
+        >>> view.update()
+        Setting value of 'one' to 'True'
+        Setting value of 'two' to 'False'
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+            doctest.DocTestSuite(optionflags=doctest.ELLIPSIS |
+                                             doctest.NORMALIZE_WHITESPACE)])
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/tests/test_views.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/views.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/views.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/views.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,47 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Configuration views for SchoolTool security policy.
+
+$Id: views.py 6117 2006-05-26 13:18:41Z ignas $
+"""
+
+from zope.publisher.browser import BrowserView
+from zope.traversing.browser.absoluteurl import absoluteURL
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+
+
+class AccessControlView(BrowserView):
+
+    def settings(self):
+        """Returns a list of access control customisation settings."""
+        app = ISchoolToolApplication(None)
+        customisations = IAccessControlCustomisations(app)
+        return list(customisations)
+
+    def update(self):
+        prefix = 'setting.'
+        if 'UPDATE_SUBMIT' in self.request:
+            for setting in self.settings():
+                setting.setValue(prefix + setting.key in self.request)
+        elif 'CANCEL' in self.request:
+            url = absoluteURL(self.context, self.request)
+            self.request.response.redirect(url)


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/browser/views.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:security="http://schooltool.org/securitypolicy"
+           i18n_domain="schooltool">
+
+  <!-- Basically a copy of zope.app.securitypolicy/securitypolicy.zcml  -->
+  <securityPolicy
+    component=".policy.SchoolToolSecurityPolicy" />
+
+  <adapter
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      factory=".customisation.getAccessControlCustomisations"
+      provides=".interfaces.IAccessControlCustomisations" />
+
+  <!-- Some basic crowds -->
+  <security:crowd
+      name="everybody"
+      factory=".crowds.EverybodyCrowd" />
+
+  <security:crowd
+      name="anonymous"
+      factory=".crowds.AnonymousCrowd" />
+
+  <security:crowd
+      name="authenticated"
+      factory=".crowds.AuthenticatedCrowd" />
+
+  <security:crowd
+      name="owner"
+      factory=".crowds.OwnerCrowd" />
+
+  <security:crowd
+      name="managers"
+      factory=".crowds.ManagersCrowd" />
+
+  <security:crowd
+      name="administrators"
+      factory=".crowds.AdministratorsCrowd" />
+
+  <security:crowd
+      name="clerks"
+      factory=".crowds.ClerksCrowd" />
+
+  <security:crowd
+      name="teachers"
+      factory=".crowds.TeachersCrowd" />
+
+  <security:aggregate_crowd
+      name="administration"
+      crowds="administrators clerks managers" />
+
+  <security:allow
+      crowds="everybody"
+      permission="zope.View" />
+  <security:allow
+      crowds="administration"
+      permission="zope.ManageApplication" />
+  <security:allow
+      crowds="administration"
+      permission="zope.ManageServices" />
+  <security:allow
+      crowds="administration"
+      permission="zope.app.dublincore.change" />
+  <security:allow
+      crowds="everybody"
+      permission="zope.app.dublincore.view" />
+
+
+  <!--   XXX ignas: there must and will be a better way! -->
+
+  <security:crowd
+      name="person_instructors"
+      factory="schooltool.course.section.PersonInstructorsCrowd" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/crowds.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/crowds.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/crowds.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,157 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool security policy crowds.
+
+$Id: crowds.py 6523 2006-12-19 10:53:35Z ignas $
+
+"""
+
+from zope.interface import implements
+from zope.security.proxy import removeSecurityProxy
+from zope.component import adapts, queryAdapter
+
+from schooltool.securitypolicy.interfaces import ICrowd
+from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+
+
+class Crowd(object):
+    """An abstract base class for crowds."""
+
+    implements(ICrowd)
+
+    def __init__(self, context):
+        # As crowds are used in our security policy we have to trust
+        # them
+        self.context = removeSecurityProxy(context)
+
+    def contains(self, principal):
+        raise NotImplementedError()
+
+
+class AggregateCrowd(Crowd):
+    """A base class for aggregating crowds.
+
+    Override crowdFactories to specify which crowds to aggregate.
+    """
+
+    def contains(self, principal):
+        for crowdcls in self.crowdFactories():
+            crowd = crowdcls(self.context)
+            if crowd.contains(principal):
+                return True
+        return False
+
+    def crowdFactories(self):
+        raise NotImplementedError("override this in subclasses")
+
+
+class ConfigurableCrowd(Crowd):
+    """A base class for calendar parent crowds.
+
+    You only need to override `setting_key` which indicates the key
+    of the corresponding security setting.
+    """
+
+    setting_key = None # override in subclasses
+
+    def contains(self, principal):
+        """Return the value of the related setting (True or False)."""
+        # XXX avoid a circular import
+        from schooltool.app.interfaces import ISchoolToolApplication
+        app = ISchoolToolApplication(None)
+        customizations = IAccessControlCustomisations(app)
+        return customizations.get(self.setting_key)
+
+
+class EverybodyCrowd(Crowd):
+    """A crowd that contains absolutely everybody."""
+
+    def contains(self, principal):
+        return True
+
+
+class OwnerCrowd(Crowd):
+    """Crowd of owners.
+
+    The crowd tries to adapt the context to IPerson.  If adaptation succeeds,
+    it compares the obtained person with the current principal.
+    """
+
+    def contains(self, principal):
+        from schooltool.person.interfaces import IPerson
+        from schooltool.app.browser import same # XXX
+        person = IPerson(principal, None)
+        owner = IPerson(self.context, None)
+        return person is not None and same(person, owner)
+
+
+class _GroupCrowd(Crowd):
+    """A base class for crowds determined by the principal's groups."""
+
+    group = None # override this
+
+    def contains(self, principal):
+        return self.group in principal.groups
+
+
+class AuthenticatedCrowd(_GroupCrowd):
+    """Authenticated users."""
+
+    group = 'zope.Authenticated'
+
+class AnonymousCrowd(_GroupCrowd):
+    """Anonymous users."""
+
+    group = 'zope.Anybody'
+
+class ManagersCrowd(_GroupCrowd):
+    group = 'sb.group.manager'
+
+class AdministratorsCrowd(_GroupCrowd):
+    group = 'sb.group.administrators'
+
+class ClerksCrowd(_GroupCrowd):
+    group = 'sb.group.clerks'
+
+class TeachersCrowd(_GroupCrowd):
+    group = 'sb.group.teachers'
+
+
+class ParentCrowdTemplate(Crowd):
+    """A crowd that contains principals who are allowed to access the context."""
+
+    interface = None
+    permission = ''
+
+    def contains(self, principal):
+        parent = self.context.__parent__
+        pcrowd = queryAdapter(parent, self.interface, self.permission,
+                              default=None)
+        if pcrowd is not None:
+            return pcrowd.contains(principal)
+        else:
+            return False
+
+
+def ParentCrowd(interface, permission):
+    return type('ParentCrowd',
+                (ParentCrowdTemplate,),
+                {'interface': interface,
+                 'permission': permission})


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/crowds.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/customisation.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/customisation.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/customisation.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,70 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Customisation for SchoolTool security policy.
+
+$Id: customisation.py 6210 2006-06-08 12:40:03Z gintas $
+"""
+
+from zope.interface import implements
+from zope.annotation.interfaces import IAnnotations
+from zope.component import subscribers
+from persistent import Persistent
+from persistent.dict import PersistentDict
+from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+from schooltool.securitypolicy.interfaces import IAccessControlSetting
+
+
+class AccessControlCustomisations(Persistent):
+    implements(IAccessControlCustomisations)
+
+    def __init__(self):
+        self._settings = PersistentDict()
+
+    def _getSetting(self, key):
+        for setting in self:
+            if setting.key == key:
+                return setting
+        else:
+            raise KeyError("there is no AccessControlSetting"
+                           " associated with this key.")
+
+    def get(self, key):
+        return self._settings.get(key, self._getSetting(key).default)
+
+    def set(self, key, value):
+        if self._getSetting(key):
+            self._settings[key] = value
+
+    def __iter__(self):
+        settings = subscribers([None], IAccessControlSetting)
+        return iter(settings)
+
+
+def getAccessControlCustomisations(app):
+    """Adapt a SchoolToolApplication to IAccessControlCustomisations."""
+
+    annotations = IAnnotations(app)
+    key = 'schooltool.securitypolicy.AccessControlCustomisations'
+    try:
+        return annotations[key]
+    except KeyError:
+        annotations[key] = AccessControlCustomisations()
+        annotations[key].__parent__ = app
+        return annotations[key]


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/customisation.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional Testing Utilities for securitypolicy
+
+$Id: ftesting.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+import os
+
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+securitypolicy_functional_layer = ZCMLLayer(filename,
+                                            __name__,
+                                            'securitypolicy_functional_layer')


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,17 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+  <include package="schooltool.gradebook" />
+  <include package="schooltool.requirement" />
+  <include package="schooltool.level" />
+  <include package="schooltool.attendance" />
+  <include package="schooltool.demographics" />
+
+  <includeOverrides package="schooltool.demographics" file="overrides.zcml" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,89 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Interfaces for SchoolTool security policy.
+
+$Id: interfaces.py 6183 2006-06-07 18:40:03Z ignas $
+
+"""
+
+from zope.interface import Interface
+from zope.schema import Dict, Bool, TextLine
+from zope.interface import Attribute
+from zope.configuration.fields import PythonIdentifier
+
+
+class ICrowdsUtility(Interface):
+    """Crowds Utility holds registered security information"""
+
+    crowdmap = Dict(
+        title=u"Crowd Map",
+        description=u"Maps crowd names to crowd factories")
+
+    objcrowds = Dict(
+        title=u"Object Crowd Factories",
+        description=u"Maps (interface, permission)s to crowd factories")
+
+    permcrowds = Dict(
+        title=u"Permission Crowd Factories",
+        description=u"Maps permissions to crowd factories")
+
+
+class ICrowd(Interface):
+    """A crowd is conceptually a set of principals.
+
+    A crowd need only support one operation -- a membership test.
+    """
+
+    def contains(principal):
+        """Return True if principal is in the crowd."""
+
+
+class IAccessControlCustomisations(Interface):
+    """Access Control Customisation storage."""
+
+    def get(key):
+        """Return a value of a setting stored under the key."""
+
+    def set(key, value):
+        """Set the value of a setting stored under the key."""
+
+    def __iter__():
+        """Iterate through all customisation settings."""
+
+
+class IAccessControlSetting(Interface):
+    """An access control customisation setting."""
+
+    key = PythonIdentifier(description=u"""A key that identified the setting.
+                           For example: 'members_manage_groups',
+                           'teachers_edit_person_info'
+                           """)
+    default = Bool(title=u"The default value for the setting.")
+    text = TextLine(title=u"Description of the setting for the user interface.")
+
+    def getValue():
+        """Return the value of the setting.
+
+        Return the default if it is not set in the
+        AccessControlCusomisations storage.
+        """
+
+    def setValue(value):
+        """Set the value of the setting."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/meta.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/meta.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/meta.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,31 @@
+<configure xmlns="http://namespaces.zope.org/meta">
+
+  <directives namespace="http://schooltool.org/securitypolicy">
+
+    <directive
+      name="crowd"
+      schema=".metadirectives.ICrowdDirective"
+      handler=".metaconfigure.crowd"
+      />
+
+    <directive
+      name="allow"
+      schema=".metadirectives.IAllowDirective"
+      handler=".metaconfigure.allow"
+      />
+
+    <directive
+      name="setting"
+      schema=".metadirectives.ISettingDirective"
+      handler=".metaconfigure.setting"
+      />
+
+    <directive
+      name="aggregate_crowd"
+      schema=".metadirectives.IAggregateCrowdDirective"
+      handler=".metaconfigure.aggregate_crowd"
+      />
+
+  </directives>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/meta.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/metaconfigure.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/metaconfigure.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/metaconfigure.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,165 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool metaconfiguration code.
+
+$Id: metaconfigure.py 6183 2006-06-07 18:40:03Z ignas $
+
+"""
+
+from zope.app import zapi
+from zope.interface import implements
+from zope.component import provideAdapter, provideSubscriptionAdapter
+from zope.security.zcml import permission
+
+from schooltool.securitypolicy.crowds import Crowd, AggregateCrowd
+from schooltool.securitypolicy.interfaces import ICrowd
+from schooltool.securitypolicy.interfaces import ICrowdsUtility
+from schooltool.securitypolicy.interfaces import IAccessControlSetting
+from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+from schooltool.app.interfaces import ISchoolToolApplication
+
+
+class CrowdsUtility(object):
+    implements(ICrowdsUtility)
+
+    def __init__(self):
+        self.crowdmap = {}   # crowd_name -> crowd_factory
+        self.objcrowds = {}  # (interface, permission) -> crowd_factory
+        self.permcrowds = {} # permission -> crowd_factory
+
+
+def getCrowdsUtility():
+    """Helper - returns crowds utility and registers new one if missing."""
+    utility = zapi.queryUtility(ICrowdsUtility)
+    if not utility:
+        utility = CrowdsUtility()
+        zapi.getGlobalSiteManager().registerUtility(utility, ICrowdsUtility)
+    return utility
+
+
+def registerCrowdAdapter(iface, permission):
+    """Register an adapter to ICrowd for iface.
+
+    The adapter dynamically retrieves the list of crowds from the
+    global objcrowds.  You should not call this function several times
+    for the same (iface, permission).
+    """
+    class AggregateUtilityCrowd(AggregateCrowd):
+        def crowdFactories(self):
+            return getCrowdsUtility().objcrowds[(iface, permission)]
+    provideAdapter(AggregateUtilityCrowd, provides=ICrowd, adapts=[iface],
+                   name=permission)
+
+
+def handle_crowd(name, factory):
+    """Handler for the ZCML <crowd> directive."""
+    getCrowdsUtility().crowdmap[name] = factory
+
+
+def handle_allow(iface, crowdname, permission):
+    """Handler for the ZCML <allow> directive.
+
+    iface is the interface for which the security declaration is issued,
+    crowdname is a string,
+    permission is an identifier for a permission.
+
+    The function registers the given crowd factory in the ICrowdsUtility
+    utility and registers an adapter to ICrowd if it was not registered before.
+
+    iface may be None.  In that case permcrowds is updated instead.
+    """
+
+    utility = getCrowdsUtility()
+    factory = utility.crowdmap[crowdname]
+    if iface is None:
+        utility.permcrowds.setdefault(permission, []).append(factory)
+        return
+
+    objcrowds = utility.objcrowds
+    if (iface, permission) not in objcrowds:
+        registerCrowdAdapter(iface, permission)
+        objcrowds[(iface, permission)] = []
+    objcrowds[(iface, permission)].append(factory)
+
+
+def crowd(_context, name, factory):
+    # Declare the crowd.
+    _context.action(discriminator=('crowd', name), callable=handle_crowd,
+                    args=(name, factory))
+
+
+def allow(_context, interface=None, crowds=None, permission=None):
+    for crowd in crowds:
+        _context.action(discriminator=('allow', interface, crowd, permission),
+                        callable=handle_allow,
+                        args=(interface, crowd, permission))
+
+
+class AccessControlSetting(object):
+    implements(IAccessControlSetting)
+
+    def __init__(self, key, text, default):
+        self.key = key
+        self.text = text
+        self.default = default
+
+    def getValue(self):
+        app = ISchoolToolApplication(None)
+        customisations = IAccessControlCustomisations(app)
+        return customisations.get(self.key)
+
+    def setValue(self, value):
+        app = ISchoolToolApplication(None)
+        customisations = IAccessControlCustomisations(app)
+        return customisations.set(self.key, value)
+
+    def __repr__(self):
+        return "<AccessControlSetting key=%s, text=%s, default=%s>" % (
+                self.key, self.text, self.default)
+
+
+def handle_setting(key, text, default):
+    def accessControlSettingFactory(context=None):
+        return AccessControlSetting(key, text, default)
+    provideSubscriptionAdapter(accessControlSettingFactory,
+                               adapts=[None],
+                               provides=IAccessControlSetting)
+
+def setting(_context, key=None, text=None, default=None):
+    _context.action(discriminator=('setting', key),
+                    callable=handle_setting, args=(key, text, default))
+
+
+def handle_aggregate_crowd(name, crowd_names):
+    crowdmap = getCrowdsUtility().crowdmap
+    try:
+        crowds = [crowdmap[crowd_name] for crowd_name in crowd_names]
+    except KeyError:
+        raise ValueError("invalid crowd id", crowd_name)
+
+    class AggregateCrowdFactory(AggregateCrowd):
+        def crowdFactories(self):
+            return crowds
+    handle_crowd(name, AggregateCrowdFactory)
+
+
+def aggregate_crowd(_context, name, crowds):
+    _context.action(discriminator=('crowd', name),
+                    callable=handle_aggregate_crowd, args=(name, crowds))


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/metaconfigure.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/metadirectives.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/metadirectives.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/metadirectives.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,86 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool security policy metadirectives.
+
+$Id: metadirectives.py 6586 2007-01-24 11:52:47Z ignas $
+
+"""
+
+from zope.interface import Interface
+from zope.configuration.fields import (Tokens, GlobalObject, PythonIdentifier,
+                                       Bool, MessageID)
+from zope.security.zcml import Permission
+
+
+CrowdId = PythonIdentifier
+
+
+class ICrowdDirective(Interface):
+
+    name = CrowdId(
+        title=u"Name",
+        description=u"Identifier of the crowd")
+
+    factory = GlobalObject(
+        title=u"Factory",
+        description=u"The factory for the crowd")
+
+
+class IAllowDirective(Interface):
+
+    interface = GlobalObject(
+        title=u"Interface",
+        required=False,
+        description=u"An interface of the object")
+
+    crowds = Tokens(
+        title=u"Crowds",
+        value_type=CrowdId(title=u"Crowd"),
+        required=True)
+
+    permission = Permission(
+        title=u"Permission",
+        required=True)
+
+
+class ISettingDirective(Interface):
+
+    key = PythonIdentifier(
+        title=u"Key")
+
+    text = MessageID(
+        title=u"Text")
+
+    default = Bool(
+        title=u"Default setting",
+        required=True,
+        default=False)
+
+
+class IAggregateCrowdDirective(Interface):
+
+    name = CrowdId(
+        title=u"Name",
+        description=u"Identifier of the crowd")
+
+    crowds = Tokens(
+        title=u"Crowds",
+        value_type=CrowdId(title=u"Crowd"),
+        required=True)


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/metadirectives.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/policy.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/policy.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/policy.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,70 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool security policy.
+
+$Id: policy.py 6344 2006-07-05 15:51:12Z ignas $
+
+"""
+
+from zope.security.simplepolicies import ParanoidSecurityPolicy
+from zope.component import queryAdapter
+from zope.traversing.api import getParent
+from schooltool.securitypolicy.crowds import ICrowd
+from schooltool.securitypolicy.metaconfigure import getCrowdsUtility
+
+
+class SchoolToolSecurityPolicy(ParanoidSecurityPolicy):
+    """Crowd-based security policy."""
+
+    def checkPermission(self, permission, obj):
+        """Return True if principal has permission on object."""
+
+        # Check the generic, interface-independent permissions.
+        crowdclasses = getCrowdsUtility().permcrowds.get(permission, [])
+        if self.checkCrowds(crowdclasses, obj):
+            return True
+
+        # No quick method worked, look up the crowd by adaptation.
+        return self.checkByAdaptation(permission, obj)
+
+    def checkByAdaptation(self, permission, obj):
+        crowd = queryAdapter(obj, ICrowd, name=permission, default=None)
+        # If there is no crowd that has the given permission on this
+        # object, try to look up a crowd that includes the parent.
+        while crowd is None and obj is not None:
+            obj = getParent(obj)
+            crowd = queryAdapter(obj, ICrowd, name=permission, default=None)
+        if crowd is None: # no crowds found
+            raise AssertionError('no crowd found for', obj, permission)
+
+        for participation in self.participations:
+            if crowd.contains(participation.principal):
+                return True
+        else:
+            return False
+
+    def checkCrowds(self, crowdclasses, obj):
+        """Check if an object is in any of the given crowds."""
+        for participation in self.participations:
+            for crowdcls in crowdclasses:
+                crowd = crowdcls(obj)
+                if crowd.contains(participation.principal):
+                    return True
+        return False


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/policy.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_crowds.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_crowds.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_crowds.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,191 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.securitypolicy.crowds
+
+$Id: test_crowds.py 6248 2006-06-14 16:01:08Z ignas $
+"""
+
+import unittest
+from zope.testing import doctest
+from zope.app.testing import setup
+
+from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+from schooltool.app.interfaces import ISchoolToolApplication
+from zope.interface import implements
+
+
+def doctest_AggregateCrowd():
+    """Doctests for AggregateCrowd.
+
+    What's so special about this adapter?  It aggregates crowds retrieved from
+    objcrowds:
+
+        >>> class CrowdStub(object):
+        ...     def __init__(self, context):
+        ...         pass
+        ...     def contains(self, principal):
+        ...         print 'contains(%s)' % principal
+        ...         return principal == 'r00t'
+
+    The crowdFactories method is normally overridden:
+
+        >>> from schooltool.securitypolicy.crowds import AggregateCrowd
+        >>> adapter = AggregateCrowd(object())
+
+        >>> adapter.crowdFactories = lambda: [CrowdStub]
+
+        >>> adapter.contains('some principal')
+        contains(some principal)
+        False
+
+        >>> adapter.contains('r00t')
+        contains(r00t)
+        True
+
+    """
+
+
+def doctest_ConfigurableCrowd():
+    """Tests for ConfigurableCrowd.
+
+    Some setup:
+
+        >>> setup.placelessSetUp()
+        >>> class CustomisationsStub(object):
+        ...     implements(IAccessControlCustomisations)
+        ...     def get(self, key):
+        ...         print 'Getting %s' % key
+        ...         return True
+
+        >>> class AppStub(object):
+        ...     implements(ISchoolToolApplication)
+        ...     def __conform__(self, iface):
+        ...         if iface == IAccessControlCustomisations:
+        ...             return CustomisationsStub()
+
+        >>> from zope.component import provideAdapter
+        >>> provideAdapter(lambda context: AppStub(),
+        ...                adapts=[None],
+        ...                provides=ISchoolToolApplication)
+
+        >>> from schooltool.app.security import ConfigurableCrowd
+
+    Off we go:
+
+        >>> crowd = ConfigurableCrowd(object())
+        >>> crowd.setting_key = 'key'
+        >>> crowd.contains(object())
+        Getting key
+        True
+
+    Clean up:
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_ParentCrowd():
+    """Tests for ParentCrowd.
+
+        >>> setup.placelessSetUp()
+
+        >>> from schooltool.securitypolicy.interfaces import ICrowd
+        >>> class ICalendarParentCrowd(ICrowd):
+        ...     pass
+        >>> class CalendarStub(object):
+        ...     def __init__(self, parent):
+        ...         self.__parent__ = parent
+
+        >>> from schooltool.securitypolicy.crowds import ParentCrowd
+        >>> CalendarViewersCrowd = ParentCrowd(ICalendarParentCrowd,
+        ...                                    'schooltool.view')
+        >>> crowd = CalendarViewersCrowd(CalendarStub(None))
+        >>> crowd.perm = "schooltool.view"
+
+    First, fire a blank (no adapters registered):
+
+        >>> crowd.contains(object())
+        False
+
+    OK, let's try with an adaptable object now:
+
+        >>> from schooltool.app.interfaces import ICalendarParentCrowd
+
+        >>> class ParentCrowdStub(object):
+        ...     implements(ICalendarParentCrowd)
+        ...     def __init__(self, context):
+        ...         print 'Getting adapter for %s' % context
+        ...     def contains(self, principal):
+        ...         print 'Checking %s' % principal
+        ...         return True
+
+        >>> from zope.interface import Interface
+        >>> class IOwner(Interface):
+        ...     pass
+
+        >>> class OwnerStub(object):
+        ...     implements(IOwner)
+
+        >>> from zope.component import provideAdapter
+        >>> provideAdapter(ParentCrowdStub, adapts=[IOwner],
+        ...                provides=ICalendarParentCrowd,
+        ...                name='schooltool.view')
+
+    Let's try now with the adapter:
+
+        >>> from schooltool.app.security import CalendarViewersCrowd
+        >>> crowd = CalendarViewersCrowd(CalendarStub(OwnerStub()))
+        >>> crowd.contains('some principal')
+        Getting adapter for <...OwnerStub ...>
+        Checking some principal
+        True
+
+    Let's try another name:
+
+        >>> CalendarEditorsCrowd = ParentCrowd(ICalendarParentCrowd,
+        ...                                    'schooltool.edit')
+        >>> crowd = CalendarEditorsCrowd(CalendarStub(OwnerStub()))
+        >>> crowd.contains('some principal')
+        False
+
+    Now with an adapter in place:
+
+        >>> from zope.component import provideAdapter
+        >>> provideAdapter(ParentCrowdStub, adapts=[IOwner],
+        ...                provides=ICalendarParentCrowd,
+        ...                name='schooltool.edit')
+        >>> crowd = CalendarEditorsCrowd(CalendarStub(OwnerStub()))
+        >>> crowd.contains('some principal')
+        Getting adapter for <...OwnerStub ...>
+        Checking some principal
+        True
+
+    We're done.
+
+        >>> setup.placefulTearDown()
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+            doctest.DocTestSuite(optionflags=doctest.ELLIPSIS |
+                                             doctest.NORMALIZE_WHITESPACE)])


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_crowds.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_customisation.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_customisation.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_customisation.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,138 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for customisation of SchoolTool security policy.
+
+$Id: test_customisation.py 6214 2006-06-08 13:52:13Z ignas $
+"""
+
+import unittest
+from zope.testing import doctest
+
+def doctest_AccessControlCustomisations():
+    r"""Tests for AccessControlCustomisations.
+
+        >>> from schooltool.securitypolicy.customisation import AccessControlCustomisations
+        >>> from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+        >>> from zope.interface.verify import verifyObject
+        >>> customisations = AccessControlCustomisations()
+        >>> verifyObject(IAccessControlCustomisations, customisations)
+        True
+
+    Iterating through customisations should yield us a list of all
+    AccessControlSettings, there are none yet:
+
+        >>> list(customisations)
+        []
+
+    Let's register a couple of settings:
+
+        >>> class SettingStub(object):
+        ...     def __init__(self, key, default=False):
+        ...         self.default = default
+        ...         self.key = key
+        ...     def __repr__(self):
+        ...         return "<SettingStub default=%s, key=%s>" % (self.default,
+        ...                                                      self.key)
+
+        >>> from zope.component import provideSubscriptionAdapter
+        >>> from schooltool.securitypolicy.interfaces import IAccessControlSetting
+        >>> for key, default in [("key1", False),
+        ...                      ("key2", True)]:
+        ...     provideSubscriptionAdapter(lambda c, k=key, d=default: SettingStub(k, d),
+        ...                                adapts=[None],
+        ...                                provides=IAccessControlSetting)
+
+        >>> list(customisations)
+        [<SettingStub default=False, key=key1>,
+         <SettingStub default=True, key=key2>]
+
+    If there is no value for a setting defined yet, we should get the
+    default:
+
+        >>> customisations.get("key1")
+        False
+        >>> customisations.get("key2")
+        True
+
+    If there is no such key, raise a KeyError:
+
+        >>> customisations.get("key3")
+        Traceback (most recent call last):
+        ...
+        KeyError: 'there is no AccessControlSetting associated with this key.'
+
+    We can assign some value to existing keys by using the set method:
+
+        >>> customisations.set("key1", True)
+        >>> customisations.set("key2", False)
+
+        >>> customisations.get("key1")
+        True
+        >>> customisations.get("key2")
+        False
+
+    It should raise a key error for unrecognized keys too:
+
+        >>> customisations.set("key3", True)
+        Traceback (most recent call last):
+        ...
+        KeyError: 'there is no AccessControlSetting associated with this key.'
+
+    """
+
+
+def doctest_getAccessControlCustomisations():
+    """Tests for getAccessControlCustomisations.
+
+        >>> from schooltool.securitypolicy.customisation import getAccessControlCustomisations
+
+    Customisations should be stored in annotations of a schooltool
+    application, or created on the first access if they are not there:
+
+        >>> from zope.annotation.interfaces import IAnnotations
+        >>> annotations = {}
+        >>> class AppStub(object):
+        ...     def __conform__(self, iface):
+        ...         if iface == IAnnotations:
+        ...             return annotations
+
+        >>> customisations = getAccessControlCustomisations(AppStub())
+        >>> print customisations
+        <schooltool.securitypolicy.customisation.AccessControlCustomisations ...>
+
+    On subsequent calls we should get the same customisations object:
+
+        >>> customisations is getAccessControlCustomisations(AppStub())
+        True
+
+    The key for customisations is
+    'schooltool.securitypolicy.AccessControlCustomisations':
+
+        >>> annotations
+        {'schooltool.securitypolicy.AccessControlCustomisations':
+         <schooltool.securitypolicy.customisation.AccessControlCustomisations ...}
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+            doctest.DocTestSuite(optionflags=doctest.ELLIPSIS |
+                                             doctest.NORMALIZE_WHITESPACE)])


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_customisation.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_metaconfigure.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_metaconfigure.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_metaconfigure.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,318 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.securitypolicy.metaconfigure
+
+$Id: test_metaconfigure.py 6183 2006-06-07 18:40:03Z ignas $
+"""
+
+import unittest
+from zope.testing import doctest
+from zope.interface import implements, Interface
+from zope.interface.verify import verifyObject
+from zope.app.testing import setup
+from zope.app.testing import ztapi
+from zope.component import getAdapter
+from schooltool.securitypolicy import metaconfigure as mc
+from schooltool.securitypolicy.metaconfigure import CrowdsUtility
+from schooltool.securitypolicy.interfaces import ICrowdsUtility
+from zope.app import zapi
+
+
+def doctest_CrowdsUtility():
+    """Doctest for CrowdsUtility.
+
+        >>> cru = CrowdsUtility()
+        >>> verifyObject(ICrowdsUtility, cru)
+        True
+    """
+
+
+def doctest_getCrowdsUtility():
+    """Doctest for getCrowdsUtility.
+
+        >>> from schooltool.securitypolicy.metaconfigure import getCrowdsUtility
+        >>> zapi.queryUtility(ICrowdsUtility) is None
+        True
+
+        >>> cru = getCrowdsUtility()
+        >>> print cru
+        <schooltool.securitypolicy.metaconfigure.CrowdsUtility object ...>
+
+        >>> zapi.queryUtility(ICrowdsUtility) is cru
+        True
+
+    """
+
+
+def doctest_registerCrowdAdapter():
+    """Doctests for registerCrowdAdapter.
+
+        >>> from schooltool.securitypolicy import metaconfigure
+        >>> from schooltool.securitypolicy.interfaces import ICrowd
+        >>> cru = CrowdsUtility()
+        >>> ztapi.provideUtility(ICrowdsUtility, cru)
+
+        >>> class IMyObject(Interface):
+        ...     pass
+
+    Let's invoke registerCrowdAdapter:
+
+        >>> metaconfigure.registerCrowdAdapter(IMyObject, 'perm')
+
+    An adapter should have been registered.
+
+        >>> class MyObject(object):
+        ...     implements(IMyObject)
+        >>> obj = MyObject()
+        >>> adapter = getAdapter(obj, ICrowd, name='perm')
+        >>> adapter
+        <...Aggregate...>
+
+        >>> cru.objcrowds = {(IMyObject, 'perm'): ['crowd A', 'crowd B']}
+        >>> adapter.crowdFactories()
+        ['crowd A', 'crowd B']
+
+    """
+
+
+def doctest_handle_crowd():
+    """Doctest for handle_crowd
+
+        >>> from schooltool.securitypolicy.metaconfigure import handle_crowd
+        >>> cru = CrowdsUtility()
+        >>> ztapi.provideUtility(ICrowdsUtility, cru)
+
+        >>> handle_crowd('cr1', 'fac1')
+        >>> print sorted(cru.crowdmap.keys())
+        ['cr1']
+        >>> cru.crowdmap['cr1']
+        'fac1'
+    """
+
+
+def doctest_handle_allow():
+    """Tests for handle_allow.
+
+        >>> from schooltool.securitypolicy import metaconfigure as mc
+
+        >>> cru = CrowdsUtility()
+        >>> cru.crowdmap = {'cr1': 'fac1',
+        ...                 'cr2': 'fac2',
+        ...                 'cr3': 'fac3'}
+        >>> ztapi.provideUtility(ICrowdsUtility, cru)
+        >>> def registerCrowdAdapterStub(iface, permission):
+        ...     print 'registerCrowdAdapter' + str((iface, permission))
+
+        >>> mc.registerCrowdAdapter = registerCrowdAdapterStub
+
+    First check a simple declaration:
+
+        >>> mc.handle_allow('iface', 'cr1', 'my.permission')
+        registerCrowdAdapter('iface', 'my.permission')
+        >>> mc.handle_allow('iface', 'cr2', 'my.permission')
+
+        >>> cru.objcrowds
+        {('iface', 'my.permission'): ['fac1', 'fac2']}
+
+    Another call will not invoke registerCrowdAdapter again:
+
+        >>> mc.handle_allow('iface', 'cr3', 'my.permission')
+        >>> cru.objcrowds
+        {('iface', 'my.permission'): ['fac1', 'fac2', 'fac3']}
+
+    Let's check the case when an interface is not provided:
+
+        >>> mc.handle_allow(None, 'cr1', 'my.permission')
+        >>> cru.permcrowds
+        {'my.permission': ['fac1']}
+
+        >>> mc.handle_allow(None, 'cr2', 'my.permission')
+        >>> cru.permcrowds
+        {'my.permission': ['fac1', 'fac2']}
+
+    """
+
+
+class ContextStub(object):
+    def action(self, discriminator, callable, args):
+        print discriminator
+        print callable
+        print args
+        print '---'
+
+
+def doctest_crowd():
+    """Doctests for crowd
+
+        >>> from schooltool.securitypolicy.metaconfigure import crowd
+
+        >>> _context = ContextStub()
+        >>> crowd(_context, 'ipqs', 'ipqsfactory')
+        ('crowd', 'ipqs')
+          <function handle_crowd at ...>
+          ('ipqs', 'ipqsfactory')
+        ---
+    """
+
+
+def doctest_handle_aggregate_crowd():
+    """Doctests for handle_aggregate_crowd.
+
+        >>> cru = CrowdsUtility()
+        >>> cru.crowdmap['old1'] = 'crowd A'
+        >>> cru.crowdmap['old2'] = 'crowd B'
+        >>> ztapi.provideUtility(ICrowdsUtility, cru)
+
+        >>> from schooltool.securitypolicy import metaconfigure
+        >>> metaconfigure.handle_aggregate_crowd('newcrowd', ['old1', 'old2'])
+
+        >>> factory = cru.crowdmap['newcrowd']
+        >>> factory(None).crowdFactories()
+        ['crowd A', 'crowd B']
+
+    """
+
+
+def doctest_aggregate_crowd():
+    """Doctests for aggregate_crowd.
+
+        >>> from schooltool.securitypolicy.metaconfigure import aggregate_crowd
+        >>> _context = ContextStub()
+        >>> aggregate_crowd(_context, 'newcrowd', ['old1', 'old2'])
+        ('crowd', 'newcrowd')
+          <function handle_aggregate_crowd ...>
+          ('newcrowd', ['old1', 'old2'])
+        ---
+
+    """
+
+
+def doctest_allow():
+    """Doctests for allow.
+
+        >>> from schooltool.securitypolicy.metaconfigure import allow
+        >>> _context = ContextStub()
+        >>> allow(_context, 'interface', ['ipqs', 'ecug'], 'do')
+        ('allow', 'interface', 'ipqs', 'do')
+          <function handle_allow ...>
+          ('interface', 'ipqs', 'do')
+        ---
+        ('allow', 'interface', 'ecug', 'do')
+          <function handle_allow ...>
+          ('interface', 'ecug', 'do')
+        ---
+
+    """
+
+
+def doctest_AccessControlSetting():
+    """Doctests for AccessControlSetting.
+
+        >>> from schooltool.securitypolicy.metaconfigure import AccessControlSetting
+        >>> setting = AccessControlSetting("key", "Some text", False)
+
+    Setting should implement the IAccessControlSetting interface:
+
+        >>> from schooltool.securitypolicy.interfaces import IAccessControlSetting
+        >>> verifyObject(IAccessControlSetting, setting)
+        True
+
+    getValue is just a wrapper for the get method of the
+    adapter from schooltool application to IAccessControlCustomisations:
+
+        >>> from schooltool.app.interfaces import ISchoolToolApplication
+        >>> from schooltool.securitypolicy.interfaces import IAccessControlCustomisations
+        >>> class CustomisationsStub(object):
+        ...     implements(IAccessControlCustomisations)
+        ...     def get(self, key):
+        ...         return "Value for setting: %s" % key
+        ...     def set(self, key, value):
+        ...         return "Setting value of %s to %s" % (key, value)
+
+        >>> class AppStub(object):
+        ...     implements(ISchoolToolApplication)
+        ...     def __conform__(self, iface):
+        ...         if iface == IAccessControlCustomisations:
+        ...             return CustomisationsStub()
+
+        >>> from zope.component import provideAdapter
+        >>> provideAdapter(lambda context: AppStub(),
+        ...                adapts=[None],
+        ...                provides=ISchoolToolApplication)
+
+        >>> setting.getValue()
+        'Value for setting: key'
+
+    We can set the value of the setting directly as well:
+
+        >>> setting.setValue("new value")
+        'Setting value of key to new value'
+
+    """
+
+
+def doctest_handle_setting():
+    """Tests for handle_setting.
+
+        >>> from schooltool.securitypolicy.metaconfigure import handle_setting
+
+    Handle setting should register a subscriber adapter for
+    IAccessControlSetting interface, initially there are no subscribers:
+
+        >>> from zope.component import subscribers
+        >>> from schooltool.securitypolicy.interfaces import IAccessControlSetting
+        >>> subscribers([None], IAccessControlSetting)
+        []
+
+        >>> handle_setting("key", "text", False)
+
+    Now we should have one:
+
+        >>> subscribers([None], IAccessControlSetting)
+        [<AccessControlSetting key=key, text=text, default=False>]
+
+    Let's add another one:
+
+        >>> handle_setting("another_key", "more text", True)
+        >>> subscribers([None], IAccessControlSetting)
+        [<AccessControlSetting key=key, text=text, default=False>,
+         <AccessControlSetting key=another_key, text=more text, default=True>]
+
+    """
+
+
+class Fixture(object):
+
+    def setUp(self, test=None):
+        setup.placelessSetUp()
+        self.oldRegisterCrowdAdapter = mc.registerCrowdAdapter
+
+    def tearDown(self, test=None):
+        setup.placelessTearDown()
+        mc.registerCrowdAdapter = self.oldRegisterCrowdAdapter
+
+
+def test_suite():
+    f = Fixture()
+    return unittest.TestSuite([
+            doctest.DocTestSuite(optionflags=doctest.ELLIPSIS |
+                                             doctest.NORMALIZE_WHITESPACE,
+                                 setUp=f.setUp, tearDown=f.tearDown)])
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_metaconfigure.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_policy.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_policy.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_policy.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,216 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.securitypolicy.policy
+
+$Id: test_policy.py 6183 2006-06-07 18:40:03Z ignas $
+"""
+
+import unittest
+from zope.testing import doctest
+from zope.app.testing import ztapi
+from zope.interface import implements, directlyProvides, Interface
+from zope.component import adapts
+from zope.app.testing import setup
+from zope.traversing.interfaces import IContainmentRoot
+from schooltool.securitypolicy.crowds import Crowd
+from schooltool.securitypolicy.interfaces import ICrowd
+
+
+class IObj(Interface):
+    pass
+
+
+class Obj(object):
+    implements(IObj)
+
+class AnotherObj(object):
+    pass
+
+
+class ParticipationStub(object):
+    interaction = None
+    principal = 'guest'
+
+
+def test_SchoolToolSecurityPolicy_checkPermission():
+    """Tests for SchoolToolSecurityPolicy.
+
+        >>> from schooltool.securitypolicy.metaconfigure import CrowdsUtility
+        >>> from schooltool.securitypolicy.interfaces import ICrowdsUtility
+        >>> cru = CrowdsUtility()
+        >>> ztapi.provideUtility(ICrowdsUtility, cru)
+
+    Let's construct a security policy.
+
+        >>> from schooltool.securitypolicy import policy
+        >>> participation = ParticipationStub()
+        >>> sp = policy.SchoolToolSecurityPolicy(participation)
+
+        >>> byadaptation_returns = False
+        >>> def checkByAdaptationStub(permission, obj):
+        ...     print 'checkByAdaptation' + str((permission, obj))
+        ...     return byadaptation_returns
+        >>> sp.checkByAdaptation = checkByAdaptationStub
+
+        >>> checkcrowds_returns = False
+        >>> def checkCrowdsStub(crowdclasses, obj):
+        ...     print 'checkCrowds' + str((crowdclasses, obj))
+        ...     return checkcrowds_returns
+        >>> sp.checkCrowds = checkCrowdsStub
+
+    First, we test the path where no crowds accept the principal:
+
+        >>> obj = Obj()
+
+        >>> sp.checkPermission('perm', obj)
+        checkCrowds([], <...test_policy.Obj object ...>)
+        checkByAdaptation('perm', <...Obj object ...>)
+        False
+
+    Interface-independent permissions
+    ---------------------------------
+
+        >>> checkcrowds_returns = True
+        >>> cru.permcrowds['perm'] = ['crowd factory']
+        >>> sp.checkPermission('perm', obj)
+        checkCrowds(['crowd factory'], <...Obj object ...>)
+        True
+
+    Another case: checkCrowds fails, but checkByAdaptation returns True:
+
+        >>> checkcrowds_returns = False
+        >>> byadaptation_returns = True
+
+        >>> sp.checkPermission('perm', obj)
+        checkCrowds(['crowd factory'], <...Obj object ...>)
+        checkByAdaptation('perm', <...Obj object...>)
+        True
+
+    """
+
+
+def test_SchoolToolSecurityPolicy_checkByAdaptation():
+    """Tests for SchoolToolSecurityPolicy.checkByAdaptation.
+
+        >>> from schooltool.securitypolicy.metaconfigure import CrowdsUtility
+        >>> from schooltool.securitypolicy.interfaces import ICrowdsUtility
+        >>> cru = CrowdsUtility()
+        >>> ztapi.provideUtility(ICrowdsUtility, cru)
+
+    Let's construct a security policy.
+
+        >>> from schooltool.securitypolicy import policy
+        >>> participation = ParticipationStub()
+        >>> sp = policy.SchoolToolSecurityPolicy(participation)
+
+        >>> obj = Obj()
+
+    First, check the straightforward case
+
+        >>> contains_returns = False
+        >>> class ObjCrowd(Crowd):
+        ...     adapts(IObj)
+        ...     def contains(self, principal):
+        ...         return contains_returns
+        >>> ztapi.provideAdapter(IObj, ICrowd, ObjCrowd, 'perm')
+
+        >>> sp.checkByAdaptation('perm', obj)
+        False
+
+        >>> contains_returns = True
+        >>> sp.checkByAdaptation('perm', obj)
+        True
+
+    If no crowd is found for a given object, its parents are checked instead:
+
+        >>> obj2 = AnotherObj()
+        >>> obj2.__parent__ = obj
+        >>> obj3 = AnotherObj()
+        >>> obj3.__parent__ = obj2
+
+        >>> sp.checkPermission('perm', obj3)
+        True
+
+    The code won't climb up beyond IContainmentRoot:
+
+        >>> obj2.__parent__ = None
+        >>> directlyProvides(obj2, IContainmentRoot)
+        >>> sp.checkPermission('perm', obj3)
+        Traceback (most recent call last):
+            ...
+        AssertionError: ('no crowd found for', None, 'perm')
+
+    """
+
+
+def test_SchoolToolSecurityPolicy_checkCrowds():
+    """Tests for SchoolToolSecurityPolicy.checkCrowds.
+
+    Check crowds just check whether any principal is contained in at
+    least one of the crowds constructed from a crowdcls list passed to
+    it:
+
+        >>> class NegativeCrowdStub(object):
+        ...     def __init__(self, context):
+        ...         pass
+        ...     def contains(self, principal):
+        ...         return False
+        >>> class CrowdStub(NegativeCrowdStub):
+        ...     def contains(self, principal):
+        ...         return principal == 'john'
+
+        >>> class ParticipationStub(object):
+        ...     interaction = None
+        ...     def __init__(self, principal):
+        ...         self.principal = principal
+
+        >>> from schooltool.securitypolicy import policy
+        >>> sp = policy.SchoolToolSecurityPolicy(ParticipationStub('john'),
+        ...                                      ParticipationStub('pete'))
+
+        >>> sp.checkCrowds([NegativeCrowdStub, NegativeCrowdStub], object())
+        False
+
+        >>> sp.checkCrowds([NegativeCrowdStub, CrowdStub], object())
+        True
+
+    If john is not logged in, we'd still get False:
+
+        >>> sp = policy.SchoolToolSecurityPolicy(ParticipationStub('pete'))
+        >>> sp.checkCrowds([NegativeCrowdStub, CrowdStub], object())
+        False
+
+    """
+
+
+def setUp(test=None):
+    setup.placelessSetUp()
+
+def tearDown(test=None):
+    setup.placelessTearDown()
+
+
+def test_suite():
+    return unittest.TestSuite([
+            doctest.DocTestSuite(optionflags=doctest.ELLIPSIS,
+                                 setUp=setUp, tearDown=tearDown),
+            doctest.DocFileSuite('../README.txt',
+                                 optionflags=doctest.ELLIPSIS)
+           ])


Property changes on: schooltool/branches/upstream/current/src/schooltool/securitypolicy/tests/test_policy.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setup/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setup/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setup/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/setup/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setup/mkschooltoolinst.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setup/mkschooltoolinst.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setup/mkschooltoolinst.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,72 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Creating SchoolTool Instances
+
+$Id: mkschooltoolinst.py 5669 2006-01-20 19:58:16Z mg $
+"""
+import os
+import sys
+
+import zope
+from zope.app.server.mkzopeinstance import parse_args, Application
+
+import schooltool
+
+class SchoolToolApplication(Application):
+
+    def copy_skeleton(self):
+        options = self.options
+        # TODO we should be able to compute the script
+        script = os.path.abspath(sys.argv[0])
+        zope_home = os.path.dirname(os.path.dirname(script))
+        zope_init = os.path.abspath(zope.__file__)
+        zope_software_home = os.path.dirname(os.path.dirname(zope_init))
+        st_init = os.path.abspath(schooltool.__file__)
+        st_software_home = os.path.dirname(os.path.dirname(st_init))
+        self.replacements = [
+            ("<<USERNAME>>",                 options.username),
+            ("<<PASSWORD>>",                 options.password),
+            ("<<PYTHON>>",                   sys.executable),
+            ("<<INSTANCE_HOME>>",            options.destination),
+            ("<<ZOPE_HOME>>",                zope_home),
+            ("<<ZOPE_SOFTWARE_HOME>>",       zope_software_home),
+            ("<<SCHOOLTOOL_SOFTWARE_HOME>>", st_software_home),
+            ]
+        self.copytree(self.options.skeleton, self.options.destination)
+
+
+def main(argv=None, from_checkout=False):
+    """Top-level script function to create a new SchoolTool instance."""
+    if argv is None:
+        argv = sys.argv
+    try:
+        options = parse_args(argv, from_checkout)
+    except SystemExit, e:
+        if e.code:
+            return 2
+        else:
+            return 0
+    app = SchoolToolApplication(options)
+    try:
+        return app.process()
+    except KeyboardInterrupt:
+        return 1
+    except SystemExit, e:
+        return e.code


Property changes on: schooltool/branches/upstream/current/src/schooltool/setup/mkschooltoolinst.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,58 @@
+====================================================
+Pluggable school setup data framework for SchoolTool
+====================================================
+
+The goal of this framework is to facilitate the automation of the
+initial setup of a school.  Schools are complex, and if the sys admin
+is importing large bodies of archived data from legacy systems,
+mistakes, dead ends and false starts are practically inevitable,
+particularly while SchoolTool itself is new and rapidly evolving.  By
+scripting this process, the sys admin can easily make changes and
+rebuild the entire database from scratch.
+
+This system is intended to be implemented using customized Python
+scripts to parse the school's legacy data.
+
+The framework is based very closely (i.e., almost entirely copied
+from) SchoolTool's sample data framework.
+
+
+How to use it?
+--------------
+
+School data setup is available in the developer mode.  In order to
+enable it, uncomment the `devmode on` line in your schooltool.conf.
+If you only have schooltool.conf.in, copy it to schooltool.conf and
+then edit it.
+
+Initially, the assumption is that you are doing this on an empty
+database.
+
+When the generation is done, you'll get a summary of how much CPU time
+each plugin took.  Unfortunately, generating this amount of data
+imposes significant overhead, so the run time of the plugins does not
+quite sum up to the amount of wall time the generation took.
+
+
+How do I create a setup data plugin?
+-------------------------------------
+
+In order to create a school setup data plugin, you only have to
+register a named utility that implements the interface
+`schooltool.setupdata.interfaces.ISetupDataPlugin`.  This interface is
+very simple, it requires only the `name` attribute with the unique
+name of the plugin, the `dependencies` attribute with names of plugins
+this one depends on, and a `generate` method that parses and returns
+its data given that the dependencies have already been satisfied.
+
+In practice, you want to create a package that corresponds to the
+school you're setting up.  It is convenient to just put it in src with
+everything else.  You'll need to put the appropriate snippet of ZCML
+in package-includes to point Zope to your school's setup package.
+You'll also need to create a directory somewhere that Zope'll be able
+to find it that will contain your CSV files or whatever else you're
+pulling your data from.
+
+Then you can pretty much follow the instructions in the sampledata
+README, except instead of generating random data you're pulling it
+from a text file, or just hardwiring it into a script.


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,50 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Views for the setup data generation
+
+$Id: browser.py 5225 2005-10-12 18:02:40Z alga $
+"""
+from zope.app import zapi
+from zope.publisher.browser import BrowserView
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.setupdata.generator import generate
+
+
+class SetupDataView(BrowserView):
+
+    __used_for__ = ISchoolToolApplication
+
+    template = ViewPageTemplateFile("setupdata.pt")
+
+    work_done = property(lambda self: hasattr(self, 'times'))
+
+    def __call__(self):
+        self.update()
+        return self.template()
+
+    def update(self):
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(
+                zapi.absoluteURL(self.context, self.request))
+        if 'SUBMIT' in self.request:
+            # TODO: maybe clear database here
+            self.times = generate(self.context)


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="schooltool">
+
+  <browser:page
+      name="setupdata.html"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      class=".browser.SetupDataView"
+      permission="schooltool.edit"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/generator.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/generator.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/generator.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,95 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool pluggable setup data generator
+
+Setup data is created by a variety of plugins
+that can state their dependencies on other plugins explicitly.
+Dependencies must be acyclic.
+
+Setup data generation plugins are named local utilities with an
+interface schooltool.setupdata.interfaces.ISetupDataGeneratorPlugin.
+
+$Id: generator.py 5224 2005-10-12 17:38:34Z alga $
+"""
+import time
+from zope.app import zapi
+from schooltool.setupdata.interfaces import ISetupDataPlugin
+from schooltool.setupdata.interfaces import CyclicDependencyError
+
+
+def generate(app):
+    """Generate setup data provided by all plugins.
+
+    Runs the generate functions of all plugins in an order such that
+    the dependencies are all generated before the dependents.
+
+    In essence, this function performs a topological sort in a
+    directed acyclic graph.
+
+    Raises a CyclicDependencyError if the dependency graph has a cycle.
+
+    Returns a dict with names of plugins run as keys and CPU times as
+    values.
+    """
+
+    plugins = dict([(obj.name, obj) for name, obj in
+                    zapi.getUtilitiesFor(ISetupDataPlugin)])
+
+
+    # status is a dict plugin names as keys and statuses as values.
+    # Statuses can be as follows:
+    #
+    #   new    -- not yet visited
+    #   closed -- already processed
+    #   open   -- being processed
+    #
+    # Stumbling over an 'open' node means there is a cyclic dependency
+
+    new = 'new'
+    open = 'open'
+    closed = 'closed'
+    status = dict([(name, new) for name in plugins])
+
+    # dict with used CPU cycles for each plugin
+    times = {}
+
+    def visit(name):
+        """The recursive part of the topological sort
+
+        Raises a CyclicDependencyError if cyclic depencencies are found.
+        """
+        if status[name] == new:
+            status[name] = open
+            plugin = plugins[name]
+            for dep in plugin.dependencies:
+                visit(dep)
+            start = time.clock()
+            plugin.generate(app)
+            times[name] = time.clock() - start
+            status[name] = closed
+        elif status[name] == closed:
+            return
+        elif status[name] == open:
+            raise CyclicDependencyError("cyclic dependency at '%s'" % name)
+
+    for name in plugins:
+        visit(name)
+
+    return times


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/generator.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,55 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool setup data generator interfaces
+
+$Id: interfaces.py 5231 2005-10-12 19:45:06Z alga $
+"""
+import zope.interface
+import zope.schema
+
+
+class ISetupDataPlugin(zope.interface.Interface):
+    """A plugin that generates some setup data.
+
+    These plugins may depend on other setup data plugins.  Say,
+    calendar event generators depend on person generators.  All
+    plugins have unique names and other plugins reference their
+    dependencies by these names.
+    """
+
+    name = zope.schema.Id(title=u"Setup data generator name")
+
+    dependencies = zope.schema.List(
+        title=u"A list of dependenies",
+        value_type=zope.schema.Id(title=u"Setup data generator name"),
+        description=u"""
+        A list of names of setup data generators this one depends on.
+        """)
+
+    def generate(app, seed=None):
+        """Generate setup data of this plugin.
+
+        This method assumes the setup data this plugin depends on has
+        been created.
+        """
+
+
+class CyclicDependencyError(ValueError):
+    """Cyclic dependency of setup data plugins"""


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/setupdata.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/setupdata.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/setupdata.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,50 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Initial School Setup Scripts
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    i18n:translate="">Initial School Setup Scripts</h1>
+
+<metal:block metal:fill-slot="body">
+<tal:block condition="not: view/work_done">
+<p i18n:translate="" class="error">Warning: proceeding will populate
+the database with data generated from scripts installed on the filesystem
+of this server.  Do not do this if you have any valuable data in this 
+SchoolTool instance or don't already understand what this is
+for.</p>
+
+<form tal:attributes="action request/URL" method="POST">
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="SUBMIT"
+           value="Generate" i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value cancel-button" />
+  </div>
+</form>
+</tal:block>
+
+<tal:block condition="view/work_done">
+
+<p>Setup data generated.  Below is the list of plugins executed along
+with the CPU time it took to run them</p>
+
+<table>
+  <tr>
+    <th>Plugin Name</th>
+    <th>CPU time used (seconds)</th>
+  </tr>
+  <tr tal:repeat="name view/times">
+    <td tal:content="name"></td>
+    <td tal:content="python: view.times[name]"></td>
+  </tr>
+</table>
+</tal:block>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/setupdata.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,211 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.setupdata.generator
+
+$Id: test_browser.py 5644 2006-01-16 21:21:00Z mg $
+"""
+
+
+import unittest
+from pprint import pprint
+
+from zope.interface import implements
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+from zope.publisher.browser import TestRequest
+from schooltool.testing.setup import setUpSchoolToolSite
+from schooltool.testing.setup import setUpApplicationPreferences
+from schooltool.setupdata.tests.test_generator import DummyPlugin
+from schooltool.setupdata.interfaces import ISetupDataPlugin
+import schooltool.app.browser.testing
+
+def setUp(test):
+    setup.placefulSetUp()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+class DummySetupPlugin(DummyPlugin):
+    implements(ISetupDataPlugin)
+
+
+def doctest_SetupDataView_update():
+    """Tests for SetupDataView.update method
+
+        >>> app = setUpSchoolToolSite()
+        >>> from schooltool.setupdata.browser import SetupDataView
+
+    Now, let's set up some stub setup data plugins.
+
+        >>> p1 = DummySetupPlugin("work", ())
+        >>> p2 = DummySetupPlugin("play", ("work", ))
+        >>> ztapi.provideUtility(ISetupDataPlugin, p1, 'work')
+        >>> ztapi.provideUtility(ISetupDataPlugin, p2, 'play')
+
+    If we fill in the seed and press the submit button, we get setup
+    data plugins called.
+
+        >>> DummySetupPlugin.log = []
+        >>> request = TestRequest(form={'SUBMIT': 'Generate'})
+        >>> view = SetupDataView(app, request)
+        >>> view.update()
+        >>> pprint(DummySetupPlugin.log)
+        [('work',
+          <schooltool.app.app.SchoolToolApplication object at ...>,
+          None),
+         ('play',
+          <schooltool.app.app.SchoolToolApplication object at ...>,
+          None)]
+
+    When the work is done the times attribute is set on the view:
+
+        >>> sorted(view.times)
+        ['play', 'work']
+        >>> for item, time in view.times.items():
+        ...     assert time < 0.1   # 100 ms ought to be enough to do nothing
+        >>> view.work_done
+        True
+
+    If we press the cancel button, we also get redirected to the main page:
+
+        >>> request = TestRequest(form={'seed': 'data', 'CANCEL': 'Cancel'})
+        >>> view = SetupDataView(app, request)
+        >>> view.update()
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1'
+
+    Clean up:
+
+        >>> DummySetupPlugin.log = []
+    """
+
+def doctest_SetupDataView__call__():
+    """Tests for SetupDataView rendering
+
+    We'll need a massive browser views setup here.
+
+        >>> schooltool.app.browser.testing.setUp()
+        >>> setUpApplicationPreferences()
+
+    Let's set up some plugins so they are called:
+
+        >>> from schooltool.setupdata.interfaces import ISetupDataPlugin
+        >>> p1 = DummySetupPlugin("work", ())
+        >>> p2 = DummySetupPlugin("play", ("work", ))
+        >>> ztapi.provideUtility(ISetupDataPlugin, p1, 'work')
+        >>> ztapi.provideUtility(ISetupDataPlugin, p2, 'play')
+
+    Let's create an application object and a view:
+
+        >>> from schooltool.setupdata.browser import SetupDataView
+        >>> app = setUpSchoolToolSite()
+        >>> request = TestRequest(form={'seed': 'test'})
+        >>> view = SetupDataView(app, request)
+
+    Let's render the view.  The default value of the seed is displayed there.
+
+# XXX This test fails and I'm not sure how to fix it. -- Gintas
+#
+#        >>> print view()
+#        <BLANKLINE>
+#        ...
+#        <h1>Setup Data Generation</h1>
+#        ...
+#        <form method="POST" action="http://127.0.0.1">
+#          <div class="row">
+#            <div class="label">
+#               <label>Random seed</label>
+#            </div>
+#            <div class="field">
+#               <input name="seed" value="test" />
+#            </div>
+#          </div>
+#          <div class="controls">
+#            <input type="submit" class="button-ok"
+#                   name="SUBMIT" value="Generate" />
+#            <input type="submit" class="button-cancel" name="CANCEL"
+#                   value="Cancel" />
+#          </div>
+#        </form>
+#        ...
+
+    Let's render the view.  The default value of the seed is displayed there.
+
+        >>> request = TestRequest(form={'seed': 'test', 'SUBMIT': 'Yes'})
+        >>> view = SetupDataView(app, request)
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <p>Setup data generated.  Below is the list of plugins executed along
+        with the CPU time it took to run them</p>
+        <BLANKLINE>
+        <table>
+          <tr>
+            <th>Plugin Name</th>
+            <th>CPU time used (seconds)</th>
+          </tr>
+          <tr>
+            <td>play</td>
+            <td>...</td>
+          </tr>
+          <tr>
+            <td>work</td>
+            <td>...</td>
+          </tr>
+        </table>
+        ...
+    """
+
+def doctest_SetupDataView_work_done():
+    """Tests for SetupDataView.work_done propery.
+
+        >>> from schooltool.setupdata.browser import SetupDataView
+        >>> request = TestRequest()
+        >>> view = SetupDataView(object(), request)
+
+    Before any processing is done, work_done is False:
+
+        >>> view.work_done
+        False
+
+    When the update sets the times attribute, it becomes True:
+
+        >>> view.times = {}
+        >>> view.work_done
+        True
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp,
+                             tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS
+                             |doctest.NORMALIZE_WHITESPACE
+                             |doctest.REPORT_NDIFF),
+        ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_generator.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_generator.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_generator.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,130 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.setupdata.generator
+
+$Id: test_generator.py 5459 2005-12-15 17:28:45Z mg $
+"""
+
+import unittest
+
+from zope.testing import doctest
+from zope.interface import implements
+from zope.app.testing import setup, ztapi
+
+from schooltool.setupdata.interfaces  import ISetupDataPlugin
+
+
+class DummyPlugin:
+    """A dummy sample data plugin that logs the args to a class attribute"""
+    implements(ISetupDataPlugin)
+
+    log = []  # one for all
+
+    def __init__(self, name, deps=()):
+        self.name = name
+        self.dependencies = deps
+
+    def generate(self, app, seed=None):
+        self.log.append((self.name, app, seed))
+
+
+def doctest_generate():
+    """Unit test for schooltool.setupdata.generator.generate
+
+    This function finds all the utilities registered with the sample
+    data plugin interface and runs the generate methods of them.
+
+    First, let's register several plugins:
+
+        >>> p1 = DummyPlugin("p1", ())
+        >>> p2 = DummyPlugin("p2", ())
+        >>> p3 = DummyPlugin("p3", ())
+        >>> ztapi.provideUtility(ISetupDataPlugin, p1, 'p1')
+        >>> ztapi.provideUtility(ISetupDataPlugin, p2, 'p2')
+        >>> ztapi.provideUtility(ISetupDataPlugin, p3, 'p3')
+
+    Now, let's run the generator:
+
+        >>> DummyPlugin.log = []
+        >>> import schooltool.setupdata.generator
+
+        >>> app = 'app'
+        >>> result = schooltool.setupdata.generator.generate(app)
+
+    The order of the plugins is undefined, so let's sort to see if
+    they're all there.
+
+        >>> DummyPlugin.log.sort()
+        >>> DummyPlugin.log
+        [('p1', 'app', None), ('p2', 'app', None), ('p3', 'app', None)]
+
+    The result returned by this function is a dict of plugin names as
+    keys and CPU times consumed as values:
+
+        >>> sorted(result.keys())
+        ['p1', 'p2', 'p3']
+        >>> for v in result.values():
+        ...     v < 0.1
+        True
+        True
+        True
+
+    Let's make p1 and p2 depend on p3:
+
+        >>> p1.dependencies = 'p3',
+        >>> p2.dependencies = 'p3',
+
+    Now p3 must be the first plugin run:
+
+        >>> DummyPlugin.log = []
+        >>> result = schooltool.setupdata.generator.generate(app)
+        >>> DummyPlugin.log[0]
+        ('p3', 'app', None)
+
+    If we add a dependency on p2 to p1, the order becomes defined:
+
+        >>> p1.dependencies = 'p2',
+        >>> DummyPlugin.log = []
+        >>> result = schooltool.setupdata.generator.generate(app)
+        >>> DummyPlugin.log
+        [('p3', 'app', None), ('p2', 'app', None), ('p1', 'app', None)]
+
+    If we add an extra dependency and close the cycle, we get an error:
+
+        >>> p3.dependencies = 'p1',
+        >>> DummyPlugin.log = []
+        >>> result = schooltool.setupdata.generator.generate(app)
+        Traceback (most recent call last):
+          ...
+        CyclicDependencyError: cyclic dependency at ...
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setup.placelessSetUp,
+                             tearDown=setup.placelessTearDown,
+                             optionflags=doctest.ELLIPSIS
+                             |doctest.NORMALIZE_WHITESPACE),
+        ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/setupdata/tests/test_generator.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,28 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Skin package for SchoolTool.
+
+$Id: breadcrumbs.py 5675 2006-01-23 03:08:51Z srichter $
+"""
+
+from skin import ISchoolToolLayer, ISchoolToolSkin
+from skin import INavigationManager, IActionMenuManager
+from skin import ICSSManager, IJavaScriptManager, IHeaderManager
+from skin import OrderedViewletManager, NavigationViewlet
+from skin import TopLevelContainerNavigationViewlet


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/breadcrumbs.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/breadcrumbs.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/breadcrumbs.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,79 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Custom Breadcrumbs implementation
+
+$Id: breadcrumbs.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+__docformat__ = 'reStructuredText'
+import zope.component
+import zope.interface
+import zope.publisher.interfaces.http
+from zope.app import zapi
+from zope.publisher import browser
+from zope.traversing.interfaces import IContainmentRoot
+
+from schooltool import SchoolToolMessage as _
+from schooltool.skin import interfaces
+
+class Breadcrumbs(browser.BrowserView):
+    """Special Breadcrumbs implementation."""
+    zope.interface.implements(interfaces.IBreadcrumbs)
+
+    @property
+    def crumbs(self):
+        objects = [self.context] + list(zapi.getParents(self.context))
+        objects.reverse()
+        for object in objects:
+            info = zapi.getMultiAdapter((object, self.request),
+                                        interfaces.IBreadcrumbInfo)
+            yield {'name': info.name, 'url': info.url, 'active': info.active}
+
+
+class GenericBreadcrumbInfo(object):
+    """A generic breadcrumb info adapter."""
+    zope.interface.implements(interfaces.IBreadcrumbInfo)
+    zope.component.adapts(zope.interface.Interface,
+                          zope.publisher.interfaces.http.IHTTPRequest)
+
+    # See interfaces.IBreadcrumbInfo
+    active = True
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    @property
+    def name(self):
+        """See interfaces.IBreadcrumbInfo"""
+        name = getattr(self.context, 'title', None)
+        if name is None:
+            name = getattr(self.context, '__name__', None)
+        if name is None and IContainmentRoot.providedBy(self.context):
+            name = _('top')
+        return name
+
+    @property
+    def url(self):
+        """See interfaces.IBreadcrumbInfo"""
+        return zapi.absoluteURL(self.context, self.request)
+
+
+def CustomNameBreadCrumbInfo(name):
+    return type('CustomNameBreadCrumbInfo(%r)' %name,
+                (GenericBreadcrumbInfo,), {'name': name})


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/breadcrumbs.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,280 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <!-- Viewlet Managers -->
+
+  <zope:interface
+      interface=".skin.IActionMenuContext"
+      type="zope.contentprovider.interfaces.ITALNamespaceData" />
+
+  <viewletManager
+      name="schooltool.Actions"
+      permission="zope.Public"
+      class=".skin.ActionMenuViewletManager"
+      template="templates/actions.pt"
+      />
+
+  <viewletManager
+      name="schooltool.CSS"
+      permission="zope.Public"
+      provides=".skin.ICSSManager"
+      />
+
+  <viewletManager
+      name="schooltool.JavaScript"
+      permission="zope.Public"
+      provides=".skin.IJavaScriptManager"
+      />
+
+  <viewletManager
+      name="schooltool.Header"
+      permission="zope.Public"
+      provides=".skin.IHeaderManager"
+      />
+
+  <viewletManager
+      name="schooltool.MenuBar"
+      permission="zope.Public"
+      provides=".skin.IMenuBarMenuManager"
+      class=".skin.MenuBarMenuViewletManager"
+      template="templates/menubar.pt"
+      />
+
+  <viewletManager
+      name="schooltool.NavigationMenu"
+      permission="zope.Public"
+      provides=".skin.INavigationManager"
+      template="templates/navigation.pt"
+      class=".skin.OrderedViewletManager"
+      />
+
+  <viewletManager
+      name="schooltool.ActionsMenu"
+      permission="zope.Public"
+      class=".skin.ActionMenuViewletManager"
+      template="templates/actionsbar.pt"
+      />
+
+  <!-- Skin and resources -->
+
+  <zope:interface
+      interface=".skin.ISchoolToolSkin"
+      type="zope.publisher.interfaces.browser.IBrowserSkinType"
+      name="SchoolTool"
+      />
+
+  <page
+      name="standard_macros"
+      for="*"
+      class=".macros.StandardMacros"
+      allowed_interface="zope.interface.common.mapping.IItemMapping"
+      permission="zope.Public"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <page
+      name="schooltool_macros"
+      for="*"
+      class=".macros.SchoolToolMacros"
+      allowed_interface="zope.interface.common.mapping.IItemMapping"
+      permission="zope.Public"
+      />
+
+  <page
+      name="view_macros"
+      for="*"
+      permission="zope.View"
+      template="templates/view_macros.pt"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <page
+      name="generic_macros"
+      for="*"
+      permission="zope.View"
+      template="templates/generic_macros.pt"
+      />
+
+   <page
+      name="onlinehelp_macros"
+      for="*"
+      permission="zope.View"
+      template="templates/onlinehelp_macros.pt"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <page
+      name="widget_macros"
+      for="*"
+      permission="zope.View"
+      template="templates/widget_macros.pt"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <page
+      name="formlib_macros"
+      for="*"
+      permission="zope.View"
+      template="templates/formlib_macros.pt"
+      layer="schooltool.skin.ISchoolToolLayer"
+      />
+
+  <icon
+      name="zmi_icon"
+      for="schooltool.app.interfaces.ISchoolToolApplication"
+      file="resources/icon.png"
+      />
+
+  <resource
+      name="logo.png"
+      file="resources/schooltool.png"
+      layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource
+      name="schooltool.css"
+      file="resources/schooltool.css"
+      layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource
+      name="editor_config.js"
+      file="resources/editor_config.js"
+      layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource name="layout.css" file="resources/layout.css"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="schooltool.js" file="resources/schooltool.js"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="favicon.ico" file="resources/favicon.ico"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="toolbar-background.png"
+            file="resources/toolbar-background.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="toolbar-background-hover.png"
+            file="resources/toolbar-background-hover.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="sidebar-background.png"
+            file="resources/sidebar-background.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="sidebar-background-top.png"
+            file="resources/sidebar-background-top.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource name="previous.png" file="resources/previous.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="next.png" file="resources/next.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource name="printer.png" file="resources/printer.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource name="delete.png" file="resources/delete.png"
+            layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource name="note-head-l.gif" file="resources/note-head-l.gif"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="note-head-r.gif" file="resources/note-head-r.gif"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="note-body-r.gif" file="resources/note-body-r.gif"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="note-body-l.gif" file="resources/note-body-l.gif"
+            layer="schooltool.skin.ISchoolToolLayer" />
+
+  <resource name="private-note-head-l.gif"
+            file="resources/private-note-head-l.gif"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="private-note-head-r.gif"
+            file="resources/private-note-head-r.gif"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="private-note-body-r.gif"
+            file="resources/private-note-body-r.gif"
+            layer="schooltool.skin.ISchoolToolLayer" />
+  <resource name="private-note-body-l.gif"
+            file="resources/private-note-body-l.gif"
+            layer="schooltool.skin.ISchoolToolLayer" />
+
+  <!-- Breadcrumbs -->
+
+  <page
+      for="*"
+      name="breadcrumbs"
+      class=".breadcrumbs.Breadcrumbs"
+      permission="zope.Public"
+      allowed_interface=".interfaces.IBreadcrumbs"
+      />
+
+  <zope:adapter
+      factory=".breadcrumbs.GenericBreadcrumbInfo"
+      trusted="true"
+      permission="zope.Public"
+      />
+
+  <!-- Error messages -->
+
+  <page
+      for="zope.interface.common.interfaces.IException"
+      name="index.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class=".error.ErrorView"
+      template="templates/error.pt"
+      permission="zope.Public"
+      />
+
+  <page
+      for="zope.publisher.interfaces.INotFound"
+      name="index.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class="zope.app.exception.browser.notfound.NotFound"
+      template="templates/notfound.pt"
+      permission="zope.Public"
+      />
+
+  <page
+      for="zope.security.interfaces.IUnauthorized"
+      name="index.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class="zope.app.exception.browser.unauthorized.Unauthorized"
+      template="templates/unauthorized.pt"
+      permission="zope.Public"
+      />
+
+  <zope:adapter
+      for=".skin.NavigationViewlet"
+      name="schooltool.view"
+     factory=".skin.NavigationViewletCrowd" />
+
+  <zope:view
+      for="datetime.date"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      name="fullDate"
+      factory=".dateformatter.DateFormatterFullView"
+      permission="zope.Public"
+      />
+
+  <zope:view
+      for="datetime.date"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      name="mediumDate"
+      factory=".dateformatter.DateFormatterMediumView"
+      permission="zope.Public"
+      />
+
+  <zope:view
+      for="datetime.date"
+      type="zope.publisher.interfaces.browser.IBrowserRequest"
+      name="shortDate"
+      factory=".dateformatter.DateFormatterShortView"
+      permission="zope.Public"
+      />
+
+  <viewlet
+      name="language_selector"
+      for="*"
+      manager="schooltool.skin.IHeaderManager"
+      template="templates/language_selector.pt"
+      permission="schooltool.view"
+      class="schooltool.skin.skin.LanguageSelectorViewlet"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/containers.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/containers.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/containers.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,143 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool skin containers
+
+$Id: containers.py 6863 2007-04-16 14:50:03Z ignas $
+"""
+import urllib
+
+from zope.app import zapi
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.component import queryMultiAdapter
+from zope.publisher.browser import BrowserView
+from zope.security.checker import canAccess
+
+from schooltool.table.batch import IterableBatch
+from schooltool.table.table import DependableCheckboxColumn
+from schooltool.table.table import url_cell_formatter
+from schooltool.table.interfaces import ITableFormatter
+
+
+class ContainerView(BrowserView):
+    """A base view for all containers.
+
+    Subclasses must provide the following attributes that are used in the
+    page template:
+
+        `index_title` -- Title of the index page.
+
+    """
+
+    def update(self):
+        if 'SEARCH' in self.request and 'CLEAR_SEARCH' not in self.request:
+            searchstr = self.request['SEARCH'].lower()
+            results = [item for item in self.context.values()
+                       if searchstr in item.title.lower()]
+            extra_url = "&SEARCH=%s" % urllib.quote(self.request['SEARCH'])
+        else:
+            self.request.form['SEARCH'] = ''
+            results = self.context.values()
+            extra_url = ""
+
+        self.batch = IterableBatch(results, self.request, sort_by='title',
+                                   extra_url=extra_url)
+
+    @property
+    def canModify(self):
+        return canAccess(self.context, '__delitem__')
+
+
+class ContainerDeleteView(BrowserView):
+    """A view for deleting items from container."""
+
+    def listIdsForDeletion(self):
+        return [key for key in self.context
+                if "delete.%s" % key in self.request]
+
+    def _listItemsForDeletion(self):
+        return [self.context[key] for key in self.listIdsForDeletion()]
+
+    itemsToDelete = property(_listItemsForDeletion)
+
+    def update(self):
+        if 'CONFIRM' in self.request:
+            for key in self.listIdsForDeletion():
+                del self.context[key]
+            self.request.response.redirect(self.nextURL())
+        elif 'CANCEL' in self.request:
+            self.request.response.redirect(self.nextURL())
+
+    def nextURL(self):
+        return zapi.absoluteURL(self.context, self.request)
+
+
+class TableContainerView(BrowserView):
+    """A base view for containers that use zc.table to display items.
+
+    Subclasses must provide the following attributes that are used in the
+    page template:
+
+        `index_title` -- Title of the index page.
+
+    """
+
+    template = ViewPageTemplateFile('templates/table_container.pt')
+    delete_template = ViewPageTemplateFile('templates/container_delete.pt')
+
+    def __init__(self, context, request):
+        self.request = request
+        self.context = context
+        self.table = queryMultiAdapter((context, request), ITableFormatter)
+
+    def setUpTableFormatter(self, formatter):
+        columns_before = []
+        if self.canModify():
+            columns_before = [DependableCheckboxColumn(prefix="delete",
+                                                       name='delete_checkbox',
+                                                       title=u'')]
+        formatter.setUp(formatters=[url_cell_formatter],
+                        columns_before=columns_before)
+
+    def __call__(self):
+        if 'DELETE' in self.request:
+            return self.delete_template()
+
+        self.setUpTableFormatter(self.table)
+        # XXX update should be in here but as the container_delete
+        # template is shared with the ContainerDeleteView and update
+        # is called in the template we are not doing it here
+        return self.template()
+
+    def update(self):
+        if 'CONFIRM' in self.request:
+            for key in self.listIdsForDeletion():
+                del self.context[key]
+
+    def canModify(self):
+        return canAccess(self.context, '__delitem__')
+
+    def listIdsForDeletion(self):
+        return [key for key in self.context
+                if "delete.%s" % key in self.request]
+
+    def _listItemsForDeletion(self):
+        return [self.context[key] for key in self.listIdsForDeletion()]
+
+    itemsToDelete = property(_listItemsForDeletion)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/containers.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/dateformatter.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/dateformatter.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/dateformatter.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,76 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Language dpendent date formatting.
+
+$Id: dateformatter.py 6597 2007-01-24 16:21:15Z ignas $
+"""
+from zope.publisher.browser import BrowserView
+from zope.interface import implements
+
+from zope.i18n.locales import Locale
+from zope.i18n.locales import LocaleIdentity
+
+
+class LocaleLookupMixin(object):
+    """Mixin for extracting of locale from request.
+
+    Defaults to english if no locale is set in the request.
+    """
+
+    def getLocale(self):
+        if not hasattr(self, 'request'):
+            raise NotImplementedError("LocaleLookupMixin need to be applied on a view")
+
+        if self.request.locale.id.language is None:
+            # if we dont have any locale defined in the request
+            # we set default to english
+            id = LocaleIdentity('en', territory='US')
+            locale = Locale(id)
+        else:
+            if hasattr(self.request, 'locale'):
+                locale = self.request.locale
+
+        return locale
+
+
+class DateFormatterFullView( BrowserView, LocaleLookupMixin):
+    """Formats the date using the 'full' format"""
+
+    def __call__(self):
+        locale = self.getLocale()
+        formatter = locale.dates.getFormatter('date','full')
+        return formatter.format(self.context)
+
+
+class DateFormatterMediumView( BrowserView, LocaleLookupMixin):
+    """Formats the date using the 'medium' format"""
+
+    def __call__(self):
+        locale = self.getLocale()
+        formatter = locale.dates.getFormatter('date','medium')
+        return formatter.format(self.context)
+
+
+class DateFormatterShortView( BrowserView, LocaleLookupMixin):
+    """Formats the date using the 'short' format"""
+
+    def __call__(self):
+        locale = self.getLocale()
+        formatter = locale.dates.getFormatter('date','short')
+        return formatter.format(self.context)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/dateformatter.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/error.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/error.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/error.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,109 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolBell internal error view.
+
+$Id: error.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+
+import sys
+import linecache
+import cgi
+
+from zope.interface import implements
+from zope.publisher.browser import BrowserView
+from zope.app.exception.interfaces import ISystemErrorView
+
+
+class ErrorView(BrowserView):
+    """A view for server error messages."""
+
+    implements(ISystemErrorView)
+
+    def isSystemError(self):
+        return True
+
+    def __call__(self):
+        self.request.response.setStatus(500)
+        return self.index()
+
+    def traceback(self):
+        # Note: this function exposes filenames to the web user; some may
+        # consider it a security risk.
+        etype, value, tb = sys.exc_info()
+        lines = []
+        w = lines.append
+        q = lambda s: cgi.escape(str(s), True)
+        for filename, lineno, method, locals in extract_tb(tb):
+            w('File "<span class="filename">%s</span>",'
+                    ' line <span class="lineno">%s</span>,'
+                    ' in <span class="method">%s</span>\n'
+              % (q(filename), q(lineno), q(method)))
+            w('  <span class="source">%s</span>\n'
+              % q(linecache.getline(filename, lineno).strip()))
+            self._extra_info(w, dict(locals))
+        return "".join(lines)
+
+    def _extra_info(self, w, locals):
+        # TODO: unit tests would be nice
+        q = lambda s: cgi.escape(str(s), True)
+        if '__traceback_info__' in locals:
+            tb_info = locals['__traceback_info__']
+            w('Extra information: %s\n' % q(repr(tb_info)))
+        if '__traceback_supplement__' in locals:
+            tb_supplement = locals['__traceback_supplement__']
+            tb_supplement = tb_supplement[0](*tb_supplement[1:])
+            from zope.pagetemplate.pagetemplate import \
+                    PageTemplateTracebackSupplement
+            from zope.tales.tales import TALESTracebackSupplement
+            if isinstance(tb_supplement, PageTemplateTracebackSupplement):
+                source_file = tb_supplement.manageable_object.pt_source_file()
+                if source_file:
+                    w('Template "<span class="filename">%s</span>"\n'
+                      % q(source_file))
+            elif isinstance(tb_supplement, TALESTracebackSupplement):
+                w('Template "<span class="filename">%s</span>",'
+                  ' line <span class="lineno">%s</span>,'
+                  ' column <span class="column">%s</span>\n'
+                  % (q(tb_supplement.source_url), q(tb_supplement.line),
+                     q(tb_supplement.column)))
+                w('  Expression: <span class="expr">%s</span>\n'
+                  % q(tb_supplement.expression))
+            else:
+                w('__traceback_supplement__ = %s\n'
+                  % q(repr(tb_supplement)))
+
+
+def extract_tb(tb, limit=None):
+    """Improved version of traceback.extract_tb.
+
+    Includes a dict with locals in every stack frame instead of the line.
+    """
+    # TODO: unit tests would be nice
+    list = []
+    while tb is not None and (limit is None or len(list) < limit):
+        frame = tb.tb_frame
+        code = frame.f_code
+        name = code.co_name
+        filename = code.co_filename
+        lineno = tb.tb_lineno
+        locals = frame.f_locals
+        list.append((filename, lineno, name, locals))
+        tb = tb.tb_next
+    return list


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/error.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/form.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/form.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/form.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,99 @@
+import pytz
+import datetime
+from zope.app import zapi
+from zope import event
+from zope.formlib import form
+from zope.formlib.interfaces import IAction
+from zope.lifecycleevent import ObjectModifiedEvent
+from zope.interface.common import idatetime
+from zope.app.pagetemplate import ViewPageTemplateFile
+
+from schooltool import SchoolToolMessage as _
+
+class BasicForm(form.FormBase):
+    """Simple non-edit form in schooltool style.
+
+    Pass render_context=False to form.Fields() in subclasses to
+    make sure it doesn't try to render fields from the context object.
+    """
+    template = ViewPageTemplateFile('templates/edit_form.pt')
+
+    def title(self):
+        # optional
+        return None
+
+    def legend(self):
+        # optional
+        return None
+
+    def getMenu(self):
+        # optional
+        return None
+
+class EditForm(form.PageEditForm):
+    """Formlib-based edit form in schooltool style.
+    """
+    template = ViewPageTemplateFile('templates/edit_form.pt')
+
+    def title(self):
+        # optional
+        return None
+
+    def legend(self):
+        # optional
+        return None
+
+    def getMenu(self):
+        # optional
+        return None
+
+    def actualContext(self):
+        # subclass could turn this into self.context.__parent__ for
+        # attribute editing
+        return self.context
+
+    @form.action(_("Apply"), condition=form.haveInputWidgets)
+    def handle_edit_action(self, action, data):
+        self.edit_action(action, data)
+
+    # a separate method so it can be called by actions on subclasses as well
+    # or, alternatively, be overridden by subclasses
+    def edit_action(self, action, data):
+        if not form.applyChanges(self.context, self.form_fields, data,
+                                 self.adapters):
+            self.status = _('No changes')
+            return
+
+        event.notify(ObjectModifiedEvent(self.context))
+        formatter = self.request.locale.dates.getFormatter(
+            'dateTime', 'medium')
+
+        try:
+            time_zone = idatetime.ITZInfo(self.request)
+        except TypeError:
+            time_zone = pytz.UTC
+
+        self.status = _(
+            "Updated on ${date_time}",
+            mapping={
+              'date_time':
+              formatter.format(datetime.datetime.now(time_zone))
+              }
+            )
+
+    @form.action(_("Cancel"), condition=form.haveInputWidgets)
+    def handle_cancel_action(self, action, data):
+        self.cancel_action(action, data)
+
+    def cancel_action(self, action, data):
+        # redirect to parent
+        url = zapi.absoluteURL(self.actualContext(), self.request)
+        self.request.response.redirect(url)
+        return ''
+
+class AttributeEditForm(EditForm):
+    """A form that can be used when editing an attribute of the actual
+    content object.
+    """
+    def actualContext(self):
+        return self.context.__parent__


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/form.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,55 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Interfaces for SchoolTool calendar browser views.
+
+$Id: interfaces.py 6863 2007-04-16 14:50:03Z ignas $
+"""
+from zope.schema import Object, TextLine, Bool, URI
+from zope.interface import Interface, Attribute
+
+
+class IBreadcrumbs(Interface):
+    """An object providing breadcrumbs.
+
+    This object will use the ``IBreadcrumbInfo`` adapter to get its
+    information from each entry.
+    """
+
+    crumbs = Attribute('An iteratable of all breadcrumbs.')
+
+
+class IBreadcrumbInfo(Interface):
+    """Provides pieces of information about a breadcrumb."""
+
+    name = TextLine(
+        title=u'Name',
+        description=u'The name of the breadcrumb.',
+        required=True)
+
+    url = URI(
+        title=u'URL',
+        description=u'The url of the breadcrumb.',
+        required=True)
+
+    active = Bool(
+        title=u'Active',
+        description=u'Tells whether the breadcrumb link should active.',
+        required=True,
+        default=True)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/macros.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/macros.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/macros.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,46 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Macros
+
+$Id: macros.py 6595 2007-01-24 15:25:15Z jfroche $
+"""
+import zope.interface
+
+from zope.app import zapi
+from zope.publisher.browser import BrowserView
+
+from zope.app import basicskin
+
+class StandardMacros(basicskin.standardmacros.StandardMacros):
+    macro_pages = ('view_macros', 'dialog_macros',)
+
+
+class SchoolToolMacros(BrowserView):
+    zope.interface.implements(zope.interface.common.mapping.IItemMapping)
+
+    macro_pages = ('calendar_macros', 'generic_macros', 'onlinehelp_macros')
+
+    def __getitem__(self, key):
+        name = key + '_macros'
+
+        if name in self.macro_pages:
+            return zapi.getMultiAdapter((self.context, self.request), name=name)
+
+        raise KeyError, key


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/macros.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/meta.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/meta.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/meta.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,14 @@
+<configure
+    xmlns:meta="http://namespaces.zope.org/meta">
+
+  <meta:directives namespace="http://namespaces.zope.org/browser">
+
+    <meta:directive
+        name="navigationViewlet"
+        schema=".skin.INavigationMenuItemDirective"
+        handler="zope.viewlet.metaconfigure.viewletDirective"
+        />
+
+  </meta:directives>
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/meta.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/delete.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/delete.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/editor_config.js
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/resources/editor_config.js	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/resources/editor_config.js	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,29 @@
+FCKConfig.BasePath = '/@@/fckeditor/editor/';
+FCKConfig.EditorAreaCSS = FCKConfig.BasePath + 'css/fck_editorarea.css' ;
+FCKConfig.CustomConfigurationsPath = "/@@/zope_fckconfig.js";
+
+FCKConfig.ToolbarSets["schooltool"] = [
+  ['Bold','Italic','RemoveFormat'], // 'Underline','StrikeThrough','-','Subscript','Superscript'
+  //['Source'],
+  ['Cut','Copy','PasteText'], // ,'Paste','PasteWord'],
+  // ['SelectAll'], // , // for IE JS, unlike Python, never end a list with a comma!
+  //['OrderedList','UnorderedList','-','Outdent','Indent'],
+  //['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
+  //['Image','Link','Unlink','Anchor','Table','Rule'],
+  ['Link']
+  //'/',
+  //['Style','FontFormat','FontName','FontSize'],
+  //['TextColor','BGColor'],
+  //['About']
+  ];
+
+// set faked table borders on table with border="0"
+FCKConfig.ShowBorders   = true ;
+
+// The contextURL is set in the javascript template and used in the explorer
+// implementation
+FCKConfig.contextURL = window.top.top.contextURL;
+
+FCKConfig.LinkBrowser = false ;
+
+FCKConfig.ImageBrowser = false ;

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/favicon.ico
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/favicon.ico
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/icon.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/icon.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/layout.css
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/resources/layout.css	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/resources/layout.css	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1363 @@
+/*
+ * Stylesheet for SchoolTool
+ *
+ */
+
+/******************************************************* BEGIN: Base.css */
+
+BODY {
+	font-size: x-small; /* for IE5/Win */
+	voice-family: "\"}\"";
+	voice-family: inherit;
+	font-size: small; /* for IE6/Win */
+}
+
+HTML>BODY {
+	font-size: x-small; /* for Opera */
+}
+
+head:first-child+BODY {
+	font-size: small; /* for Mozilla, IE5/Mac */
+}
+
+BODY {
+	margin: 0;
+	padding:0 ;
+}
+
+/********************************************************* END: Base.css */
+
+
+/************************************************* BEGIN: Schooltool.css */
+
+BODY {
+	font-family: Verdana, Helvetica, Arial, Sans-Serif;
+	background: #fff;
+	color: #000;
+	min-width: 700px;
+}
+
+UL {
+	padding-left: 2em;
+}
+
+IMG {
+	border: none;
+}
+
+A, A:link, A:visited, A:hover, A:active {
+	color: #314e6c;
+	font-weight: bold;
+}
+
+H1, H2, H3, H4, H5, H6 {
+	font-family: "Trebuchet MS", Sans-Serif;
+}
+
+H1, H2, H3, H4, H5, H6 { margin: 0; padding: 0; }
+H1 { font-size: 120%; }
+H2 { font-size: 110%; }
+H3 { font-size: 100%; }
+H4 { font-size: 90%; }
+H5 { font-size: 80%; }
+H6 { font-size: 75%; }
+
+PRE {
+	margin: 1em;
+	padding: 1em;
+	border: 1px #000 dotted;
+}
+
+/*************************************************** END: Schooltool.css */
+
+
+/***************************************************** BEGIN: Layout.css */
+
+#footer {
+	width: 70%;
+	padding: 1em 15%;
+	margin-top: 2em;
+	margin-bottom: 1em;
+}
+
+#columns {
+	margin-bottom: 1em;
+}
+
+.clearer {
+	clear: both;
+	margin-top: 2em;
+}
+
+FORM.standalone, div.standalone {
+	width: 40em;
+	margin: auto;
+}
+
+FORM.standalone FIELDSET, div.standalone FIELDSET {
+	margin: 1em;
+}
+
+FORM.standalone h3, div.standalone h3 {
+	margin: 0;
+	padding: 0.25em;
+}
+
+FORM.standalone .row, div.standalone .row {
+	margin: 0.5em 0em;
+}
+
+FORM.standalone > .row, div.standalone > .row {
+	margin: 0.5em;
+}
+
+FORM.standalone .controls, div.standalone .controls {
+	margin: 0.5em 1em 1em 1em;
+}
+
+FORM div.oneline-form div{
+  display: inline;
+}
+
+FORM div.oneline-form div.value{
+  margin: 0;
+}
+
+#header {
+}
+
+#header .logo IMG {
+	float: left;
+}
+
+#header .logo {
+	height: 30px;
+	padding: 10px;
+	vertical-align: middle;
+}
+
+#header .logo H1 {
+	margin: 0;
+}
+
+#header .tools {
+	text-align: right;
+	padding: 2px 1ex;
+}
+
+#header .breadcrumbs {
+	float: left;
+}
+
+#column-left {
+	float: left;
+	width: 14em;
+	margin-bottom: 5em;
+        margin-top: 2em;
+}
+
+#column-center {
+	margin-left: 0em;
+}
+
+#footer {
+	text-align: center;
+	clear: both;
+}
+
+/* Calendar Views */
+#calendar-view-year {
+	text-align: center;
+	margin: auto;
+}
+
+
+/********************************************************* BEGIN: Style.css */
+
+.center {
+	text-align: center;
+}
+
+.inline {
+	display: inline;
+}
+
+.popup {
+	font-size: smaller;
+
+	width:100% !important;
+}
+
+DIV.search-results {
+	height:10em;
+	overflow: auto;
+	border: 1px #bab5ab solid;
+	background: #eae8e3;
+}
+
+FORM.standalone, div.standalone, FORM div.oneline-form{
+	background: #eae8e3;
+	border: 1px #bab5ab solid;
+}
+
+FORM.standalone h3, div.standalone h3 {
+	background: #bab5ab;
+}
+
+FORM.standalone FIELDSET, div.standalone FIELDSET {
+	border: 1px #bab5ab solid;
+	/* Mozilla's default padding for fieldsets -- makes it nice in MSIE too */
+	padding: 0.35em 0.625em 0.75em 0.625em;
+}
+
+FORM.standalone p, div.standalone p {
+	margin: 0.5em;
+}
+
+FORM.standalone p.hint, div.standalone p.hint {
+	font-size: 80%;
+	font-style: italic;
+	color: #bab5ab;
+}
+
+FORM.standalone .controls INPUT, div.standalone .controls INPUT {
+	background: #fff;
+}
+
+FORM.standalone DIV.label, div.standalone DIV.label {
+	width: 10em;
+	padding-top: 0.5ex;
+}
+
+FORM.booking_form {
+	width: 75%;
+}
+
+INPUT[type=text],
+INPUT[type=password],
+INPUT[type=submit],
+SELECT,
+TEXTAREA {
+	padding: 2px;
+	border: 1px #bab5ab solid;
+	background: #ffffff;
+	vertical-align: middle;
+}
+
+SELECT {
+	padding: 0;
+	vertical-align: top;
+}
+
+#column-left SELECT {
+	width: 10em;
+}
+
+OPTION {
+	border-bottom: 1px #eae8e3 solid;
+}
+
+OPTION.dropdown-header {
+        border-bottom: 1px #000 solid;
+        background: #ddd;
+        color: #000;
+        font-weight: bold;
+}
+
+INPUT[type=text]:focus,
+INPUT[type=password]:focus,
+INPUT[type=submit]:focus,
+INPUT[type=checkbox]:focus,
+INPUT[type=radio]:focus,
+TEXTAREA:focus  {
+	border: 1px #565248 solid;
+}
+
+DIV.info {
+	margin: 0.5em;
+	font-weight: bold;
+	color: #009900;
+}
+
+P.error {
+	margin: 0.5em;
+	font-weight: bold;
+	color: #990000;
+}
+
+DIV.error {
+	margin: 0.5em;
+	font-weight: bold;
+	color: #990000;
+}
+
+.error LABEL {
+	font-weight: bold;
+	color: #990000;
+}
+
+.error INPUT[type=text],
+.error INPUT[type=password],
+.error INPUT[type=checkbox],
+.error SELECT,
+.error TEXTAREA  {
+	padding: 2px;
+	border: 1px #C1665A solid;
+	background: #e0b6af;
+}
+
+.error INPUT[type=text]:focus,
+.error INPUT[type=password]:focus,
+.error INPUT[type=checkbox]:focus,
+.error SELECT:focus,
+.error TEXTAREA:focus  {
+	border: 1px #663822 solid;
+}
+
+.controls {
+	margin-top: 1ex;
+}
+
+A.button-cancel,
+A.button-ok {
+	color: white;
+	text-decoration: none;
+	margin: 5px;
+	padding: 2px 5px;
+}
+
+.button-ok {
+	background: #83A67F !important;
+	border: 1px #445632 solid !important;
+	color: #fff;
+	font-weight: bold;
+}
+
+.button-cancel {
+	background: #C1665A !important;
+	border: 1px #663822 solid !important;
+	color: #fff;
+	font-weight: bold;
+}
+
+/***************************/
+
+#header {
+	background: #eae8e3;
+}
+
+#header .tools {
+	color: #f0f0f0;
+	background: #990000 url(++resource++toolbar-background.png) top left repeat-x;
+	border-top: 2px #800 solid;
+	border-bottom: 2px #700 solid;
+	font-size: smaller;
+}
+
+#header .tools a {
+	color: #f0f0f0;
+	background: inherit;
+	text-decoration: none;
+	padding: 2px 1ex;
+	font-weight: bold;
+	margin: 0 1px;
+}
+
+#header .tools a:hover {
+	color: #ffffff;
+	background: #C40000 url(++resource++toolbar-background-hover.png) top left repeat-x;
+	margin: 0;
+	border-left: 1px #800 solid;
+	border-right: 1px #800 solid;
+}
+
+#tools-zmi-principal {
+	font-style: italic;
+}
+
+/*
+* Left Column and portlets
+*/
+#column-left-top {
+    background: url(++resource++sidebar-background-top.png) top right no-repeat;
+	position: relative;
+	top: 0;
+	right: 0;
+	width: 100%;
+	padding-top: 20px;
+	padding-right: 3px;
+	margin: 0;
+	margin-bottom: -0.5em;
+}
+
+#column-left {
+	background: #eae8e3 url(++resource++sidebar-background.png) bottom right no-repeat;
+	padding-right: 3px;
+	padding-bottom: 2em;
+}
+
+#column-left .portlet {
+	margin-top: 1em;
+}
+
+#column-left .portlet H4 {
+	margin: 0;
+	padding: 0 1em;
+	border-top: 1px #bab5ab solid;
+	border-bottom: 1px #bab5ab solid;
+	background: #d6d6d6;
+	font-size: small;
+}
+
+#column-left .portlet UL {
+	margin: 0;
+	padding: 0;
+}
+
+#portlet-next-day-events.portlet UL {
+	margin: 0.5em;
+	padding: 0;
+}
+
+#column-left .portlet LI {
+	list-style: none;
+	padding: 1px 0;
+	margin-top: 1px;
+	margin-bottom: 0;
+}
+
+#column-left .portlet LI A {
+	display: block;
+	margin: 1px 0;
+	padding: 2px 1em;
+	color: #304D6B;
+	font-weight: bold;
+	text-decoration: none;
+}
+
+#column-left .portlet LI A:hover {
+	background: #748FAD;
+	background: #7590ae;
+	margin: 0;
+	border-top: 1px #314e6c solid;
+	border-bottom: 1px #314e6c solid;
+	color: #fff !important;
+}
+
+#column-left .portlet .controls {
+	margin: 1ex 1ex 1ex 1ex;
+	text-align: right;
+}
+
+#column-left .portlet .controls INPUT {
+	font-size: x-small;
+}
+
+/*
+* Center Column and Content
+*/
+
+#column-center {
+	padding: 2em 2em;
+}
+
+#content-header,
+#content-header H1 {
+	margin: 0;
+}
+
+#content-header H1 {
+}
+
+#content-body {
+  margin-top: 20px;
+}
+
+#breadcrumbs {
+	list-style: none;
+	padding: 0;
+	/* This compensates for the padding on #column-center */
+	margin: -0.5em 0 0 -1em;
+}
+
+#breadcrumbs LI {
+	display: inline;
+	margin: 0;
+}
+
+#breadcrumbs LI.breadcrumb:after {
+	content: "\00BB \0020";
+}
+
+#breadcrumbs LI.last:after {
+	content: '';
+}
+
+.breadcrumb A {
+	font-size: smaller;
+	text-decoration: none;
+}
+
+#message {
+	/*
+	* A status message for the user.  There should only be one of these as it
+	* is meant to be displayed prominently
+	*/
+
+	margin: 1em;
+	padding: 1em;
+	background: #EED680;
+	border: 1px #D1940C solid;
+}
+
+#footer {
+	font-size: xx-small;
+	background: #eae8e3;
+	border-top: 1px solid #bab5ab;
+	border-bottom: 1px solid #bab5ab;
+	line-height: 1em;
+}
+
+#footer P {
+	margin: 0.5ex;
+}
+
+/*
+* Calendar Views
+*/
+
+#calendar-navigation {
+	position: absolute;
+	top: 1em;
+	right: 1em;
+}
+
+#calendar-navigation-pdf,
+#calendar-navigation-day,
+#calendar-navigation-week,
+#calendar-navigation-month,
+#calendar-navigation-year {
+	display: block;
+	margin: 2px;
+	float: left;
+	text-decoration: none;
+	border: 0;
+	padding: 0;
+	width: 24px;
+}
+
+#calendar-navigation-pdf {
+	margin-right: 16px;
+}
+
+#calendar-navigation-context {
+	background: #eae8e3;
+	border: 1px #bab5ab solid;
+	margin: 1ex auto;
+	vertical-align: middle;
+	overflow: auto;
+}
+
+#calendar-navigation-context-previous,
+#calendar-navigation-context-current,
+#calendar-navigation-context-next {
+	display: block;
+	text-decoration: none;
+	width: 33.33%;
+	float: left;
+}
+
+#calendar-navigation-context-previous {
+	text-align: left;
+}
+
+#calendar-navigation-context-previous SPAN {
+	padding-left: 24px;
+	background: url("++resource++previous.png") left center no-repeat;
+}
+
+#calendar-navigation-context-current {
+	text-align: center;
+}
+
+#calendar-navigation-context-next {
+	text-align: right;
+}
+
+#calendar-navigation-context-next SPAN {
+	padding-right: 24px;
+	background: url("++resource++next.png") right center no-repeat;
+}
+
+#calendar-navigation-context-previous:hover,
+#calendar-navigation-context-current:hover,
+#calendar-navigation-context-next:hover {
+	background: #cfc9bc;
+}
+
+#calendar-view-year TD.month {
+	padding: 1em;
+}
+
+#calendar-view-year TABLE.month,
+#portlet-calendar-view-month TABLE.month,
+#calendar-view-month {
+	background: #eae8e3;
+	border: 1px #4B6983 solid;
+}
+
+#calendar-view-month {
+	width: 99%;
+	min-width: 100%;
+}
+
+#calendar-view-year TABLE.month TH,
+#portlet-calendar-view-month TABLE.month TH,
+#calendar-view-month TH,
+#calendar-view-month TD.weekno {
+	background: #9DB8D2;
+}
+
+#calendar-view-month TD.weekno {
+	border-right: 2px #4B6983 solid;
+	border-bottom: 1px #4b6983 solid;
+	font-family: cursive, serif;
+	font-size: x-large;
+	font-style: italic;
+}
+
+#calendar-view-year TABLE.month TH.month-weekday,
+#calendar-view-month TH.weekday {
+	font-weight: normal;
+	padding: 2px;
+	border-bottom: 1px #4B6983 solid;
+}
+
+.cal_yearly_day_busy {
+	background: #9DB8D2;
+	color: #9C0000;
+}
+
+#calendar-view-year TABLE.month TH.month-title A {
+	display: block;
+	width: 100%;
+	height: 100%;
+	text-decoration: none;
+	color: #f0f0f0;
+	background: #4B6983;
+	padding-top: 3px;
+	padding-bottom: 1px;
+}
+
+#calendar-view-year TABLE.month TH.month-title A:hover {
+	background: #314e6c;
+}
+
+#calendar-view-year TABLE.month TH {
+}
+
+#calendar-view-year TABLE.month TD {
+}
+
+#calendar-view-year TABLE.month TD A,
+#calendar-view-month TD A  {
+	text-decoration: none;
+	display: block;
+	padding: 1px;
+}
+
+#portlet-calendar-view-month TABLE.month TD A {
+	text-decoration: none;
+	display: block;
+	font-weight: normal;
+	padding: 1px;
+}
+
+#calendar-view-month TH.month-title {
+	color: #f0f0f0;
+	background: #4B6983;
+}
+
+#calendar-view-year TABLE.month TD A:hover,
+#calendar-view-month TD A:hover,
+#portlet-calendar-view-month TABLE.month TD A:hover,
+#calendar-view-week TH A:hover {
+	color: #f0f0f0;
+	background: #314e6c;
+}
+
+#calendar-view-month TD.weekno {
+}
+
+#calendar-view-month TD.day,
+#portlet-calendar-view-month TABLE.month TD {
+	border-right: 1px #bab5ab solid;
+	border-bottom: 1px #bab5ab solid;
+}
+
+#calendar-view-month TD.day A,
+#calendar-view-month TD.day-other A,
+#calendar-view-month TD.weekno A {
+	margin: auto;
+	display: block;
+	height: 100%;
+	min-height: 80px;
+}
+
+#calendar-view-month TD.weekno A {
+	height: 100%;
+	width: 100%;
+	color: #7590AE;
+	padding-left: 0.5ex;
+	padding-right: 0.5ex;
+}
+
+#calendar-view-month TD.day-other {
+	background: #bab5ab;
+}
+
+#calendar-view-month TD.day-other A {
+	color: #807d74;
+}
+
+#calendar-view-month .event,
+#calendar-view-month .comp_event {
+	font-weight: normal;
+	font-size: xx-small;
+	display: block;
+	padding: 1px;
+	border: 1px #eae8e3 solid;
+}
+
+#calendar-view-month A:hover .event,
+#calendar-view-month A:hover .comp_event {
+	color: #000;
+	border: 1px #314e6c solid;
+}
+
+#calendar-view-month .event {
+	background: #9db8d2;
+}
+
+#calendar-view-month .comp_event {
+	background: #e0b6af;
+}
+
+#calendar-view-week {
+	border-top: 1px #4B6983 solid;
+}
+
+#calendar-view-week TD {
+	width: 20em;
+	background: #eae8e3;
+	font-size: smaller;
+}
+#calendar-view-week TH {
+	border-right: 1px #4B6983 solid;
+}
+
+#calendar-view-week TH.first {
+	border-left: 1px #4B6983 solid;
+}
+
+#calendar-view-week TH.day-title {
+	background: #9DB8D2;
+	border-bottom: 1px #4B6983 solid;
+}
+
+#calendar-view-week TH A {
+	display: block;
+	width: 100%;
+	text-align: center;
+	text-decoration: none;
+}
+
+#calendar-view-week TD {
+	border-right: 1px #bab5ab solid;
+	border-bottom: 1px #bab5ab solid;
+}
+
+#calendar-view-week TD.first {
+	border-left: 1px #bab5ab solid;
+}
+
+#calendar-view-week TD A {
+	display: block;
+	border: 1px solid;
+	margin: 2px;
+	padding: 0.5em;
+	text-decoration: none;
+	font-weight: normal;
+}
+
+#calendar-view-week TD A .time {
+	font-size: smaller;
+}
+
+#calendar-view-week TD A.first {
+}
+
+#calendar-view-week TD A:hover {
+	color: #f0f0f0;
+	background: #314e6c;
+}
+
+/* Day View
+* The height attribute is defined inline depending on the length of the visible
+* day
+*/
+#calendar-view-day {
+	border: #aaaaaa 1px solid;
+	border-top: none;
+	position: relative;
+	padding-top: 2px;
+}
+
+#events-allday {
+	margin-bottom: 1px;
+}
+
+#events-allday .event-allday {
+	position: relative;
+	margin-top: 1px;
+}
+
+#events-allday .event-allday H6 {
+	margin: 0;
+	font-size: small;
+	text-align: center;
+}
+#events-allday .event-allday H6 A {
+	text-decoration: none;
+	display: block;
+}
+
+#events-allday .event-allday A.delete {
+	position: absolute;
+	top: 0px;
+	right: 2px;
+	display: block;
+	text-decoration: none;
+	overflow: hidden;
+	border: 0;
+	padding: 0;
+	cursor: pointer;
+}
+
+#events-allday .event-allday P {
+	font-size: smaller;
+	margin: 0 1em;
+	text-align: center;
+}
+
+
+
+#calendar-view-day .hour {
+	border-top: 1px #bab5ab solid;
+	width: 100%;
+	position: absolute;
+	height: 4em;
+	margin: 0 !important;
+	padding: 0 !important;
+}
+
+#calendar-view-day .even {
+	background: #eae8e3;
+}
+
+#calendar-view-day .active {
+	background: #a8a5a0;
+}
+
+#calendar-view-day .hour .title {
+	position: absolute;
+	top: 0;
+	left: 0;
+	font-weight: bold;
+	margin-left: 0.5em;
+}
+
+#calendar-view-day .events {
+	position: absolute;
+	margin-left: 5.5em;
+	left: 0;
+	top: 0;
+	width: 100%;
+}
+
+#calendar-view-day .event {
+	position: absolute;
+	margin-left: 5em;
+	width: 20em;
+	min-width: 20em;
+	border: 1px #4b6983 solid;
+	background: #9db8d2;
+	opacity: 0.85;
+}
+
+#calendar-view-day .expanded {
+        overflow: visible;
+        display: block;
+	opacity: 1;
+	z-index: 9;
+ 	height: auto !important;
+}
+
+#calendar-view-day .contracted {
+        z-index: 1;
+        overflow: hidden;
+        display: block;
+}
+
+#calendar-view-day .other {
+	background: #e0b6af;
+	border: 1px #884631 solid;
+}
+
+#calendar-view-day .event H6 {
+	font-size: small;
+	margin: 0;
+	padding: 2px;
+	background: #7590ae;
+	font-weight: bold;
+	line-height: 1em;
+	opacity: 1 !important;
+}
+
+#calendar-view-day .other H6 {
+	background: #c1665a;
+}
+
+#calendar-view-day .event H6 A {
+	color: #fff;
+	text-decoration: none;
+	display: block;
+}
+
+#calendar-view-day .event H6 .start-end {
+	font-weight: bold;
+	color: #000;
+}
+
+#calendar-view-day .event A.delete {
+	position: absolute;
+	top: 1px;
+	right: 1px;
+	display: block;
+	text-decoration: none;
+	overflow: hidden;
+	border: 0;
+	padding: 0;
+	cursor: pointer;
+}
+
+#calendar-view-day .event .body {
+	margin: 0.5ex;
+	padding: 0.5ex;
+}
+
+#calendar-view-day .event .booked-resources {
+	border: 1px;
+	padding: 0.5ex;
+	font-size: 80%;
+}
+
+#calendar-view-day .event .booked-resources-header A {
+	color: #000;
+	text-decoration: none;
+	display: block;
+}
+
+#calendar-view-day .event .booked-resources a {
+	display: block;
+}
+
+#calendar-view-day .event .body .title {
+	font-style: italic;
+}
+
+#calendar-view-day .hour A.event-new {
+	padding: 0.5ex;
+	cursor: pointer;
+	text-decoration: none;
+}
+
+#calendar-view-day .hour SPAN.event-new {
+	font-weight: bold;
+	padding: 0.5ex;
+}
+
+/*
+* Content specific styling
+*/
+
+body#path-login H1 {
+	display: none;
+}
+
+body#path-login #column-center {
+	margin-left: 0;
+}
+
+body#path-login FORM.standalone {
+	vertical-align: middle;
+	margin-top: 10%;
+	margin-bottom: 10%;
+}
+
+#portlet-navigation-calendar {
+	padding-left: 3em !important;
+	background: url("/calendar.png") left no-repeat;
+}
+
+#portlet-navigation-calendar:hover {
+	padding-left: 3em !important;
+	background: #748fad url("/calendar.png") left no-repeat !important;
+}
+
+#portlet-navigation-information {
+	padding-left: 3em !important;
+	background: url("/information.png") left no-repeat;
+}
+
+#portlet-navigation-information:hover {
+	padding-left: 3em !important;
+	background: #748fad url(".png") left no-repeat !important;
+}
+
+#portlet-calendar-view-month {
+	text-align: center;
+}
+
+#portlet-calendar-view-month TABLE.month {
+	margin: 0.5em auto;
+}
+
+#portlet-jumpto FORM {
+	border-bottom: 1px #aaa dashed;
+	padding: 0.5em;
+	font-size: smaller;
+	margin: auto;
+}
+
+#portlet-calendar-overlay FORM {
+	margin: 2px;
+}
+#portlet-calendar-overlay INPUT {
+	margin-left: 0.5em;
+}
+
+#portlet-calendar-overlay LABEL {
+	display: block;
+}
+
+#portlet-calendar-overlay LABEL:hover {
+	color: #888888;
+}
+
+#portlet-calendar-overlay LABEL.disabled {
+	color: #888888;
+}
+
+#portlet-calendar-overlay A.go {
+	float: right;
+	top: -1.25em;
+	margin-right: 0.25em;
+	width: 1em;
+	height: 1em;
+	position: relative;
+	text-decoration: none;
+}
+#portlet-calendar-overlay A.go IMG {
+	border: none;
+}
+
+/** Specific Page Styling **/
+
+.info-block {
+	width: 62%;
+	border: none;
+	border-top: 1px #d6d6d6 solid;
+	margin: 1em 0em;
+	padding: 0em 0.5em;
+}
+
+.info-block H5 {
+	margin: 0px;
+	padding: 0px;
+	font-weight: bold;
+}
+
+.info-block A {
+	font-weight: normal;
+}
+
+.info-block UL {
+	margin: 0.25em;
+	list-style: circle;
+}
+
+A.modify {
+	display: block;
+	padding: 0.25em;
+	font-weight: normal;
+}
+
+.person-photo {
+	float: left;
+	margin: 0 0.5em 0 0;
+	background: #d6d6d6;
+	padding: 2px;
+	border: 1px #999 solid;
+}
+
+TD.dl {
+	text-align: left;
+}
+
+TD.dr {
+	text-align: right;
+}
+
+TABLE.person-details {
+	text-align: center;
+}
+.person-details .address {
+	margin: 0.25em;
+	font-size: 85%;
+}
+
+TABLE.acl {
+	border: none;
+	border-collapse: collapse;
+	width: 100%;
+}
+
+TABLE.acl TR.header TH {
+	border-bottom: 1px solid #bab5ab;
+}
+TABLE.acl TR.even {
+	background: #d6d6d6;
+}
+
+TABLE.acl TD {
+	text-align: center;
+}
+
+TABLE.acl TH {
+	text-align: left;
+}
+
+TABLE.acl TH.permission {
+	width: 7em;
+	text-align: center;
+}
+
+TABLE.event_booking {
+	border: none;
+	border-collapse: collapse;
+	width: 100%;
+}
+
+TABLE.event_booking TR.header TH {
+	border-bottom: 1px solid #bab5ab;
+}
+
+TABLE.event_booking TR.even {
+	background: #d6d6d6;
+}
+
+TABLE.event_booking TD {
+	text-align: center;
+}
+
+TABLE.event_booking TH {
+	text-align: left;
+}
+
+TABLE.event_booking TH.permission {
+	width: 7em;
+	text-align: center;
+}
+
+TABLE.event_booking TD.booked {
+	width: 2em;
+	text-align: center;
+}
+
+#notes {
+	float: right;
+	width: 32%;
+}
+
+#notes H5 {
+	display: none; /* XXX Hide this here, but keep it in the template for */
+	             /* accessibility (or should we just remove from template? */
+}
+
+/* Rounded corners for notes, taken from:
+* http://www.vertexwerks.com/tests/sidebox/
+*/
+
+.note {
+	margin-bottom: 1ex;
+	background: #eed680 url(++resource++note-body-r.gif) no-repeat bottom right;
+}
+
+.note P {
+	padding: 1em 2em 2em 2em;
+	margin: 0;
+}
+
+.note .header {
+	background: #d1940c url(++resource++note-head-r.gif) no-repeat top right;
+	margin: 0;
+	padding: 0;
+	position: relative;
+}
+
+.note .header H6 {
+	background: url(++resource++note-head-l.gif) no-repeat top left;
+	font-weight: bold; 
+	font-size: small;
+	margin: 0;
+	padding: 6px 0 0 15px;
+}
+
+.note .header A.delete {
+	background: url(++resource++delete.png) no-repeat top left;
+	display: block;
+	width: 10px;
+	height: 0px;
+	padding-top: 10px;
+	height/**/: 0px;
+	overflow: hidden;
+	float: right;
+	position: absolute;
+	right: 11px;
+	top: 9px;
+}
+
+.note .body {
+	background: url(++resource++note-body-l.gif) no-repeat bottom left;
+	margin: 0;
+	font-size: x-small;
+}
+
+.note.private {
+	background: #c1665a url(++resource++private-note-body-r.gif) no-repeat bottom right;
+}
+
+.note.private .header {
+	background: #900 url(++resource++private-note-head-r.gif) no-repeat top right;
+}
+
+.note.private .privacy {
+	font-size: x-small;
+}
+
+.note.private H6 {
+	background: url(++resource++private-note-head-l.gif) no-repeat top left;
+	color: #f0f0f0;
+}
+
+.note.private .body {
+	background: url(++resource++private-note-body-l.gif) no-repeat bottom left;
+}
+
+/* Batch navigation */
+
+.batch-navigation {
+	background: #d6d6d6;
+	border: 1px #bab5ab solid;
+	text-align: center;
+	vertical-align: top;
+	margin: 1em auto;
+	overflow: auto;
+	font-size: smaller;
+}
+
+.batch-navigation A {
+	text-decoration: none;
+	padding: 0 0.5em;
+}
+
+.batch-navigation A:hover {
+	background: #bab5ab;
+}
+
+.batch-navigation SPAN.previous,
+.batch-navigation A.previous {
+	text-align: left;
+	float: left;
+	padding-left: 1em;
+}
+
+.batch-navigation SPAN.next,
+.batch-navigation A.next {
+	text-align: right;
+	float: right;
+	padding-right: 1em;
+}
+
+.batch-navigation SPAN.next,
+.batch-navigation SPAN.previous {
+	color: #bab5ab;
+	font-weight: bold;
+}
+
+.batch-navigation A.current {
+	color: #fff;
+	background: #314e6c;
+}
+
+.batch-extra-navigation {
+	float: right;
+	border-left: 1px #bab5ab solid;
+}
+
+.batch-extra-navigation .more,
+.batch-extra-navigation .less,
+.batch-extra-navigation .all {
+	padding: 0 0.5em;
+}
+
+/* "Showing aaa of bbb items" */
+DIV.count {
+	font-size: smaller;
+	color: #76797c;
+}
+
+/* Internal error pages */
+
+PRE.traceback {
+	color: #444444;
+	font-size: small;
+	overflow: auto;
+	background: #f0f0f0;
+}
+
+PRE.traceback SPAN.filename {
+	color: blue;
+}
+
+PRE.traceback SPAN.lineno,
+PRE.traceback SPAN.column {
+	color: red;
+}
+
+PRE.traceback SPAN.method {
+	color: green;
+}
+
+PRE.traceback SPAN.expr {
+	color: green;
+}
+
+PRE.traceback SPAN.source {
+	color: black;
+}
+
+/*********************************************************** END: Style.css */
+
+/* vi: sw=4 ts=4 noet

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/logo.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/logo.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/next.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/next.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/note-body-l.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/note-body-l.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/note-body-r.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/note-body-r.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/note-head-l.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/note-head-l.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/note-head-r.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/note-head-r.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/previous.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/previous.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/printer.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/printer.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-body-l.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-body-l.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-body-r.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-body-r.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-head-l.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-head-l.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-head-r.gif
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/private-note-head-r.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.css
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.css	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.css	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,408 @@
+/*
+ * Stylesheet for SchoolTool
+ *
+ * Aesthetic styling
+ *
+ */
+
+
+ul {
+    list-style: none;
+    padding-left: 1em;
+}
+
+input.disabled {
+    color: #eae8e3 !important;
+    background: #bab5ab !important;
+    border: #eae8e3 !important;
+}
+
+td.number {
+    text-align: right;
+}
+
+.section {
+    margin: 0.5em;
+    background: #eae8e3;
+    padding: 2px;
+    border: 1px #999 solid;
+}
+
+.instructor {
+    float: left;
+    text-align: center;
+}
+
+.instructor img {
+    background: #d6d6d6;
+    padding: 2px;
+    border: 1px #999 solid;
+}
+
+/* This overrides schoolbell's style.css */
+#header .logo {
+    height: 60px;
+    padding: 5px;
+    vertical-align: middle;
+}
+
+/* Terms */
+
+table.schooldaymodel {
+    width: 90%;
+    margin-bottom: 0.5ex;
+}
+
+table.schooldaymodel tr.legend td {
+    text-align: center;
+}
+table.schooldaymodel tr.legend td.legend {
+    text-align: left;
+    padding-left: 0;
+}
+table.schooldaymodel td.holiday {
+    color: red;
+    background: #eeeeee;
+    font-weight: bold;
+}
+table.schooldaymodel td.schoolday {
+    color: black;
+    background: #eeeeee;
+    font-weight: normal;
+}
+table.schooldaymodel td {
+    background: transparent;
+    text-align: right;
+    padding: 0ex 1ex;
+}
+table.schooldaymodel td label {
+    display: inline;
+    font-weight: inherit;
+    float: none;
+    width: auto;
+    color: inherit;
+}
+
+/* Forms beautification for ttschema wizard */
+span.hint,
+p.hint {
+    font-size: 80%;
+    font-style: italic;
+    color: #bab5ab;
+}
+
+/* Help clearing the mess generated by the field-names of a form which are
+   floating and can break the layout of the whole page.
+   For more information: 
+   http://www.complexspiral.com/publications/containing-floats/ */
+div.clear {
+    display: block;
+    clear: left;
+    margin: 0;
+    line-height: 0;
+    height: 0;
+    visibility: hidden;
+}
+
+
+div.label {
+    float: left;
+    width: 10em;
+    padding-top: 0.5ex;
+}
+
+div.value {
+    margin-left: 10em;
+}
+
+table.timetable input.text {
+    width: 7em;
+}
+
+ul.container-content a {
+    text-decoration: none;
+}
+
+ul.container-content {
+    padding: 0;
+    margin: 0;
+    margin: 0.25em 0 0 0.5em;
+}
+
+li.course {
+    border: none;
+    border-left: 1px #d6d6d6 solid;
+    margin-bottom: 1em;
+}
+
+ul.section-list {
+    margin: 0.25em 0 0 0.5em;
+}
+
+ul.section-list a {
+    font-weight: normal;
+}
+
+.info-block ul {
+    list-style: none;
+}
+
+.info-block li ul {
+    border: none;
+    border-left: 1px #d6d6d6 solid;
+    padding: 0em 0em 0.5em 0.5em;
+}
+
+.info-block li.group a {
+    font-weight: bold;
+}
+
+.info-block li.individual a {
+    font-weight: normal;
+}
+
+a#selected {
+   background: #cccccc;
+}
+
+/* timetable display */
+
+table.timetable {
+    width: 90%;
+}
+
+table.timetable th {
+    background: #cccccc;
+}
+table.timetable th.period {
+    background: #ccccff;
+}
+table.timetable td {
+    background: #eeeeee;
+}
+
+/* Calendar overlay */
+
+#portlet-calendar-overlay a.go {
+    top: 0em;
+}
+
+#portlet-calendar-overlay table.overlays {
+    padding: none;
+    margin: none;
+    border-collapse: collapse;
+}
+
+#portlet-calendar-overlay table.overlays th {
+    text-align: right;
+}
+
+#portlet-calendar-overlay table.overlays acronym {
+    border-bottom: none;
+}
+
+/* Timetable setup form */
+
+table.timetable_setup {
+    border-collapse: collapse;
+}
+table.timetable_setup tr.conflict {
+    background: yellow;
+}
+table.timetable_setup th,
+table.timetable_setup td {
+    padding: 1ex;
+    background: transparent;
+}
+table.timetable_setup th {
+    text-align: left;
+}
+
+
+/* XXX This style should be merged with table.acl in schoolbell style.css */
+table.container {
+    border: none;
+    border-collapse: collapse;
+    width: 99%;
+    border-left: 1px solid #bab5ab;
+}
+
+table.container tr.header th {
+    border-right: 1px solid #bab5ab;
+    border-top: 1px solid #bab5ab;
+    border-bottom: 1px solid #bab5ab;
+    padding: 0 10px;
+}
+
+table.container tr.even {
+    background: #d6d6d6;
+}
+
+table.container tr {
+}
+
+table.container td {
+    text-align: center;
+    border-right: 1px solid #bab5ab;
+    border-bottom: 1px solid #bab5ab;
+}
+
+table.container th {
+    text-align: left;
+}
+
+/* Styles for the zc tables */
+
+table.data {
+    border-collapse: collapse;
+}
+
+tr.odd {
+    background-color: transparent;
+}
+
+tr.even {
+    background-color: #EAE8E3;
+}
+
+div.field-odd {
+   background-color: transparent;
+}
+
+div.field-even {
+    background-color: #EAE8E3; 
+}
+
+/*Styles for actions bar */
+#dropdowncontainer {
+  position: absolute;
+  left: 0px;
+  clear: left;
+  z-index: 100;
+}
+
+#dropdowncontainer tr td {
+  vertical-align: top;
+}
+
+/*For the messed up schooltool action viewlets*/
+#dropdowncontainer tr td li{
+  list-style: none;
+  font-size: 1em;
+  padding-right: .5ex;
+  padding-left: .5ex;
+  background: #ddd;
+  border: 1px solid #aaa;
+  line-height:1.2em;
+  height:1.2em;
+}
+
+#dropdowncontainer tr td li a{
+  font-family: "Trebuchet MS", Sans-Serif;
+  text-decoration: none;
+  display: block;
+}
+
+#dropdowncontainer tr td div{
+  border: 1px solid #aaa;
+}
+
+div .singleton,
+div .dropdown {
+  width: auto;
+  line-height:1.2em;
+  height:1.2em;
+  overflow:hidden;
+  text-align:left;
+  z-index:100;
+  font-weight: bold;
+}
+
+div .singleton:hover,
+div .dropdown:hover {
+  height: auto;
+  background:#eee;}
+
+div .singleton .title{
+  font-size: 1em;
+  padding-right: .5ex;
+  padding-left: .5ex;
+  background: #ddd;
+}
+
+div .singleton:hover .title{
+  background:#eee;
+}
+
+div .singleton a.title{
+  font-family: "Trebuchet MS", Sans-Serif;
+  text-decoration: none;
+  display: block;
+  }
+
+div .dropdown .title{
+  font-size: 1em;
+  padding-right: .5ex;
+  padding-left: 15px;
+  background: #ddd url('++resource++rightarrow.png') no-repeat center left;
+}
+
+div .dropdown:hover .title{
+  border-bottom:1px solid #aaa;
+  background: #ddd url('++resource++downarrow.png') no-repeat center left;
+}
+
+div .dropdown ul{
+  padding: 0px;
+  margin: 0px;
+  text-indent: 0px;
+}
+
+div .dropdown li{
+  margin: 0px;
+  border: 0px;
+  padding: 0px;
+}
+
+div .dropdown li a{
+  background: #eee;
+  border: 1px solid #eee;
+  border-left: 0px;
+  border-right: 0px;
+  line-height:18px;
+  color:#304D6B;
+  text-decoration:none;
+  width: auto;
+  padding-left: 0px;
+  padding-right: 0px;
+  font-size: x-small;
+}
+
+div .dropdown li a:hover{
+  background: #7590ae;
+  border-top: 1px #314e6c solid;
+  border-bottom: 1px #314e6c solid;
+  color: #fff !important;
+}
+
+div .dropdown a {
+  background: #eee;
+  border: 1px solid #eee;
+  border-left: 0px;
+  border-right: 0px;
+  display:block;
+  line-height:18px;
+  color:#304D6B;
+  text-decoration:none;
+  width: auto;
+  padding-left: .5ex;
+  padding-right: .5ex;
+  font-size: x-small;
+}
+
+div .dropdown a:hover {
+  background: #7590ae;
+  border-top: 1px #314e6c solid;
+  border-bottom: 1px #314e6c solid;
+  color: #fff !important;
+}
\ No newline at end of file

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.js
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.js	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.js	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,81 @@
+//
+// SchoolTool - common information systems platform for school administration
+// Copyright (c) 2003 Shuttleworth Foundation
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//
+// Javascript for Schoolbell calendar
+//
+// $Id: schooltool.js 6887 2007-04-24 11:14:07Z ignas $
+
+//
+// Generic PopUp window function for calendar forms
+//
+// Call with
+// <a href="javascript:popUp('foo.html')" title="Pop Up Foo">
+//   Popup Window
+// </a>
+
+function popUp(url) {
+	window.open( url, "myWindow", "status = 1,	\
+					toolbar=0,	\
+					scrollbars=1,	\
+					menubar=0,	\
+					statusbar=0,	\
+					height = 500,	\
+					width = 650,	\
+					resizable = 1" );
+}
+
+function jumpTo(box) {
+	destination = box.form.jump.options[box.form.jump.selectedIndex].value;
+	if (destination) location.href = destination;
+}
+
+
+// Tooltips for various calendar views
+
+var x = 0;
+var y = 0;
+var tipon = false;
+var tip = null;
+
+function onBodyLoad() {
+    document.captureEvents(Event.MOUSEMOVE);
+    document.onmousemove = followMouse;
+}
+
+function followMouse(e) {
+    x = e.pageX;
+    y = e.pageY;
+    if(tip){
+        tip.style.top = (y + 10) + 'px';
+        tip.style.left = (x + 10) + 'px';
+    }
+    return true;
+}
+
+function showToolTip(elem, id) {
+    elem.style.borderColor = 'black';
+    tip = document.getElementById(id);
+    tip.style.visibility = 'visible';
+    tip.style.position = 'absolute';
+    tip.style.display = 'block';
+}
+
+function hideToolTip(elem) {
+    tip.style.visibility = 'hidden';
+    tip = null;
+}

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/schooltool.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/sidebar-background-top.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/sidebar-background-top.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/sidebar-background.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/sidebar-background.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/toolbar-background-hover.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/toolbar-background-hover.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/resources/toolbar-background.png
===================================================================
(Binary files differ)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/resources/toolbar-background.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: schooltool/branches/upstream/current/src/schooltool/skin/skin.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/skin.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/skin.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,246 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool skin.
+
+$Id: skin.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+
+from zope.component import getAdapter
+from zope.interface import Interface, implements
+from zope.schema import Object
+from zope.i18n.interfaces import IUserPreferredLanguages
+from zope.publisher.interfaces.browser import ILayer, IDefaultBrowserLayer
+from zope.publisher.interfaces.browser import IBrowserRequest
+from zope.viewlet.interfaces import IViewletManager
+from zope.viewlet.manager import ViewletManagerBase
+from zope.viewlet.metadirectives import IViewletDirective
+from zope.configuration.fields import MessageID
+from zope.publisher.browser import BrowserView
+from zope.app import zapi
+from zope.app.publisher.browser.menu import getMenu
+
+from schooltool.app.interfaces import ICookieLanguageSelector
+from schooltool.securitypolicy.crowds import Crowd
+from schooltool.securitypolicy.interfaces import ICrowd
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.skin.interfaces import IBreadcrumbInfo
+
+from schooltool.app.app import getSchoolToolApplication
+
+
+class IJavaScriptManager(IViewletManager):
+    """Provides a viewlet hook for the javascript link entries."""
+
+
+class ICSSManager(IViewletManager):
+    """Provides a viewlet hook for the CSS link entries."""
+
+
+class IHeaderManager(IViewletManager):
+    """Provides a viewlet hook for the header of a page."""
+
+
+class INavigationManager(IViewletManager):
+    """Provides a viewlet hook for the navigation section of a page."""
+
+
+class IActionMenuManager(IViewletManager):
+    """Provides a viewlet hook for the action menu."""
+
+    def title():
+        """Title that will be displayed before the action menu or submenu."""
+
+    def subItems():
+        """Sub items that will have their own menus in the main action menu.
+
+        Returns a list of ISubMenuItem objects.
+        """
+
+
+class IMenuBarMenuManager(IViewletManager):
+    """Provides a viewlet hook for the entire menu bar."""
+
+
+class IActionMenuContext(Interface):
+    """Schema for attributes required by ActionMenuViewletManager."""
+
+    target = Object(Interface)
+
+
+class OrderedViewletManager(ViewletManagerBase):
+    """Viewlet manager that orders viewlets by their 'order' attribute.
+
+    The order attribute can be a string, but it will be sorted numerically
+    (i.e. '1' before '5' before '20').  The attribute is optional; viewlets
+    without an ``order`` attribute will be sorted alphabetically by their
+    ``title`` attribute, and placed below all the ordered viewlets.
+    """
+
+    def sort(self, viewlets):
+        """Sort the viewlets.
+
+        ``viewlets`` is a list of tuples of the form (name, viewlet).
+        """
+
+        def key_func((name, viewlet)):
+            if hasattr(viewlet, 'order'):
+                return (0, int(viewlet.order))
+            elif hasattr(viewlet, 'title'):
+                return (1, viewlet.title)
+            else:
+                raise AttributeError('%r viewlet has neither order nor title'
+                                     % name)
+
+        return sorted(viewlets, key=key_func)
+
+
+class NavigationViewlet(object):
+    """A navigation viewlet base class."""
+
+    def actualContext(self):
+        return ISchoolToolApplication(None)
+
+    def appURL(self):
+        return zapi.absoluteURL(getSchoolToolApplication(), self.request)
+
+
+class TopLevelContainerNavigationViewlet(NavigationViewlet):
+    """A base class of navigation viewlet for top level containers."""
+
+    def actualContext(self):
+        """Actual context is the container this viewlet links to."""
+        return ISchoolToolApplication(None)[self.link]
+
+
+class ISubMenuItem(Interface):
+    """Marker interface for objects that will be displayed as items in submenus.
+    """
+
+
+class MenuBarMenuViewletManager(OrderedViewletManager):
+    """Viewlet manager for displaying the various menus at the top of a page."""
+
+    implements(IMenuBarMenuManager)
+
+
+class ActionMenuViewletManager(OrderedViewletManager):
+    """Viewlet manager for displaying the action menu."""
+
+    implements(IActionMenuContext, IActionMenuManager)
+
+    def title(self):
+        breadcrumb = zapi.getMultiAdapter((self.context, self.request),
+                                          IBreadcrumbInfo)
+        return breadcrumb.name
+
+    def getSubItems(self, context):
+        """Collect all items that should be displayed in the submenu of context.
+
+        Submenu items are registered as subscribers with interface
+        ISubMenuItem.
+        """
+        return list(zapi.subscribers((context, ), ISubMenuItem))
+
+    def update(self):
+        # set the right context for menu items that will be set up by
+        # OrderedViewletManager.update
+        self.context = self.target
+
+        # We could just check for ISubMenuItem on self.context, though
+        # that would be less reliable.
+        sub_items = self.getSubItems(self.context.__parent__)
+        in_submenu_of_parent = self.context in sub_items
+        displayed_in_submenu = IActionMenuManager.providedBy(self.__parent__)
+        if (in_submenu_of_parent and not displayed_in_submenu):
+            # display menu as if looking at the parent object
+            self.context = self.context.__parent__
+        self.orderedViewletManagerUpdate()
+
+    def filter(self, viewlets):
+        return [(name, viewlet) for (name, viewlet) in viewlets
+                if not IDisableViewlet.providedBy(viewlet)]
+
+    def orderedViewletManagerUpdate(self):
+        OrderedViewletManager.update(self)
+
+    def subItems(self):
+        """See zope.contentprovider.interfaces.IContentProvider"""
+        return self.getSubItems(self.context)
+
+
+class ActionMenuViewlet(object):
+
+    def getMenu(self):
+        return getMenu(self.menu, self.context, self.request)
+
+
+class NavigationViewletCrowd(Crowd):
+    """A crowd for navigation viewlets.
+
+    Checks permissions on the actual context rather than the parent. Parents
+    of viewlets are pretty useless in this case as NavigationViewlets
+    are used in a global navigation menu.
+    """
+
+    def contains(self, principal):
+        context = self.context.actualContext()
+        crowd = getAdapter(context, ICrowd, name='schooltool.view')
+        return crowd.contains(principal)
+
+
+class ISchoolToolLayer(ILayer, IBrowserRequest):
+    """SchoolTool layer."""
+
+
+class ISchoolToolSkin(ISchoolToolLayer, IDefaultBrowserLayer):
+    """The SchoolTool skin"""
+
+
+class LanguageSelectorViewlet(BrowserView):
+
+    def selected_lang(self):
+        upl = IUserPreferredLanguages(self.request)
+        return upl.getSelectedLanguage()
+
+    def languages(self):
+        upl = IUserPreferredLanguages(self.request)
+        if ICookieLanguageSelector.providedBy(upl):
+            return upl.getLanguageList()
+        return None
+
+
+class INavigationMenuItemDirective(IViewletDirective):
+    """An interface that makes title attribute of a viewlet translatable."""
+
+    title = MessageID(
+        title=u"The title for the menu item",
+        required=False
+        )
+
+# Arbitrary keys and values are allowed to be passed to the viewlet.
+INavigationMenuItemDirective.setTaggedValue('keyword_arguments', True)
+
+
+class IDisableViewlet(Interface):
+    pass
+
+
+class DisableNavigationViewlet(BrowserView):
+    implements(IDisableViewlet)


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/skin.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/actions.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/actions.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/actions.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,23 @@
+<tal:block i18n:domain="schooltool"
+           tal:define="url view/context/@@absolute_url;
+                       actions view/context/@@view_get_menu/schooltool_actions">
+
+<div class="portlet">
+  <h4 tal:content="view/title">Actions</h4>
+  <ul> <!-- old-style menu actions (obsolete) -->
+    <li tal:repeat="view actions">
+      <a tal:attributes="href
+                   string:${url}/${view/action}"
+         tal:content="view/title" i18n:translate="" />
+    </li>
+  </ul>
+  <ul> <!-- new-style viewlet actions -->
+    <tal:block
+        repeat="viewlet options/viewlets"
+        replace="structure viewlet/render" />
+  </ul>
+  <tal:block tal:repeat="target view/subItems">
+    <div tal:replace="structure provider:schooltool.Actions" />
+  </tal:block>
+</div>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/actions.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsViewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsViewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsViewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3 @@
+  <a tal:attributes="href string:${context/@@absolute_url}/${view/link}"
+     tal:content="view/title"
+     i18n:translate="">Title</a>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsViewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsbar.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsbar.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsbar.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,16 @@
+<tal:block i18n:domain="schooltool"
+	   tal:condition="python:actions or options['viewlets']"
+           tal:define="url view/context/@@absolute_url;
+                       actions view/context/@@view_get_menu/schooltool_actions">
+
+  <!-- old-style menu actions (obsolete) -->
+      <div class="dropdown">
+        <h3 class="title">Actions</h3>
+        <a tal:repeat="view actions"
+           tal:attributes="href string:${url}/${view/action}"
+           tal:content="view/title">Item one</a>
+	<!-- new-style menu actions (yay!) -->
+        <tal:block repeat="viewlet options/viewlets"
+                   content="structure viewlet/render" />
+      </div>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/actionsbar.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/container.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/container.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/container.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,52 @@
+<tal:define define="dummy view/update"/>
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="view/index_title" i18n:translate="">
+    Contents
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/index_title" i18n:translate="">Contents</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="batch view/batch;
+                         canModify view/canModify">
+  <tal:block replace="structure view/batch/render" />
+  <div metal:use-macro="view/@@view_macros/batch-search"/>
+  <tal:if condition="batch">
+    <div class="count">
+      <span i18n:translate="">Showing</span>
+      <span tal:content="python:len(batch)"/>
+      <span i18n:translate="">of</span>
+      <span tal:content="python:len(batch.list)"/>
+      <span i18n:translate="">items</span>
+    </div>
+    <form tal:condition="canModify"
+          method="post"
+          tal:attributes="action string:${context/@@absolute_url}/delete.html">
+      <div tal:repeat="obj batch">
+        <input type="checkbox"
+               tal:attributes="name string:delete.${obj/zope:name};
+                               disabled obj/schooltool:has_dependents" />
+        <a tal:content="obj/title"
+           tal:attributes="href obj/@@absolute_url">Some Object</a>
+      </div>
+      <div class="controls">
+        <input type="submit" class="button-cancel" value="Delete"
+               i18n:attributes="value delete-button;" />
+      </div>
+    </form>
+    <ul tal:condition="not:canModify">
+      <li tal:repeat="obj batch">
+        <a tal:content="obj/title"
+           tal:attributes="href obj/@@absolute_url">Some Object</a>
+      </li>
+    </ul>
+  </tal:if>
+  <p tal:condition="not:batch" i18n:translate="">There are none.</p>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/container.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/container_delete.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/container_delete.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/container_delete.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,36 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title">
+    Delete items
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header" i18n:translate="">
+  Are you sure you want to delete selected items?
+</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="objects view/itemsToDelete">
+  <p tal:condition="not:objects" i18n:translate="">You have not
+  selected any items.</p>
+  <ul tal:condition="objects">
+    <form method="post"
+          action="delete.html">
+      <li tal:repeat="obj objects/sortby:title">
+        <input type="hidden" tal:attributes="name string:delete.${obj/zope:name}" />
+        <a tal:content="obj/title"
+           tal:attributes="href obj/@@absolute_url">Some Object</a>
+      </li>
+      <div class="controls">
+        <input type="submit" class="button-cancel" name="CONFIRM" value="Confirm"
+               i18n:attributes="value delete-button;" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+      </div>
+    </form>
+  </ul>
+
+</metal:block>
+</body></html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/container_delete.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/edit_form.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/edit_form.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/edit_form.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,10 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<body>
+<metal:nothing metal:fill-slot="content-header" />
+<metal:block metal:fill-slot="body">
+
+  <metal:block use-macro="view/@@formlib_macros/edit" />
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/edit_form.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/error.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/error.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/error.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,25 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Server Error</title>
+</head>
+<body>
+<h1 metal:fill-slot="content-header" i18n:translate="">Server Error</h1>
+<metal:block metal:fill-slot="body">
+
+<p i18n:translate="">An internal server error has occurred.  This most likely
+means that you have found a bug in SchoolBell.  Please report it on <a
+href="http://issues.schooltool.org">the issue tracker</a>.</p>
+
+<h2 i18n:translate="">Exception</h2>
+
+<p><span class="exc_type" tal:content="python:context.__class__.__name__" />:
+   <span class="exc_value" tal:content="context" /></p>
+
+<h2 i18n:translate="">Traceback</h2>
+
+<pre class="traceback" tal:content="structure view/traceback">
+</pre>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/error.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/filter.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/filter.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/filter.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,8 @@
+<tal:block i18n:domain="schooltool">
+    <input type="text" name="SEARCH"
+           tal:attributes="value request/SEARCH|nothing"/>
+    <input type="submit" name="SEARCH_BUTTON" value="Find Now"
+           i18n:attributes="value"/>
+    <input type="submit" name="CLEAR_SEARCH" value="Clear"
+           i18n:attributes="value"/>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/filter.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/formlib_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/formlib_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/formlib_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,47 @@
+<tal:block i18n:domain="schooltool">
+<metal:block define-macro="edit">
+  <form action="." method="post"
+        tal:attributes="action request/URL"
+        class="standalone" enctype="multipart/form-data">
+    
+    <h3 tal:content="view/title | nothing">
+    </h3>
+
+    <div class="info" tal:condition="view/status" tal:content="view/status" />
+
+    <fieldset>
+      <legend tal:define="legend view/legend | nothing" 
+              tal:condition="legend" tal:content="legend">
+      </legend>
+
+      <div metal:use-macro="context/@@form_macros/widget_rows" />
+    </fieldset>
+
+    <div class="controls">
+      <metal:block define-slot="controls">
+        <input type="submit" id="form.actions.apply" name="form.actions.apply" value="Apply" class="button-ok" 
+          title="Shortcut: Alt-A" accesskey="A" 
+          i18n:attributes="value submit-button; accesskey" />
+        <input type="submit" id="form.actions.cancel" name="form.actions.cancel" value="Cancel" class="button-cancel" 
+          i18n:attributes="value cancel-button" />
+      </metal:block>
+    </div>
+
+  </form>
+</metal:block>
+
+<metal:block define-macro="display">
+  <fieldset>	
+    <div class="row" tal:repeat="widget view/widgets">
+      <div class="label" tal:content="widget/label"/>
+      <tal:block condition="repeat/widget/even">
+        <div class="field-even"><tal:block replace="structure widget" />&nbsp;</div>
+      </tal:block>
+      <tal:block condition="not: repeat/widget/even">
+        <div class="field-odd"><tal:block replace="structure widget" />&nbsp;</div>
+      </tal:block>
+      <div class="clear"/>
+    </div>
+  </fieldset>
+</metal:block>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/formlib_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/generic_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/generic_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/generic_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<tal:block i18n:domain="schooltool">
+<metal:block define-macro="stylesheets">
+    <link rel="stylesheet" type="text/css" href="schooltool.css"
+          tal:attributes="href context/++resource++schooltool.css"/>
+</metal:block>
+
+<metal:block define-macro="title">
+  <title i18n:translate="">SchoolTool</title>
+</metal:block>
+
+<metal:block define-macro="serverinfo">
+  <span i18n:translate="">Server Running SchoolTool</span>
+  <span tal:content="modules/schooltool/get_version"/>
+</metal:block>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/generic_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/language_selector.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/language_selector.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/language_selector.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,13 @@
+<tal:if condition="view/languages"
+        i18n:domain="schooltool">
+  <tal:block repeat="lang view/languages">
+    <tal:if condition="python:lang == view.selected_lang()">
+      <span tal:content="lang">EN</span>
+    </tal:if>
+    <tal:if condition="python:lang != view.selected_lang()">
+      <a tal:attributes="href request/URL;
+                         onclick string:document.cookie='schooltool.lang=${lang};;path=/'"
+         tal:content="lang">EN</a>
+    </tal:if>
+  </tal:block>
+</tal:if>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/language_selector.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/menuBarViewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/menuBarViewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/menuBarViewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<div class="singleton" tal:condition="view/link|nothing">
+  <a tal:attributes="href string:${context/@@absolute_url}/${view/link}"
+     tal:content="view/title"
+     i18n:translate=""
+     class="title">Title</a>
+</div>
+
+<div class="dropdown" tal:condition="not:view/link|nothing">
+  <h3 class="title"
+     tal:content="view/title"
+     i18n:translate="">title</h3>
+  <a tal:repeat="link view/getMenu"
+     tal:content="link/title"
+     tal:attributes="href string:${context/@@absolute_url}/${link/action}" />
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/menuBarViewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/menubar.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/menubar.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/menubar.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,16 @@
+<tal:block i18n:domain="schooltool"
+           tal:define="url view/context/@@absolute_url;
+                       actions view/context/@@view_get_menu/schooltool_actions">
+
+  <!-- old-style menu actions (obsolete) -->
+  <table id="dropdowncontainer">
+  <tr>
+    <td tal:content="structure provider:schooltool.NavigationMenu" />
+    <tal:block define="target view/__parent__/actualContext|nocall:context">
+      <td tal:content="structure provider:schooltool.ActionsMenu" />
+    </tal:block>
+    <td tal:repeat="viewlet options/viewlets"
+        tal:content="structure viewlet/render">viewlet</td>
+  </tr>
+  </table>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/menubar.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/navigation.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/navigation.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/navigation.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,6 @@
+<div class="dropdown">
+  <h3 class="title">Navigation</h3>
+  <tal:block repeat="viewlet options/viewlets"
+	     content="structure viewlet/render" />
+</div>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/navigation.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/navigationViewlet.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/navigationViewlet.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/navigationViewlet.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5 @@
+  <a tal:attributes="href string:${view/appURL}/${view/link}"
+     tal:content="view/title"
+     i18n:domain="schooltool"
+     i18n:translate="">Title</a>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/navigationViewlet.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/notfound.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/notfound.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/notfound.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,24 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Not Found</title>
+</head>
+<body>
+<h1 metal:fill-slot="content-header" i18n:translate="">Not Found</h1>
+<metal:block metal:fill-slot="body">
+
+<h3 i18n:translate="">
+  The page that you are trying to access is not available
+</h3>
+<br/> 
+<b i18n:translate="">Please note the following:</b>
+<br/>
+<ol>
+   <li i18n:translate=""> You might have misspelled the url </li>
+   <li i18n:translate="">
+     You might be trying to access a non-existing page
+   </li>
+</ol>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/notfound.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/onlinehelp_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/onlinehelp_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/onlinehelp_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,81 @@
+<metal:block define-macro="page">
+<metal:block define-slot="doctype">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+</metal:block>
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xml:lang="en"
+    lang="en"
+    i18n:domain="schooltool"
+    tal:define="sitemgmt python:'/++etc++site/' in str(request.URL)">
+
+  <head>
+    <title metal:define-slot="title"
+           tal:content="string:Z3: ${context/zope:title_or_name}">SchoolTool Onlinehelp</title>
+
+    <script type="text/javascript" src="tree.js"
+            tal:attributes="src string:${context/++resource++tree.js}" >
+    </script>
+
+    <style type="text/css" media="all"
+           tal:content="string:@import url(${context/++resource++onlinehelp.css});">
+      @import url(./onlinehelp.css);
+    </style>
+
+    <style type="text/css" media="all"
+           tal:content="string:@import url(${context/++resource++tree.css});">
+      @import url(./tree.css);
+    </style>
+
+    <style type="text/css" media="all"
+           tal:content="string:@import url(${context/++resource++layout.css});">
+      @import url(./layout.css);
+    </style>
+
+    <style type="text/css" media="all"
+           tal:content="string:@import url(${context/++resource++help.css});">
+      @import url(./help.css);
+    </style>
+
+    <meta http-equiv="Content-Type"
+          content="text/html;charset=utf-8" />
+
+    <metal:block define-slot="headers" />
+    <metal:block define-slot="style_slot" />
+    <metal:block define-slot="ecmascript_slot" />
+
+    <link rel="icon" type="image/png" href="favicon.ico"
+          tal:attributes="href context/++resource++favicon.ico"/>
+
+  </head>
+
+  <body onload="buildTrees();">
+
+    <div class="headline">
+        <div class="title" i18n:translate="">SchoolTool Onlinehelp</div>
+    </div>
+
+    <!-- get rid of the crapy divs where place the content below the tree box
+         if somebody has a better solution, fell free the change it.
+         But I don't whana see the content below the navigation box. -->
+    <table class="layout" border="0" cellspacing="0" cellpadding="0">
+        <tr>
+            <td class="navigation" nowrap="nowrap">
+                <metal:block define-slot="navigation ">
+                <metal:navigation use-macro="views/onlinehelp_navigation_macros/navigation" />
+                </metal:block>
+            </td>
+            <td class="content">
+                <metal:block define-slot="body">
+                    content
+                </metal:block>
+            </td>
+        </tr>
+    </table>
+
+    <div id="footer" metal:define-macro="footer" />
+  </body>
+
+</html>
+
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/onlinehelp_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_add.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_add.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_add.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,66 @@
+<html metal:use-macro="context/@@standard_macros/page" i18n:domain="schooltool">
+<body>
+<div metal:fill-slot="body">
+
+<div metal:define-macro="addform">
+
+  <form tal:attributes="action request/URL"
+        method="post" enctype="multipart/form-data" class="standalone">
+
+    <fieldset metal:define-macro="formbody">
+
+      <h3 tal:condition="view/label"
+          tal:content="view/label" i18n:translate=""
+          metal:define-slot="heading"
+          >Edit something</h3>
+
+      <p tal:define="status view/update"
+         tal:condition="status"
+         tal:content="status" i18n:translate="" />
+
+      <p tal:condition="view/errors" i18n:translate="">
+        There are <strong tal:content="python:len(view.errors)"
+                          i18n:name="num_errors">6</strong> input errors.
+      </p>
+
+      <div metal:define-slot="extra_info" tal:replace="nothing">
+      </div>
+
+      <div class="row" metal:define-slot="extra_top" tal:replace="nothing">
+        <div class="label">Extra top</div>
+        <div class="label"><input type="text" style="width:100%" /></div>
+      </div>
+
+      <div metal:use-macro="context/@@form_macros/widget_rows" />
+
+      <div class="separator"></div>
+
+      <div class="row" metal:define-slot="extra_bottom" tal:replace="nothing">
+        <div class="label">Extra bottom</div>
+        <div class="field"><input type="text" style="width:100%" /></div>
+      </div>
+
+      <div class="row">
+        <div class="label">
+          <label for="add_name" i18n:translate="">Identifier
+            (optional)
+          </label>
+        </div>
+        <div class="field">
+          <input id="add_name" type="text" name="add_input_name"
+                 tal:attributes="value context/contentName" />
+        </div>
+    </fieldset>
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Add"
+             title="Shortcut: Alt-A" accesskey="A"
+             i18n:attributes="value add-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+  </form>
+</div>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_add.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_edit.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_edit.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_edit.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,68 @@
+<tal:tag condition="view/update"/>
+<html metal:use-macro="context/@@standard_macros/view"
+      i18n:domain="schooltool">
+<body>
+<div metal:fill-slot="body">
+
+<div metal:define-macro="body">
+
+  <form tal:attributes="action request/URL" method="post"
+        enctype="multipart/form-data" class="standalone">
+
+    <div metal:define-macro="formbody">
+
+      <h3 tal:condition="view/label"
+          tal:content="view/label" i18n:translate=""
+          metal:define-slot="heading"
+          >Edit something</h3>
+
+      <p tal:define="status view/update"
+         tal:condition="status" tal:content="status" i18n:translate="" />
+
+      <p tal:condition="view/errors" i18n:translate="">
+        There are <strong tal:content="python:len(view.errors)"
+                          i18n:name="num_errors">6</strong> input errors.
+      </p>
+
+      <div metal:define-slot="extra_info" tal:replace="nothing">
+      </div>
+
+      <fieldset>
+        <div class="row"
+             metal:define-slot="extra_top" tal:replace="nothing">
+          <div class="label">Extra top</div>
+          <div class="field"><input type="text" style="width:100%" /></div>
+        </div>
+
+        <div metal:use-macro="context/@@form_macros/widget_rows" />
+
+        <div class="separator"></div>
+
+        <div class="row"
+             metal:define-slot="extra_bottom" tal:replace="nothing">
+          <div class="label">Extra bottom</div>
+          <div class="field"><input type="text" style="width:100%" /></div>
+        </div>
+        <div class="separator"></div>
+      </fieldset>
+    </div>
+
+    <div class="controls">
+      <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Apply"
+             title="Shortcut: Alt-A" accesskey="A"
+             i18n:attributes="value submit-button; accesskey" />
+      <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+             i18n:attributes="value cancel-button" />
+    </div>
+    <div class="row" metal:define-slot="extra_buttons" tal:replace="nothing">
+    </div>
+
+    <div class="separator"></div>
+
+  </form>
+
+</div>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/simple_edit.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/table_container.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/table_container.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/table_container.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="view/index_title" i18n:translate="">
+    Contents
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/index_title" i18n:translate="">Contents</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="canModify view/canModify">
+  <tal:block replace="structure view/table/batch/render" />
+  <form method="post" tal:attributes="action string:${context/@@absolute_url}">
+    <tal:block tal:replace="structure view/table/filter_widget/render" />
+    <tal:if condition="view/table/batch">
+      <div class="count">
+        <span i18n:translate="">Showing</span>
+        <span tal:content="view/table/batch/length"/>
+        <span i18n:translate="">of</span>
+        <span tal:content="view/table/batch/full_size"/>
+        <span i18n:translate="">items</span>
+      </div>
+        <tal:block replace="structure view/table/render" />
+        <div class="controls" tal:condition="canModify">
+          <input type="submit" class="button-cancel" value="Delete"
+                 name="DELETE"
+                 i18n:attributes="value delete-button;" />
+        </div>
+    </tal:if>
+  </form>
+  <p tal:condition="not:view/table/batch" i18n:translate="">There are none.</p>
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/table_container.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/unauthorized.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/unauthorized.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/unauthorized.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,15 @@
+<tal:Make_sure_we_process_the_authorization_challenge_first
+  condition="view/issueChallenge"
+  /><html metal:use-macro="context/@@standard_macros/page"
+    i18n:domain="zope">
+<body i18n:domain="zope">
+
+<div metal:fill-slot="body">
+
+<h1 i18n:translate="">Unauthorized</h1>
+
+<p i18n:translate="">You are not authorized</p>
+
+</div>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/unauthorized.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/view_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/view_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/view_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,145 @@
+<metal:block define-macro="page" i18n:domain="schooltool">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <link rel="icon" type="image/png" href="favicon.ico"
+          tal:attributes="href context/++resource++favicon.ico"/>
+    <link rel="stylesheet" type="text/css" href="layout.css"
+          tal:attributes="href context/++resource++layout.css"/>
+    <link type="text/css" rel="stylesheet" href="calwidget-calendar.css"
+          tal:attributes="href context/++resource++calwidget-calendar.css" />
+    <metal:block use-macro="view/@@schooltool_macros/generic/stylesheets" />
+    <script type="text/javascript" src="mochikit.js"
+            tal:attributes="src context/++resource++mochikit.js">
+    </script>
+    <script type="text/javascript" src="schooltool.js"
+            tal:attributes="src context/++resource++schooltool.js">
+    </script>
+    <script type="text/javascript" src=""
+            tal:attributes="src context/++resource++calwidget-calendar.js">
+    </script>
+    <tal:block replace="structure provider:schooltool.CSS" />
+    <tal:block replace="structure provider:schooltool.JavaScript" />
+    <metal:block define-slot="title">
+      <metal:block use-macro="view/@@schooltool_macros/generic/title" />
+    </metal:block>
+    <metal:block metal:define-slot="extrahead" />
+  </head>
+  <body>
+    <div id="header">
+      <div class="logo">
+        <a href=""
+          tal:define="url context/schooltool:app/@@absolute_url"
+          tal:attributes="href url">
+          <img src="logo.png" alt="SchoolTool" i18n:attributes="alt"
+            tal:attributes="src context/++resource++logo.png"/>
+        </a>
+        <tal:block replace="structure provider:schooltool.Header" />
+      </div>
+      <div class="tools">
+        <div class="breadcrumbs">
+        <tal:for tal:repeat="breadcrumb context/@@breadcrumbs/crumbs">
+          <tal:if condition="not:repeat/breadcrumb/start">&#187;</tal:if>
+          <a tal:condition="breadcrumb/active"
+             tal:attributes="href breadcrumb/url"
+             tal:content="breadcrumb/name"
+             i18n:translate="">Breadcrumb</a>
+          <span tal:condition="not: breadcrumb/active"
+                tal:content="breadcrumb/name"
+                i18n:translate="">Breadcrumb</span>
+        </tal:for>
+        </div>
+        <div
+          tal:define="user request/principal;
+                      url context/schooltool:app/@@absolute_url">
+
+          <tal:if condition="not:user/schooltool:authenticated">
+            <a id="tools-login" i18n:translate=""
+              tal:attributes="href string:${url}/@@login.html">Log In</a>
+          </tal:if>
+
+          <tal:if condition="user/schooltool:authenticated"
+                  define="person user/schooltool:person">
+            <span metal:define-macro="logged_user">
+
+              <tal:span i18n:translate="">User:</tal:span>
+
+              <tal:if condition="not:person">
+                <span id="tools-zmi-principal" i18n:translate=""
+                  tal:content="user/title">ZMI Principal</span>
+              </tal:if>
+
+              <tal:if condition="person">
+                <a id="tools-principal" i18n:translate=""
+                  tal:attributes="href person/@@absolute_url"
+                  tal:content="user/title">Schoolbell Person</a> |
+                <a id="tools-calendar" i18n:translate=""
+                  tal:attributes="href string:${person/@@absolute_url}/calendar"
+                  >My Calendar</a> |
+                <a id="tools-logout" i18n:translate=""
+                  tal:attributes="href string:${url}/@@logout.html"
+                  >Log Out</a>
+              </tal:if>
+
+            </span>
+          </tal:if>
+
+          <!-- XXX either all modules should include Help, or core
+          should provide a dummy replacement, because eating errors is
+          a bad idea -->
+          <tal:block replace="structure provider:schooltool.Help"
+                     on-error="nothing" />
+
+        </div>
+      </div>
+    </div>
+    <div id="columns">
+      <div id="action-bar">
+	<div metal:define-slot="actions-bar"
+	     tal:replace="structure provider:schooltool.MenuBar" />
+      </div>
+      <metal:block define-slot="column-left">
+        <metal:block define-slot="column-left-extra"/>
+      </metal:block>
+      <metal:block define-slot="content">
+        <div id="column-center">
+          <div id="content-header">
+            <metal:block define-slot="content-header"/>
+          </div>
+          <div id="content-body">
+            <metal:block define-slot="body"/>
+          </div>
+        </div>
+      </metal:block>
+      <div class="clearer">&nbsp;</div>
+    </div>
+    <div id="footer">
+      <p>
+        <strong tal:replace="context/schooltool:preferences/title"/>
+          <metal:block
+              use-macro="view/@@schooltool_macros/generic/serverinfo" />
+          <span i18n:translate="">
+            &copy; The Shuttleworth Foundation 2003 - <span>2006</span>:
+            Supporting Social Innovation.
+          </span>
+      </p>
+      <p i18n:translate="">
+        SchoolTool&trade; is a Trademark of The Shuttleworth Foundation.
+      </p>
+    </div>
+  </body>
+</html>
+</metal:block>
+
+<metal:block define-macro="batch-search">
+  <form method="post" class="batch-search">
+    <input id="batch-search-box" type="text" name="SEARCH"
+      tal:attributes="value request/SEARCH|nothing"/>
+    <input type="submit" name="SEARCH_BUTTON" value="Find Now"
+      i18n:attributes="value"/>
+    <input type="submit" name="CLEAR_SEARCH" value="Clear"
+      i18n:attributes="value"/>
+  </form>
+</metal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/view_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/templates/widget_macros.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/templates/widget_macros.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/templates/widget_macros.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,57 @@
+<metal:block define-macro="widget_rows" i18n:domain="schooltool">
+<div class="row" tal:repeat="widget view/widgets">
+  <metal:block define-macro="widget_row">
+  <div class="label" tal:condition="widget/label">
+    <label for="field.name" title="The widget's hint"
+      tal:attributes="for widget/name; title widget/hint"
+      tal:content="widget/label"
+      i18n:translate="">The Label</label>
+  </div>
+  <p class="hint" tal:content="widget/hint" i18n:translate=""/>
+  <div class="field">
+    <input type="text" style="width:100%" tal:replace="structure widget" />
+    <metal:block define-slot="extra" />
+  </div>
+  <div class="clear">&nbsp;</div>
+  <div class="error" tal:define="error widget/error"
+    tal:condition="error" tal:content="structure error">
+    The Error
+  </div>
+  </metal:block>
+</div>
+</metal:block>
+
+<div class="field" metal:define-macro="checkbox_widget">
+  <input type="text" tal:replace="structure widget" />
+  <label tal:attributes="for widget/name"
+         tal:content="widget/label" i18n:translate="">Label</label>
+  <div class="error" tal:define="error widget/error"
+       tal:condition="error" tal:content="structure error">
+    Error message.
+  </div>
+</div>
+
+<div class="field" metal:define-macro="datepicker_widget">
+  <div class="label">
+    <label for="field.name" title="The widget's hint"
+      tal:attributes="for widget/name; title widget/hint"
+      tal:content="widget/label" i18n:translate="">The Label</label>
+  </div>
+  <p class="hint" tal:content="widget/hint" />
+  <div class="field">
+    <input type="text" tal:replace="structure widget"/>
+    <img class="CalIcon" src="" id="" onmousedown=""
+      alt="[popup calendar]" i18n:attributes="alt"
+      tal:attributes="id string:${widget/name}Icon;
+        onclick string:clickWidgetIcon('${widget/name}');;;
+        src context/++resource++calwidget-icon.gif"/>
+    <div id="" style="background: #fff; position: absolute; display: none;"
+         tal:attributes="id string:${widget/name}Div">
+    </div>
+  </div>
+  <div class="error" tal:define="error widget/error"
+    tal:condition="error" tal:content="structure error"
+    i18n:translate="">
+    The Error
+  </div>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/templates/widget_macros.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# this is a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_breadcrumbs.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/tests/test_breadcrumbs.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/tests/test_breadcrumbs.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,130 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Breadcrumbs tests
+
+$Id: test_breadcrumbs.py 5986 2006-04-27 15:17:13Z faassen $
+"""
+__docformat__ = 'reStructuredText'
+import unittest
+from zope.testing import doctest, doctestunit
+from schooltool.app.browser.testing import setUp, tearDown
+
+def test_breadcrumbs():
+    """
+    Breadcrumbs
+    -----------
+
+    The SchoolTool breadcrumb mechanism uses breadcrumb info objects to
+    retrieve its data. Those info objects have a ``name``, ``url`` and
+    ``active`` attribute. The name is the name displayed in the
+    breadcrumbs. The URL is the one used for the link of the crumb. Finally,
+    the ``active`` flag specifies whether a link should be provided for the
+    crumb or not.
+
+    The default implementation is called ``GenericBreadcrumbInfo``. Here is
+    how it works.
+
+      >>> class Object(object):
+      ...     def __init__(self, parent=None, name=None):
+      ...         self.__parent__ = parent
+      ...         self.__name__ = name
+
+      >>> root = Object()
+      >>> from zope.traversing.interfaces import IContainmentRoot
+      >>> import zope.interface
+      >>> zope.interface.directlyProvides(root, IContainmentRoot)
+
+      >>> sub1 = Object(root, 'sub1')
+
+      >>> from zope.publisher.browser import TestRequest
+      >>> request = TestRequest()
+
+    Now we can initialize the genreic info adapter:
+
+      >>> from schooltool.skin import breadcrumbs
+      >>> generic = breadcrumbs.GenericBreadcrumbInfo(sub1, request)
+
+    The generic ``active`` flag value is always true:
+
+      >>> generic.active
+      True
+
+    The URL is just the absolute URL:
+
+      >>> generic.url
+      'http://127.0.0.1/sub1'
+
+    The name is constructed in a more complex manner. First, it looks for a
+    title attribute; if none is found, it uses the containment name:
+
+      >>> generic.name
+      'sub1'
+      >>> sub1.title = 'Sub-Object 1'
+      >>> generic.name
+      'Sub-Object 1'
+
+    If the object is a containment root and no name or title is set, the word
+    "top" is returned:
+
+      >>> generic_root = breadcrumbs.GenericBreadcrumbInfo(root, request)
+      >>> generic_root.name
+      u'top'
+
+    Now, a common use case is to specify a custom name for the breadcrumbs. In
+    those cases you simply create a class as follows:
+
+      >>> MyNameInfo = breadcrumbs.CustomNameBreadCrumbInfo('My Name')
+      >>> info = MyNameInfo(sub1, request)
+      >>> info.name
+      'My Name'
+
+    Let's now register the breadcrumb info as an adapter:
+
+      >>> import zope.component
+      >>> import zope.interface
+      >>> from schooltool.skin import interfaces
+      >>> zope.component.provideAdapter(breadcrumbs.GenericBreadcrumbInfo,
+      ...                              (Object, TestRequest),
+      ...                              interfaces.IBreadcrumbInfo)
+
+    We can now get the entire breadcrumb info:
+
+      >>> crumbs = breadcrumbs.Breadcrumbs(sub1, request)
+      >>> pprint(list(crumbs.crumbs))
+      [{'active': True,
+        'name': u'top',
+        'url': 'http://127.0.0.1'},
+       {'active': True,
+        'name': 'Sub-Object 1',
+        'url': 'http://127.0.0.1/sub1'}]
+    """
+
+
+def test_suite():
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF
+                   | doctest.REPORT_ONLY_FIRST_FAILURE)
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       globs={'pprint': doctestunit.pprint},
+                                       optionflags=optionflags))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_breadcrumbs.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_containers.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/tests/test_containers.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/tests/test_containers.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,296 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2007 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool.app.browser.containers.
+
+$Id: test_containers.py 6860 2007-04-13 23:37:39Z ignas $
+"""
+import unittest
+
+from zope.app.testing import setup
+from zope.testing import doctest
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+
+from schooltool.app.browser.testing import setUp, tearDown
+
+
+def doctest_ContainerView():
+    r"""Test for ContainerView
+
+    Let's create some persons to toy with in a person container:
+
+        >>> from schooltool.skin.containers import ContainerView
+        >>> from schooltool.person.person import Person, PersonContainer
+        >>> setup.setUpAnnotations()
+
+        >>> personContainer = PersonContainer()
+        >>> from zope.traversing.interfaces import IContainmentRoot
+        >>> directlyProvides(personContainer, IContainmentRoot)
+
+        >>> personContainer['pete'] = Person('pete', 'Pete Parrot')
+        >>> personContainer['john'] = Person('john', 'Long John')
+        >>> personContainer['frog'] = Person('frog', 'Frog Man')
+        >>> personContainer['toad'] = Person('toad', 'Taodsworth')
+        >>> request = TestRequest()
+        >>> view = ContainerView(personContainer, request)
+
+    After calling update, we should have a batch setup with everyone in it:
+
+        >>> view.update()
+        >>> [p.title for p in view.batch]
+        ['Frog Man', 'Long John', 'Pete Parrot', 'Taodsworth']
+
+
+    We can alter the batch size and starting point through the request
+
+        >>> request.form = {'batch_start': '2',
+        ...                 'batch_size': '2'}
+        >>> view.update()
+        >>> [p.title for p in view.batch]
+        ['Pete Parrot', 'Taodsworth']
+
+    We can search through the request:
+
+        >>> request.form = {'SEARCH': 'frog'}
+        >>> view.update()
+        >>> [p.title for p in view.batch]
+        ['Frog Man']
+
+    And we can clear the search (which ignores any search value):
+
+        >>> request.form = {'SEARCH': 'frog',
+        ...                 'CLEAR_SEARCH': 'on'}
+        >>> view.update()
+        >>> [p.title for p in view.batch]
+        ['Frog Man', 'Long John', 'Pete Parrot', 'Taodsworth']
+
+    """
+
+
+def doctest_ContainerDeleteView():
+    r"""Test for ContainerDeleteView
+
+    Let's create some persons to delete from a person container:
+
+        >>> from schooltool.skin.containers import ContainerDeleteView
+        >>> from schooltool.person.person import Person, PersonContainer
+        >>> setup.setUpAnnotations()
+
+        >>> personContainer = PersonContainer()
+
+        >>> from zope.traversing.interfaces import IContainmentRoot
+        >>> directlyProvides(personContainer, IContainmentRoot)
+
+        >>> personContainer['pete'] = Person('pete', 'Pete Parrot')
+        >>> personContainer['john'] = Person('john', 'Long John')
+        >>> personContainer['frog'] = Person('frog', 'Frog Man')
+        >>> personContainer['toad'] = Person('toad', 'Taodsworth')
+        >>> request = TestRequest()
+        >>> view = ContainerDeleteView(personContainer, request)
+
+    We should have the list of all the Ids of items that are going to
+    be deleted from container:
+
+        >>> view.listIdsForDeletion()
+        []
+
+    We must pass ids of selected people in the request:
+
+        >>> request.form = {'delete.pete': 'on',
+        ...                 'delete.john': 'on',
+        ...                 'CONFIRM': 'Confirm'}
+        >>> ids = [key for key in view.listIdsForDeletion()]
+        >>> ids.sort()
+        >>> ids
+        [u'john', u'pete']
+        >>> [item.title for item in view.itemsToDelete]
+        ['Long John', 'Pete Parrot']
+
+    These two should be gone after update:
+
+        >>> view.update()
+        >>> ids = [key for key in personContainer]
+        >>> ids.sort()
+        >>> ids
+        [u'frog', u'toad']
+
+    And we should be redirected to the container view:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    If we press Cancel no one should get hurt though:
+
+        >>> request.form = {'delete.frog': 'on',
+        ...                 'delete.toad': 'on',
+        ...                 'CANCEL': 'Cancel'}
+
+    You see, both our firends are still in there:
+
+        >>> ids = [key for key in personContainer]
+        >>> ids.sort()
+        >>> ids
+        [u'frog', u'toad']
+
+    But we should be redirected to the container:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    No redirection if nothing was pressed should happen:
+
+        >>> request.form = {'delete.frog': 'on',
+        ...                 'delete.toad': 'on'}
+        >>> view.update()
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1'
+
+    """
+
+
+def doctest_TableContainerView():
+    r"""Test for ContainerView
+
+    Let's create some persons to toy with in a table container:
+
+        >>> from schooltool.skin.containers import TableContainerView
+        >>> from schooltool.person.person import Person, PersonContainer
+        >>> setup.setUpAnnotations()
+
+        >>> personContainer = PersonContainer()
+        >>> from zope.traversing.interfaces import IContainmentRoot
+        >>> directlyProvides(personContainer, IContainmentRoot)
+
+        >>> personContainer['pete'] = Person('pete', 'Pete Parrot')
+        >>> personContainer['john'] = Person('john', 'Long John')
+        >>> personContainer['frog'] = Person('frog', 'Frog Man')
+        >>> personContainer['toad'] = Person('toad', 'Taodsworth')
+        >>> request = TestRequest()
+
+    The table view is using the ITableFormatter adapter to lookup the
+    approrpiate table formatter for the container:
+
+        >>> from zope.component import provideAdapter
+        >>> from schooltool.table.interfaces import ITableFormatter
+        >>> from zope.interface import implements
+        >>> class TableFormatter(object):
+        ...     implements(ITableFormatter)
+        ...     def __init__(self, context, request):
+        ...         self.request = request
+        ...     def setUp(self, **kwargs):
+        ...         print "Setting up table formatter: %s" % kwargs
+
+        >>> from schooltool.person.interfaces import IPersonContainer
+        >>> from zope.publisher.interfaces.browser import IBrowserRequest
+        >>> provideAdapter(TableFormatter, adapts=[IPersonContainer,
+        ...                                        IBrowserRequest],
+        ...                                provides=ITableFormatter)
+
+    By default the template that displays a list of items is being
+    used:
+
+        >>> view = TableContainerView(personContainer, request)
+        >>> view.canModify = lambda: False
+        >>> view.template = lambda: "The table template."
+        >>> view.delete_template = lambda: "The delete template."
+        >>> result = view()
+        Setting up table formatter:
+         {'columns_before': [],
+          'formatters': [<function url_cell_formatter at ...>]}
+
+        >>> result
+        'The table template.'
+
+    If we can modify the list that is being displayed, an additional
+    columns is added before the default columns:
+
+        >>> view.canModify = lambda: True
+        >>> result = view()
+        Setting up table formatter: {'columns_before': [<....DependableCheckboxColumn object at ...>],
+                                     'formatters': [<function url_cell_formatter at ...>]}
+
+        >>> result
+        'The table template.'
+
+
+    If there 'DELETE' button is pressed, a different template is used:
+
+        >>> request.form = {'delete.pete': 'on', 'DELETE': 'Delete'}
+        >>> view()
+        'The delete template.'
+
+    We should have the list of all the Ids of items that are going to
+    be deleted from container:
+
+        >>> view.listIdsForDeletion()
+        [u'pete']
+
+    We must pass ids of selected people in the request:
+
+        >>> request.form = {'delete.pete': 'on',
+        ...                 'delete.john': 'on',
+        ...                 'CONFIRM': 'Confirm'}
+        >>> ids = [key for key in view.listIdsForDeletion()]
+        >>> ids.sort()
+        >>> ids
+        [u'john', u'pete']
+        >>> [item.title for item in view.itemsToDelete]
+        ['Long John', 'Pete Parrot']
+
+    These two should be gone after update:
+
+        >>> view.update()
+        >>> ids = [key for key in personContainer]
+        >>> ids.sort()
+        >>> ids
+        [u'frog', u'toad']
+
+    If we press Cancel no one should get hurt though:
+
+        >>> request.form = {'delete.frog': 'on',
+        ...                 'delete.toad': 'on',
+        ...                 'CANCEL': 'Cancel'}
+
+    You see, both our firends are still in there:
+
+        >>> ids = [key for key in personContainer]
+        >>> ids.sort()
+        >>> ids
+        [u'frog', u'toad']
+
+    """
+
+
+def test_suite():
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF
+                   | doctest.REPORT_ONLY_FIRST_FAILURE
+                   | doctest.NORMALIZE_WHITESPACE)
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=optionflags))
+    return suite
+
+
+if __name__ == "__main__":
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_containers.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_dateformatter.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/tests/test_dateformatter.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/tests/test_dateformatter.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,170 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for DateFormatter views.
+
+$Id: test_dateformatter.py 6597 2007-01-24 16:21:15Z ignas $
+"""
+import unittest
+import datetime
+
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+from zope.traversing.interfaces import IContainmentRoot
+
+from schooltool.app.browser.testing import setUp, tearDown
+from schooltool.testing import setup as sbsetup
+from schooltool.skin.dateformatter import DateFormatterFullView
+from schooltool.skin.dateformatter import DateFormatterMediumView
+from schooltool.skin.dateformatter import DateFormatterShortView
+from schooltool.skin.dateformatter import LocaleLookupMixin
+
+
+def doctest_DateFormatterView():
+    r"""Test for DateFormatterView
+
+    Let's say we need to localize the 1 december 2006
+
+    We create 2 clients, one english, one french:
+
+        >>> english_request = TestRequest(environ={'HTTP_ACCEPT_LANGUAGE':'en'})
+        >>> french_request = TestRequest(environ={'HTTP_ACCEPT_LANGUAGE':'fr,en'})
+
+    We setup the date:
+
+        >>> date = datetime.date(2006, 12, 1)
+        >>> date
+        datetime.date(2006, 12, 1)
+        >>> isinstance(date, datetime.date)
+        True
+
+    We take the Full format of a date:
+
+        >>> view = DateFormatterFullView(date, english_request)
+        >>> view()
+        u'Friday, December 1, 2006'
+
+    and in french:
+
+        >>> view = DateFormatterFullView(date, french_request)
+        >>> view()
+        u'vendredi 1 d\xe9cembre 2006'
+
+    We take the medium format of a date
+
+        >>> view = DateFormatterMediumView(date, english_request)
+        >>> view()
+        u'Dec 1, 2006'
+
+    and in french:
+
+        >>> view = DateFormatterMediumView(date, french_request)
+        >>> view()
+        u'1 d\xe9c. 06'
+
+    We take the short format of a date
+
+        >>> view = DateFormatterShortView(date, english_request)
+        >>> view()
+        u'12/1/06'
+
+    and in French:
+
+        >>> view = DateFormatterShortView(date, french_request)
+        >>> view()
+        u'01/12/06'
+
+    """
+
+def doctest_LocaleLookupMixin():
+    r"""Tests for LocaleLookupMixin
+
+    Let's try first to use the mixin without a view and thus without
+    a request attribute. This will fail as there is no request attribute
+    provided
+
+        >>> mixin = LocaleLookupMixin()
+        >>> mixin.getLocale()
+        Traceback (most recent call last):
+            ...
+        NotImplementedError: LocaleLookupMixin need to be applied on a view
+
+    Now let's play with a real view which will use our LocaleLookupMixin
+
+        >>> from zope.publisher.browser import BrowserView
+        >>> class FooView(BrowserView, LocaleLookupMixin):
+        ...     pass
+
+    Let's create a dummy context for the view
+
+        >>> class FooContext(object):
+        ...     pass
+        >>> barObj = FooContext()
+
+    Let's create two simple request
+
+        >>> french_request = TestRequest(environ={'HTTP_ACCEPT_LANGUAGE':'fr,en'})
+
+    We can now instanciate the view
+
+        >>> v = FooView(barObj, french_request)
+
+        >>> locale = v.getLocale()
+
+    We have then an instance of the Locale class
+
+        >>> locale
+        <zope.i18n.locales.Locale object ...>
+
+    Which is french as in our request
+
+        >>> locale.getLocaleID()
+        u'fr'
+
+    Now let's see what happen is no locale is defined in the request
+
+        >>> simple_request = TestRequest()
+
+    We don't have any language defined:
+
+        >>> simple_request.locale.id.language is None
+        True
+
+    Let's see how the Mixin will behave, it should return an english
+    locale by default:
+
+        >>> v = FooView(barObj, simple_request)
+        >>> locale = v.getLocale()
+        >>> locale
+        <zope.i18n.locales.Locale object ...>
+        >>> locale.getLocaleID()
+        'en_US'
+    """
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(
+        setUp=setUp, tearDown=tearDown,
+        optionflags=doctest.ELLIPSIS|doctest.REPORT_NDIFF))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_dateformatter.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_error.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/tests/test_error.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/tests/test_error.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,82 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool error views.
+
+$Id: test_error.py 5827 2006-03-20 13:21:01Z faassen $
+"""
+
+import unittest
+
+from zope.testing import doctest
+from zope.publisher.browser import TestRequest
+from zope.app.exception.interfaces import ISystemErrorView
+
+
+def doctest_ErrorView():
+    r"""Test for ErrorView
+
+        >>> from schooltool.skin.error import ErrorView
+        >>> exception = RuntimeError("some kind of error")
+        >>> request = TestRequest()
+        >>> view = ErrorView(exception, request)
+
+    The view is a system error view, thus causing the zope publication to
+    log exceptions via the SiteError logger.
+
+        >>> ISystemErrorView.providedBy(view)
+        True
+        >>> view.isSystemError()
+        True
+
+    view.index is a page template, normally specified via ZCML
+
+        >>> view.index = lambda: 'rendered page'
+
+    Rendering the view sets the status code to 500.
+
+        >>> print view()
+        rendered page
+
+        >>> request.response.getStatus()
+        500
+
+    view.traceback uses sys.exc_info, and apparently we have to test it inside
+    an except clause
+
+        >>> try:
+        ...     raise exception
+        ... except:
+        ...     print view.traceback()
+        File "<span class="filename">&lt;doctest...ErrorView[...]&gt;</span>",
+        line <span class="lineno">2</span>, in <span class="method">?</span>
+          <span class="source">raise exception</span>
+
+    """
+
+
+def test_suite():
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF |
+                   doctest.NORMALIZE_WHITESPACE |
+                   doctest.REPORT_ONLY_FIRST_FAILURE)
+    return doctest.DocTestSuite(optionflags=optionflags)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_error.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_skin.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/skin/tests/test_skin.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/skin/tests/test_skin.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,303 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool.app.browser.skin.
+
+$Id: test_skin.py 6535 2007-01-02 12:04:22Z ignas $
+"""
+
+import unittest
+import pprint
+
+from zope.interface import providedBy, Interface, implements
+from zope.testing import doctest
+from zope.app.testing import setup
+from zope.publisher.browser import TestRequest
+from zope.app.publication.zopepublication import BeforeTraverseEvent
+from zope.component import provideAdapter, adapts
+
+from schooltool.testing.setup import setUpSchoolToolSite
+
+
+def doctest_OrderedViewletManager_sort():
+    r"""Tests for OrderedViewletManager.sort
+
+        >>> from schooltool.skin import OrderedViewletManager
+
+    If two viewlets have an ``order`` attribute, they are ordered by it.
+    This attribute may be a string, if defined via zcml.
+
+    If two viewlets do not have an ``order`` attribute, they are ordered
+    alphabetically by their ``title`` attributes.
+
+    If it so happens that one viewlet has an ``order`` attribute, and the other
+    doesn't, the one with an order comes first.
+
+        >>> class SomeViewlet(object):
+        ...     def __init__(self, title=None, order=None):
+        ...         if title is not None:
+        ...             self.title = title
+        ...         if order is not None:
+        ...             self.order = order
+
+        >>> mgr = OrderedViewletManager(context=None, request=None, view=None)
+        >>> viewlets = [
+        ...     ('name1', SomeViewlet('One', '1')),
+        ...     ('name2', SomeViewlet('Apple')),
+        ...     ('name3', SomeViewlet('Twenty-two', '22')),
+        ...     ('name4', SomeViewlet('Five', '5')),
+        ...     ('name5', SomeViewlet('Orange')),
+        ...     ('name6', SomeViewlet('Grapefuit')),
+        ... ]
+        >>> for name, v in mgr.sort(viewlets):
+        ...     print v.title
+        One
+        Five
+        Twenty-two
+        Apple
+        Grapefuit
+        Orange
+
+    Viewlets may not necessarily have a title, if they have an order.
+
+        >>> viewlets = [
+        ...     ('name1', SomeViewlet(order='1')),
+        ...     ('name22', SomeViewlet(order='22')),
+        ...     ('name5', SomeViewlet(order='5')),
+        ... ]
+        >>> for name, v in mgr.sort(viewlets):
+        ...     print name
+        name1
+        name5
+        name22
+
+    Viewlets must have either an order or a title, and the error message
+    should explicitly say which viewlet is at fault:
+
+        >>> viewlets = [
+        ...     ('name1', SomeViewlet(order='1')),
+        ...     ('name2', SomeViewlet()),
+        ...     ('name3', SomeViewlet(title='hi')),
+        ... ]
+        >>> mgr.sort(viewlets)
+        Traceback (most recent call last):
+          ...
+        AttributeError: 'name2' viewlet has neither order nor title
+
+    """
+
+
+def doctest_NavigationViewlet_appURL():
+    r"""Tests for NavigationViewlet.appURL
+
+        >>> setup.placefulSetUp()
+        >>> site = setUpSchoolToolSite()
+
+        >>> from schooltool.skin import NavigationViewlet
+        >>> viewlet = NavigationViewlet()
+        >>> viewlet.request = TestRequest()
+        >>> viewlet.appURL()
+        'http://127.0.0.1'
+
+        >>> setup.placefulTearDown()
+
+    """
+
+def doctest_NavigationViewletCrowd():
+    """Tests for NavigationViewletCrowd.
+
+        >>> setup.placelessSetUp()
+        >>> from schooltool.skin.skin import NavigationViewletCrowd
+
+        >>> class StubCrowd(object):
+        ...     def __init__(self, context):
+        ...         self.context = context
+        ...     def contains(self, principal):
+        ...         return "Crowd on %s contains %s" % (self.context, principal)
+
+        >>> from zope.component import provideAdapter
+        >>> from zope.interface import Interface
+        >>> from schooltool.securitypolicy.interfaces import ICrowd
+        >>> provideAdapter(StubCrowd,
+        ...                (Interface, ), ICrowd, name='schooltool.view')
+
+        >>> class ViewletStub(object):
+        ...     def actualContext(self):
+        ...         return "Actual context object"
+
+    The crowd delegates the permission check to the ICrowd based on
+    the actualContext object of the viewlet:
+
+        >>> crowd = NavigationViewletCrowd(ViewletStub())
+        >>> crowd.contains("The principal")
+        'Crowd on Actual context object contains The principal'
+
+        >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_ActionMenuViewletManager():
+    """Tests for ActionMenuViewletManager.
+
+         >>> setup.placelessSetUp()
+         >>> from schooltool.skin.skin import ActionMenuViewletManager
+         >>> context = "context"
+         >>> request = TestRequest()
+         >>> manager = ActionMenuViewletManager(context, request, None)
+
+         >>> from zope.publisher.interfaces.browser import IBrowserRequest
+         >>> from schooltool.skin.interfaces import IBreadcrumbInfo
+         >>> class StubBreadcrumbInfo(object):
+         ...     adapts(Interface, IBrowserRequest)
+         ...     implements(IBreadcrumbInfo)
+         ...     def __init__(self, context, request):
+         ...         self.name = "Breadcrumb name"
+
+         >>> provideAdapter(StubBreadcrumbInfo)
+
+    Viewlet managers title is taken from it's contexts breadcrumb info:
+
+         >>> manager.title()
+         'Breadcrumb name'
+
+    subItems is a shortctut that gets subitems for the managers context:
+
+         >>> manager.getSubItems = lambda context: ["Sub menu items for", context]
+         >>> manager.subItems()
+         ['Sub menu items for', 'context']
+
+         >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_ActionMenuViewletManager_update():
+    """Tests for ActionMenuViewletManager.update.
+
+         >>> setup.placelessSetUp()
+         >>> from schooltool.skin.skin import ActionMenuViewletManager
+         >>> context = "context"
+         >>> request = TestRequest()
+         >>> manager = ActionMenuViewletManager(context, request, None)
+
+    Viewlet managers title is taken from it's contexts breadcrumb info:
+
+         >>> class TargetStub(object):
+         ...      __parent__ = "parent"
+         >>> target = TargetStub()
+         >>> manager.getSubItems = lambda context: ["foo", "bar"]
+         >>> import sys
+         >>> manager.orderedViewletManagerUpdate = lambda: sys.stdout.write(
+         ...                                           "OrderedViewletManager.update()")
+         >>> manager.__parent__ = ActionMenuViewletManager(None, None, None)
+         >>> manager.target = target
+
+    If we are not displaying a top level menu and the current target
+    is not in the list of it's parents subitems:
+
+         >>> manager.update()
+         OrderedViewletManager.update()
+
+    Target becomes the context:
+
+         >>> target is manager.context
+         True
+
+    If we are displaying a top level menu we should still have the
+    target becoming new context:
+
+         >>> manager.context = None
+         >>> manager.update()
+         OrderedViewletManager.update()
+
+         >>> target is manager.context
+         True
+
+    But if the manager is being displayed to display a top level menu,
+    and the item is in it's parents subitem list:
+
+         >>> manager.getSubItems = lambda context: ["foo", "bar", target]
+         >>> manager.__parent__ = None
+
+         >>> manager.update()
+         OrderedViewletManager.update()
+
+    We should get menu items of the targets parent:
+
+         >>> target.__parent__ is manager.context
+         True
+
+         >>> setup.placelessTearDown()
+
+    """
+
+
+def doctest_LanguageSelectorViewlet():
+    """
+
+         >>> from schooltool.skin.skin import LanguageSelectorViewlet
+         >>> from zope.publisher.browser import TestRequest
+         >>> viewlet = LanguageSelectorViewlet(None, TestRequest())
+
+         >>> from zope.i18n.interfaces import IUserPreferredLanguages
+         >>> class UPL(object):
+         ...     implements(IUserPreferredLanguages)
+         ...     adapts(Interface)
+         ...     def __init__(self, request):
+         ...         pass
+
+     If ICookieLanguageSelector is not provided by the
+     UserPreferedLanguages adapter - no languages are in the list:
+
+         >>> provideAdapter(UPL)
+         >>> viewlet.languages() is None
+         True
+
+     If adapter provides ICookieLanguageSelector viewlet returns
+     whatever is given by the CookieLanguageSelector:
+
+         >>> from zope.publisher.interfaces.http import IHTTPRequest
+         >>> from schooltool.app.interfaces import ICookieLanguageSelector
+         >>> class CookieLanguageSelector(UPL):
+         ...     implements(ICookieLanguageSelector)
+         ...     adapts(IHTTPRequest)
+         ...     def getLanguageList(self):
+         ...         return ["lt", "en"]
+         ...     def getSelectedLanguage(self):
+         ...         return "lt"
+         >>> provideAdapter(CookieLanguageSelector, provides=IUserPreferredLanguages)
+
+         >>> viewlet.languages()
+         ['lt', 'en']
+
+         >>> viewlet.selected_lang()
+         'lt'
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+                doctest.DocTestSuite(),
+           ])
+
+
+if __name__ == "__main__":
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/skin/tests/test_skin.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/table/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/table/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/table/batch.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/table/batch.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/table/batch.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,143 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Batching for schooltool.
+
+$Id: batch.py 6889 2007-04-25 12:44:56Z ignas $
+"""
+from zope.interface import implements
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+
+from schooltool.table.interfaces import IBatch
+
+
+class Batch(object):
+    """Batching mechanism for Tables"""
+
+    template = ViewPageTemplateFile("templates/batch.pt")
+
+    def __init__(self, formatter, batch_size=10):
+        self.formatter = formatter
+
+        if formatter.prefix:
+            self.name = "." + formatter.prefix
+        else:
+            self.name = ""
+
+        self.request = self.formatter.request
+        self.context = self.formatter
+
+        item_list = list(self.context._items)
+        self.full_size = len(item_list)
+        self.extra_url = self.context.extra_url()
+        self.base_url = self.request.URL
+
+        self.start = int(self.request.get('batch_start' + self.name, 0))
+        self.size = int(self.request.get('batch_size' + self.name, batch_size))
+        self.length = len(item_list[self.start:self.start + self.size])
+
+    def render(self):
+        if self.size < self.full_size or self.needsBatch:
+            return self.template()
+        else:
+            return ''
+
+    @property
+    def needsBatch(self):
+        there_are_more = self.full_size > self.size + self.start
+        there_were_before = self.start - self.size > 0
+        return there_are_more or there_were_before
+
+    def __len__(self):
+        return self.length
+
+    def previous_url(self):
+        start = self.start - self.size
+        if start < 0:
+            return '%s?batch_start%s=%s&batch_size.%s=%s%s' % (
+                self.base_url, self.name, start, self.name, self.size, self.extra_url)
+        return None
+
+
+    def next_url(self):
+        start = self.size + self.start
+        if self.full_size > start:
+            return '%s?batch_start%s=%s&batch_size.%s=%s%s' % (
+                self.base_url, self.name, start, self.name, self.size, self.extra_url)
+
+    def num(self):
+        return self.start / self.size + 1
+
+    def numBatches(self):
+        num = self.full_size / self.size
+        if self.full_size % self.size:
+            num += 1
+        return num
+
+    def batch_urls(self):
+        urls = []
+        start = 0
+        num = 1
+        while self.full_size > start:
+            css_class = None
+            if (self.start == start):
+                css_class = 'current'
+            href = '%s?batch_start%s=%s&batch_size%s=%s%s' % (
+                self.base_url, self.name, start, self.name, self.size, self.extra_url)
+            urls.append({'href': href,
+                         'num': num,
+                         'class': css_class})
+            num += 1
+            start += self.size
+
+        return urls
+
+
+class IterableBatch(Batch):
+
+    def __init__(self, items, request, extra_url=None, batch_size=10,
+                 sort_by=None, name=None):
+        self.context = None
+        self.items = items
+        self.request = request
+
+        if name:
+            self.name = "." + name
+        else:
+            self.name = ""
+
+        def key(obj):
+            try:
+                return obj.get(sort_by)
+            except AttributeError:
+                return getattr(obj, sort_by)
+
+        item_list = sorted(items, key=key)
+        self.full_size = len(item_list)
+        self.extra_url = extra_url or ""
+        self.base_url = self.request.URL
+
+
+        self.start = int(self.request.get('batch_start' + self.name, 0))
+        self.size = int(self.request.get('batch_size' + self.name, batch_size))
+        self.list = item_list[self.start:self.start + self.size]
+        self.length = len(self.list)
+
+    def __iter__(self):
+        return iter(self.list)


Property changes on: schooltool/branches/upstream/current/src/schooltool/table/batch.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/table/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/table/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/table/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,78 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Interfaces for SchoolTool calendar browser views.
+
+$Id: interfaces.py 6860 2007-04-13 23:37:39Z ignas $
+"""
+from zope.schema import Object
+from zope.interface import Interface
+
+
+class IBatch(Interface):
+
+    def render():
+        """ """
+
+
+class IFilterWidget(Interface):
+
+    def render():
+        """Render the HTML representation of the filtering widget. """
+
+    def filter(list):
+        """Process the list leaving only those elements that match the query."""
+
+    def active():
+        """Returns True if there is at least one search parameter in the request."""
+
+    def extra_url():
+        """String that should be appended to the url to preserve query parameters."""
+
+
+class ITableFormatter(Interface):
+
+    batch = Object(schema=IBatch)
+
+    filter_widget = Object(schema=IFilterWidget)
+
+    def setUp(items=None, filter=None, columns=None, columns_before=None,
+              columns_after=None, sort_on=None, prefix="", formatters=None,
+              table_formatter=None):
+        """Populate the table with items, set up the variables for table formatter.
+
+        After calling this method you have batch and filter_widget set
+        up as well, so you can render them in the view as well.
+        """
+
+    def render():
+        """Render the table for display in a view."""
+
+
+class IIndexedColumn(Interface):
+    """A column that operates on index dicts instead of objects.
+
+    Index dicts are composed this way:
+
+    context - the container containing items
+    id      - the int id of the object
+    catalog - the catalog that is storing relevant indexes
+    key     - the key by which the object can be retrieved from the context
+
+    """


Property changes on: schooltool/branches/upstream/current/src/schooltool/table/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/table/table.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/table/table.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/table/table.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,379 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Base code for table rendering and filtering.
+
+$Id: table.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import urllib
+
+from zope.interface import implements
+from zope.interface import directlyProvides
+from zope.i18n.interfaces.locales import ICollator
+from zope.app.pagetemplate import ViewPageTemplateFile
+from zc.table import table
+from zc.table import column
+from zc.table.interfaces import ISortableColumn
+from zc.table.column import GetterColumn
+from zope.app import zapi
+from zope.component import queryMultiAdapter
+from zope.security.proxy import removeSecurityProxy
+from zope.app.dependable.interfaces import IDependable
+from zope.app.catalog.interfaces import ICatalog
+from zope.component import getUtility
+from zope.app.intid.interfaces import IIntIds
+from zope.component import queryUtility
+
+from schooltool.table.batch import Batch
+from schooltool.table.interfaces import IFilterWidget
+from schooltool.table.interfaces import ITableFormatter
+from schooltool.table.interfaces import IIndexedColumn
+
+
+class FilterWidget(object):
+    """A simple one field search widget.
+
+    Filters out items in the container by their title.
+    """
+    implements(IFilterWidget)
+
+    template = ViewPageTemplateFile('templates/filter.pt')
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def render(self):
+        return self.template()
+
+    def filter(self, list):
+        if 'SEARCH' in self.request and 'CLEAR_SEARCH' not in self.request:
+            searchstr = self.request['SEARCH'].lower()
+            results = [item for item in list
+                       if searchstr in item.title.lower()]
+        else:
+            self.request.form['SEARCH'] = ''
+            results = list
+
+        return results
+
+    def active(self):
+        return 'SEARCH' in self.request
+
+    def extra_url(self):
+        if 'SEARCH' in self.request:
+            return '&SEARCH=%s' % self.request.get('SEARCH')
+        return ''
+
+
+class IndexedFilterWidget(FilterWidget):
+
+    def filter(self, list):
+        catalog = ICatalog(self.context)
+        index = catalog['title']
+        if 'SEARCH' in self.request and 'CLEAR_SEARCH' not in self.request:
+            searchstr = self.request['SEARCH'].lower()
+            results = []
+            for item in list:
+                title = index.documents_to_values[item['id']]
+                if searchstr in title.lower():
+                    results.append(item)
+        else:
+            self.request.form['SEARCH'] = ''
+            results = list
+
+        return results
+
+
+class CheckboxColumn(column.Column):
+    """A columns with a checkbox
+
+    The name and id of the checkbox are composed of the prefix keyword
+    argument and __name__ of the item being displayed.
+    """
+    def __init__(self, prefix, name=None, title=None, isDisabled=None):
+        super(CheckboxColumn, self).__init__(name=name, title=title)
+        self.prefix = prefix
+        if isDisabled:
+            self.isDisabled = isDisabled
+
+    def isDisabled(self, item):
+        return False
+
+    def renderCell(self, item, formatter):
+        if not self.isDisabled(item):
+            id = "%s.%s" % (self.prefix, item.__name__)
+            return '<input type="checkbox" name="%s" id="%s" />' % (id, id)
+        else:
+            return ''
+
+
+def label_cell_formatter_factory(prefix=""):
+    if prefix:
+        prefix = prefix + "."
+    def label_cell_formatter(value, item, formatter):
+        return '<label for="%s%s">%s</label>' % (prefix,
+                                                 item.__name__,
+                                                 value)
+    return label_cell_formatter
+
+
+class DependableCheckboxColumn(CheckboxColumn):
+    """A column that displays a checkbox that is disabled if item has dependables.
+
+    The name and id of the checkbox are composed of the prefix keyword
+    argument and __name__ of the item being displayed.
+    """
+
+    def renderCell(self, item, formatter):
+        id = "%s.%s" % (self.prefix, item.__name__)
+
+        if self.hasDependents(item):
+            return '<input type="checkbox" name="%s" id="%s" disabled="disabled" />' % (id, id)
+        else:
+            return '<input type="checkbox" name="%s" id="%s" />' % (id, id)
+
+    def hasDependents(self, item):
+        # We cannot adapt security-proxied objects to IDependable.  Unwrapping
+        # is safe since we do not modify anything, and the information whether
+        # an object can be deleted or not is not classified.
+        unwrapped_context = removeSecurityProxy(item)
+        dependable = IDependable(unwrapped_context, None)
+        if dependable is None:
+            return False
+        else:
+            return bool(dependable.dependents())
+
+
+def url_cell_formatter(value, item, formatter):
+    url = zapi.absoluteURL(item, formatter.request)
+    return '<a href="%s">%s</a>' % (url, value)
+
+
+class LocaleAwareGetterColumn(GetterColumn):
+    """Getter columnt that has locale aware sorting."""
+
+    implements(ISortableColumn)
+
+    def getSortKey(self, item, formatter):
+        collator = ICollator(formatter.request.locale)
+        s = self.getter(item, formatter)
+        return s and collator.key(s)
+
+
+class IndexedGetterColumn(GetterColumn):
+    implements(IIndexedColumn, ISortableColumn)
+
+    def __init__(self, **kwargs):
+        self.index = kwargs.pop('index')
+        super(IndexedGetterColumn, self).__init__(**kwargs)
+
+    def renderCell(self, item, formatter):
+        item = queryUtility(IIntIds).getObject(item['id'])
+        value = self.getter(item, formatter)
+        return self.cell_formatter(value, item, formatter)
+
+    def getSortKey(self, item, formatter):
+        id = item['id']
+        index = item['catalog'][self.index]
+        return index.documents_to_values[id]
+
+
+class IndexedLocaleAwareGetterColumn(IndexedGetterColumn):
+
+    _cached_collator = None
+
+    def getSortKey(self, item, formatter):
+        if not self._cached_collator:
+            self._cached_collator = ICollator(formatter.request.locale)
+        s = super(IndexedLocaleAwareGetterColumn, self).getSortKey(item, formatter)
+        return s and self._cached_collator.key(s)
+
+
+class SchoolToolTableFormatter(object):
+    implements(ITableFormatter)
+
+    filter_widget = None
+    batch = None
+
+    def __init__(self, context, request):
+        self.context, self.request = context, request
+
+    def columns(self):
+        title = GetterColumn(name='title',
+                             title=u"Title",
+                             getter=lambda i, f: i.title,
+                             subsort=True)
+        directlyProvides(title, ISortableColumn)
+        return [title]
+
+    def items(self):
+        return self.context.values()
+
+    def ommit(self, items, ommited_items):
+        ommited_items = set(ommited_items)
+        return [item for item in items
+                if item not in ommited_items]
+
+    def filter(self, items):
+        # if there is no filter widget, we just return all the items
+        if self.filter_widget:
+            return self.filter_widget.filter(items)
+        else:
+            return items
+
+    def sortOn(self):
+        return (("title", False),)
+
+    def setUp(self, items=None, ommit=[], filter=None, columns=None,
+              columns_before=[], columns_after=[], sort_on=None, prefix="",
+              formatters=[], table_formatter=table.FormFullFormatter,
+              batch_size=10):
+
+        self.filter_widget = queryMultiAdapter((self.context, self.request),
+                                               IFilterWidget)
+
+        self._table_formatter = table_formatter
+
+        if not columns:
+            columns = self.columns()
+
+        if formatters:
+            for formatter, column in zip(formatters, columns):
+                column.cell_formatter = formatter
+
+        self._columns = columns_before[:] + columns[:] + columns_after[:]
+
+        if items is None:
+            items = self.items()
+
+        if not filter:
+            filter = self.filter
+
+        self._items = filter(self.ommit(items, ommit))
+
+        self.prefix = prefix
+
+        if batch_size == 0:
+            batch_size = len(list(self._items))
+
+        self.batch = Batch(self, batch_size=batch_size)
+
+        self._sort_on = sort_on or self.sortOn()
+
+    def extra_url(self):
+        extra_url = ""
+        if self.filter_widget:
+            extra_url += self.filter_widget.extra_url()
+        for key, value in self.request.form.items():
+            if key.endswith("sort_on"):
+                values = [urllib.quote(token) for token in value]
+                extra_url += "&%s:tokens=%s" % (key, " ".join(values))
+        return extra_url
+
+    def render(self):
+        formatter = self._table_formatter(
+            self.context, self.request, self._items,
+            columns=self._columns,
+            batch_start=self.batch.start, batch_size=self.batch.size,
+            sort_on=self._sort_on,
+            prefix=self.prefix)
+        formatter.cssClasses['table'] = 'data'
+        return formatter()
+
+
+class IndexedTableFormatter(SchoolToolTableFormatter):
+
+    def columns(self):
+        return [IndexedGetterColumn(name='title',
+                                    title=u"Title",
+                                    getter=lambda i, f: i.title,
+                                    cell_formatter=url_cell_formatter,
+                                    index='title')]
+
+    def items(self):
+        """Return a list of index dicts for all the items in the context container"""
+        catalog = ICatalog(self.context)
+        index = catalog.values()[0]
+        results = []
+        for id, value in index.documents_to_values.items():
+            results.append({
+                    'id': id,
+                    'catalog': catalog})
+        return results
+
+    def ommit(self, items, ommited_items):
+        ommited_items = self.indexItems(ommited_items)
+        ommited_ids = set([item['id'] for item in ommited_items])
+        return [item for item in items
+                if item['id'] not in ommited_ids]
+
+    def indexItems(self, items):
+        """Convert a list of objects to a list of index dicts"""
+        int_ids = getUtility(IIntIds)
+        catalog = ICatalog(self.context)
+        results = []
+        for item in items:
+            results.append({
+                    'id': int_ids.getId(item),
+                    'catalog': catalog})
+        return results
+
+    def wrapColumn(self, column):
+        """Wrap a normal column to work with index dicts"""
+        original_renderCell = column.renderCell
+        def unindexingRenderCell(item, formatter):
+            item = queryUtility(IIntIds).getObject(item['id'])
+            return original_renderCell(item, formatter)
+        column.renderCell = unindexingRenderCell
+
+        if ISortableColumn.providedBy(column):
+            original_getSortKey = column.getSortKey
+            def unindexingGetSortKey(item, formatter):
+                item = queryUtility(IIntIds).getObject(item['id'])
+                return original_getSortKey(item, formatter)
+            column.getSortKey = unindexingGetSortKey
+
+        return column
+
+    def wrapColumns(self, columns):
+        """Wrap all not indexed columns to work with index dicts"""
+        wrapped_columns = []
+        for column in columns:
+            if IIndexedColumn.providedBy(column):
+                wrapped_columns.append(column)
+            else:
+                wrapped_columns.append(self.wrapColumn(column))
+        return wrapped_columns
+
+    def setUp(self, **kwargs):
+        items = kwargs.pop('items', None)
+        columns = kwargs.pop('columns', None)
+        columns_before = kwargs.pop('columns_before', [])
+        columns_after = kwargs.pop('columns_after', [])
+
+        if items is not None:
+            items = self.indexItems(items)
+        if columns is None:
+            columns = self.columns()
+
+        super(IndexedTableFormatter, self).setUp(items=items,
+                columns=self.wrapColumns(columns),
+                columns_before=self.wrapColumns(columns_before),
+                columns_after=self.wrapColumns(columns_after),
+                **kwargs)


Property changes on: schooltool/branches/upstream/current/src/schooltool/table/table.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/table/templates/batch.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/table/templates/batch.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/table/templates/batch.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,82 @@
+<div class="batch-navigation">
+
+  <tal:if condition="view/needsBatch">
+    <span tal:condition="not:view/previous_url" i18n:translate=""
+          class="previous">&laquo; Previous</span>
+    <a class="previous"
+       tal:condition="view/previous_url"
+       tal:attributes="href view/previous_url"
+       i18n:translate=""
+       >&laquo; Previous</a>
+  </tal:if>
+
+  <div class="batch-extra-navigation">
+
+    <a tal:attributes="href string:${view/base_url}?batch_size.${view/name}=10"
+       tal:condition="python:view.size > 10"
+       class="less">Show Less</a>
+
+    <a tal:attributes="href string:${view/base_url}?batch_size.${view/name}=${view/full_size}"
+       tal:condition="python:view.size < view.full_size"
+       class="all">Show All</a>
+
+  </div>
+
+  <tal:if condition="view/needsBatch">
+    <a class="next"
+       tal:condition="view/next_url"
+       tal:attributes="href view/next_url"
+       i18n:translate=""
+       >Next &raquo;</a>
+
+    <span tal:condition="not:view/next_url" i18n:translate=""
+          class="next">Next &raquo;</span>
+
+    <tal:if define="cur view/num;
+                    total view/numBatches;
+                    urls view/batch_urls"
+            condition="python:total > 11">
+
+      <tal:if condition="python:cur <= 6">
+        <span tal:repeat="b python:urls[:9]">
+          <a tal:attributes="href b/href; class b/class" tal:content="b/num" />
+        </span>
+        <span class="separator">...</span>
+        <tal:block define="b python:urls[-1]">
+          <a tal:attributes="href b/href; class b/class" tal:content="b/num" />
+        </tal:block>
+      </tal:if>
+
+      <tal:if condition="python:cur < (total - 4) and (cur > 6)">
+        <tal:block define="b python:urls[0]">
+          <a tal:attributes="href b/href; class b/class" tal:content="b/num" />
+        </tal:block>
+        <span class="separator">...</span>
+        <span tal:repeat="b python:urls[cur - 4: cur + 3]">
+          <a tal:attributes="href b/href; class b/class" tal:content="b/num" />
+        </span>
+        <span class="separator">...</span>
+        <tal:block define="b python:urls[-1]">
+          <a tal:attributes="href b/href; class b/class" tal:content="b/num" />
+        </tal:block>
+      </tal:if>
+
+      <tal:if condition="python:cur >= total - 4">
+        <tal:block define="b python:urls[0]">
+          <a tal:attributes="href b/href; class b/class" tal:content="b/num" />
+        </tal:block>
+        <span class="separator">...</span>
+        <span tal:repeat="b python:urls[-8:]">
+          <a tal:attributes="href b/href; class b/class" tal:content="b/num" />
+        </span>
+      </tal:if>
+
+    </tal:if>
+
+    <tal:if condition="not:python:view.numBatches() > 11">
+      <span tal:repeat="b view/batch_urls">
+        <a tal:attributes="href b/href; class b/class" tal:content="b/num" />
+      </span>
+    </tal:if>
+  </tal:if>
+</div>


Property changes on: schooltool/branches/upstream/current/src/schooltool/table/templates/batch.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/table/templates/filter.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/table/templates/filter.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/table/templates/filter.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,8 @@
+<tal:block i18n:domain="schooltool">
+    <input type="text" name="SEARCH"
+           tal:attributes="value request/SEARCH|nothing"/>
+    <input type="submit" name="SEARCH_BUTTON" value="Find Now"
+           i18n:attributes="value"/>
+    <input type="submit" name="CLEAR_SEARCH" value="Clear"
+           i18n:attributes="value"/>
+</tal:block>


Property changes on: schooltool/branches/upstream/current/src/schooltool/table/templates/filter.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/table/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/table/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/table/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# this is a package


Property changes on: schooltool/branches/upstream/current/src/schooltool/table/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/table/tests/test_table.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/table/tests/test_table.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/table/tests/test_table.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,989 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Table tests
+
+$Id: test_table.py 6862 2007-04-16 11:36:27Z ignas $
+"""
+import unittest
+
+from zope.testing import doctest, doctestunit
+from zope.testing.doctestunit import pprint
+
+from zope.app.intid.interfaces import IIntIds
+from zope.component import provideUtility
+from zope.component import provideAdapter
+
+from schooltool.app.browser.testing import setUp, tearDown
+
+
+def doctest_FilterWidget():
+    """Doctest for FilterWidget.
+
+    Let's create the FilterWidget:
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> from schooltool.table.table import FilterWidget
+        >>> class ItemStub(object):
+        ...     def __init__(self, title):
+        ...         self.title = title
+        ...     def __repr__(self):
+        ...         return '<ItemStub %s>' % self.title
+        >>> container = map(ItemStub, ['alpha', 'beta', 'lambda'])
+        >>> request = TestRequest()
+        >>> widget = FilterWidget(container, request)
+
+    Rendering the widget returns whatever is returned by calling the template:
+
+        >>> widget.template = lambda : 'I am a rendered widget!'
+        >>> widget.render()
+        'I am a rendered widget!'
+
+    The state of the widget (whether it will filter the data or not)
+    is determined by checking whether there is a query parameter in
+    the request:
+
+        >>> widget.active()
+        False
+
+        >>> request.form = {'SEARCH': 'lamb'}
+        >>> widget.active()
+        True
+
+    The information that we got from the request can be appended to
+    the url:
+
+        >>> widget.extra_url()
+        '&SEARCH=lamb'
+
+    If there is no query in the request - an empty string get seturned:
+
+        >>> request.form = {}
+        >>> widget.extra_url()
+        ''
+
+    Filtering is done by skipping any entry that doesn't contain the
+    query string in it's title:
+
+        >>> request.form = {'SEARCH': 'lamb'}
+        >>> widget.filter(widget.context)
+        [<ItemStub lambda>]
+
+   The search is case insensitive:
+
+        >>> request.form = {'SEARCH': 'AlphA'}
+        >>> widget.filter(widget.context)
+        [<ItemStub alpha>]
+
+    If clear search button is clicked, the form attribute is cleared,
+    and all items are displayed:
+
+        >>> request.form['CLEAR_SEARCH'] = 'Yes'
+
+        >>> widget.filter(widget.context)
+        [<ItemStub alpha>, <ItemStub beta>, <ItemStub lambda>]
+        >>> request.form['SEARCH']
+        ''
+    """
+
+
+def doctest_IndexedFilterWidget():
+    """Doctest for IndexedFilterWidget.
+
+    First we need a container with a catalog associated with it:
+
+        >>> from zope.app.catalog.interfaces import ICatalog
+        >>> from zope.interface import implements
+        >>> class IndexStub(object):
+        ...     def __init__(self):
+        ...         self.documents_to_values = {}
+
+    Our catalog has an index for title attribute:
+
+        >>> class CatalogStub(dict):
+        ...     implements(ICatalog)
+        ...     def __init__(self):
+        ...         self['title'] = IndexStub()
+
+        >>> catalog = CatalogStub()
+
+        >>> class ContainerStub(object):
+        ...     def __conform__(self, iface):
+        ...         if iface == ICatalog:
+        ...             return catalog
+
+    Let's create the IndexedFilterWidget:
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> from schooltool.table.table import IndexedFilterWidget
+
+        >>> container = ContainerStub()
+        >>> request = TestRequest()
+        >>> widget = IndexedFilterWidget(container, request)
+
+    Indexed filter widgets do not get items themselves, as filtering
+    through normal object attributes would be just too slow, instead
+    they get dicts with item int ids in them. All the information used
+    for filtering is stored in the catalog associated with the context
+    container:
+
+        >>> catalog['title'].documents_to_values[5] = 'Lambda'
+        >>> catalog['title'].documents_to_values[6] = 'Alpha'
+        >>> catalog['title'].documents_to_values[7] = 'Beta'
+
+        >>> items = [{'id': 5}, {'id': 6}, {'id': 7}]
+        >>> request.form = {'SEARCH': 'lamb'}
+        >>> widget.filter(items)
+        [{'id': 5}]
+
+   The search is case insensitive:
+
+        >>> request.form = {'SEARCH': 'AlphA'}
+        >>> widget.filter(items)
+        [{'id': 6}]
+
+    If clear search button is clicked, the form attribute is cleared,
+    and all items are displayed:
+
+        >>> request.form['CLEAR_SEARCH'] = 'Yes'
+
+        >>> widget.filter(items)
+        [{'id': 5}, {'id': 6}, {'id': 7}]
+        >>> request.form['SEARCH']
+        ''
+
+    """
+
+
+def doctest_CheckboxColumn():
+    """Tests for CheckboxColumn.
+
+    Let's try creating a CheckboxColumn first:
+
+        >>> from schooltool.table.table import CheckboxColumn
+        >>> column = CheckboxColumn("prefix", "name", "title")
+        >>> column.title
+        'title'
+        >>> column.name
+        'name'
+        >>> column.prefix
+        'prefix'
+
+        >>> class ItemStub(object):
+        ...     __name__ = "itemStub"
+        >>> column.renderCell(ItemStub(), None)
+        '<input type="checkbox" name="prefix.itemStub" id="prefix.itemStub" />'
+
+    """
+
+
+def doctest_label_cell_formatter_factory():
+    """Tests for label_cell_formatter_factory.
+
+    Let's create a label formatter:
+
+        >>> from schooltool.table.table import label_cell_formatter_factory
+        >>> formatter = label_cell_formatter_factory()
+
+    And render it:
+
+        >>> class ItemStub(object):
+        ...     __name__ = "item_stub"
+
+        >>> formatter("Title of The Item", ItemStub(), "formatter")
+        '<label for="item_stub">Title of The Item</label>'
+
+    If we pass a prefix to the formatter factory, we get a label with
+    the prefix before the item id:
+
+        >>> formatter = label_cell_formatter_factory("some_prefix")
+        >>> formatter("Title of The Item", ItemStub(), "formatter")
+        '<label for="some_prefix.item_stub">Title of The Item</label>'
+
+    """
+
+
+def doctest_LocaleAwareGetterColumn():
+    """Tests for LocaleAwareGetterColumn.
+
+    Create a formatter with a request:
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> class FormatterStub(object):
+        ...     request = request
+        >>> formatter = FormatterStub()
+
+    Register collation adapter:
+
+        >>> from zope.i18n.interfaces.locales import ICollator
+        >>> from zope.i18n.interfaces.locales import ILocale
+        >>> from zope.interface import implements
+        >>> from zope.component import adapts
+        >>> class CollatorAdapterStub(object):
+        ...     implements(ICollator)
+        ...     adapts(ILocale)
+        ...     def __init__(self, context):
+        ...         self.context = context
+        ...     def key(self, string):
+        ...         return "CollatorKey(%s)" % string
+        >>> provideAdapter(CollatorAdapterStub)
+
+    Now when we try to get the sort key instead of getting the
+    attribute of the object, we will get a collator key:
+
+        >>> from schooltool.table.table import LocaleAwareGetterColumn
+        >>> lac = LocaleAwareGetterColumn()
+        >>> item = "Item"
+        >>> lac.getSortKey(item, formatter)
+        'CollatorKey(Item)'
+
+    """
+
+
+def doctest_IndexedGetterColumn():
+    """Tests for IndexedGetterColumn.
+
+    Indexed column requires an additional keyword argument (index)
+    for it's constructor:
+
+        >>> from schooltool.table.table import IndexedGetterColumn
+        >>> column = IndexedGetterColumn(index='title', getter=lambda i, f: i.title)
+        >>> column.index
+        'title'
+
+    Items used by this column are not ordinary objects, but rather
+    index dicts:
+
+
+        >>> class IndexStub(object):
+        ...     def __init__(self):
+        ...         self.documents_to_values = {}
+        >>> index = IndexStub()
+        >>> index.documents_to_values[5] = 'Peter'
+
+        >>> int_ids = {}
+        >>> class IntIdsStub(object):
+        ...     def getObject(self, id):
+        ...         return int_ids[id]
+        >>> from zope.component import provideUtility
+        >>> provideUtility(IntIdsStub(), IIntIds)
+
+        >>> catalog = {'title': index}
+        >>> item = {'id': 5,
+        ...         'catalog': catalog}
+
+    The key of the index is used when getting the sort key of the
+    column, so the only object touched is the index in the catalog,
+    the Peter object is not used when sorting in any way:
+
+        >>> column.getSortKey(item, None)
+        'Peter'
+
+    As we are rendering only a small set of items we are using the
+    real object for that, because indexed information used for
+    sorting/filtering might be different from the one that is being
+    displayed:
+
+        >>> class PersonStub(object):
+        ...     def __init__(self, title):
+        ...         self.title = title
+        >>> int_ids[5] = PersonStub('Mr. Peter')
+        >>> column.renderCell(item, None)
+        u'Mr. Peter'
+
+    """
+
+
+def doctest_IndexedLocaleAwareGetterColumn():
+    """Tests for IndexedLocaleAwareGetterColumn.
+
+    Create a formatter with a request:
+
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> class FormatterStub(object):
+        ...     request = request
+        >>> formatter = FormatterStub()
+
+    Register collation adapter:
+
+        >>> from zope.i18n.interfaces.locales import ICollator
+        >>> from zope.i18n.interfaces.locales import ILocale
+        >>> from zope.interface import implements
+        >>> from zope.component import adapts
+        >>> class CollatorAdapterStub(object):
+        ...     implements(ICollator)
+        ...     adapts(ILocale)
+        ...     def __init__(self, context):
+        ...         self.context = context
+        ...     def key(self, string):
+        ...         return "CollatorKey(%s)" % string
+        >>> provideAdapter(CollatorAdapterStub)
+
+    Indexed column requires an additional keyword argument (index)
+    for it's constructor:
+
+        >>> from schooltool.table.table import IndexedLocaleAwareGetterColumn
+        >>> column = IndexedLocaleAwareGetterColumn(index='title',
+        ...                                         getter=lambda i, f: i.title)
+        >>> column.index
+        'title'
+
+    Items used by this column are not ordinary objects, but rather
+    index dicts:
+
+        >>> class IndexStub(object):
+        ...     def __init__(self):
+        ...         self.documents_to_values = {}
+        >>> index = IndexStub()
+        >>> index.documents_to_values[5] = 'Peter'
+
+        >>> context = {}
+        >>> catalog = {'title': index}
+        >>> item = {'id': 5,
+        ...         'catalog': catalog}
+
+    The sort key for this column is not the title of the object, but
+    rather a collator key derived from the title:
+
+        >>> from schooltool.table.table import LocaleAwareGetterColumn
+        >>> column.getSortKey(item, formatter)
+        'CollatorKey(Peter)'
+
+    """
+
+
+def doctest_SchoolToolTableFormatter():
+    """Tests for SchoolToolTableFormatter.
+
+    First some set up so we could render actual tables:
+
+        >>> from zope.interface import Interface
+        >>> class ResourcePathStub(object):
+        ...     def __init__(self, context):
+        ...         pass
+        ...     def __call__(self):
+        ...         return ""
+        >>> provideAdapter(ResourcePathStub,
+        ...                adapts=[Interface],
+        ...                provides=Interface,
+        ...                name="zc.table")
+
+    A table formatter is meant to make rendering of tables more
+    standard and convenient. All you need to do is create a table
+    formatter, though usualy it is an adapter on the container and
+    request, but for the testing purposes we will create it directly:
+
+        >>> from schooltool.table.table import SchoolToolTableFormatter
+        >>> container = {}
+        >>> from zope.publisher.browser import TestRequest
+        >>> request = TestRequest()
+        >>> formatter = SchoolToolTableFormatter(container, request)
+
+        >>> from schooltool.table.interfaces import ITableFormatter
+        >>> from zope.interface.verify import verifyObject
+        >>> verifyObject(ITableFormatter, formatter)
+        True
+
+    Before rendering the table we must set it up, we will provide a
+    fake filter function so we would not have to set up FilterWidgets
+    yet:
+
+        >>> formatter.setUp()
+
+        >>> print formatter.render()
+        <BLANKLINE>
+        <table class="data">
+          <thead>
+            <tr>
+              <th>
+        <BLANKLINE>
+                    <span class="zc-table-sortable" ...>
+                        Title</span> <img src="/sort_arrows_down.gif" ... alt="(descending)"/>
+        <BLANKLINE>
+              </th>
+            </tr>
+          </thead>
+          <tbody>
+          </tbody>
+        </table>
+        <input type="hidden" name=".sort_on:tokens" id=".sort_on" value="title" />
+        <BLANKLINE>
+
+    The table has no items though, but these items are sorted by title
+    by default.
+
+
+    Lets add some items to play around with:
+
+        >>> class ItemStub(object):
+        ...     def __init__(self, title, email):
+        ...         self.title, self.email = title, email
+        ...         self.__name__ = self.title.lower()
+
+        >>> pete = container['pete'] = ItemStub('Pete', 'pete at example.com')
+        >>> john = container['john'] = ItemStub('John', 'john at example.com')
+        >>> toad = container['toad'] = ItemStub('Toad', 'toad at example.com')
+        >>> frog = container['frog'] = ItemStub('Frog', 'frog at example.com')
+
+    Now the table has all 4 of them:
+
+        >>> formatter.setUp()
+        >>> print formatter.render()
+        <BLANKLINE>
+        ...
+        <tbody>
+        <tr class="odd">
+          <td>
+            Frog
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            John
+          </td>
+        </tr>
+        <tr class="odd">
+          <td>
+            Pete
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            Toad
+          </td>
+        </tr>
+        </tbody>
+        ...
+
+    Lets provide a filter widget:
+
+        >>> from schooltool.table.interfaces import IFilterWidget
+        >>> from zope.interface import implements
+        >>> class FilterWidget(object):
+        ...     implements(IFilterWidget)
+        ...     def __init__(self, context, request):
+        ...         self.request = request
+        ...     def filter(self, list):
+        ...         if 'SEARCH' in self.request:
+        ...             return [item for item in list
+        ...                     if self.request['SEARCH'] in item.title.lower()]
+        ...         return list
+        ...     def extra_url(self):
+        ...         return "&search_info"
+
+        >>> from zope.interface import Interface
+        >>> from zope.publisher.interfaces.browser import IBrowserRequest
+        >>> provideAdapter(FilterWidget, adapts=[Interface, IBrowserRequest],
+        ...                              provides=IFilterWidget)
+
+    Now if we will put a SEARCH string into the request, we will only
+    get part of the items:
+
+        >>> request.form = {'SEARCH': 'o'}
+        >>> formatter.setUp()
+        >>> print formatter.render()
+        <BLANKLINE>
+        ...
+        <tbody>
+        <tr class="odd">
+          <td>
+            Frog
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            John
+          </td>
+        </tr>
+        <tr class="odd">
+          <td>
+            Toad
+          </td>
+        </tr>
+        </tbody>
+        ...
+
+    We can limit items that are being displayed ourselves as well:
+
+        >>> request.form = {}
+        >>> formatter.setUp(items=[frog, toad])
+        >>> print formatter.render()
+        <BLANKLINE>
+        ...
+        <tbody>
+        <tr class="odd">
+          <td>
+            Frog
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            Toad
+          </td>
+        </tr>
+        </tbody>
+        ...
+
+    We can provide custom columns to the formatter if we want:
+
+        >>> from zc.table.column import GetterColumn
+        >>> email = GetterColumn(name='email',
+        ...                      title=u"Email",
+        ...                      getter=lambda i, f: i.email,
+        ...                      subsort=True)
+        >>> from zope.interface import directlyProvides
+        >>> from zc.table.interfaces import ISortableColumn
+        >>> directlyProvides(email, ISortableColumn)
+        >>> formatter.setUp(columns=[email], sort_on=(("email", False),))
+        >>> print formatter.render()
+        <BLANKLINE>
+        ...
+        <tbody>
+        <tr class="odd">
+          <td>
+            frog at example.com
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            john at example.com
+          </td>
+        </tr>
+        <tr class="odd">
+          <td>
+            pete at example.com
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            toad at example.com
+          </td>
+        </tr>
+        </tbody>
+        ...
+
+    We could of course add the column after the title:
+
+        >>> formatter.setUp(columns_after=[email])
+        >>> print formatter.render()
+        <BLANKLINE>
+        ...
+        <tbody>
+        <tr class="odd">
+          <td>
+            Frog
+          </td>
+          <td>
+            frog at example.com
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            John
+          </td>
+          <td>
+            john at example.com
+          </td>
+        </tr>
+        <tr class="odd">
+          <td>
+            Pete
+          </td>
+          <td>
+            pete at example.com
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            Toad
+          </td>
+          <td>
+            toad at example.com
+          </td>
+        </tr>
+        </tbody>
+        ...
+
+    Now let's add a checkbox before the Title column:
+
+        >>> from schooltool.table.table import CheckboxColumn
+        >>> checkbox = CheckboxColumn("delete", "delete", "Delete")
+        >>> formatter.setUp(columns_before=[checkbox], columns_after=[email],
+        ...                 items=[frog, john])
+        >>> print formatter.render()
+        <BLANKLINE>
+        ...
+        <tbody>
+        <tr class="odd">
+          <td>
+            <input type="checkbox" name="delete.frog" id="delete.frog" />
+          </td>
+          <td>
+            Frog
+          </td>
+          <td>
+            frog at example.com
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            <input type="checkbox" name="delete.john" id="delete.john" />
+          </td>
+          <td>
+            John
+          </td>
+          <td>
+            john at example.com
+          </td>
+        </tr>
+        </tbody>
+        ...
+
+    We can pass custom formatters for the default columns if we want:
+
+        >>> from schooltool.table.table import label_cell_formatter_factory
+        >>> label_formatter = label_cell_formatter_factory("delete")
+        >>> formatter.setUp(columns_before=[checkbox], columns_after=[email],
+        ...                 items=[frog, john], formatters=[label_formatter])
+        >>> print formatter.render()
+        <BLANKLINE>
+        ...
+        <tbody>
+        <tr class="odd">
+          <td>
+            <input type="checkbox" name="delete.frog" id="delete.frog" />
+          </td>
+          <td>
+            <label for="delete.frog">Frog</label>
+          </td>
+          <td>
+            frog at example.com
+          </td>
+        </tr>
+        <tr class="even">
+          <td>
+            <input type="checkbox" name="delete.john" id="delete.john" />
+          </td>
+          <td>
+            <label for="delete.john">John</label>
+          </td>
+          <td>
+            john at example.com
+          </td>
+        </tr>
+        </tbody>
+        ...
+
+    We can alter the batch size and starting point through the request
+
+        >>> request.form = {'batch_start': '2',
+        ...                 'batch_size': '2'}
+        >>> formatter.setUp()
+        >>> print formatter.render()
+        <BLANKLINE>
+        <table class="data">
+          <thead>
+            <tr>
+              <th>
+        <BLANKLINE>
+                    <span class="zc-table-sortable" ...>
+                        Title</span> <img src="/sort_arrows_down.gif" ... alt="(descending)"/>
+        <BLANKLINE>
+              </th>
+            </tr>
+          </thead>
+          <tbody>
+          <tr class="odd">
+            <td>
+              Pete
+            </td>
+          </tr>
+          <tr class="even">
+            <td>
+              Toad
+            </td>
+          </tr>
+          </tbody>
+        </table>
+        <input type="hidden" name=".sort_on:tokens" id=".sort_on" value="title" />
+        <BLANKLINE>
+
+    """
+
+
+def doctest_IndexedTableFormatter_columns():
+    """Tests for IndexedTableFormatter.columns.
+
+    The default column for an indexed table formatter is an indexed
+    getter column set to display the title of objects:
+
+        >>> from schooltool.table.table import IndexedTableFormatter
+        >>> formatter = IndexedTableFormatter(None, None)
+        >>> columns = formatter.columns()
+        >>> columns
+        [<schooltool.table.table.IndexedGetterColumn object at ...>]
+
+        >>> columns[0].title
+        u'Title'
+        >>> columns[0].index
+        'title'
+
+    """
+
+
+def doctest_IndexedTableFormatter_items():
+    """Tests for IndexedTableFormatter.items.
+
+        >>> class IndexStub(object):
+        ...     def __init__(self):
+        ...         self.documents_to_values = {}
+        >>> index = IndexStub()
+
+        >>> from zope.app.catalog.interfaces import ICatalog
+        >>> from zope.interface import implements
+        >>> class CatalogStub(dict):
+        ...     implements(ICatalog)
+        ...     def __init__(self):
+        ...         self['__name__'] = index
+        ...     def __repr__(self):
+        ...         return '<Catalog>'
+        >>> catalog = CatalogStub()
+
+        >>> class ContainerStub(object):
+        ...     def __conform__(self, iface):
+        ...         if iface == ICatalog:
+        ...             return catalog
+        ...     def __repr__(self):
+        ...         return '<Container>'
+
+    The IndexedTableFormatter relies on catalog to list all the items
+    so if there are no indexed items we get an empty list:
+
+        >>> from schooltool.table.table import IndexedTableFormatter
+        >>> formatter = IndexedTableFormatter(ContainerStub(), None)
+        >>> formatter.items()
+        []
+
+    Let's index some objects:
+
+        >>> index.documents_to_values[1] = 'peter'
+        >>> index.documents_to_values[2] = 'john'
+        >>> index.documents_to_values[3] = 'ted'
+
+    Now we should get a list of index dicts:
+
+        >>> pprint(formatter.items())
+        [{'catalog': <Catalog>,
+          'id': 1},
+         {'catalog': <Catalog>,
+          'id': 2},
+         {'catalog': <Catalog>,
+          'id': 3}]
+
+    """
+
+
+def doctest_IndexedTableFormatter_indexItems():
+    """Tests for IndexedTableFormatter.indexItems.
+
+        >>> from zope.app.catalog.interfaces import ICatalog
+        >>> class ContainerStub(object):
+        ...     def __conform__(self, iface):
+        ...         if iface == ICatalog:
+        ...             return '<Catalog>'
+        ...     def __repr__(self):
+        ...         return '<Container>'
+        >>> from schooltool.table.table import IndexedTableFormatter
+        >>> formatter = IndexedTableFormatter(ContainerStub(), None)
+
+    The formatter has a function that converts a list of objects into
+    a list of index dicts that can be displayed by Indexed columns and
+    filtered by indexed filter widgets:
+
+        >>> class IntIdsStub(object):
+        ...     def getId(self, obj):
+        ...         return obj.id
+        >>> provideUtility(IntIdsStub(), IIntIds)
+
+        >>> class ItemStub(object):
+        ...     def __init__(self, name, id):
+        ...         self.__name__, self.id = name, id
+
+        >>> items = [ItemStub('pete', 1), ItemStub('john', 2)]
+        >>> pprint(formatter.indexItems(items))
+        [{'catalog': '<Catalog>',
+          'id': 1},
+         {'catalog': '<Catalog>',
+          'id': 2}]
+
+    """
+
+
+def doctest_IndexedTableFormatter_wrapColumn():
+    """Tests for IndexedTableFormatter.wrapColumn.
+
+        >>> from schooltool.table.table import IndexedTableFormatter
+        >>> formatter = IndexedTableFormatter(None, None)
+
+        >>> from zc.table.column import GetterColumn
+        >>> column = GetterColumn(getter=lambda i, f: i.title)
+
+    Normal columns accept objects and have a way of displaying the
+    relevant data. For example this getter column when it gets a
+    person passed will display its title:
+
+        >>> class PersonStub(object):
+        ...     def __init__(self, title):
+        ...         self.title = title
+
+        >>> item = PersonStub('Pete')
+        >>> column.renderCell(item, None)
+        u'Pete'
+
+    But as our indexed table formatter is manipulating index dicts, we
+    must wrap normal columns to use them on our data:
+
+        >>> int_ids = {}
+        >>> class IntIdsStub(object):
+        ...     def getObject(self, id):
+        ...         return int_ids[id]
+        >>> provideUtility(IntIdsStub(), IIntIds)
+
+        >>> int_ids[5] = item
+        >>> index_dict = {'id': 5}
+        >>> column = formatter.wrapColumn(column)
+        >>> column.renderCell(index_dict, None)
+        u'Pete'
+
+    Columns that implement ISortableColumn will get their getSortKey
+    wrapped as well:
+
+        >>> from zc.table.interfaces import ISortableColumn
+        >>> from zope.interface import directlyProvides
+        >>> column = GetterColumn(getter=lambda i, f: i.title)
+        >>> directlyProvides(column, ISortableColumn)
+
+        >>> column.getSortKey(item, None)
+        'Pete'
+
+        >>> column = formatter.wrapColumn(column)
+        >>> column.getSortKey(index_dict, None)
+        'Pete'
+
+    """
+
+
+def doctest_IndexedTableFormatter_wrapColumns():
+    """Tests for IndexedTableFormatter.wrapColumns.
+
+        >>> from schooltool.table.table import IndexedTableFormatter
+        >>> formatter = IndexedTableFormatter(None, None)
+        >>> formatter.wrapColumn = lambda column: "<Wrapped %s>" % column
+
+    Wrap columns function wraps all the columns that do not implement
+    IIndexedColumn and returns the new list of columns. If there were
+    no columns passed to it - you get an empty list:
+
+        >>> formatter.wrapColumns([])
+        []
+
+    Now let's pass it some real column stubs:
+
+        >>> from zope.interface import implements
+        >>> from schooltool.table.interfaces import IIndexedColumn
+        >>> class IndexedColumnStub(object):
+        ...     implements(IIndexedColumn)
+        ...     def __repr__(self):
+        ...         return "<IndexedColumn>"
+        >>> class NonIndexedColumnStub(object):
+        ...     def __repr__(self):
+        ...         return "<NonIndexedColumn>"
+
+    We are getting all our non-indexed columns wrapped:
+
+        >>> formatter.wrapColumns([IndexedColumnStub()])
+        [<IndexedColumn>]
+
+        >>> formatter.wrapColumns([IndexedColumnStub(), NonIndexedColumnStub()])
+        [<IndexedColumn>, '<Wrapped <NonIndexedColumn>>']
+
+    """
+
+
+def doctest_IndexedTableFormatter_setUp():
+    """Tests for IndexedTableFormatter.setUp.
+
+        >>> from schooltool.table.table import IndexedTableFormatter
+        >>> from zope.publisher.browser import TestRequest
+        >>> formatter = IndexedTableFormatter(None, TestRequest())
+
+    Our IndexedTableFormatter can only work with index dicts and
+    IndexedColumns, so before passing all the columns and items to the
+    constructor of the parent class we must process them:
+
+        >>> formatter.items = lambda: []
+        >>> formatter.ommit = lambda list, ommit: list
+        >>> formatter.wrapColumns = lambda list: list and list[:3] + ['wrapped'] + list[-1:] or []
+        >>> formatter.columns = lambda: ['A', 'list', 'of', 'columns']
+        >>> formatter.setUp()
+
+    If no keyword parameters were passed, only the columns returned by
+    the columns method get wrapped. We do this so that you could
+    inherit from IndexedTableFormatter and provide your own columns
+    method that has any columns you need (no performance penalty will
+    occur unless you try sorting on an unindexed column):
+
+        >>> formatter._columns
+        ['A', 'list', 'of', 'wrapped', 'columns']
+
+    If we have some after or before columns or if we pass some columns
+    to the setUp they will be wrapped too:
+
+        >>> formatter.wrapColumns = lambda list: list and ['<'] + list + ['>'] or []
+        >>> formatter.setUp(columns_before=['before'],
+        ...                 columns=['custom', 'columns'],
+        ...                 columns_after=['after'])
+        >>> formatter._columns
+        ['<', 'before', '>', '<', 'custom', 'columns', '>', '<', 'after', '>']
+
+        >>> formatter.indexItems = lambda list: ["Indexed %s" % item for item in list]
+
+    If we pass some items to the formatter, they should be converted
+    into index dicts:
+
+        >>> formatter.setUp(items=["Pete", "John"])
+        >>> formatter._items
+        ['Indexed Pete', 'Indexed John']
+
+    """
+
+
+def test_suite():
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF
+                   | doctest.REPORT_ONLY_FIRST_FAILURE
+                   | doctest.NORMALIZE_WHITESPACE)
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=optionflags))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/table/tests/test_table.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,419 @@
+=====================================
+Terms and SchoolTool Timeflow Control
+=====================================
+
+Terms are the primary objects to control timeflow in SchoolTool. In SchoolTool
+a term is defined as a time interval to organize academic school
+administration. Typical examples include the academic year, semester,
+trimester, and grading period, but not a break, school day or period.
+
+  >>> from schooltool.term import interfaces, term
+
+Term Types
+----------
+
+Term types are interfaces that describe the scope of the term. Those
+interfaces provide a meta-interface called ``ITermType``. An example of a
+term type is the academic year:
+
+  >>> interfaces.ITermType.providedBy(interfaces.IAcademicYear)
+  True
+
+The academic year is SchoolTool's largest term type. Each school *must*
+organize its program on an annual cycle.
+
+Years are typically divided into two semesters or three trimesters.
+
+  >>> interfaces.ITermType.providedBy(interfaces.ISemester)
+  True
+
+  >>> interfaces.ITermType.providedBy(interfaces.ITrimester)
+  True
+
+Within all of the term types above, some school systems define shorter grading
+periods:
+
+  >>> interfaces.ITermType.providedBy(interfaces.IGradingPeriod)
+  True
+
+
+Terms
+-----
+
+The term type interfaces are implemented by corresponding components known as
+terms. Terms must define a title, first and last date.
+
+The Academic Year
++++++++++++++++++
+
+Let's have a look at the academic year first:
+
+  >>> import datetime
+  >>> year = term.AcademicYear(
+  ...     u'2005/2006', datetime.date(2005, 8, 15), datetime.date(2006, 8, 14))
+
+  >>> year
+  AcademicYear
+
+  >>> year.title
+  u'2005/2006'
+  >>> year.first
+  datetime.date(2005, 8, 15)
+  >>> year.last
+  datetime.date(2006, 8, 14)
+
+The academic year implements the ``IAcademicYear`` term type interface:
+
+  >>> interfaces.IAcademicYear.providedBy(year)
+  True
+
+The term itself does not provide any other functionality. One extension of a
+term is to provide the ``IDateRange`` API:
+
+  >>> dates = interfaces.IDateRange(year)
+  >>> datetime.date(2005, 11, 11) in dates
+  True
+  >>> list(dates)
+  [datetime.date(2005, 8, 15), ..., datetime.date(2006, 8, 14)]
+
+__Note__: For a full demonstration of the ``IDateRange`` API see the
+          corresponding section below.
+
+The academic year component is also a container. Initially, there are no
+items:
+
+  >>> year.keys()
+  []
+
+The term containment describes the sub-terms of a term. In the case of the
+academic year, it can contain semesters and trimesters.
+
+  >>> fall = term.Semester(
+  ...     u'Fall 2005',
+  ...     datetime.date(2005, 8, 31), datetime.date(2005, 12, 21))
+  >>> year['fall'] = fall
+
+  >>> spring = term.Semester(
+  ...     u'Spring 2006',
+  ...     datetime.date(2006, 1, 12), datetime.date(2006, 5, 19))
+  >>> year['spring'] = spring
+
+Note that the semesters *must* have a date range within the date range of the
+academic year. If not, the addition fails:
+
+  >>> year['summer'] = term.Semester(
+  ...     u'Summer, 2006',
+  ...     datetime.date(2006, 5, 24), datetime.date(2006, 9, 1))
+  Traceback (most recent call last):
+  ...
+  ValueError: Date range outside of term.
+
+Also, only certain term types can be added to the academic year. For example,
+it makes no sense to add another academic year to the academic year itself:
+
+  >>> year['2006_2007'] = term.AcademicYear(
+  ...     u'2006/2007',
+  ...     datetime.date(2006, 5, 24), datetime.date(2005, 5, 25))
+  Traceback (most recent call last):
+  ...
+  ConstraintError:
+
+Semesters and Trimesters
+++++++++++++++++++++++++
+
+We already added some semesters to our academic year. But currently there is
+no telling (in the model) that the spring semester will come after the fall
+semester. This can be done by setting the next attribute of the term:
+
+  >>> fall.next = spring
+
+Note that you can only assign terms of the same term type:
+
+  >>> fall.next = year
+  Traceback (most recent call last):
+  ...
+  ValueError: Next term does not have the right term type.
+
+Also, the first term is marked using a flag:
+
+  >>> fall.isFirst = True
+
+Now, to complicate matters even further, some schools are on a semester *and*
+timester schedule. In those cases it will be necessary to create the trimester
+terms in parallel to the semesters:
+
+  >>> triFall = term.Trimester(
+  ...     u'Fall Trimester 2005',
+  ...     datetime.date(2005, 9, 1), datetime.date(2005, 11, 30))
+  >>> year['triFall'] = triFall
+  >>> triFall.isFirst = True
+
+  >>> triWinter = term.Trimester(
+  ...     u'Winter Trimester 2006',
+  ...     datetime.date(2005, 12, 1), datetime.date(2006, 2, 28))
+  >>> year['triWinter'] = triWinter
+  >>> triFall.next = triWinter
+
+  >>> triSpring = term.Trimester(
+  ...     u'Spring Trimester 2006',
+  ...     datetime.date(2006, 3, 1), datetime.date(2006, 5, 31))
+  >>> year['triSpring'] = triSpring
+  >>> triWinter.next = triSpring
+
+That's it. We now have parallel schedules for semesters and trimester.
+
+Grading Periods
++++++++++++++++
+
+In some middle schools, for example the US, grading periods are used to give
+parents frequently feedback about their childrens performance. In some schools
+the grading period is 2 weeks, in others 6 weeks. Let's create grading periods
+for the fall semester.
+
+  >>> period1 = term.GradingPeriod(
+  ...     u'Grading Period 1',
+  ...     datetime.date(2006, 9, 1), datetime.date(2006, 9, 30))
+  >>> fall['period1'] = period1
+  >>> period1.isFirst = True
+
+  >>> period2 = term.GradingPeriod(
+  ...     u'Grading Period 2',
+  ...     datetime.date(2006, 10, 1), datetime.date(2006, 10, 31))
+  >>> fall['period2'] = period2
+  >>> period1.next = period2
+
+  >>> period3 = term.GradingPeriod(
+  ...     u'Grading Period 3',
+  ...     datetime.date(2006, 11, 1), datetime.date(2006, 11, 30))
+  >>> fall['period3'] = period3
+  >>> period2.next = period3
+
+
+Controlling Timeflow
+--------------------
+
+From an organizational point of view, the primary task of the term hierarchy
+is to control the timeflow of the school and manage all time-driven
+maintanance tasks.
+
+  >>> control = interfaces.IEventControl(year)
+
+Using the event control component, one can dispatch an events. Those events
+must implement the ``ITermEvent`` interface:
+
+  >>> from schooltool.term import event
+  >>> yearSetup = event.SetUpTermEvent(year)
+
+  >>> interfaces.ITermEvent.providedBy(yearSetup)
+  True
+
+Before we can send off the event, let's register a subscriber that listens to
+all term events:
+
+  >>> def recordTermEvent(event):
+  ...     print event
+
+  >>> import zope.component
+  >>> zope.component.provideHandler(recordTermEvent, (interfaces.ITermEvent,))
+
+Now we can dispatch the event:
+
+  >>> control.dispatch(yearSetup)
+  SetUpTermEvent(<AcademicYear u'2005/2006'>)
+
+Once the event has been dispatched, it can be found in the term event log:
+
+  >>> control.eventLog
+  [SetUpTermEvent(<AcademicYear u'2005/2006'>)]
+
+Note that you *cannot* dispatch the same event twice in a term:
+
+  >>> control.dispatch(yearSetup)
+  Traceback (most recent call last):
+  ...
+  ValueError: Events can only be dispatched once.
+
+  >>> control.dispatch(event.SetUpTermEvent(year))
+  Traceback (most recent call last):
+  ...
+  ValueError: Events can only be dispatched once.
+
+  >>> class MySetUpTermEvent(event.SetUpTermEvent):
+  ...     pass
+  >>> control.dispatch(event.MySetUpTermEvent(year))
+  Traceback (most recent call last):
+  ...
+  ValueError: Events can only be dispatched once.
+
+Oftentimes creating the specific event is trivial. In those cases you simply
+need to provide the event interface to dispatch a term event. For this method
+to work, you have to setup an adapter from ``ITerm`` to the term event
+interface:
+
+  >>> zope.component.provideAdapter(event.BeginTermEvent)
+
+Now we can dispatch the event type:
+
+  >>> control.dispatchType(interfaces.IBeginTermEvent)
+  BeginTermEvent(<AcademicYear u'2005/2006'>)
+
+  >>> control.eventLog
+  [SetUpTermEvent(<AcademicYear u'2005/2006'>),
+   BeginTermEvent(<AcademicYear u'2005/2006'>)]
+
+Furthermore, you can check whether a particular type of event has been
+dispatched already:
+
+  >>> control.wasDispatched(yearSetup)
+  True
+
+  >>> control.wasTypeDispatched(interfaces.ISetUpTermEvent)
+  True
+  >>> control.wasTypeDispatched(interfaces.IBeginTermEvent)
+  True
+  >>> control.wasTypeDispatched(interfaces.IEndTermEvent)
+  False
+
+
+Events cannot be called at arbitrary times. For example, it does not make
+sense to start a term before having it setup. Those restrictions are
+implemented using subscriptions providing the ``ITermEventCondition``
+interface:
+
+  >>> def doNotStartBeforeSetup(event):
+  ...     control = interfaces.IEventControl(event.term)
+  ...     if not control.wasTypeDispatched(interfaces.ISetUpTermEvent):
+  ...         raise interfaces.TermEventConditionError(
+  ...             'Terms must be setup before they can be started.')
+
+  >>> zope.component.provideSubscriptionAdapter(
+  ...     doNotStartBeforeSetup,
+  ...     (interfaces.IBeginTermEvent,), interfaces.ITermEventCondition)
+
+Let's now try to call the startup event for our fall semester before the
+setup:
+
+  >>> interfaces.IEventControl(fall).dispatchType(interfaces.IBeginTermEvent)
+  Traceback (most recent call last):
+  ...
+  TermEventConditionError: Terms must be setup before they can be started.
+
+There is a set of standard events that SchoolTool provides:
+
+``SetUpTermEvent``
+
+  Begin with the setup of the term. This mainly means that the term is
+  available in the rest of the UI.
+
+``BeginTermEvent``
+
+  The term actually begins. It is the first day at which classes meet and all
+  services provided during the term are turned on.
+
+``EndTermEvent``
+
+  The term actually ends. It is the last day at which classes meet and all
+  services available during the term are turned off.
+
+``CloseTermEvent``
+
+  This event indicates the time after which data associated with the term
+  cannot be easily changed anymore. For example, grades cannot be submitted by
+  instructors anymore.
+
+``TearDownTermEvent``
+
+  Finish up any data management of the term. For example, archive any data
+  that is related to the term.
+
+SchoolTool provides term event conditions to enforce the order (as listed) of
+those events.
+
+Custom Events and Conditions
+++++++++++++++++++++++++++++
+
+Some schools will require more fine-grained events than the ones provided by
+SchoolTool. In those cases you can write your own term event. Let's say, for
+example, that you would like to send out a warning two weeks before the end of
+a semester:
+
+  >>> class ITwoWeekWarningEvent(interfaces.ITermEvent):
+  ...     '''The semester will be over in two weeks.'''
+
+  >>> import zope.interface
+  >>> class TwoWeekWarningEvent(event.TermEvent):
+  ...     zope.interface.implements(ITwoWeekWarning)
+
+Furthermore, you want to make sure that the warning gets sent out no earlier
+than two weeks before the end of the semester, so you also implement a
+condition:
+
+  >>> today = datetime.date(2005, 12, 6)
+  >>> def giveWarningInTime(event):
+  ...     if datetime.date.today() < event.term.last - datetime.timedelta(14):
+  ...         raise interfaces.TermEventConditionError(
+  ...             'The warning must be sent within two weeks '
+  ...             'of the end of the semester.')
+
+  >>> zope.component.provideSubscriptionAdapter(
+  ...     giveWarningInTime, (ITwoWeekWarning,), interfaces.ITermEventCondition)
+
+Let's now send out the warning:
+
+  >>> control = interfaces.IEventControl(fall)
+  >>> control.dispatch(TwoWeekWarningEvent(fall))
+  TwoWeekWarningEvent(<Semester u'Fall'>)
+
+Now, if the condition is not fulfilled, we get an error:
+
+  >>> del control.eventLog[-1]
+  >>> today = datetime.date(2005, 11, 31)
+
+  >>> control.dispatch(TwoWeekWarningEvent(fall))
+  Traceback (most recent call last):
+  ...
+  TermEventConditionError: The warning must be sent within two weeks ...
+
+
+The Term Type Vocabulary
+------------------------
+
+
+The Term Event Vocabulary
+-------------------------
+
+
+Setting Up the Year at FHS
+--------------------------
+
+* We need an efficient API for multiple evaluations. *
+
+* We need custom evaluation objects that keep track of the term and section being
+  assessed. *
+
+Each course has a set of special requirements -- these are requirements that
+will appear on the report cards & must be evaluated each semester or marking
+period.  These special requirements should know the appropriate score system
+needed to evaluate them.
+
+There are also specific sets of requirements that are applied at the end of
+the first and third marking periods that apply to every section ('completes
+homework,' etc).
+
+So, I would create a year, which wouldn't have any direct evaluations.  Create
+a fall semester and a spring semester, and indicate that for those terms
+teachers must evaluate the course's "special requirements" for each of those
+semesters.
+
+Then I would create two marking periods, covering the first half of each
+semester, and indicate that for each of these terms each section should be
+evaluated for the specific set of requirements described above.
+
+When I trigger the term's 'start' event, each section's subscriber picks up
+the event, and causes the section to ask the term what 'report requirements'
+it has, if any for that term.  Those events are added in a special category to
+the gradebook for the section.
+
+Requirements may need to be wrapped to prevent name duplication.
+
+When I set up a term, I indicate what info, if any is reported each term


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,44 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""SchoolTool terms package
+
+A term defines a range in time (e.g. September 1 to December 31, 2004) and for
+every day within that range it defines whether that day is a schoolday or a
+holiday.
+
+
+$Id: __init__.py 5780 2006-03-04 18:33:26Z srichter $
+"""
+
+def addToApplication(event):
+    from schooltool.term.term import TermContainer
+    event.object['terms'] = TermContainer()
+
+
+def registerTestSetup():
+    from schooltool.testing import registry
+
+    def addTermContainer(app):
+        from schooltool.term.term import TermContainer
+        app['terms'] = TermContainer()
+
+    registry.register('ApplicationContainers', addTermContainer)
+
+registerTestSetup()
+del registerTestSetup


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/browser"
+    xmlns:zope="http://namespaces.zope.org/zope"
+    i18n_domain="schooltool">
+
+  <configure package="schooltool.skin">
+
+    <page
+       name="index.html"
+       for="schooltool.term.interfaces.ITermContainer"
+       class="schooltool.term.browser.term.TermContainerView"
+       permission="schooltool.view"
+       menu="zmi_views"
+       title="View"
+       />
+
+  </configure>
+
+  <page
+      name="add.html"
+      for="..interfaces.ITermContainer"
+      class=".term.TermAddView"
+      template="term_add_edit.pt"
+      permission="schooltool.edit"
+      menu="schooltool_actions" title="New Term"
+      />
+
+  <configure package="schooltool.skin">
+    <navigationViewlet
+      name="terms"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.TopLevelContainerNavigationViewlet"
+      permission="schooltool.view"
+      link="terms"
+      title="Terms"
+      order="70"
+      />
+  </configure>
+
+  <page
+      name="index.html"
+      for="..interfaces.ITerm"
+      class=".term.TermView"
+      template="term.pt"
+      permission="schooltool.view"
+      menu="zmi_views" title="View"
+      />
+
+  <page
+      name="edit.html"
+      for="..interfaces.ITerm"
+      class=".term.TermEditView"
+      template="term_add_edit.pt"
+      permission="schooltool.edit"
+      menu="schooltool_actions" title="Edit"
+      />
+
+  <page
+      name="emergency.html"
+      for="..interfaces.ITerm"
+      class=".emergency.EmergencyDayView"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Cancel School in Emergency"
+      />
+
+  <zope:adapter
+      for="schooltool.term.interfaces.ITermContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory="schooltool.table.table.FilterWidget" />
+
+  <zope:adapter
+      for="schooltool.term.interfaces.ITermContainer
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      factory="schooltool.table.table.SchoolToolTableFormatter " />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/emergency.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/emergency.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/emergency.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,147 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Emergency Day Views
+
+$Id: emergency.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+import datetime
+
+from zope.i18n import translate
+from zope.security.proxy import removeSecurityProxy
+from zope.app import zapi
+from zope.publisher.browser import BrowserView
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+
+from schooltool import SchoolToolMessage as _
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.cal import CalendarEvent
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.calendar.utils import parse_date
+from schooltool.term.interfaces import ITerm
+from schooltool.timetable import SchooldayTemplate
+
+
+class EmergencyDayView(BrowserView):
+    """On emergencies such as extreme temperetures, blizzards, etc,
+    school is cancelled, and a different day gets added to the term
+    instead.
+
+    This view lets the administrator choose the cancelled date and
+    presents the user with a choice of non-schooldays within a term
+    and the days immediately after the term.
+    """
+
+    __used_for__ = ITerm
+
+    template = None
+    date_template = ViewPageTemplateFile('emergency_select.pt')
+    replacement_template = ViewPageTemplateFile('emergency2.pt')
+
+    error = None
+    date = None
+    replacement = None
+
+    def replacements(self):
+        """Return all non-schooldays in term plus 3 days after the term."""
+        result = []
+        for date in self.context:
+            if date > self.date:
+                if not self.context.isSchoolday(date):
+                    result.append(date)
+        last = self.context.last
+        day = datetime.timedelta(1)
+        result.append(last + day)
+        result.append(last + 2 * day)
+        result.append(last + 3 * day)
+        return result
+
+    def update(self):
+        self.template = self.date_template
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(
+                zapi.absoluteURL(self.context, self.request))
+            return
+        if 'date' in self.request:
+            try:
+                self.date = parse_date(self.request['date'])
+            except ValueError:
+                self.error = _("The date you entered is invalid."
+                               "  Please use the YYYY-MM-DD format.")
+                return
+            if not self.date in self.context:
+                self.error = _("The date you entered does not belong to"
+                               " this term.")
+                return
+            if not self.context.isSchoolday(self.date):
+                self.error = _("The date you entered is not a schoolday.")
+                return
+
+            self.template = self.replacement_template
+        if 'replacement' in self.request:
+            try:
+                self.replacement = parse_date(self.request['replacement'])
+            except ValueError:
+                self.error = _("The replacement date you entered is invalid.")
+                return
+
+        if self.date and self.replacement:
+            if self.context.last < self.replacement:
+                self.context.last = self.replacement
+            assert not self.context.isSchoolday(self.replacement)
+            assert self.context.isSchoolday(self.date)
+            self.context.add(self.replacement)
+
+            # Update all schemas
+            ttschemas = getSchoolToolApplication()['ttschemas']
+            for schema in ttschemas.values():
+                model = schema.model
+                exceptionDays = removeSecurityProxy(model.exceptionDays)
+                exceptionDayIds = removeSecurityProxy(model.exceptionDayIds)
+                exceptionDays[self.date] = SchooldayTemplate()
+                day_id = model.getDayId(self.context, self.date)
+                exceptionDayIds[self.replacement] = removeSecurityProxy(day_id)
+
+            # Post calendar events to schoolwide calendar
+            calendar = ISchoolToolCalendar(getSchoolToolApplication())
+            dtstart = datetime.datetime.combine(self.date, datetime.time())
+            msg = _('School cancelled due to emergency.'
+                    ' Replacement day $replacement.',
+                    mapping={'replacement': str(self.replacement)})
+            msg = translate(msg, context=self.request)
+            calendar.addEvent(
+                CalendarEvent(dtstart, datetime.timedelta(),
+                              msg, allday=True))
+
+            dtstart = datetime.datetime.combine(self.replacement,
+                                                datetime.time())
+            msg = _('Replacement day for emergency day $emergency.',
+                    mapping={'emergency': str(self.date)})
+            msg = translate(msg, context=self.request)
+            calendar.addEvent(
+                CalendarEvent(dtstart, datetime.timedelta(),
+                              msg, allday=True))
+
+            self.request.response.redirect(
+                zapi.absoluteURL(self.context, self.request))
+
+
+
+    def __call__(self):
+        self.update()
+        return self.template()


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/emergency.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/emergency2.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/emergency2.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/emergency2.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,51 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Emergency day</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">
+    Choose a replacement for the emergency day.
+  </h1>
+<metal:block metal:fill-slot="body">
+
+<p i18n:translate="">
+You have selected <span tal:replace="view/date"/> as the emergency
+day.  Now please select the replacement day.  The selection below
+consists of non-schooldays in this term following the emergency day
+and several days after the term.
+</p>
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <div class="error"
+       tal:content="view/error"
+       tal:condition="view/error"
+       i18n:translate=""
+       />
+
+   <input type="hidden" name="date" tal:attributes="value view/date" />
+
+  <p i18n:translate="">
+    Please enter the replacement date below.
+  </p>
+
+  <div class="row">
+    <label for="replacement" i18n:translate="">Replacement</label>
+    <select id="replacement" name="replacement">
+      <option tal:repeat="date view/replacements"
+              tal:content="date"/>
+    </select>
+  </div>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="SUBMIT" value="Proceed"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value cancel-button" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/emergency2.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/emergency_select.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/emergency_select.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/emergency_select.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,50 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Emergency day</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">
+    Emergency day
+  </h1>
+<metal:block metal:fill-slot="body">
+
+<p i18n:translate="">
+This form allows you to mark a date as an emergency non-schoolday and
+add a replacement day to the term.
+</p>
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <div class="error"
+       tal:content="view/error"
+       tal:condition="view/error"
+       i18n:translate=""
+       />
+
+  <p i18n:translate="">
+    Please enter the emergency date below.
+  </p>
+
+  <div class="row">
+    <label for="date" i18n:translate="">Date</label>
+    <input type="text" name="date" id="date"
+           tal:attributes="value request/date|nothing"/>
+    <img class="CalIcon" onClick="clickWidgetIcon('date');" id="dateIcon"
+         alt="[popup calendar]" i18n:attributes="alt"
+         tal:attributes="src context/++resource++calwidget-icon.gif"/>
+    <div id="dateDiv"
+         style="background: #fff; position: absolute; display: none;"/>
+  </div>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="CHOOSE" value="Proceed"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value cancel-button" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/emergency_select.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/emergencydays.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/emergencydays.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/emergencydays.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,325 @@
+==============
+Emergency Days
+==============
+
+Set up
+------
+
+    >>> from schooltool.testing import setup as sbsetup
+    >>> sbsetup.setUpCalendaring()
+    >>> sbsetup.setUpApplicationPreferences()
+
+First of all, we need an app object:
+
+    >>> app = sbsetup.setUpSchoolToolSite()
+
+We have a timetable schema to put the view on:
+
+    >>> from schooltool.timetable.browser import SpecialDayView
+    >>> ttschema = createSchema(['Day 1', 'Day 2'],
+    ...                         ['First',
+    ...                          'Second',
+    ...                          'Third',
+    ...                          'Fourth'],
+    ...                         ['First',
+    ...                          'Second',
+    ...                          'Third',
+    ...                          'Fourth'])
+    >>> app['ttschemas']['usual'] = ttschema
+    >>> ttschema1 = createSchema(['Day 1', 'Day 2', 'Day 3'],
+    ...                          ['First', 'Second', 'Third', 'Fourth'],
+    ...                          ['First', 'Second', 'Third', 'Fourth'],
+    ...                          ['First', 'Second', 'Third', 'Fourth'])
+    >>> app['ttschemas']['unusual'] = ttschema1
+
+The schemas have a model attribute:
+
+    >>> from schooltool.timetable import SequentialDaysTimetableModel
+    >>> default = createDayTemplate([(9, 0, 45),
+    ...                              (10, 0, 45),
+    ...                              (11, 0, 45),
+    ...                              (12, 0, 45)])
+    >>> ttschema.model = SequentialDaysTimetableModel(['Day 1', 'Day 2'],
+    ...                                               {None: default})
+    >>> ttschema1.model = SequentialDaysTimetableModel(
+    ...     ['Day 1', 'Day 2', 'Day 3'],
+    ...     {None: default})
+
+We will need a term:
+
+    >>> import datetime
+    >>> from schooltool.term.term import Term
+    >>> term = Term('2005 summer',
+    ...             datetime.date(2005, 6, 1),
+    ...             datetime.date(2005, 8, 31))
+    >>> app["terms"]["2005-summer"] = term
+    >>> term.addWeekdays(0, 1, 2, 3, 4, 5)
+
+Now we can create the view:
+
+    >>> from zope.publisher.browser import TestRequest
+    >>> request = TestRequest()
+    >>> from schooltool.term.browser.emergency import EmergencyDayView
+    >>> view = EmergencyDayView(term, request)
+    >>> print view()
+    <BLANKLINE>
+    ...
+    <p>
+    This form allows you to mark a date as an emergency non-schoolday and
+    add a replacement day to the term.
+    </p>
+    ...
+      <div class="row">
+        <label for="date">Date</label>
+        <input type="text" name="date" id="date" />
+        <img class="CalIcon" onclick="clickWidgetIcon('date');"
+             id="dateIcon" alt="[popup calendar]"
+             src="a dummy resource" />
+        <div id="dateDiv" style="background: #fff; position: absolute; display: none;" />
+      </div>
+    <BLANKLINE>
+      <div class="controls">
+        <input type="submit" class="button-ok" name="CHOOSE"
+               value="Proceed" />
+        <input type="submit" class="button-cancel" name="CANCEL"
+               value="Cancel" />
+      </div>
+    ...
+
+When we enter the emergency date, we get to choose the replacement day:
+
+    >>> request = TestRequest(form={'date': '2005-07-07'})
+    >>> view = EmergencyDayView(term, request)
+    >>> view.update()
+    >>> view.date
+    datetime.date(2005, 7, 7)
+
+The view now can offer a choice of replacements after this day.  These will be
+all non-schooldays in the term and 3 days after the term:
+
+    >>> view.replacements()
+    [datetime.date(2005, 7, 10),
+     datetime.date(2005, 7, 17),
+     datetime.date(2005, 7, 24),
+     datetime.date(2005, 7, 31),
+     datetime.date(2005, 8, 7),
+     datetime.date(2005, 8, 14),
+     datetime.date(2005, 8, 21),
+     datetime.date(2005, 8, 28),
+     datetime.date(2005, 9, 1),
+     datetime.date(2005, 9, 2),
+     datetime.date(2005, 9, 3)]
+
+
+The page presented next contains a selection of these dates:
+
+    >>> print view()
+    <BLANKLINE>
+    ...
+      <input type="hidden" name="date" value="2005-07-07" />
+    ...
+      <div class="row">
+        <label for="replacement">Replacement</label>
+        <select id="replacement" name="replacement">
+          <option>2005-07-10</option>
+          <option>2005-07-17</option>
+          <option>2005-07-24</option>
+          <option>2005-07-31</option>
+          <option>2005-08-07</option>
+          <option>2005-08-14</option>
+          <option>2005-08-21</option>
+          <option>2005-08-28</option>
+          <option>2005-09-01</option>
+          <option>2005-09-02</option>
+          <option>2005-09-03</option>
+        </select>
+      </div>
+      ...
+
+The original day ids of the emergency day were:
+
+     >>> def getDayId(date, ttschema):
+     ...     return ttschema.model._periodsInDay(term, ttschema, date)[0]
+     >>> getDayId(datetime.date(2005, 7, 7), ttschema)
+     'Day 2'
+     >>> getDayId(datetime.date(2005, 7, 7), ttschema1)
+     'Day 2'
+
+The ids of some other days before and after the planned replacement day:
+
+     >>> getDayId(datetime.date(2005, 7, 8), ttschema)
+     'Day 1'
+     >>> getDayId(datetime.date(2005, 7, 11), ttschema)
+     'Day 1'
+
+     >>> getDayId(datetime.date(2005, 7, 8), ttschema1)
+     'Day 3'
+     >>> getDayId(datetime.date(2005, 7, 11), ttschema1)
+     'Day 2'
+
+If the user selects a replacement day and calls the view, several things
+happen:
+
+    >>> request = TestRequest(form={'date': '2005-07-07',
+    ...                             'replacement': '2005-07-10'})
+    >>> view = EmergencyDayView(term, request)
+    >>> result = view()
+    >>> view.date
+    datetime.date(2005, 7, 7)
+    >>> view.replacement
+    datetime.date(2005, 7, 10)
+
+The user gets redirected:
+
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('location')
+    'http://127.0.0.1/terms/2005-summer'
+
+The replacement day gets added to the calendar, and the emergency day gets an
+empty day template:
+
+    >>> term.isSchoolday(datetime.date(2005, 7, 10))
+    True
+    >>> term.isSchoolday(datetime.date(2005, 7, 7))
+    True
+    >>> ttschema.model.periodsInDay(term, ttschema,
+    ...                             datetime.date(2005, 7, 7))
+    []
+    >>> ttschema1.model.periodsInDay(term, ttschema1,
+    ...                              datetime.date(2005, 7, 7))
+    []
+
+The day id of the replacement day is the same as that of the emergency day:
+
+     >>> getDayId(datetime.date(2005, 7, 7), ttschema)
+     'Day 2'
+     >>> getDayId(datetime.date(2005, 7, 7), ttschema1)
+     'Day 2'
+
+Day ids of the days before and after the replacement day are unchanged:
+
+     >>> getDayId(datetime.date(2005, 7, 8), ttschema)
+     'Day 1'
+     >>> getDayId(datetime.date(2005, 7, 11), ttschema)
+     'Day 1'
+
+     >>> getDayId(datetime.date(2005, 7, 8), ttschema1)
+     'Day 3'
+     >>> getDayId(datetime.date(2005, 7, 11), ttschema1)
+     'Day 2'
+
+All day events get posted to the schoolwide calendar on both days, notifying
+of the shift:
+
+    >>> from schooltool.app.app import getSchoolToolApplication
+    >>> from schooltool.app.interfaces import ISchoolToolCalendar
+    >>> cal = ISchoolToolCalendar(getSchoolToolApplication())
+    >>> events = list(cal)
+    >>> events.sort()
+    >>> for event in events:
+    ...     print event.dtstart
+    ...     print event.title
+    2005-07-07 00:00:00+00:00
+    School cancelled due to emergency. Replacement day 2005-07-10.
+    2005-07-10 00:00:00+00:00
+    Replacement day for emergency day 2005-07-07.
+
+When the replacement day is outside the term, the end date of the term gets
+adjusted:
+
+    >>> request = TestRequest(form={'date': '2005-07-08',
+    ...                             'replacement': '2005-09-03'})
+    >>> view = EmergencyDayView(term, request)
+    >>> result = view()
+    >>> getDayId(datetime.date(2005, 9, 3), ttschema)
+    'Day 1'
+    >>> getDayId(datetime.date(2005, 9, 3), ttschema1)
+    'Day 3'
+    >>> term.last
+    datetime.date(2005, 9, 3)
+
+The days that might have been implicitly added to the term (might have been a
+weekend) are not marked as schooldays:
+
+    >>> term.isSchoolday(datetime.date(2005, 9, 1))
+    False
+    >>> term.isSchoolday(datetime.date(2005, 9, 2))
+    False
+    >>> term.isSchoolday(datetime.date(2005, 9, 3))
+    True
+
+
+Cancel
+------
+
+If the cancel button is pressed, nothing is changed, and the user is
+redirected:
+
+    >>> request = TestRequest(form={'date': '2005-07-09',
+    ...                             'replacement': '2005-09-04',
+    ...                             'CANCEL': 'Cancel'})
+    >>> view = EmergencyDayView(term, request)
+    >>> result = view()
+    >>> ttschema.model.periodsInDay(term, ttschema,
+    ...                             datetime.date(2005, 7, 9))
+    [('First', datetime.time(9, 0), datetime.timedelta(0, 2700)),
+    ('Second', datetime.time(10, 0), datetime.timedelta(0, 2700)),
+    ('Third', datetime.time(11, 0), datetime.timedelta(0, 2700)),
+    ('Fourth', datetime.time(12, 0), datetime.timedelta(0, 2700))]
+
+    >>> term.last
+    datetime.date(2005, 9, 3)
+
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('location')
+    'http://127.0.0.1/terms/2005-summer'
+
+
+Errors
+------
+
+If date is invalid, the user sees a nice error:
+
+    >>> request = TestRequest(form={'date': '07/09/05'})
+    >>> view = EmergencyDayView(term, request)
+    >>> print view()
+    <BLANKLINE>
+    ...
+    <div class="error">The date you entered is invalid.
+       Please use the YYYY-MM-DD format.</div>
+    ...
+
+
+If the date is not in term, the user sees the appropriate message:
+
+    >>> request = TestRequest(form={'date': '1999-12-31'})
+    >>> view = EmergencyDayView(term, request)
+    >>> print view()
+    <BLANKLINE>
+    ...
+    <div class="error">The date you entered does not belong
+    to this term.</div>
+    ...
+
+If the date is not a schoolday, we tell that:
+
+    >>> request = TestRequest(form={'date': '2005-07-17'})
+    >>> view = EmergencyDayView(term, request)
+    >>> print view()
+    <BLANKLINE>
+    ...
+    <div class="error">The date you entered is not a schoolday.</div>
+    ...
+
+If replacement is invalid, the user gets to enter it again:
+
+    >>> request = TestRequest(form={'date': '2005-07-19',
+    ...                             'replacement': 'whatever'})
+    >>> view = EmergencyDayView(term, request)
+    >>> print view()
+    <BLANKLINE>
+    ...
+    <div class="error">The replacement date you entered is invalid.</div>
+    ...


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/emergencydays.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/term-container-delete.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/term-container-delete.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/term-container-delete.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,38 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title">
+    Delete Terms
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header" i18n:translate="">
+  Are you sure you want to delete the selected terms?
+</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="objects view/itemsToDelete">
+  <p tal:condition="not:objects" i18n:translate="">You have not
+  selected any items.</p>
+  <ul tal:condition="objects">
+    <form method="post"
+          action="delete.html">
+      <li tal:repeat="obj objects/sortby:title">
+        <input type="hidden" tal:attributes="name string:delete.${obj/zope:name}" />
+        <a tal:content="obj/title" tal:attributes="href
+        obj/@@absolute_url">Title</a>. This term is used
+        by <span tal:replace="python:len(view.timetables(obj))"/>
+        individual timetables.
+      </li>
+      <div class="controls">
+        <input type="submit" class="button-cancel" name="CONFIRM" value="Confirm"
+               i18n:attributes="value delete-button;" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+      </div>
+    </form>
+  </ul>
+
+</metal:block>
+</body></html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/term-container-delete.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/term.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/term.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/term.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,54 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" tal:content="context/title">Term</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" tal:content="context/title">Term</h1>
+
+<metal:block metal:fill-slot="body">
+
+  <table id="legend" class="schooldaymodel">
+    <tr class="legend">
+      <td class="legend" i18n:translate="">Legend:</td>
+      <td width="12%" class="schoolday" i18n:translate="">Schoolday</td>
+      <td width="12%" class="holiday" i18n:translate="">Holiday</td>
+      <td width="12%"></td>
+      <td width="12%"></td>
+      <td width="12%"></td>
+      <td width="12%"></td>
+      <td width="12%"></td>
+    </tr>
+  </table>
+
+  <table class="schooldaymodel" tal:repeat="month view/calendar">
+    <tr>
+      <th class="month" colspan="8" i18n:translate="">
+        <span tal:replace="month/month" i18n:name="month" i18n:translate="" /> <span tal:replace="month/year" i18n:name="year" />
+      </th>
+    </tr>
+    <tr>
+      <th class="day"></th>
+      <th class="day" width="12%" i18n:translate="">Monday</th>
+      <th class="day" width="12%" i18n:translate="">Tuesday</th>
+      <th class="day" width="12%" i18n:translate="">Wednesday</th>
+      <th class="day" width="12%" i18n:translate="">Thursday</th>
+      <th class="day" width="12%" i18n:translate="">Friday</th>
+      <th class="day" width="12%" i18n:translate="">Saturday</th>
+      <th class="day" width="12%" i18n:translate="">Sunday</th>
+    </tr>
+    <tr tal:repeat="week month/weeks">
+      <th class="week" i18n:translate="">
+        Week <span tal:replace="week/number" i18n:name="week_number" />
+      </th>
+      <td tal:repeat="day week/days"
+          tal:attributes="class day/class">
+        <label tal:condition="day/number">
+          <span tal:replace="day/number">N</span>
+        </label>
+      </td>
+    </tr>
+  </table>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/term.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/term.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/term.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/term.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,322 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetabling Term views.
+
+$Id: term.py 6602 2007-01-26 13:17:25Z ignas $
+"""
+import datetime
+import itertools
+
+from zope.interface import Interface
+from zope.schema import TextLine, Date
+
+from zope.app import zapi
+from zope.app.container.interfaces import INameChooser
+from zope.lifecycleevent import modified
+from zope.app.form.browser.add import AddView
+from zope.app.form.browser.submit import Update
+from zope.app.form.interfaces import WidgetsError
+from zope.app.form.utility import getWidgetsData
+from zope.app.form.utility import setUpEditWidgets
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.publisher.browser import BrowserView
+
+from schooltool.skin.containers import TableContainerView
+from schooltool.app.browser.cal import month_names
+from schooltool.calendar.utils import parse_date
+from schooltool.calendar.utils import next_month, week_start
+from schooltool.timetable import findRelatedTimetables
+from schooltool.term.interfaces import ITermContainer, ITerm
+from schooltool.term.term import Term
+
+from schooltool import SchoolToolMessage as _
+
+
+class TermContainerView(TableContainerView):
+    """Term container view."""
+    # XXX ftest deletion!
+
+    __used_for__ = ITermContainer
+
+    delete_template = ViewPageTemplateFile("term-container-delete.pt")
+
+    index_title = _("Terms")
+
+    def timetables(self, obj):
+        return findRelatedTimetables(obj)
+
+    def update(self):
+        if 'CONFIRM' in self.request:
+            for key in self.listIdsForDeletion():
+                for tt in findRelatedTimetables(self.context[key]):
+                    ttdict = getParent(tt)
+                    del ttdict[getName(tt)]
+                del self.context[key]
+
+
+class ITermForm(Interface):
+    """Form schema for ITerm add/edit views."""
+
+    title = TextLine(title=_("Title"))
+
+    first = Date(title=_("Start date"))
+
+    last = Date(title=_("End date"))
+
+
+class TermView(BrowserView):
+    """Browser view for terms."""
+
+    __used_for__ = ITerm
+
+    def calendar(self):
+        """Prepare the calendar for display.
+
+        Returns a structure composed of lists and dicts, see `TermRenderer`
+        for more details.
+        """
+        return TermRenderer(self.context).calendar()
+
+
+class TermEditViewMixin(object):
+    """Mixin for Term add/edit views."""
+
+    def _buildTerm(self):
+        """Build a Term object from form values.
+
+        Returns None if the form doesn't contain enough information.
+        """
+        try:
+            data = getWidgetsData(self, ITermForm)
+        except WidgetsError:
+            return None
+        try:
+            term = Term(data['title'], data['first'], data['last'])
+        except ValueError:
+            return None # date range invalid
+        term.addWeekdays(0, 1, 2, 3, 4, 5, 6)
+        holidays = self.request.form.get('holiday', [])
+        if not isinstance(holidays, list):
+            holidays = [holidays]
+        for holiday in holidays:
+            try:
+                term.remove(parse_date(holiday))
+            except ValueError:
+                pass # ignore ill-formed or out-of-range dates
+        toggle = [n for n in range(7) if ('TOGGLE_%d' % n) in self.request]
+        if toggle:
+            term.toggleWeekdays(*toggle)
+        return term
+
+
+class TermEditView(BrowserView, TermEditViewMixin):
+    """Edit view for terms."""
+
+    __used_for__ = ITerm
+
+    creating = False
+
+    update_status = None
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+        setUpEditWidgets(self, ITermForm)
+
+    def title(self):
+        title = _("Change Term: $title",
+                  mapping={'title': self.context.title})
+        return title
+
+    def update(self):
+        if self.update_status is not None:
+            return self.update_status # We've been called before.
+        self.update_status = ''
+        self.term = self._buildTerm()
+        if self.term is None:
+            self.term = self.context
+        elif Update in self.request:
+            self.context.reset(self.term.first, self.term.last)
+            for day in self.term:
+                if self.term.isSchoolday(day):
+                    self.context.add(day)
+            modified(self.context)
+            self.update_status = _("Saved changes.")
+        return self.update_status
+
+    def calendar(self):
+        """Prepare the calendar for display.
+
+        Returns a structure composed of lists and dicts, see `TermRenderer`
+        for more details.
+        """
+        return TermRenderer(self.term).calendar()
+
+
+class TermAddView(AddView, TermEditViewMixin):
+    """Adding view for terms."""
+
+    __used_for__ = ITermContainer
+
+    creating = True
+
+    title = _("New term")
+
+    # Since this view is registered via <browser:page>, and not via
+    # <browser:addform>, we need to set up some attributes for AddView.
+    schema = ITermForm
+    _arguments = ()
+    _keyword_arguments = ()
+    _set_before_add = ()
+    _set_after_add = ()
+
+    def update(self):
+        """Process the form."""
+        self.term = self._buildTerm()
+        return AddView.update(self)
+
+    def create(self):
+        """Create the object to be added.
+
+        We already have it, actually -- unless there was an error in the form.
+        """
+        if self.term is None:
+            raise WidgetsError([])
+        return self.term
+
+    def add(self, content):
+        """Add the object to the term container."""
+        chooser = INameChooser(self.context)
+        name = chooser.chooseName(None, content)
+        self.context[name] = content
+
+    def nextURL(self):
+        """Return the location to visit once the term's been added."""
+        return zapi.absoluteURL(self.context, self.request)
+
+    def calendar(self):
+        """Prepare the calendar for display.
+
+        Returns None if the form doesn't contain enough information.  Otherwise
+        returns a structure composed of lists and dicts (see `TermRenderer`
+        for more details).
+        """
+        if self.term is None:
+            return None
+        return TermRenderer(self.term).calendar()
+
+
+class TermRenderer(object):
+    """Helper for rendering ITerms."""
+
+    first_day_of_week = 0 # Monday  TODO: get from IPersonPreferences
+
+    def __init__(self, term):
+        self.term = term
+
+    def calendar(self):
+        """Prepare the calendar for display.
+
+        Returns a list of month dicts (see `month`).
+        """
+        calendar = []
+        date = self.term.first
+        counter = itertools.count(1)
+        while date <= self.term.last:
+            start_of_next_month = next_month(date)
+            end_of_this_month = start_of_next_month - datetime.date.resolution
+            maxdate = min(self.term.last, end_of_this_month)
+            calendar.append(self.month(date, maxdate, counter))
+            date = start_of_next_month
+        return calendar
+
+    def month(self, mindate, maxdate, counter):
+        """Prepare one month for display.
+
+        Returns a dict with these keys:
+
+            month   -- title of the month
+            year    -- the year number
+            weeks   -- a list of week dicts in this month (see `week`)
+
+        """
+        assert (mindate.year, mindate.month) == (maxdate.year, maxdate.month)
+        weeks = []
+        date = week_start(mindate, self.first_day_of_week)
+        while date <= maxdate:
+            weeks.append(self.week(date, mindate, maxdate, counter))
+            date += datetime.timedelta(days=7)
+        return {'month': month_names[mindate.month],
+                'year': mindate.year,
+                'weeks': weeks}
+
+    def week(self, start_of_week, mindate, maxdate, counter):
+        """Prepare one week of a Term for display.
+
+        `start_of_week` is the date when the week starts.
+
+        `mindate` and `maxdate` are used to indicate which month (or part of
+        the month) interests us -- days in this week that fall outside
+        [mindate, maxdate] result in a dict containing None values for all
+        keys.
+
+        `counter` is an iterator that returns indexes for days
+        (itertools.count(1) is handy for this purpose).
+
+        `term` is an ITerm that indicates which days are schooldays,
+        and which are holidays.
+
+        Returns a dict with these keys:
+
+            number  -- week number
+            days    -- a list of exactly seven dicts
+
+        Each day dict has the following keys
+
+            date    -- date as a string (YYYY-MM-DD)
+            number  -- day of month
+                       (None when date is outside [mindate, maxdate])
+            index   -- serial number of this day (used in Javascript)
+            class   -- CSS class ('holiday' or 'schoolday')
+            checked -- True for holidays, False for schooldays
+            onclick -- onclick event handler that calls toggle(index)
+
+        """
+        # start_of_week will be a Sunday or a Monday.  If it is a Sunday,
+        # we want to take the ISO week number of the following Monday.  If
+        # it is a Monday, we won't break anything by taking the week number
+        # of the following Tuesday.
+        week_no = (start_of_week + datetime.date.resolution).isocalendar()[1]
+        date = start_of_week
+        days = []
+        for day in range(7):
+            if mindate <= date <= maxdate:
+                index = counter.next()
+                checked = not self.term.isSchoolday(date)
+                css_class = checked and 'holiday' or 'schoolday'
+                days.append({'number': date.day, 'class': css_class,
+                             'date': date.strftime('%Y-%m-%d'),
+                             'index': index, 'checked': checked,
+                             'onclick': 'javascript:toggle(%d)' % index})
+            else:
+                days.append({'number': None, 'class': None, 'index': None,
+                             'onclick': None, 'checked': None, 'date': None})
+            date += datetime.date.resolution
+        return {'number': week_no,
+                'days': days}


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/term.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/term_add_edit.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/term_add_edit.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/term_add_edit.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,168 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title"
+         tal:content="view/title" i18n:translate="">Term</title>
+  <script type="text/javascript" metal:fill-slot="extrahead">
+    function update(idx) {
+        var checkbox = document.getElementById('c' + idx);
+        var cell = document.getElementById('td' + idx);
+        if (checkbox.checked) {
+            cell.className = "holiday";
+        } else {
+            cell.className = "schoolday";
+        }
+    }
+    function toggle(idx) {
+        var checkbox = document.getElementById('c' + idx);
+        checkbox.checked = !checkbox.checked;
+        update(idx);
+    }
+    document.write('\074style\076 input.chk { display: none } \074/style\076');
+  </script>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header"
+      tal:content="view/title" i18n:translate="">Term</h1>
+
+<metal:block metal:fill-slot="body">
+
+<form class="plain" method="post" tal:attributes="action request/URL"
+      tal:define="calendar view/calendar">
+
+<div class="info" tal:condition="view/update_status"
+                  tal:content="view/update_status" i18n:translate="">
+  [Status message]
+</div>
+
+<p i18n:translate="" tal:condition="view/creating">
+First, please name and define the time period of the term.  The date range is
+inclusive (e.g., 2004-09-01 to 2004-12-31).  Dates must be specified in
+YYYY-MM-DD format.
+</p>
+
+<p i18n:translate="" tal:condition="not:view/creating">
+The date range is inclusive (e.g., 2004-09-01 to 2004-12-31).
+</p>
+
+<fieldset>
+  <div class="row" tal:define="widget nocall:view/title_widget">
+    <div metal:use-macro="context/@@form_macros/widget_row" />
+  </div>
+  <div class="row" tal:define="widget nocall:view/first_widget">
+    <div metal:use-macro="context/@@form_macros/widget_row" />
+  </div>
+  <div class="row" tal:define="widget nocall:view/last_widget">
+    <div metal:use-macro="context/@@form_macros/widget_row" />
+  </div>
+</fieldset>
+  <div class="controls" tal:condition="not:calendar">
+    <input type="submit" class="button-ok" name="NEXT"
+           value="Next" i18n:attributes="value" />
+  </div>
+  <div class="controls" tal:condition="calendar">
+    <input type="submit" class="button-ok" name="REFRESH"
+           value="Refresh" i18n:attributes="value" />
+  </div>
+
+<tal:if condition="calendar">
+
+<p i18n:translate="" tal:condition="view/creating">
+Second, please specify which days are school days, and which days are holidays.
+</p>
+
+<p i18n:translate="" tal:condition="not:view/creating">
+Please specify which days are school days, and which days are holidays.
+</p>
+
+<fieldset>
+  <table id="legend" class="schooldaymodel">
+    <tr class="legend">
+      <td class="legend" i18n:translate="">Legend:</td>
+      <td width="12%" class="schoolday" i18n:translate="">Schoolday</td>
+      <td width="12%" class="holiday" i18n:translate="">Holiday</td>
+      <td width="12%"></td>
+      <td width="12%"></td>
+      <td width="12%"></td>
+      <td width="12%"></td>
+      <td width="12%"></td>
+    </tr>
+  </table>
+
+  <p>
+    <span i18n:translate="">Toggle the following days of week: </span>
+    <input class="button" type="submit" name="TOGGLE_0" value="Monday"
+           i18n:attributes="value" />
+    <input class="button" type="submit" name="TOGGLE_1" value="Tuesday"
+           i18n:attributes="value" />
+    <input class="button" type="submit" name="TOGGLE_2" value="Wednesday"
+           i18n:attributes="value" />
+    <input class="button" type="submit" name="TOGGLE_3" value="Thursday"
+           i18n:attributes="value" />
+    <input class="button" type="submit" name="TOGGLE_4" value="Friday"
+           i18n:attributes="value" />
+    <input class="button" type="submit" name="TOGGLE_5" value="Saturday"
+           i18n:attributes="value" />
+    <input class="button" type="submit" name="TOGGLE_6" value="Sunday"
+           i18n:attributes="value" />
+  </p>
+
+  <p>Click on a day to toggle its state.</p>
+
+  <table class="schooldaymodel" tal:repeat="month calendar">
+    <tr>
+      <th class="month" colspan="8" i18n:translate="">
+        <span tal:replace="month/month" i18n:translate="" i18n:name="month" /> <span tal:replace="month/year" i18n:name="year" />
+      </th>
+    </tr>
+    <tr>
+      <th class="day"></th>
+      <th class="day" width="12%" i18n:translate="">Monday</th>
+      <th class="day" width="12%" i18n:translate="">Tuesday</th>
+      <th class="day" width="12%" i18n:translate="">Wednesday</th>
+      <th class="day" width="12%" i18n:translate="">Thursday</th>
+      <th class="day" width="12%" i18n:translate="">Friday</th>
+      <th class="day" width="12%" i18n:translate="">Saturday</th>
+      <th class="day" width="12%" i18n:translate="">Sunday</th>
+    </tr>
+    <tr tal:repeat="week month/weeks">
+      <th class="week" i18n:translate="">
+        Week <span tal:replace="week/number" i18n:name="week_number" />
+      </th>
+      <td tal:repeat="day week/days"
+          tal:attributes="class day/class;
+                          id python:day['index'] and 'td%d' % day['index'];
+                          onclick day/onclick">
+        <label tal:condition="day/number">
+          <span tal:replace="day/number">N</span>
+          <input type="checkbox" name="holiday" class="chk"
+                 tal:attributes="value day/date; checked day/checked;
+                           onchange string:javascript:update(${day/index});
+                           id string:c${day/index};" />
+        </label>
+      </td>
+    </tr>
+  </table>
+</fieldset>
+
+  <div class="controls" tal:condition="view/creating">
+    <input type="submit" class="button-ok" name="REFRESH"
+           value="Refresh" i18n:attributes="value" />
+    <input type="submit" class="button-ok" name="UPDATE_SUBMIT"
+           value="Add term" i18n:attributes="value" />
+  </div>
+
+  <div class="controls" tal:condition="not:view/creating">
+    <input type="submit" class="button-ok" name="REFRESH"
+           value="Refresh" i18n:attributes="value" />
+    <input type="submit" class="button-ok" name="UPDATE_SUBMIT"
+           value="Save changes" i18n:attributes="value" />
+  </div>
+
+</tal:if>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/term_add_edit.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/termrenderer.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/termrenderer.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/termrenderer.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,219 @@
+==================
+Term Renderer View
+==================
+
+Unit tests for TermRenderer.calendar
+------------------------------------
+
+    >>> import datetime
+    >>> from schooltool.term.term import Term
+    >>> from schooltool.term.browser.term import TermRenderer
+
+    >>> term = Term('Sample', datetime.date(2004, 8, 1),
+    ...                     datetime.date(2004, 8, 31))
+    >>> print_cal(TermRenderer(term).calendar())
+    *                        August 2004
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 31:                           1
+    Week 32:   2   3   4   5   6   7   8
+    Week 33:   9  10  11  12  13  14  15
+    Week 34:  16  17  18  19  20  21  22
+    Week 35:  23  24  25  26  27  28  29
+    Week 36:  30  31
+
+    >>> term = Term('Sample', datetime.date(2004, 8, 2),
+    ...                     datetime.date(2004, 9, 1))
+    >>> print_cal(TermRenderer(term).calendar())
+    *                        August 2004
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 32:   2   3   4   5   6   7   8
+    Week 33:   9  10  11  12  13  14  15
+    Week 34:  16  17  18  19  20  21  22
+    Week 35:  23  24  25  26  27  28  29
+    Week 36:  30  31
+    *                     September 2004
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 36:           1
+
+    >>> term = Term('Sample', datetime.date(2004, 8, 3),
+    ...                     datetime.date(2004, 8, 3))
+    >>> print_cal(TermRenderer(term).calendar())
+    *                        August 2004
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 32:       3
+
+    >>> term = Term('Sample', datetime.date(2004, 12, 30),
+    ...                     datetime.date(2005, 1, 3))
+    >>> print_cal(TermRenderer(term).calendar())
+    *                      December 2004
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 53:              30  31
+    *                       January 2005
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 53:                       1   2
+    Week 1 :   3
+
+Each day gets a numeric index, used in Javascript
+
+    >>> term = Term('Sample', datetime.date(2004, 12, 30),
+    ...                     datetime.date(2005, 1, 3))
+    >>> print_cal(TermRenderer(term).calendar(), '%(index)3s')
+    *                      December 2004
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 53:               1   2
+    *                       January 2005
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 53:                       3   4
+    Week 1 :   5
+
+
+Unit test for TermRenderer.month
+--------------------------------
+
+    >>> term = Term('Sample', datetime.date(2005, 1, 1),
+    ...                     datetime.date(2005, 12, 31))
+    >>> month = TermRenderer(term).month
+
+The month function goes through all weeks between mindate and maxdate.
+
+    >>> def print_month(month, day_format='%(number)3d'):
+    ...     title = '%s %d' % (month['month'], month['year'])
+    ...     print '*%35s' % title
+    ...     print '         Mon Tue Wed Thu Fri Sat Sun'
+    ...     for week in month['weeks']:
+    ...         s = ['Week %-2d:' % week['number']]
+    ...         for day in week['days']:
+    ...             if day['number'] is None:
+    ...                 s.append('   ')
+    ...             else:
+    ...                 s.append(day_format % day)
+    ...         print ' '.join(s).rstrip()
+
+    >>> import itertools
+    >>> counter = itertools.count(1)
+
+    >>> print_month(month(datetime.date(2005, 5, 1),
+    ...                   datetime.date(2005, 5, 31), counter))
+    *                           May 2005
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 17:                           1
+    Week 18:   2   3   4   5   6   7   8
+    Week 19:   9  10  11  12  13  14  15
+    Week 20:  16  17  18  19  20  21  22
+    Week 21:  23  24  25  26  27  28  29
+    Week 22:  30  31
+
+    >>> print_month(month(datetime.date(2005, 5, 2),
+    ...                   datetime.date(2005, 5, 30), counter))
+    *                           May 2005
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 18:   2   3   4   5   6   7   8
+    Week 19:   9  10  11  12  13  14  15
+    Week 20:  16  17  18  19  20  21  22
+    Week 21:  23  24  25  26  27  28  29
+    Week 22:  30
+
+    >>> print_month(month(datetime.date(2005, 5, 3),
+    ...                   datetime.date(2005, 5, 29), counter))
+    *                           May 2005
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 18:       3   4   5   6   7   8
+    Week 19:   9  10  11  12  13  14  15
+    Week 20:  16  17  18  19  20  21  22
+    Week 21:  23  24  25  26  27  28  29
+
+    >>> print_month(month(datetime.date(2005, 5, 10),
+    ...                   datetime.date(2005, 5, 11), counter))
+    *                           May 2005
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 19:      10  11
+
+    >>> print_month(month(datetime.date(2005, 5, 17),
+    ...                   datetime.date(2005, 5, 17), counter))
+    *                           May 2005
+             Mon Tue Wed Thu Fri Sat Sun
+    Week 20:      17
+
+
+Unit test for TermRenderer.week
+-------------------------------
+
+    >>> term = Term('Sample', datetime.date(2005, 5, 1),
+    ...                     datetime.date(2005, 5, 31))
+    >>> term.addWeekdays(0, 1, 2, 3, 4)
+    >>> week = TermRenderer(term).week
+
+The week function is pretty simple.  First we will try to pass Monday
+as start_of_week.
+
+    >>> def print_week(week):
+    ...     print 'Week %d' % week['number']
+    ...     print 'index date number checked class onclick'
+    ...     for day in week['days']:
+    ...         print ('%(index)s %(date)s %(number)s %(checked)s'
+    ...                ' %(class)s %(onclick)s') % day
+
+    >>> counter = itertools.count(1)
+
+    >>> print_week(week(datetime.date(2005, 5, 2),
+    ...                 datetime.date(2005, 5, 2),
+    ...                 datetime.date(2005, 5, 8),
+    ...                 counter))
+    Week 18
+    index date number checked class onclick
+    1 2005-05-02 2 False schoolday javascript:toggle(1)
+    2 2005-05-03 3 False schoolday javascript:toggle(2)
+    3 2005-05-04 4 False schoolday javascript:toggle(3)
+    4 2005-05-05 5 False schoolday javascript:toggle(4)
+    5 2005-05-06 6 False schoolday javascript:toggle(5)
+    6 2005-05-07 7 True holiday javascript:toggle(6)
+    7 2005-05-08 8 True holiday javascript:toggle(7)
+
+min_date is handled
+
+    >>> print_week(week(datetime.date(2005, 5, 2),
+    ...                 datetime.date(2005, 5, 3),
+    ...                 datetime.date(2005, 5, 8),
+    ...                 counter))
+    Week 18
+    index date number checked class onclick
+    None None None None None None
+    8 2005-05-03 3 False schoolday javascript:toggle(8)
+    9 2005-05-04 4 False schoolday javascript:toggle(9)
+    10 2005-05-05 5 False schoolday javascript:toggle(10)
+    11 2005-05-06 6 False schoolday javascript:toggle(11)
+    12 2005-05-07 7 True holiday javascript:toggle(12)
+    13 2005-05-08 8 True holiday javascript:toggle(13)
+
+max_date is handled too
+
+    >>> print_week(week(datetime.date(2005, 5, 2),
+    ...                 datetime.date(2005, 5, 3),
+    ...                 datetime.date(2005, 5, 6),
+    ...                 counter))
+    Week 18
+    index date number checked class onclick
+    None None None None None None
+    14 2005-05-03 3 False schoolday javascript:toggle(14)
+    15 2005-05-04 4 False schoolday javascript:toggle(15)
+    16 2005-05-05 5 False schoolday javascript:toggle(16)
+    17 2005-05-06 6 False schoolday javascript:toggle(17)
+    None None None None None None
+    None None None None None None
+
+Weeks can start on Sundays too
+
+    >>> print_week(week(datetime.date(2005, 5, 1),
+    ...                 datetime.date(2005, 5, 1),
+    ...                 datetime.date(2005, 5, 8),
+    ...                 counter))
+    Week 18
+    index date number checked class onclick
+    18 2005-05-01 1 True holiday javascript:toggle(18)
+    19 2005-05-02 2 False schoolday javascript:toggle(19)
+    20 2005-05-03 3 False schoolday javascript:toggle(20)
+    21 2005-05-04 4 False schoolday javascript:toggle(21)
+    22 2005-05-05 5 False schoolday javascript:toggle(22)
+    23 2005-05-06 6 False schoolday javascript:toggle(23)
+    24 2005-05-07 7 True holiday javascript:toggle(24)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/termrenderer.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/browser/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/browser/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/browser/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,489 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool term views.
+
+$Id: tests.py 5999 2006-04-28 09:28:36Z faassen $
+"""
+import datetime
+import unittest
+
+from zope.i18n import translate
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.testing.doctestunit import pprint
+from zope.traversing.interfaces import IContainmentRoot
+
+from schooltool.timetable.browser.tests import test_timetable
+
+
+def doctest_TermView_calendar():
+    '''Unit tests for TermAddView.calendar
+
+        >>> from schooltool.term.term import Term
+        >>> from schooltool.term.browser.term import TermView
+        >>> context = Term('Sample', datetime.date(2004, 8, 1),
+        ...                        datetime.date(2004, 8, 31))
+        >>> request = TestRequest()
+        >>> view = TermView(context, request)
+
+    This view has just one method, `calendar`, that invokes TermRenderer
+    to give a nice structure of lists and dicts for the page template.
+
+        >>> test_timetable.print_cal(view.calendar())
+        *                        August 2004
+                 Mon Tue Wed Thu Fri Sat Sun
+        Week 31:                           1
+        Week 32:   2   3   4   5   6   7   8
+        Week 33:   9  10  11  12  13  14  15
+        Week 34:  16  17  18  19  20  21  22
+        Week 35:  23  24  25  26  27  28  29
+        Week 36:  30  31
+
+    '''
+
+
+def doctest_TermEditView_title():
+    '''Unit tests for TermEditView.title
+
+        >>> from schooltool.term.term import Term
+        >>> from schooltool.term.browser.term import TermEditView
+        >>> context = Term('Sample', datetime.date(2004, 8, 1),
+        ...                        datetime.date(2004, 8, 31))
+        >>> request = TestRequest()
+        >>> view = TermEditView(context, request)
+
+    view.title returns a Zope 3 I18N Message ID.
+
+        >>> view.title()
+        u'Change Term: $title'
+        >>> translate(view.title())
+        u'Change Term: Sample'
+
+    '''
+
+
+def doctest_TermEditView_calendar():
+    '''Unit tests for TermEditView.calendar
+
+        >>> from schooltool.term.term import Term
+        >>> from schooltool.term.browser.term import TermEditView
+        >>> context = Term('Sample', datetime.date(2004, 8, 4),
+        ...                        datetime.date(2004, 8, 6))
+        >>> request = TestRequest()
+        >>> view = TermEditView(context, request)
+
+    view.calendar() always renders view.term
+
+        >>> view.term = Term('Sample', datetime.date(2004, 8, 1),
+        ...                          datetime.date(2004, 8, 12))
+        >>> test_timetable.print_cal(view.calendar())
+        *                        August 2004
+                 Mon Tue Wed Thu Fri Sat Sun
+        Week 31:                           1
+        Week 32:   2   3   4   5   6   7   8
+        Week 33:   9  10  11  12
+
+    '''
+
+
+def doctest_TermEditView_update():
+    '''Unit tests for TermEditView.update
+
+        >>> from schooltool.term.term import Term
+        >>> from schooltool.term.browser.term import TermEditView
+        >>> context = Term('Sample', datetime.date(2004, 8, 4),
+        ...                        datetime.date(2004, 8, 6))
+        >>> request = TestRequest()
+        >>> view = TermEditView(context, request)
+
+    When there are no dates in the request, or when the dates are not valid,
+    view.update() sets self.term to self.context (so that the unchanged
+    term calendar is then rendered by view.calendar()).  It also sets
+    update_status.
+
+        >>> view.update()
+        ''
+        >>> view.update_status
+        ''
+        >>> view.term is view.context
+        True
+
+    If you call view.update again, it will notice that update_status is
+    set and do nothing.
+
+        >>> request.form['field.title'] = 'Sample'
+        >>> request.form['field.first'] = '2005-08-01'
+        >>> request.form['field.last'] = '2005-08-05'
+        >>> view.update()
+        ''
+        >>> view.term is view.context
+        True
+
+    However if you reset update_status back to None, update will
+
+        >>> view.update_status = None
+        >>> view.update()
+        ''
+        >>> view.term is view.context
+        False
+        >>> view.term.first
+        datetime.date(2005, 8, 1)
+        >>> view.term.last
+        datetime.date(2005, 8, 5)
+
+    If UPDATE_SUBMIT appears in the request, update changes view.context
+    and sends an ObjectModifiedEvent.
+
+        >>> import zope.event
+        >>> from zope.lifecycleevent.interfaces import IObjectModifiedEvent
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> def modified_handler(event):
+        ...     if IObjectModifiedEvent.providedBy(event):
+        ...         print "*** Object modified ***"
+        >>> zope.event.subscribers.append(modified_handler)
+
+        >>> request.form['UPDATE_SUBMIT'] = 'Save'
+        >>> request.form['holiday'] = '2005-08-03'
+        >>> view.update_status = None
+        >>> view.update()
+        *** Object modified ***
+        u'Saved changes.'
+        >>> context.first
+        datetime.date(2005, 8, 1)
+        >>> context.last
+        datetime.date(2005, 8, 5)
+        >>> context.isSchoolday(datetime.date(2005, 8, 2))
+        True
+        >>> context.isSchoolday(datetime.date(2005, 8, 3))
+        False
+
+        >>> zope.event.subscribers[:] = old_subscribers
+
+    '''
+
+
+def doctest_TermAddView_update():
+    '''Unit tests for TermAddView.update
+
+    `update` sets view.term
+
+        >>> from schooltool.term.term import TermContainer
+        >>> from schooltool.term.browser.term import TermAddView
+        >>> context = TermContainer()
+        >>> request = TestRequest()
+        >>> view = TermAddView(context, request)
+        >>> view.update()
+        >>> view.term is None
+        True
+
+        >>> request.form['field.title'] = 'Sample'
+        >>> request.form['field.first'] = '2005-09-01'
+        >>> request.form['field.last'] = '2005-10-15'
+        >>> view.update()
+        >>> view.term
+        <...Term object at ...>
+
+    '''
+
+
+def doctest_TermAddView_create():
+    '''Unit tests for TermAddView.create
+
+    `create` either returns view.term (if it has been successfully built
+    by `update` before), or raises a WidgetsError (because `_buildTerm`
+    discovered an error in the form).
+
+        >>> from schooltool.term.term import TermContainer
+        >>> from schooltool.term.browser.term import TermAddView
+        >>> context = TermContainer()
+        >>> request = TestRequest()
+        >>> view = TermAddView(context, request)
+
+        >>> view.term = object()
+        >>> view.create() is view.term
+        True
+
+        >>> view.term = None
+        >>> view.create()
+        Traceback (most recent call last):
+          ...
+        WidgetsError
+
+    '''
+
+
+def doctest_TermAddView_add():
+    r'''Unit tests for TermAddView.add
+
+    `add` adds the term to the term service.
+
+        >>> from schooltool.term.term import TermContainer
+        >>> from schooltool.term.term import Term
+        >>> from schooltool.term.browser.term import TermAddView
+        >>> context = TermContainer()
+        >>> request = TestRequest()
+        >>> view = TermAddView(context, request)
+
+        >>> term = Term('Sample', datetime.date(2005, 1, 1),
+        ...                     datetime.date(2005, 12, 31))
+        >>> view.add(term)
+
+    The standard NameChooser adapter picks the name 'Term'.
+
+        >>> print '\n'.join(context.keys())
+        Term
+
+        >>> context['Term'] is term
+        True
+
+    '''
+
+
+def doctest_TermAddView_create():
+    '''Unit tests for TermAddView.create
+
+    `create` either returns view.term (if it has been successfully built
+    by `update` before), or raises a WidgetsError (because `_buildTerm`
+    discovered an error in the form).
+
+        >>> from schooltool.term.term import TermContainer
+        >>> from schooltool.term.browser.term import TermAddView
+        >>> context = TermContainer()
+        >>> request = TestRequest()
+        >>> view = TermAddView(context, request)
+
+        >>> view.term = object()
+        >>> view.create() is view.term
+        True
+
+        >>> view.term = None
+        >>> view.create()
+        Traceback (most recent call last):
+          ...
+        WidgetsError
+
+    '''
+
+
+def doctest_TermAddView_nextURL():
+    '''Unit tests for TermAddView.nextURL
+
+    `nextURL` returns the absolute url of its context.
+
+        >>> from schooltool.term.term import TermContainer
+        >>> from schooltool.term.browser.term import TermAddView
+        >>> context = TermContainer()
+        >>> directlyProvides(context, IContainmentRoot)
+        >>> request = TestRequest()
+        >>> view = TermAddView(context, request)
+        >>> view.nextURL()
+        'http://127.0.0.1'
+
+    '''
+
+
+def doctest_TermEditViewMixin_buildTerm():
+    '''Unit tests for TermEditViewMixin._buildTerm
+
+    We shall use TermAddView here -- it inherits TermEditViewMixin._buildTerm
+    without changing it.
+
+        >>> from schooltool.term.term import TermContainer
+        >>> from schooltool.term.browser.term import TermAddView
+        >>> context = TermContainer()
+        >>> request = TestRequest()
+        >>> view = TermAddView(context, request)
+
+        >>> request.form['field.title'] = 'Sample'
+
+    When there are no dates in the request, or when the dates are not valid,
+    view._buildTerm() returns None.
+
+        >>> view._buildTerm()
+
+        >>> request.form['field.first'] = '2005-09-01'
+        >>> request.form['field.last'] = 'not a clue'
+        >>> view._buildTerm()
+
+        >>> request.form['field.first'] = 'bogus'
+        >>> request.form['field.last'] = '2005-12-31'
+        >>> view._buildTerm()
+
+        >>> request.form['field.first'] = '2005-12-31'
+        >>> request.form['field.last'] = '2005-09-01'
+        >>> view._buildTerm()
+
+    If the dates are valid, but the interval is not, you get None again.
+
+        >>> request.form['field.first'] = '2005-09-02'
+        >>> request.form['field.last'] = '2005-09-01'
+        >>> view._buildTerm()
+
+    When the dates describe a valid non-empty inclusive time interval,
+    view._buildTerm() returns a Term object.
+
+        >>> request.form['field.first'] = '2005-09-01'
+        >>> request.form['field.last'] = '2005-10-15'
+        >>> term = view._buildTerm()
+        >>> term.first
+        datetime.date(2005, 9, 1)
+        >>> term.last
+        datetime.date(2005, 10, 15)
+        >>> term.title
+        u'Sample'
+
+    When there are no indication about schooldays or holidays in the request,
+    all days are marked as schooldays.
+
+        >>> def print_holidays(term):
+        ...     all = True
+        ...     for day in term:
+        ...         if not term.isSchoolday(day):
+        ...             print "%s is a holiday" % day
+        ...             all = False
+        ...     if all:
+        ...         print "All days are schooldays."
+
+        >>> print_holidays(term)
+        All days are schooldays.
+
+        >>> request.form['holiday'] = u'2005-09-07'
+        >>> term = view._buildTerm()
+        >>> print_holidays(term)
+        2005-09-07 is a holiday
+
+        >>> request.form['holiday'] = [u'2005-10-02', u'2005-09-07']
+        >>> term = view._buildTerm()
+        >>> print_holidays(term)
+        2005-09-07 is a holiday
+        2005-10-02 is a holiday
+
+    Ill-formed or out-of-range dates are just ignored
+
+        >>> request.form['holiday'] = [u'2005-10-17', u'2005-09-07', u'foo!']
+        >>> term = view._buildTerm()
+        >>> print_holidays(term)
+        2005-09-07 is a holiday
+
+    The presence of 'TOGGLE_n' (where n is 0..6) in the request requests the
+    state of corresponding weekdays (0 = Monday, 6 = Sunday) to be toggled.
+
+        >>> request.form['holiday'] = [u'2005-10-02', u'2005-09-07']
+        >>> request.form['TOGGLE_0'] = [u'Monday']
+        >>> request.form['TOGGLE_6'] = [u'Sunday']
+        >>> term = view._buildTerm()
+        >>> print_holidays(term)
+        2005-09-04 is a holiday
+        2005-09-05 is a holiday
+        2005-09-07 is a holiday
+        2005-09-11 is a holiday
+        2005-09-12 is a holiday
+        2005-09-18 is a holiday
+        2005-09-19 is a holiday
+        2005-09-25 is a holiday
+        2005-09-26 is a holiday
+        2005-10-03 is a holiday
+        2005-10-09 is a holiday
+        2005-10-10 is a holiday
+
+    '''
+
+
+def doctest_TermAddView_calendar():
+    '''Unit tests for TermAddView.calendar
+
+        >>> from schooltool.term.term import TermContainer
+        >>> from schooltool.term.browser.term import TermAddView
+        >>> context = TermContainer()
+        >>> request = TestRequest()
+        >>> view = TermAddView(context, request)
+
+    When there are no dates in the request, or when the dates are not valid,
+    view.caledar() returns None
+
+        >>> view.term = view._buildTerm()
+        >>> view.calendar()
+
+        >>> request.form['field.first'] = '2005-09-01'
+        >>> request.form['field.last'] = 'not a clue'
+        >>> view.term = view._buildTerm()
+        >>> view.calendar()
+
+        >>> request.form['field.first'] = 'bogus'
+        >>> request.form['field.last'] = '2005-12-31'
+        >>> view.term = view._buildTerm()
+        >>> view.calendar()
+
+        >>> request.form['field.first'] = '2005-12-31'
+        >>> request.form['field.last'] = '2005-09-01'
+        >>> view.term = view._buildTerm()
+        >>> view.calendar()
+
+        >>> request.form['field.first'] = '2005-09-02'
+        >>> request.form['field.last'] = '2005-09-01'
+        >>> view.term = view._buildTerm()
+        >>> view.calendar()
+
+    When the dates describe a valid non-empty inclusive time interval,
+    view.calendar() returns a list of dicts, one for each month.
+
+        >>> request.form['field.title'] = 'Sample'
+        >>> request.form['field.first'] = '2004-08-01'
+        >>> request.form['field.last'] = '2004-08-31'
+        >>> view.term = view._buildTerm()
+        >>> test_timetable.print_cal(view.calendar())
+        *                        August 2004
+                 Mon Tue Wed Thu Fri Sat Sun
+        Week 31:                           1
+        Week 32:   2   3   4   5   6   7   8
+        Week 33:   9  10  11  12  13  14  15
+        Week 34:  16  17  18  19  20  21  22
+        Week 35:  23  24  25  26  27  28  29
+        Week 36:  30  31
+
+    '''
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF |
+                   doctest.REPORT_ONLY_FIRST_FAILURE |
+                   doctest.NORMALIZE_WHITESPACE)
+    suite.addTest(doctest.DocTestSuite(
+        setUp=test_timetable.setUp, tearDown=test_timetable.tearDown,
+        optionflags=optionflags))
+    suite.addTest(doctest.DocFileSuite(
+        'emergencydays.txt',
+        setUp=test_timetable.setUp, tearDown=test_timetable.tearDown,
+        globs={'createSchema': test_timetable.createSchema,
+               'createDayTemplate': test_timetable.createDayTemplate,
+               'pprint': pprint},
+        optionflags=optionflags))
+    suite.addTest(doctest.DocFileSuite(
+        'termrenderer.txt',
+        setUp=test_timetable.setUp, tearDown=test_timetable.tearDown,
+        globs={'print_cal': test_timetable.print_cal},
+        optionflags=optionflags))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/browser/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:security="http://schooltool.org/securitypolicy"
+    i18n_domain="schooltool">
+
+  <!-- Application hook -->
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".addToApplication"
+      />
+
+  <adapter
+      for=".interfaces.ITermContainer"
+      factory="schooltool.app.app.SimpleNameChooser"
+      provides="zope.app.container.interfaces.INameChooser" />
+
+  <interface
+      interface=".interfaces.ITermContainer"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".term.TermContainer">
+    <allow interface="zope.app.container.interfaces.ISimpleReadContainer" />
+    <require permission="schooltool.view"
+             attributes="keys values __iter__ __len__" />
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer" />
+  </class>
+
+  <interface
+      interface=".interfaces.ITerm"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".term.Term">
+    <allow interface=".interfaces.ITerm"
+           attributes="__cmp__"/>
+    <require permission="schooltool.edit"
+             interface=".interfaces.ITermWrite"
+             set_schema=".interfaces.ITerm" />
+  </class>
+
+  <!-- sample data -->
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+
+    <utility
+        factory=".sampledata.SampleTerms"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="terms"
+        />
+
+  </configure>
+
+  <!-- security -->
+
+  <security:allow
+      interface="schooltool.term.interfaces.ITermContainer"
+      crowds="everybody"
+      permission="schooltool.view" />
+  <security:allow
+      interface="schooltool.term.interfaces.ITermContainer"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <include package=".browser" />
+  <include package=".rest" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,103 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Term Interfaces
+
+$Id: interfaces.py 6507 2006-11-30 13:18:21Z ignas $
+"""
+__docformat__ = 'reStructuredText'
+import zope.interface
+import zope.schema
+
+from zope.app.container import constraints
+from zope.app.container.interfaces import IContainer, IContained
+from zope.location.interfaces import ILocation
+
+from schooltool import SchoolToolMessage as _
+from schooltool.common import IDateRange
+
+
+class ITerm(IDateRange, IContained):
+    """A term is a set of school days inside a given date range."""
+    constraints.containers('.ITermContainer')
+
+    title = zope.schema.TextLine(
+        title=_("Title"))
+
+    def isSchoolday(date):
+        """Return whether the date is a schoolday.
+
+        Raises a ValueError if the date is outside of the term covered.
+        """
+
+
+class ITermWrite(zope.interface.Interface):
+    """A term is a set of school days inside a given date range.
+
+    This interface defines an term that can be modified.
+    """
+
+    def add(day):
+        """Mark the day as a schoolday.
+
+        Raises a ValueError if the date is outside of the term covered.
+        """
+
+    def remove(day):
+        """Mark the day as a holiday.
+
+        Raises a ValueError if the date is outside of the term covered.
+        """
+
+    def reset(first, last):
+        """Change the term and mark all days as holidays.
+
+        If first is later than last, a ValueError is raised.
+        """
+
+    def addWeekdays(*weekdays):
+        """Mark that all days of week with a number in weekdays within the
+        term will be schooldays.
+
+        The numbering used is the same as one used by datetime.date.weekday()
+        method, or the calendar module: 0 is Monday, 1 is Tuesday, etc.
+        """
+
+    def removeWeekdays(*weekdays):
+        """Mark that all days of week with a number in weekdays within the
+        term will be holidays.
+
+        The numbering used is the same as one used by datetime.date.weekday()
+        method, or the calendar module: 0 is Monday, 1 is Tuesday, etc.
+        """
+
+    def toggleWeekdays(*weekdays):
+        """Toggle the state of all days of week with a number in weekdays.
+
+        The numbering used is the same as one used by datetime.date.weekday()
+        method, or the calendar module: 0 is Monday, 1 is Tuesday, etc.
+        """
+
+
+class ITermContainer(IContainer, ILocation):
+    """A container for terms.
+
+    It stores term calendars for registered term IDs.
+    """
+    constraints.contains(ITerm)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    i18n_domain="schooltool">
+
+  <!-- Traversers -->
+
+  <view
+      for="..interfaces.ITermContainer"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ITerm"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <!-- Term Views -->
+
+  <view
+      for="..interfaces.ITermContainer"
+      name="GET"
+      factory=".term.TermContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.ITermContainer"
+      provides="zope.filerepresentation.interfaces.IFileFactory"
+      factory=".term.TermFileFactory"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="..interfaces.ITerm"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".term.TermFile"
+      permission="zope.Public"
+      />
+
+  <view
+      for="..interfaces.ITerm"
+      name="GET"
+      factory=".term.TermView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/rest/term.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/rest/term.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/rest/term.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,265 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for Terms
+
+$Id: term.py 5990 2006-04-27 16:38:09Z faassen $
+"""
+import datetime
+from StringIO import StringIO
+import operator
+
+from zope.component import adapts
+from zope.interface import implements
+from zope.filerepresentation.interfaces import IFileFactory, IWriteFile
+from zope.traversing.api import getPath
+
+from schooltool.calendar.icalendar import read_icalendar
+from schooltool.common import parse_date
+from schooltool.xmlparsing import XMLDocument
+from schooltool.app.rest import View
+from schooltool.app.rest.app import GenericContainerView
+from schooltool.app.rest.errors import RestError
+
+from schooltool.term.term import Term
+from schooltool.term.interfaces import ITermContainer, ITerm
+
+
+class TermContainerView(GenericContainerView):
+    """RESTive view of a TermContainer."""
+
+
+class TermFileFactory(object):
+    """Adapter adapting ITermContainer to FileFactory."""
+
+    implements(IFileFactory)
+    adapts(ITermContainer)
+
+    _dow_map = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3,
+                "Friday": 4, "Saturday": 5, "Sunday": 6}
+
+    schema = """<?xml version="1.0" encoding="UTF-8"?>
+    <!--
+    RelaxNG grammar for a representation of Term
+    -->
+    <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+             ns="http://schooltool.org/ns/schooldays/0.1"
+             datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+
+      <define name="idattr">
+         <attribute name="id">
+            <text/>
+         </attribute>
+      </define>
+
+      <define name="datetext">
+        <!-- date in YYYY-MM-DD format -->
+        <text/>
+      </define>
+
+      <define name="daysofweek">
+        <!-- space separated list of weekdays -->
+        <text/>
+      </define>
+
+      <define name="title">
+        <!-- A title of the term -->
+        <text/>
+      </define>
+
+      <start>
+        <ref name="schooldays"/>
+      </start>
+
+      <define name="schooldays">
+        <element name="schooldays">
+          <attribute name="first">
+            <text/>
+          </attribute>
+          <attribute name="last">
+            <ref name="datetext"/>
+          </attribute>
+          <element name="title">
+            <ref name="title"/>
+          </element>
+          <element name="daysofweek">
+            <ref name="daysofweek"/>
+          </element>
+          <zeroOrMore>
+            <element name="holiday">
+              <attribute name="date">
+                <ref name="datetext"/>
+              </attribute>
+              <text/>
+            </element>
+          </zeroOrMore>
+        </element>
+      </define>
+
+    </grammar>
+    """
+
+    factory = Term
+
+    def __init__(self, container):
+        self.context = container
+
+    def __call__(self, name, content_type, data):
+        if '.' in name:
+            raise RestError("Terms can not contain dots in their names.")
+
+        if self.isDataICal(data):
+            return self.parseText(data, name=name)
+        else:
+            return self.parseXML(data, name=name)
+
+    def isDataICal(self, data):
+        return data.strip().startswith("BEGIN:VCALENDAR")
+
+    def parseText(self, data, name=None):
+        first = last = None
+        days = []
+        for event in read_icalendar(data):
+            summary = event.title.lower()
+            if summary not in ('school period', 'schoolday'):
+                continue # ignore boring events
+
+            if not event.allday:
+                raise RestError("All-day event should be used")
+
+            if event.recurrence:
+                raise RestError("Repeating events/exceptions not yet supported")
+
+            if summary == 'school period':
+                if (first is not None and
+                    (first, last) != (event.dtstart, event.dtend)):
+                    raise RestError("Multiple definitions of school period")
+                else:
+                    first, last = event.dtstart.date(), (event.dtstart + event.duration).date()
+            elif summary == 'schoolday':
+                if event.duration != datetime.date.resolution:
+                    raise RestError("Schoolday longer than one day")
+                days.append(event.dtstart)
+        else:
+            if first is None:
+                raise RestError("School period not defined")
+            for day in days:
+                if not first <= day.date() < last:
+                    raise RestError("Schoolday outside school period")
+            term = Term(name, first, last - datetime.date.resolution)
+            for day in days:
+                term.add(day.date())
+        return term
+
+    def parseXML(self, data, name=None):
+
+        doc = XMLDocument(data, self.schema)
+        try:
+            doc.registerNs('m', 'http://schooltool.org/ns/schooldays/0.1')
+
+            schooldays = doc.query('/m:schooldays')[0]
+            first_attr = schooldays['first']
+            last_attr = schooldays['last']
+
+            first = parse_date(first_attr)
+            last = parse_date(last_attr)
+            holidays = [parse_date(node.content)
+                        for node in doc.query('/m:schooldays/m:holiday/@date')]
+
+            node = doc.query('/m:schooldays/m:daysofweek')[0]
+            dows = [self._dow_map[d]
+                    for d in node.content.split()]
+
+            node = doc.query('/m:schooldays/m:title')[0]
+            title = node.content
+
+            term = Term(title, first, last)
+            term.addWeekdays(*dows)
+            for holiday in holidays:
+                if holiday in term and term.isSchoolday(holiday):
+                    term.remove(holiday)
+
+            return term
+        finally:
+            doc.free()
+
+
+class TermFile(object):
+    """Adapter adapting Term to IWriteFile"""
+
+    adapts(ITerm)
+    implements(IWriteFile)
+
+    def __init__(self, context):
+        self.context = context
+
+    def write(self, data):
+        """See IWriteFile"""
+        container = self.context.__parent__
+        factory = IFileFactory(container)
+
+        if factory.isDataICal(data):
+            term = factory.parseText(data)
+        else:
+            term = factory.parseXML(data)
+
+        self.context.reset(term.first, term.last)
+        for day in term:
+            if term.isSchoolday(day):
+                self.context.add(day)
+
+
+class TermView(View):
+    """iCalendar view for ITerm."""
+
+    datetime_hook = datetime.datetime
+
+    def GET(self):
+        end_date = self.context.last + datetime.date.resolution
+        uid_suffix = "%s@%s" % (getPath(self.context),
+                                # XXX not a very nice way (cutting http://)
+                                self.request._app_server[7:])
+        dtstamp = self.datetime_hook.utcnow().strftime("%Y%m%dT%H%M%SZ")
+        result = [
+            "BEGIN:VCALENDAR",
+            "PRODID:-//SchoolTool.org/NONSGML SchoolTool//EN",
+            "VERSION:2.0",
+            "BEGIN:VEVENT",
+            "UID:school-period-%s" % uid_suffix,
+            "SUMMARY:School Period",
+            "DTSTART;VALUE=DATE:%s" % self.context.first.strftime("%Y%m%d"),
+            "DTEND;VALUE=DATE:%s" % end_date.strftime("%Y%m%d"),
+            "DTSTAMP:%s" % dtstamp,
+            "END:VEVENT",
+        ]
+        for date in self.context:
+            if self.context.isSchoolday(date):
+                s = date.strftime("%Y%m%d")
+                result += [
+                    "BEGIN:VEVENT",
+                    "UID:schoolday-%s-%s" % (s, uid_suffix),
+                    "SUMMARY:Schoolday",
+                    "DTSTART;VALUE=DATE:%s" % s,
+                    "DTSTAMP:%s" % dtstamp,
+                    "END:VEVENT",
+                ]
+        result.append("END:VCALENDAR")
+        self.request.response.setHeader('Content-Type',
+                                        'text/calendar; charset=UTF-8')
+        return "\r\n".join(result) + "\r\n"


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/rest/term.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/rest/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/rest/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/rest/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,295 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for RESTive term views.
+
+$Id: tests.py 5990 2006-04-27 16:38:09Z faassen $
+"""
+
+import unittest
+import datetime
+
+from zope.interface import directlyProvides
+from zope.publisher.browser import TestRequest
+from zope.filerepresentation.interfaces import IFileFactory
+from zope.app.testing import ztapi, setup
+from zope.traversing.interfaces import IContainmentRoot
+
+from schooltool.testing.util import QuietLibxml2Mixin
+from schooltool.common import dedent
+
+
+class DatetimeStub:
+
+    def utcnow(self):
+        return datetime.datetime(2004, 1, 2, 3, 4, 5)
+
+
+class TestTermView(QuietLibxml2Mixin, unittest.TestCase):
+
+    def setUp(self):
+        setup.placelessSetUp()
+        setup.setUpTraversal()
+        from schooltool.term.term import Term, TermContainer
+        from schooltool.term.rest.term import TermView
+
+        self.terms = TermContainer()
+        self.terms["calendar"] =  self.term = Term(
+            "Test",
+            datetime.date(2003, 9, 1),
+            datetime.date(2003, 9, 30))
+
+        directlyProvides(self.terms, IContainmentRoot)
+
+        self.view = TermView(self.term, TestRequest())
+        self.view.datetime_hook = DatetimeStub()
+        self.setUpLibxml2()
+
+    def tearDown(self):
+        setup.placelessTearDown()
+        self.tearDownLibxml2()
+
+    def test_get_empty(self):
+        self.assertEqual(
+            self.view.GET(),
+            dedent(u"""
+                BEGIN:VCALENDAR
+                PRODID:-//SchoolTool.org/NONSGML SchoolTool//EN
+                VERSION:2.0
+                BEGIN:VEVENT
+                UID:school-period-/calendar at 127.0.0.1
+                SUMMARY:School Period
+                DTSTART;VALUE=DATE:20030901
+                DTEND;VALUE=DATE:20031001
+                DTSTAMP:20040102T030405Z
+                END:VEVENT
+                END:VCALENDAR
+            """).replace("\n", "\r\n"))
+
+    def test_get(self):
+        self.term.addWeekdays(0, 1, 2, 3, 4) # Mon to Fri
+        expected = dedent(u"""
+            BEGIN:VCALENDAR
+            PRODID:-//SchoolTool.org/NONSGML SchoolTool//EN
+            VERSION:2.0
+            BEGIN:VEVENT
+            UID:school-period-/calendar at 127.0.0.1
+            SUMMARY:School Period
+            DTSTART;VALUE=DATE:20030901
+            DTEND;VALUE=DATE:20031001
+            DTSTAMP:20040102T030405Z
+            END:VEVENT
+        """)
+        for date in self.term:
+            if date.weekday() not in (5, 6):
+                s = date.strftime("%Y%m%d")
+                expected += dedent("""
+                    BEGIN:VEVENT
+                    UID:schoolday-%s-/calendar at 127.0.0.1
+                    SUMMARY:Schoolday
+                    DTSTART;VALUE=DATE:%s
+                    DTSTAMP:20040102T030405Z
+                    END:VEVENT
+                """ % (s, s))
+        self.assertEqual(
+            self.view.GET(),
+            (expected + "END:VCALENDAR\n").replace("\n", "\r\n"))
+
+
+class TestTermFileFactory(QuietLibxml2Mixin, unittest.TestCase):
+    def setUp(self):
+        from schooltool.term.term import TermContainer
+        from schooltool.term.rest.term import TermFileFactory
+
+        self.terms = TermContainer()
+        self.fileFactory = TermFileFactory(self.terms)
+        self.setUpLibxml2()
+
+
+    def test_isDataICal(self):
+        self.assert_(self.fileFactory.isDataICal("BEGIN:VCALENDAR"))
+        self.assertEqual(self.fileFactory.isDataICal("<foo />"), False)
+
+    def test_callText(self):
+        calendar = dedent("""
+            BEGIN:VCALENDAR
+            PRODID:-//SchoolTool.org/NONSGML SchoolTool//EN
+            VERSION:2.0
+            BEGIN:VEVENT
+            UID:school-period-/person/calendar at localhost
+            SUMMARY:School Period
+            DTSTART;VALUE=DATE:20040901
+            DTEND;VALUE=DATE:20041001
+            END:VEVENT
+            BEGIN:VEVENT
+            UID:random at example.com
+            SUMMARY:Doctor's appointment
+            DTSTART;VALUE=DATE:20040911
+            END:VEVENT
+            BEGIN:VEVENT
+            UID:random2 at example.com
+            SUMMARY:Schoolday
+            DTSTART;VALUE=DATE:20040912
+            END:VEVENT
+            BEGIN:VEVENT
+            UID:random2 at example.com
+            SUMMARY:Schoolday
+            DTSTART;VALUE=DATE:20040912
+            END:VEVENT
+            END:VCALENDAR
+        """)
+        # normalize line endings
+        calendar = "\r\n".join(calendar.splitlines()) + "\r\n"
+
+        term = self.fileFactory("calendar", "", calendar)
+
+        self.assertEquals(term.title, "calendar")
+        self.assertEquals(term.first, datetime.date(2004, 9, 1))
+        self.assertEquals(term.last, datetime.date(2004, 9, 30))
+        for date in term:
+            if date == datetime.date(2004, 9, 12):
+                self.assert_(term.isSchoolday(date))
+            else:
+                self.assert_(not term.isSchoolday(date))
+
+    def test_callXML(self):
+        body = dedent("""
+            <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+                        first="2003-09-01" last="2003-09-07">
+              <title>Test.term!</title>
+              <daysofweek>Monday Tuesday Wednesday Thursday Friday</daysofweek>
+              <holiday date="2003-09-03">Holiday</holiday>
+              <holiday date="2003-09-06">Holiday</holiday>
+              <holiday date="2003-09-23">Holiday</holiday>
+            </schooldays>
+        """)
+
+        term = self.fileFactory("calendar_from_xml", "", body)
+
+        self.assertEquals(term.title, "Test.term!")
+        self.assertEquals(term.first, datetime.date(2003, 9, 1))
+        self.assertEquals(term.last, datetime.date(2003, 9, 7))
+        schooldays = []
+        for date in term:
+            if term.isSchoolday(date):
+                schooldays.append(date)
+        expected = [datetime.date(2003, 9, d) for d in 1, 2, 4, 5]
+        self.assertEquals(schooldays, expected)
+
+    def test_invalid_name(self):
+        from schooltool.app.rest.errors import RestError
+        self.assertRaises(RestError, self.fileFactory, "foo.bar", "", "")
+
+
+class TestTermFile(QuietLibxml2Mixin, unittest.TestCase):
+
+    def setUp(self):
+        from schooltool.term.term import Term, TermContainer
+        from schooltool.term.interfaces import ITermContainer
+        from schooltool.term.rest.term import TermFileFactory
+        from schooltool.term.rest.term import TermFile
+
+        ztapi.provideAdapter(ITermContainer, IFileFactory, TermFileFactory)
+
+        self.terms = TermContainer()
+        self.terms["calendar"] =  self.term = Term(
+            "Test",
+            datetime.date(2003, 9, 1),
+            datetime.date(2003, 9, 30))
+
+
+        self.file = TermFile(self.term)
+
+        self.setUpLibxml2()
+
+    def test_write(self):
+        calendar = dedent("""
+            BEGIN:VCALENDAR
+            PRODID:-//SchoolTool.org/NONSGML SchoolTool//EN
+            VERSION:2.0
+            BEGIN:VEVENT
+            UID:school-period-/person/calendar at localhost
+            SUMMARY:School Period
+            DTSTART;VALUE=DATE:20040901
+            DTEND;VALUE=DATE:20041001
+            END:VEVENT
+            BEGIN:VEVENT
+            UID:random at example.com
+            SUMMARY:Doctor's appointment
+            DTSTART;VALUE=DATE:20040911
+            END:VEVENT
+            BEGIN:VEVENT
+            UID:random2 at example.com
+            SUMMARY:Schoolday
+            DTSTART;VALUE=DATE:20040912
+            END:VEVENT
+            BEGIN:VEVENT
+            UID:random2 at example.com
+            SUMMARY:Schoolday
+            DTSTART;VALUE=DATE:20040912
+            END:VEVENT
+            END:VCALENDAR
+        """)
+        # normalize line endings
+        calendar = "\r\n".join(calendar.splitlines()) + "\r\n"
+
+        self.file.write(calendar)
+
+        self.assertEquals(self.term.first, datetime.date(2004, 9, 1))
+        self.assertEquals(self.term.last, datetime.date(2004, 9, 30))
+        for date in self.term:
+            if date == datetime.date(2004, 9, 12):
+                self.assert_(self.term.isSchoolday(date))
+            else:
+                self.assert_(not self.term.isSchoolday(date))
+
+    def test_write_xml(self):
+        body = dedent("""
+            <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+                        first="2003-09-01" last="2003-09-07">
+              <title>A super title!</title>
+              <daysofweek>Monday Tuesday Wednesday Thursday Friday</daysofweek>
+              <holiday date="2003-09-03">Holiday</holiday>
+              <holiday date="2003-09-06">Holiday</holiday>
+              <holiday date="2003-09-23">Holiday</holiday>
+            </schooldays>
+        """)
+
+        self.file.write(body)
+
+        self.assertEquals(self.term.first, datetime.date(2003, 9, 1))
+        self.assertEquals(self.term.last, datetime.date(2003, 9, 7))
+        schooldays = []
+        for date in self.term:
+            if self.term.isSchoolday(date):
+                schooldays.append(date)
+        expected = [datetime.date(2003, 9, d) for d in 1, 2, 4, 5]
+        self.assertEquals(schooldays, expected)
+
+
+def test_suite():
+    return unittest.TestSuite([
+        unittest.makeSuite(TestTermView),
+        unittest.makeSuite(TestTermFileFactory),
+        unittest.makeSuite(TestTermFile)
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/rest/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,48 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Term sample data generation
+
+$Id: sampledata.py 6373 2006-07-19 12:51:15Z alga $
+"""
+import datetime
+import zope.interface
+
+from schooltool.term import term
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+
+class SampleTerms(object):
+    """Sample data generator for terms."""
+    zope.interface.implements(ISampleDataPlugin)
+
+    name = 'terms'
+    dependencies = ()
+
+    def generate(self, app, seed=None):
+        date = datetime.date
+        fall = term.Term('2005-fall', date(2005, 8, 22), date(2005, 12, 23))
+        fall.addWeekdays(0, 1, 2, 3, 4)
+        app['terms']['2005-fall'] = fall
+
+        spring = term.Term('2006-spring', date(2006, 1, 26), date(2006, 8, 31))
+        spring.addWeekdays(0, 1, 2, 3, 4)
+        app['terms']['2006-spring'] = spring
+
+        fall = term.Term('2006-fall', date(2006, 8, 21), date(2006, 12, 22))
+        fall.addWeekdays(0, 1, 2, 3, 4)
+        app['terms']['2006-fall'] = fall


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/term-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/term-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/term-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.term" />


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/term-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/term.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/term.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/term.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,136 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Term implementation
+
+$Id: term.py 6507 2006-11-30 13:18:21Z ignas $
+"""
+import datetime
+import persistent
+
+import zope.interface
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.container import contained, btree
+
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.common import DateRange
+
+from schooltool.term import interfaces
+
+
+class Term(DateRange, contained.Contained, persistent.Persistent):
+
+    zope.interface.implements(interfaces.ITerm, interfaces.ITermWrite)
+
+    def __init__(self, title, first, last):
+        super(Term, self).__init__(first, last)
+        self.title = title
+        self._schooldays = set()
+
+    def _validate(self, date):
+        if not date in self:
+            raise ValueError("Date %r not in term [%r, %r]" %
+                             (date, self.first, self.last))
+
+    def isSchoolday(self, date):
+        self._validate(date)
+        if date in self._schooldays:
+            return True
+        return False
+
+    def add(self, date):
+        self._validate(date)
+        self._schooldays.add(date)
+        self._schooldays = self._schooldays  # persistence
+
+    def remove(self, date):
+        self._validate(date)
+        self._schooldays.remove(date)
+        self._schooldays = self._schooldays  # persistence
+
+    def addWeekdays(self, *weekdays):
+        for date in self:
+            if date.weekday() in weekdays:
+                self.add(date)
+
+    def removeWeekdays(self, *weekdays):
+        for date in self:
+            if date.weekday() in weekdays and self.isSchoolday(date):
+                self.remove(date)
+
+    def toggleWeekdays(self, *weekdays):
+        for date in self:
+            if date.weekday() in weekdays:
+                if self.isSchoolday(date):
+                    self.remove(date)
+                else:
+                    self.add(date)
+
+    def reset(self, first, last):
+        if last < first:
+            # import timemachine
+            raise ValueError("Last date %r less than first date %r" %
+                             (last, first))
+        self.first = first
+        self.last = last
+        self._schooldays.clear()
+
+
+class TermContainer(btree.BTreeContainer):
+
+    zope.interface.implements(interfaces.ITermContainer, IAttributeAnnotatable)
+
+
+def getTermForDate(date):
+    """Find the term that contains `date`.
+
+    Returns None if `date` falls outside all terms.
+    """
+    terms = getSchoolToolApplication()["terms"]
+    for term in terms.values():
+        if date in term:
+            return term
+    else:
+        return None
+
+
+def getNextTermForDate(date):
+    """Find the term that contains `date`, or the next one.
+
+    If there is a term that contains `date`, it is returned.  Otherwise, the
+    first term that starts after `date` is returned.  If there are none,
+    the last term that ended before `date` is returned.
+
+    Returns None if there are no terms.
+    """
+    terms = getSchoolToolApplication()["terms"]
+    before, after = [], []
+    for term in terms.values():
+        if date in term:
+            return term
+        if date > term.last:
+            before.append((term.last, term))
+        if date < term.first:
+            after.append((term.first, term))
+    if after:
+        return after[0][1]
+        return min(after)[1]
+    if before:
+        return max(before)[1]
+    return None


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/term.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/tests/test_sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/tests/test_sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/tests/test_sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,91 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""Unit tests for schooltool.term.sampledata
+
+$Id: test_sampledata.py 6373 2006-07-19 12:51:15Z alga $
+"""
+import unittest
+
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup
+
+from schooltool.testing import setup as stsetup
+
+def setUp(test):
+    setup.placefulSetUp()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+def doctest_SampleTerms():
+    """A sample data plugin that creates terms
+
+        >>> from schooltool.term.sampledata import SampleTerms
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> plugin = SampleTerms()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+    This plugin generates two terms:
+
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> plugin.generate(app, 42)
+        >>> len(app['terms'])
+        3
+
+    These terms are 90 schooldays long:
+
+        >>> fall = app['terms']['2005-fall']
+        >>> schooldays = [day for day in fall if fall.isSchoolday(day)]
+        >>> len(schooldays)
+        90
+
+        >>> spring = app['terms']['2006-spring']
+        >>> schooldays = [day for day in spring if spring.isSchoolday(day)]
+        >>> len(schooldays)
+        156
+
+        >>> fall6 = app['terms']['2006-fall']
+        >>> schooldays = [day for day in fall6 if fall6.isSchoolday(day)]
+        >>> len(schooldays)
+        90
+
+    They span these dates:
+
+        >>> print fall.first, fall.last
+        2005-08-22 2005-12-23
+        >>> print spring.first, spring.last
+        2006-01-26 2006-08-31
+        >>> print fall6.first, fall6.last
+        2006-08-21 2006-12-22
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS),
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/tests/test_sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/term/tests/test_term.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/term/tests/test_term.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/term/tests/test_term.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,241 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for the schooltool.timetable.term module.
+
+$Id: test_term.py 6047 2006-05-11 18:31:03Z mg $
+"""
+import calendar
+import unittest
+from datetime import date
+
+from zope.interface import implements
+from zope.interface.verify import verifyObject
+from zope.app.container.contained import Contained
+from zope.location.interfaces import ILocation
+from zope.app.testing.setup import placefulSetUp, placefulTearDown
+
+from schooltool.term import interfaces, term
+from schooltool.testing import setup
+
+
+class TermStub(Contained):
+
+    implements(interfaces.ITerm)
+
+    #     November 2003
+    #  Su Mo Tu We Th Fr Sa
+    #                     1
+    #   2  3  4  5  6  7  8
+    #   9 10 11 12 13 14 15
+    #  16 17 18 19<20-21>22
+    #  23<24-25-26>27 28 29
+    #  30
+
+    first = date(2003, 11, 20)
+    last = date(2003, 11, 26)
+
+    def __iter__(self):
+        return iter((date(2003, 11, 20),
+                     date(2003, 11, 21),
+                     date(2003, 11, 22),
+                     date(2003, 11, 23),
+                     date(2003, 11, 24),
+                     date(2003, 11, 25),
+                     date(2003, 11, 26)))
+
+    def isSchoolday(self, day):
+        return day in (date(2003, 11, 20),
+                       date(2003, 11, 21),
+                       date(2003, 11, 24),
+                       date(2003, 11, 25),
+                       date(2003, 11, 26))
+
+    def __contains__(self, day):
+        return date(2003, 11, 20) <= day <= date(2003, 11, 26)
+
+
+class TestTerm(unittest.TestCase):
+
+    def test_interface(self):
+
+        cal = term.Term('Sample', date(2003, 9, 1), date(2003, 12, 24))
+        verifyObject(interfaces.ITerm, cal)
+        verifyObject(interfaces.ITermWrite, cal)
+        verifyObject(ILocation, cal)
+
+    def testAddRemoveSchoolday(self):
+        cal = term.Term('Sample', date(2003, 9, 1), date(2003, 9, 14))
+
+        self.assert_(not cal.isSchoolday(date(2003, 9, 1)))
+        self.assert_(not cal.isSchoolday(date(2003, 9, 2)))
+        self.assertRaises(ValueError, cal.isSchoolday, date(2003, 9, 15))
+
+        cal.add(date(2003, 9, 2))
+        self.assert_(cal.isSchoolday(date(2003, 9, 2)))
+        cal.remove(date(2003, 9, 2))
+        self.assert_(not cal.isSchoolday(date(2003, 9, 2)))
+        self.assertRaises(ValueError, cal.add, date(2003, 9, 15))
+        self.assertRaises(ValueError, cal.remove, date(2003, 9, 15))
+
+    def testReset(self):
+        cal = term.Term('Sample', date(2003, 9, 1), date(2003, 9, 15))
+        cal.addWeekdays(1, 3, 5)
+
+        new_first, new_last = date(2003, 8, 1), date(2003, 9, 30)
+        cal.reset(new_first, new_last)
+
+        self.assertEqual(cal.first, new_first)
+        self.assertEqual(cal.last, new_last)
+        for d in cal:
+            self.assert_(not cal.isSchoolday(d))
+
+        self.assertRaises(ValueError, cal.reset, new_last, new_first)
+
+    def testMarkWeekday(self):
+        cal = term.Term('Sample', date(2003, 9, 1), date(2003, 9, 17))
+        for day in 1, 8, 15:
+            self.assert_(not cal.isSchoolday(date(2003, 9, day)))
+
+        cal.addWeekdays(calendar.MONDAY)
+        for day in 1, 8, 15:
+            self.assert_(cal.isSchoolday(date(2003, 9, day)))
+            self.assert_(not cal.isSchoolday(date(2003, 9, day+1)))
+
+        cal.removeWeekdays(calendar.MONDAY, calendar.TUESDAY)
+        for day in 1, 8, 15:
+            self.assert_(not cal.isSchoolday(date(2003, 9, day)))
+            self.assert_(not cal.isSchoolday(date(2003, 9, day+1)))
+
+        cal.addWeekdays(calendar.MONDAY, calendar.TUESDAY)
+        for day in 1, 8, 15:
+            self.assert_(cal.isSchoolday(date(2003, 9, day)))
+            self.assert_(cal.isSchoolday(date(2003, 9, day+1)))
+
+        cal.toggleWeekdays(calendar.TUESDAY, calendar.WEDNESDAY)
+        for day in 1, 8, 15:
+            self.assert_(cal.isSchoolday(date(2003, 9, day)))
+            self.assert_(not cal.isSchoolday(date(2003, 9, day+1)))
+            self.assert_(cal.isSchoolday(date(2003, 9, day+2)))
+
+    def test_contains(self):
+        cal = term.Term('Sample', date(2003, 9, 1), date(2003, 9, 16))
+        self.assert_(date(2003, 8, 31) not in cal)
+        self.assert_(date(2003, 9, 17) not in cal)
+        for day in range(1, 17):
+            self.assert_(date(2003, 9, day) in cal)
+        self.assertRaises(TypeError, cal.__contains__, 'some string')
+
+
+class TestTermContainer(unittest.TestCase):
+
+    def test_interface(self):
+        service = term.TermContainer()
+        verifyObject(interfaces.ITermContainer, service)
+
+    def test(self):
+        service = term.TermContainer()
+        self.assertEqual(list(service.keys()), [])
+
+        schooldays = TermStub()
+        service['2003 fall'] = schooldays
+        self.assertEqual(list(service.keys()), ['2003 fall'])
+        self.assert_('2003 fall' in service)
+        self.assert_('2004 spring' not in service)
+        self.assert_(service['2003 fall'] is schooldays)
+        self.assertEquals(schooldays.__name__, '2003 fall')
+        self.assert_(schooldays.__parent__ is service)
+
+        schooldays3 = TermStub()
+        service['2004 spring'] = schooldays3
+        self.assertEqual(sorted(service.keys()), ['2003 fall', '2004 spring'])
+        self.assert_('2004 spring' in service)
+        self.assert_(service['2004 spring'] is schooldays3)
+
+        del service['2003 fall']
+        self.assertEqual(list(service.keys()), ['2004 spring'])
+        self.assert_('2003 fall' not in service)
+        self.assert_('2004 spring' in service)
+        self.assertRaises(KeyError, lambda: service['2003 fall'])
+
+        # duplicate deletion
+        self.assertRaises(KeyError, service.__delitem__, '2003 fall')
+
+
+class TestGetTermForDate(unittest.TestCase):
+
+    def setUp(self):
+        placefulSetUp()
+        app = setup.setUpSchoolToolSite()
+
+        self.term1 = term.Term('Sample', date(2004, 9, 1), date(2004, 12, 20))
+        self.term2 = term.Term('Sample', date(2005, 1, 1), date(2005, 6, 1))
+        app["terms"]['2004-fall'] = self.term1
+        app["terms"]['2005-spring'] = self.term2
+
+        class TimetableModelStub:
+            def periodsInDay(self, schooldays, ttschema, date):
+                return 'periodsInDay', schooldays, ttschema, date
+
+        from schooltool.timetable.schema import TimetableSchema
+        tt = TimetableSchema([])
+        tt.model = TimetableModelStub()
+        self.tt = tt
+        app["ttschemas"]['default'] = tt
+        self.app = app
+
+    def tearDown(self):
+        placefulTearDown()
+
+    def test_getTermForDate(self):
+        self.assert_(term.getTermForDate(date(2004, 8, 31)) is None)
+        self.assert_(term.getTermForDate(date(2004, 9, 1)) is self.term1)
+        self.assert_(term.getTermForDate(date(2004, 11, 5)) is self.term1)
+        self.assert_(term.getTermForDate(date(2004, 12, 20)) is self.term1)
+        self.assert_(term.getTermForDate(date(2004, 12, 21)) is None)
+        self.assert_(term.getTermForDate(date(2005, 3, 17)) is self.term2)
+        self.assert_(term.getTermForDate(date(2005, 11, 5)) is None)
+
+    def test_getNextTermForDate(self):
+        self.assert_(term.getNextTermForDate(date(2004, 8, 31)) is self.term1)
+        self.assert_(term.getNextTermForDate(date(2004, 9, 1)) is self.term1)
+        self.assert_(term.getNextTermForDate(date(2004, 11, 5)) is self.term1)
+        self.assert_(term.getNextTermForDate(date(2004, 12, 20)) is self.term1)
+        self.assert_(term.getNextTermForDate(date(2004, 12, 21)) is self.term2)
+        self.assert_(term.getNextTermForDate(date(2005, 3, 17)) is self.term2)
+        self.assert_(term.getNextTermForDate(date(2005, 11, 5)) is self.term2)
+        self.term3 = term.Term('Sample', date(2006, 1, 1), date(2006, 6, 1))
+        self.app["terms"]["term3"] = self.term3
+        self.assert_(term.getNextTermForDate(date(2005, 11, 5)) is self.term3)
+        self.assert_(term.getNextTermForDate(date(2004, 8, 31)) is self.term1)
+        del self.app["terms"]["term3"]
+        del self.app["terms"]['2004-fall']
+        del self.app["terms"]['2005-spring']
+        self.assert_(term.getNextTermForDate(date(2004, 8, 31)) is None)
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestTerm))
+    suite.addTest(unittest.makeSuite(TestTermContainer))
+    suite.addTest(unittest.makeSuite(TestGetTermForDate))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/term/tests/test_term.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/testing/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/testing/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/testing/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,163 @@
+==========================
+SchoolBell Testing Support
+==========================
+
+This package basically splits into two parts, an abstract test-setup registry
+and some specific setup functions that are useful for many test setups.
+
+The Test-Setup Registry
+-----------------------
+
+The test-setup registry was designed to de-centralize the creation of a
+testing environment, allowing several independent packages to contribute to a
+particular setup. The codebase is located in:
+
+    >>> from schooltool.testing import registry
+
+In the module you will find a ``register()`` method that allows you to
+register a function for a particular setup. The simplest case is to register a
+function that has no arguments:
+
+    >>> def addOne():
+    ...     result.append(1)
+
+You register the function as follows in the `SampleFill` setup registry:
+
+    >>> registry.register('SampleFill', addOne)
+
+Now you execute the setup using the ``setup()`` method:
+
+    >>> result = []
+    >>> registry.setup('SampleFill')
+    >>> result
+    [1]
+
+Now we can register more complex functions as well, of course:
+
+    >>> def addTwo(number):
+    ...     result.append(number)
+    >>> registry.register('SampleFill', addTwo, 2)
+
+    >>> def addThree(number=None):
+    ...     result.append(number)
+    >>> registry.register('SampleFill', addThree, number=3)
+
+    >>> def addFour(number1, number2=None):
+    ...     result.append(number1+number2)
+    >>> registry.register('SampleFill', addFour, 3, number2=1)
+
+And here is the result:
+
+    >>> result = []
+    >>> registry.setup('SampleFill')
+    >>> result
+    [1, 2, 3, 4]
+
+Note that the order of registration is preserved, so if you can control the
+order of registration, one setup step could depnd on a previous one. However,
+this is hard to accomplish for generic development platforms and it is thus
+not recommended to rely on the order of the setup steps.
+
+While this functionality in itself is alsready pretty powerful, it does not
+cover all of our required use cases. Oftentimes we want to be able to
+"decorate" an object using several setup steps. Let's say, we have the
+following containerish object:
+
+    >>> class Container(object):
+    ...
+    ...     def __init__(self):
+    ...         self.data = []
+    ...
+    ...     def add(self, entry):
+    ...         self.data.append(entry)
+
+We now want our setup functions to fill this container with some initial
+values. Clearly, the above method does not work here anymore, since we do not
+have the container instance available when creating and registering the setup
+step function. Here are a couple of functions that we would like to help with
+the setup:
+
+    >>> def addOneToContainer(container):
+    ...     container.add(1)
+    >>> registry.register('ContainerValues', addOneToContainer)
+
+    >>> def addTwoToContainer(container, number=None):
+    ...     container.add(number)
+    >>> registry.register('ContainerValues', addTwoToContainer, number=2)
+
+But how do we pass in the container? The ``setup()`` method allows you to
+specify additional positional and keyword arguments. The positional arguments
+passed via the ``setup()`` are *appended* to the original ones. The additional
+keyword arguments are merged (updated) into the original keyword arguments.
+
+    >>> container = Container()
+    >>> registry.setup('ContainerValues', container)
+    >>> container.data
+    [1, 2]
+
+    >>> container = Container()
+    >>> registry.setup('ContainerValues', container=container)
+    >>> container.data
+    [1, 2]
+
+Note: As you might have already noticed, every test-setup registry has its own
+semantics and functions of a particular registry often have the same or
+similar signatures.
+
+As syntactic sugar, a setup function will be registered for all registries of
+the form ``setup<registry name``:
+
+    >>> container = Container()
+    >>> registry.setupContainerValues(container)
+    >>> container.data
+    [1, 2]
+
+
+HTML Analyzation Tools
+----------------------
+
+There is a set (currently one ;-) of helpful analyzation tools available.
+
+    >>> from schooltool.testing import analyze
+
+They are designed to ease the inspection of HTML and other testing output.
+
+
+Pick an Element using an XPath expression
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Often you are only interested in a particular element or text. The
+``queryHTML()`` method allows you to specify an XPath query to pick out a
+particular note. A list of all found nodes will be returned. The nodes will be
+returned as a serialized string.
+
+    >>> html = '''
+    ... <html>
+    ...   <head>
+    ...     <title>My Page</title>
+    ...   </head>
+    ...   <body>
+    ...     <h1>This is my page!</h1>
+    ...   </body>
+    ... </html>
+    ... '''
+
+    >>> print analyze.queryHTML('html/body/h1', html)[0]
+    <h1>This is my page!</h1>
+
+It works also with XHTML compliant documents.
+
+    >>> html = '''
+    ... <html xmlns="http://www.w3.org/1999/xhtml">
+    ...   <head>
+    ...     <title>My Page</title>
+    ...   </head>
+    ...   <body>
+    ...     <h1>This is my page!</h1>
+    ...   </body>
+    ... </html>
+    ... '''
+
+    >>> print analyze.queryHTML('html/body/h1', html)[0]
+    <h1>This is my page!</h1>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/testing/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/testing/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/testing/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/testing/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/testing/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/testing/analyze.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/testing/analyze.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/testing/analyze.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,43 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+HTML Analyzation Tools
+
+$Id: analyze.py 5667 2006-01-20 19:19:52Z mg $
+"""
+
+import sys
+import libxml2
+from schooltool.xmlparsing import HTMLDocument
+
+
+def on_error_callback(ctx, msg):
+    sys.stderr.write(msg)
+
+
+def queryHTML(xpath, response):
+    """XXX write me a docstring please XXX"""
+    # We need to shut up libxml2, so it does not spew errors to stderr.
+    libxml2.registerErrorHandler(lambda ctx, error: None, None)
+    doc = HTMLDocument(response)
+    doc.registerNs('', 'http://www.w3.org/1999/xhtml')
+    result = [str(node) for node in doc.query(xpath)]
+    doc.free()
+    libxml2.registerErrorHandler(on_error_callback, None)
+    return result


Property changes on: schooltool/branches/upstream/current/src/schooltool/testing/analyze.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/testing/functional.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/testing/functional.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/testing/functional.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,121 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional Testing Utilities
+
+$Id: functional.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import os
+import unittest
+
+from zope.testing import doctest
+from zope.app.testing.functional import ZCMLLayer as _ZCMLLayer
+from zope.app.testing.functional import FunctionalTestSetup
+from zope.app.testing.functional import FunctionalDocFileSuite
+from zope.app.appsetup.interfaces import IDatabaseOpenedEvent
+import zope.event
+
+from schooltool.testing import analyze
+from schooltool.app.rest.ftests import rest
+
+
+def find_ftesting_zcml():
+    """Find ftesting.zcml to be used for SchoolTool functional tests."""
+    dir = os.path.abspath(os.path.dirname(__file__))
+    while True:
+        filename = os.path.join(dir, 'etc', 'ftesting.zcml')
+        if os.path.exists(filename):
+            return filename # We are testing in an instance
+        filename = os.path.join(dir, 'schooltool-skel', 'etc', 'ftesting.zcml')
+        if os.path.exists(filename):
+            return filename
+        dir = os.path.dirname(dir)
+        if dir == os.path.dirname(dir): # we're looping at the filesystem root
+            raise RuntimeError("I can't find ftesting.zcml!")
+
+
+def install_db_bootstrap_hook():
+    """Install schooltool_db_setup into zope.event.subscribers."""
+    zope.event.subscribers.insert(0, schooltool_db_setup)
+
+
+def uninstall_db_bootstrap_hook():
+    """Remove schooltool_db_setup from zope.event.subscribers."""
+    zope.event.subscribers.remove(schooltool_db_setup)
+
+
+def schooltool_db_setup(event):
+    """IDatabaseOpenedEvent handler that bootstraps SchoolTool."""
+    if IDatabaseOpenedEvent.providedBy(event):
+        import schooltool.app.main
+        server = schooltool.app.main.StandaloneServer()
+        server.bootstrapSchoolTool(event.database)
+
+class ZCMLLayer(_ZCMLLayer):
+
+    def setUp(self):
+        # SchoolTool needs to bootstrap the database first, before the Zope 3
+        # IDatabaseOpenedEvent gets a chance to create its own root folder and
+        # stuff.  Unfortunatelly, we cannot install a IDatabaseOpenedEvent
+        # subscriber via ftesting.zcml and ensure it will get called first.
+        # Instead we place our own subscriber directly into zope.event.subscribers,
+        # where it gets a chance to intercept IDatabaseOpenedEvent before the
+        # Zope 3 event dispatcher sees it.
+        install_db_bootstrap_hook()
+        try:
+            _ZCMLLayer.setUp(self)
+        finally:
+            uninstall_db_bootstrap_hook()
+
+app_functional_layer = ZCMLLayer(find_ftesting_zcml(),
+                                 __name__,
+                                 'app_functional_layer')
+
+
+def collect_ftests(package=None, level=None, layer=None, filenames=None):
+    """Collect all functional doctest files in a given package.
+
+    If `package` is None, looks up the call stack for the right module.
+
+    Returns a unittest.TestSuite.
+    """
+    package = doctest._normalize_module(package)
+    testdir = os.path.dirname(package.__file__)
+    if filenames is None:
+        filenames = [fn for fn in os.listdir(testdir)
+                     if fn.endswith('.txt') and not fn.startswith('.')]
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF |
+                   doctest.NORMALIZE_WHITESPACE |
+                   doctest.REPORT_ONLY_FIRST_FAILURE)
+    suites = []
+    for filename in filenames:
+        suite = FunctionalDocFileSuite(filename, package=package,
+                                       optionflags=optionflags,
+                                       globs={'analyze': analyze,
+                                              'rest': rest})
+        if level is not None:
+            suite.level = level
+        if layer is None:
+            suite.layer = app_functional_layer
+        else:
+            suite.layer = layer
+        suites.append(suite)
+    return unittest.TestSuite(suites)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/testing/functional.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/testing/registry.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/testing/registry.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/testing/registry.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,43 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Testing registries.
+
+$Id: registry.py 5459 2005-12-15 17:28:45Z mg $
+"""
+__docformat__ = 'restructuredtext'
+
+
+_registries = {}
+
+def register(reg_name, func, *args, **kw):
+    reg = _registries.setdefault(reg_name, [])
+    if reg == []:
+        def setupUsingRegistry(*args, **kw):
+            setup(reg_name, *args, **kw)
+        globals()['setup'+reg_name] = setupUsingRegistry
+
+    reg.append((func, args, kw))
+
+
+def setup(reg_name, *args, **kw):
+    for func, orig_args, orig_kw in _registries[reg_name]:
+        all_kw = orig_kw.copy()
+        all_kw.update(kw)
+        func(*(orig_args+args), **all_kw)


Property changes on: schooltool/branches/upstream/current/src/schooltool/testing/registry.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/testing/setup.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/testing/setup.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/testing/setup.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,102 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolBell Testing Support
+
+$Id: setup.py 6300 2006-06-18 22:18:12Z ignas $
+"""
+__docformat__ = 'restructuredtext'
+from schooltool.app.security import setUpLocalAuth
+from schooltool.testing import registry
+
+# ----------------------------- Session setup ------------------------------
+from zope.publisher.interfaces import IRequest
+from zope.app.session.http import CookieClientIdManager
+from zope.app.session.interfaces import ISessionDataContainer
+from zope.app.session.interfaces import IClientId
+from zope.app.session.interfaces import IClientIdManager, ISession
+from zope.app.session.session import ClientId, Session
+from zope.app.session.session import PersistentSessionDataContainer
+from zope.app.testing import ztapi
+def setUpSessions():
+    """Set up the session machinery.
+
+    Do this after placelessSetUp().
+    """
+    ztapi.provideAdapter(IRequest, IClientId, ClientId)
+    ztapi.provideAdapter(IRequest, ISession, Session)
+    ztapi.provideUtility(IClientIdManager, CookieClientIdManager())
+    sdc = PersistentSessionDataContainer()
+    ztapi.provideUtility(ISessionDataContainer, sdc)
+
+
+# --------------------- Create a SchoolBell application --------------------
+from schooltool.app.app import SchoolToolApplication
+def createSchoolToolApplication():
+    """Create a ``SchoolToolApplication`` instance with all its high-level
+    containers."""
+    app = SchoolToolApplication()
+    registry.setupApplicationContainers(app)
+    return app
+
+
+# ----------------- Setup SchoolBell application as a site -----------------
+from zope.interface import directlyProvides
+from zope.app.component.hooks import setSite
+from zope.app.component.site import LocalSiteManager
+from zope.traversing.interfaces import IContainmentRoot
+def setUpSchoolToolSite():
+    """This should only be called after ``placefulSetUp()``."""
+    app = createSchoolToolApplication()
+    directlyProvides(app, IContainmentRoot)
+    app.setSiteManager(LocalSiteManager(app))
+    setUpLocalAuth(app)
+    setSite(app)
+    return app
+
+# --------------- Setup Calendar Adapter and set IHaveCalendar -------------
+from schooltool.app.interfaces import IHaveCalendar
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.cal import getCalendar
+def setUpCalendaring():
+    ztapi.provideAdapter(IHaveCalendar, ISchoolToolCalendar, getCalendar)
+    registry.setupCalendarComponents()
+
+
+# -------------- Setup Timetable Adapter and set IHaveTimetable ------------
+from schooltool.timetable.interfaces import IHaveTimetables, ITimetables
+from schooltool.timetable.interfaces import IOwnTimetables, ICompositeTimetables
+from schooltool.timetable import TimetablesAdapter
+from schooltool.timetable import CompositeTimetables
+def setUpTimetabling():
+    ztapi.provideAdapter(IOwnTimetables, ITimetables, TimetablesAdapter)
+    ztapi.provideAdapter(IHaveTimetables,
+                         ICompositeTimetables,
+                         CompositeTimetables)
+    registry.setupTimetablesComponents()
+
+
+# ----------------- Setup SchoolTool application preferences ---------------
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.app import getApplicationPreferences
+def setUpApplicationPreferences():
+    """A utility method for setting up the ApplicationPreferences adapter."""
+    ztapi.provideAdapter(ISchoolToolApplication, IApplicationPreferences,
+                         getApplicationPreferences)


Property changes on: schooltool/branches/upstream/current/src/schooltool/testing/setup.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/testing/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/testing/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/testing/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,36 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Testing the package.
+
+$Id: tests.py 5142 2005-10-01 10:25:55Z mg $
+"""
+
+import unittest
+from zope.testing import doctest
+
+
+def test_suite():
+    return unittest.TestSuite((
+        doctest.DocFileSuite('README.txt',
+                             optionflags=doctest.NORMALIZE_WHITESPACE),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/testing/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/testing/util.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/testing/util.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/testing/util.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,426 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Testing Utilities
+
+$Id: util.py 5986 2006-04-27 15:17:13Z faassen $
+"""
+__metaclass__ = type
+
+import cgi
+import sets
+import difflib
+import libxml2
+import unittest
+from pprint import pformat
+from StringIO import StringIO
+
+from zope.interface import implements
+from zope.traversing.interfaces import IContainmentRoot
+
+
+def unidiff(old, new, oldlabel="expected output", newlabel="actual output"):
+    """Display a compact unified diff between old text and new text.
+
+    Bugs: does not work when old or new is an empty string (this seems to
+    be a bug/limitation of the Python 2.3 difflib module).
+    """
+    return "\n".join(difflib.unified_diff(old.splitlines(), new.splitlines(),
+                                          oldlabel, newlabel, lineterm=''))
+
+
+def diff(old, new, oldlabel="expected output", newlabel="actual output"):
+    """Display a unified diff between old text and new text."""
+    old = old.splitlines()
+    new = new.splitlines()
+
+    diff = ['--- %s' % oldlabel, '+++ %s' % newlabel]
+
+    def dump(tag, x, lo, hi):
+        for i in xrange(lo, hi):
+            diff.append(tag + x[i])
+
+    differ = difflib.SequenceMatcher(a=old, b=new)
+    for tag, alo, ahi, blo, bhi in differ.get_opcodes():
+        if tag == 'replace':
+            dump('-', old, alo, ahi)
+            dump('+', new, blo, bhi)
+        elif tag == 'delete':
+            dump('-', old, alo, ahi)
+        elif tag == 'insert':
+            dump('+', new, blo, bhi)
+        elif tag == 'equal':
+            dump(' ', old, alo, ahi)
+        else:
+            raise AssertionError('unknown tag %r' % tag)
+    return "\n".join(diff)
+
+
+def pformat_set(s):
+    """Pretty-print a Set."""
+    items = list(s)
+    items.sort()
+    return 'sets.Set(%s)' % pformat(items)
+
+
+
+def normalize_xml(xml, recursively_sort=(), compact=False):
+    """Normalizes an XML document.
+
+    The idea is that two semantically equivalent XML documents should be
+    normalized into the same canonical representation.  Therefore if two
+    documents compare equal after normalization, they are semantically
+    equivalent.
+
+    The canonical representation used here has nothing to do with W3C Canonical
+    XML.
+
+    This function normalizes indentation, whitespace and newlines (except
+    inside text nodes), element attribute order, expands character references,
+    expands shorthand notation of empty XML elements ("<br/>" becomes
+    "<br></br>").
+
+    If an element has an attribute test:sort="children", the attribute is
+    removed and its immediate child nodes are sorted textually.  If the
+    attribute value is test:sort="recursively", the sorting happens at
+    all levels (unless specifically prohibited with test:sort="not").
+
+    If recursively_sort is given, it is a sequence of tags that will have
+    test:sort="recursively" automatically appended to their attribute lists in
+    the text.  Use it when you cannot or do not want to modify the XML document
+    itself.
+
+    If compact is True, nodes that only have text (without newlines) will be
+    presented more compactly ("<tag>text</tag>").
+
+    Caveats:
+     - normalize_xml does not deal well with text nodes
+     - normalize_xml does not help when different prefixes are used for the
+       same namespace
+     - normalize_xml does not handle all XML features (CDATA sections, inline
+       DTDs, processing instructions, comments)
+    """
+
+    class Document:
+
+        def __init__(self):
+            self.children = []
+            self.sort_recursively = False
+
+        def render(self, level=0):
+            result = []
+            for child in self.children:
+                result.append(child.render(level))
+            return ''.join(result)
+
+    class Element:
+
+        def __init__(self, parent, tag, attrlist, sort=False,
+                     sort_recursively=False):
+            self.parent = parent
+            self.tag = tag
+            self.attrlist = attrlist
+            self.children = []
+            self.sort = sort
+            self.sort_recursively = sort_recursively
+
+        def render(self, level):
+            result = []
+            indent = '  ' * level
+            line = '%s<%s' % (indent, self.tag)
+            for attr in self.attrlist:
+                if len(line + attr) < 78:
+                    line += attr
+                else:
+                    result.append(line)
+                    result.append('\n')
+                    line = '%s %s%s' % (indent, ' ' * len(self.tag), attr)
+            if self.children:
+                s = ''.join([child.render(level+1) for child in self.children])
+            else:
+                s = ''
+            if not s:
+                result.append('%s/>\n' % line)
+            elif (compact and len(self.children) == 1 and '<' not in s
+                  and s.count('\n') == 1):
+                result.append('%s>%s</%s>\n' % (line, s.strip(), self.tag))
+            else:
+                result.append('%s>\n' % line)
+                result.append(s)
+                result.append('%s</%s>\n' % (indent, self.tag))
+            return ''.join(result)
+
+        def finalize(self):
+            if self.sort:
+                self.children.sort(lambda x, y: cmp(x.key, y.key))
+            self.key = self.render(0)
+
+    class Text:
+
+        def __init__(self, data):
+            self.data = data
+            self.key = None
+
+        def render(self, level):
+            data = cgi.escape(self.data.strip())
+            if data:
+                indent = '  ' * level
+                return ''.join(['%s%s\n' % (indent, line.strip())
+                                for line in data.splitlines()])
+            else:
+                return ''
+
+    class Handler:
+
+        def __init__(self):
+            self.level = 0
+            self.result = []
+            self.root = self.cur = Document()
+            self.last_text = None
+
+        def startElement(self, tag, attrs):
+            sort = sort_recursively = self.cur.sort_recursively
+            if attrs:
+                if 'test:sort' in attrs:
+                    value = attrs['test:sort']
+                    del attrs['test:sort']
+                    if value == 'children':
+                        sort = True
+                    elif value == 'recursively':
+                        sort = sort_recursively = True
+                    elif value == 'not':
+                        sort = sort_recursively = False
+                attrlist = attrs.items()
+                attrlist.sort()
+                attrlist = [' %s="%s"' % (k, cgi.escape(v, True))
+                            for k, v in attrlist]
+            else:
+                attrlist = []
+            child = Element(self.cur, tag, attrlist, sort=sort,
+                            sort_recursively=sort_recursively)
+            self.cur.children.append(child)
+            self.cur = child
+            self.last_text = None
+
+        def endElement(self, tag):
+            self.cur.finalize()
+            self.cur = self.cur.parent
+            self.last_text = None
+
+        def characters(self, data):
+            if self.last_text is not None:
+                self.last_text.data += data
+            else:
+                self.last_text = Text(data)
+                self.cur.children.append(self.last_text)
+
+        def render(self):
+            return self.root.render()
+
+    for tag in recursively_sort:
+        xml = xml.replace('<%s' % tag,
+                          '<%s test:sort="recursively"' % tag)
+    try:
+        handler = Handler()
+        ctx = libxml2.createPushParser(handler, "", 0, "")
+        ret = ctx.parseChunk(xml, len(xml), True)
+        if ret:
+            return "PARSE ERROR: %r\n%s" % (ret, xml)
+        return ''.join(handler.render())
+    except libxml2.parserError, e:
+        return "ERROR: %s" % e
+
+
+def run_unit_tests(testcase):
+    r"""Hack to call into unittest from doctests.
+
+        >>> class SampleTestCase(unittest.TestCase):
+        ...     def test1(self):
+        ...         self.assertEquals(2 + 2, 4)
+        >>> run_unit_tests(SampleTestCase)
+
+        >>> class BadTestCase(SampleTestCase):
+        ...     def test2(self):
+        ...         self.assertEquals(2 * 2, 5)
+        >>> run_unit_tests(BadTestCase) # doctest: +REPORT_NDIFF
+        .F
+        ======================================================================
+        FAIL: test2 (schooltool.app.tests.test_app.BadTestCase)
+        ----------------------------------------------------------------------
+        Traceback (most recent call last):
+        ...
+        AssertionError: 4 != 5
+        <BLANKLINE>
+        ----------------------------------------------------------------------
+        Ran 2 tests in ...s
+        <BLANKLINE>
+        FAILED (failures=1)
+
+    """
+    testsuite = unittest.makeSuite(testcase)
+    output = StringIO()
+    result = unittest.TextTestRunner(output).run(testsuite)
+    if not result.wasSuccessful():
+        print output.getvalue(),
+
+
+
+class _Anything:
+    """An object that is equal to any other object."""
+
+    def __eq__(self, other):
+        return True
+
+    def __ne__(self, other):
+        return False
+
+    def __repr__(self):
+        return 'Anything'
+
+Anything = _Anything()
+
+
+class EqualsSortedMixin:
+    """Mixin that adds a helper method for comparing lists ignoring order."""
+
+    def assertEqualsSorted(self, a, b):
+        x = list(a)
+        y = list(b)
+        x.sort()
+        y.sort()
+        self.assertEquals(x, y)
+
+    assertEqualSorted = assertEqualsSorted
+
+
+class NiceDiffsMixin:
+    """Mixin that changes assertEquals to show a unified diff of pretty-printed
+    values.
+    """
+
+    def assertEquals(self, results, expected, msg=None):
+        if msg is None:
+            if (isinstance(expected, basestring)
+                and isinstance(results, basestring)):
+                msg = "\n" + diff(expected, results)
+            elif (isinstance(expected, sets.Set)
+                and isinstance(results, sets.Set)):
+                msg = "\n" + diff(pformat_set(expected), pformat_set(results))
+            else:
+                msg = "\n" + diff(pformat(expected), pformat(results))
+        unittest.TestCase.assertEquals(self, results, expected, msg)
+
+    assertEqual = assertEquals
+
+
+
+class XMLCompareMixin:
+
+    def assertEqualsXML(self, result, expected, recursively_sort=()):
+        """Assert that two XML documents are equivalent.
+
+        If recursively_sort is given, it is a sequence of tags that
+        will have test:sort="recursively" appended to their attribute lists
+        in 'result' text.  See the docstring for normalize_xml for more
+        information about this attribute.
+        """
+        result = normalize_xml(result, recursively_sort=recursively_sort)
+        expected = normalize_xml(expected, recursively_sort=recursively_sort)
+        self.assertEquals(result, expected, "\n" + diff(expected, result))
+
+    assertEqualXML = assertEqualsXML
+
+
+def compareXML(result, expected, recursively_sort=()):
+    """Compare 2 XML snippets for equality.
+
+    This is a doctest version of XMLCompareMixin.assertEqualsXML.
+
+    If recursively_sort is given, it is a sequence of tags that will have
+    test:sort="recursively" appended to their attribute lists in 'result' text.
+    See the docstring for normalize_xml for more information about this
+    attribute.
+    """
+    result = normalize_xml(result, recursively_sort=recursively_sort)
+    expected = normalize_xml(expected, recursively_sort=recursively_sort)
+    if result == expected:
+        return True
+    else:
+        print diff(expected, result)
+        return False
+
+
+class QuietLibxml2Mixin:
+    """Text mixin that disables libxml2 error reporting.
+
+    Sadly the API of libxml2 does not allow us to restore the error reporting
+    function in tearDown.  <Insert derogatory comments here>
+    """
+
+    def setUpLibxml2(self):
+        import libxml2
+        libxml2.registerErrorHandler(lambda ctx, error: None, None)
+
+    def tearDownLibxml2(self):
+        import libxml2
+        # It's not possible to restore the error handler that was installed
+        # before (libxml2 API limitation), so we set up a generic one that
+        # prints everything to stdout.
+        def on_error_callback(ctx, msg):
+            sys.stderr.write(msg)
+        libxml2.registerErrorHandler(on_error_callback, None)
+
+
+
+class FakeRoot(object):
+    implements(IContainmentRoot)
+
+
+class FakeFolder(object):
+    def __init__(self, parent, name):
+        self.__parent__ = parent
+        self.__name__ = name
+
+
+def fakePath(obj, path):
+    """Make zapi.absoluteURL(obj) return url.
+
+        >>> from zope.app import zapi
+        >>> from zope.app.testing import setup
+        >>> setup.placelessSetUp()
+        >>> setup.setUpTraversal()
+
+        >>> class Stub: pass
+        >>> obj = Stub()
+        >>> fakePath(obj, '/dir/subdir/name')
+        >>> zapi.absoluteURL(obj, TestRequest())
+        'http://127.0.0.1/dir/subdir/name'
+
+        >>> setup.placelessTearDown()
+
+    """
+    folder = FakeRoot()
+    bits = [name for name in path.split('/') if name]
+    for name in bits[:-1]:
+        folder = FakeFolder(folder, name)
+    name = bits and bits[-1] or ''
+    obj.__parent__ = folder
+    obj.__name__ = name
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/testing/util.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2 @@
+# Make a package.
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/tests/test_client.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/tests/test_client.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/tests/test_client.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,717 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.client
+"""
+
+import unittest
+import socket
+import sys
+import base64
+from StringIO import StringIO
+from xml.sax import make_parser
+from xml.sax.handler import feature_namespaces
+
+from schooltool.common import dedent
+from schooltool.testing.util import diff
+
+__metaclass__ = type
+
+
+class HTTPStub:
+
+    open_connections = []
+
+    def __init__(self, host, port=7001):
+        self.host = host
+        self.port = port
+        self.sent_headers = {}
+        self.sent_data = ''
+
+        if host == 'badhost':
+            raise socket.error(-2, 'Name or service not known')
+        if port != 7001:
+            raise socket.error(111, 'Connection refused')
+
+        self.open_connections.append(self)
+
+    def request(self, method, url, body=None, headers={}):
+        self.putrequest(method, url)
+        if body:
+            self.putheader('Content-Length', str(len(body)))
+        for k, v in headers.items():
+            self.putheader(k, v)
+        self.endheaders()
+        if body:
+            self.send(body)
+
+    def putrequest(self, method, resource, *args, **kw):
+        self.method = method
+        self.resource = resource
+
+    def putheader(self, key, value):
+        self.sent_headers[key.lower()] = value
+
+    def endheaders(self):
+        pass
+
+    def getresponse(self):
+        return ResponseStub(self)
+
+    def send(self, s):
+        if not s:
+            raise AssertionError("send('') breaks when SSL is used")
+        self.sent_data += s
+
+    def close(self):
+        self.open_connections.remove(self)
+
+
+class ResponseStub:
+
+    def __init__(self, request):
+        self.request = request
+        self.status = 200
+        self.reason = "OK"
+        if self.request.resource == "/":
+            self._data = "Welcome"
+        elif self.request.resource == "/binfile":
+            self._data = "(binary data)"
+        elif self.request.resource == "/doc.xml":
+            self._data = dedent(u"""
+                <index xmlns:xlink="http://www.w3.org/1999/xlink">
+                  <student xlink:type="simple"
+                           xlink:href="student1"
+                           xlink:title="John \u263B"/>
+                  <student xlink:type="simple"
+                           xlink:href="student2"
+                           xlink:title="Kate"/>
+                </index>
+                """).encode('UTF-8')
+        elif self.request.resource == "/place_to_put_things":
+            self._data = ("%s %s %s\n%s"
+                          % (self.request.method,
+                             self.request.sent_headers['content-type'],
+                             self.request.sent_headers['content-length'],
+                             self.request.sent_data))
+        elif self.request.resource == "/delete_me":
+            self._data = ("%s" % (self.request.method, ))
+        else:
+            self.status = 404
+            self.reason = "Not Found"
+            self._data = "404 :-)"
+
+    def read(self):
+        if self.request not in HTTPStub.open_connections:
+            raise AssertionError("read() called after connection was closed.")
+        try:
+            return self._data
+        finally:
+            self._data = None
+
+    def getheader(self, name, default=None):
+        if name.lower() == 'content-type':
+            if self.request.resource == "/":
+                return 'text/plain'
+            elif self.request.resource == "/binfile":
+                return 'application/octet-stream'
+            elif self.request.resource == "/doc.xml":
+                return 'text/xml; charset=UTF-8'
+            else:
+                return 'text/plain'
+        elif name.lower() == 'x-random-server-header':
+            return '42'
+        return default
+
+    def getheaders(self):
+        return [(hdr, self.getheader(hdr))
+                for hdr in ['Content-Type', 'X-Random-Server-Header']]
+
+
+class TestClient(unittest.TestCase):
+
+    def setUp(self):
+        from schooltool.client import Client
+        class StdinStub:
+            isatty = lambda self: True
+        self.client = Client()
+        self.client.stdin = StdinStub()
+        self.emitted = ""
+        def emit(*args):
+            if self.emitted:
+                self.emitted = "%s\n%s" % (self.emitted, ' '.join(args))
+            else:
+                self.emitted = ' '.join(args)
+        self.client.emit = emit
+        # self.client.ssl = False -- implied
+        self.client.connectionFactory = HTTPStub
+        self.client.secureConnectionFactory = HTTPStub
+
+    def test_ssl(self):
+        self.client.ssl = True
+        self.client.connectionFactory = None
+        self.client.secureConnectionFactory = HTTPStub
+        self.emitted = ""
+        self.client.server = 'localhost'
+        self.client.links = False
+        self.client.do_get("/")
+        self.assertEmitted(dedent("""
+            200 OK
+            Content-Type: text/plain
+            Welcome"""))
+        self.assertEqual(self.client.last_data, "Welcome")
+
+        self.emitted = ""
+        self.client.ssl = False
+        self.client.connectionFactory = HTTPStub
+        self.client.do_get("/")
+        self.assertEmitted(dedent("""
+            200 OK
+            Content-Type: text/plain
+            Welcome"""))
+        self.assertEqual(self.client.last_data, "Welcome")
+        self.client.secureConnectionFactory = None
+
+    def test_setupPrompt_noninteractive(self):
+        class StdinStub:
+            isatty = lambda self: False
+        self.client.stdin = StdinStub()
+        self.client.prompt = "# "
+        self.client.extra_prompt = "> "
+        self.client.intro = "Hello"
+        self.client._setupPrompt()
+        self.assertEquals(self.client.prompt, "")
+        self.assertEquals(self.client.extra_prompt, "")
+        self.assertEquals(self.client.intro, "")
+
+    def test_setupPrompt_no_curses(self):
+        class StdinStub:
+            isatty = lambda self: True
+        class CursesStub:
+            error = Exception
+            def setupterm(self):
+                raise self.error, "testing"
+        try:
+            sys.modules['curses'] = CursesStub()
+            self.client.stdin = StdinStub()
+            self.client.prompt = "# "
+            self.client.extra_prompt = "> "
+            self.client.intro = "Hello"
+            self.client._setupPrompt()
+            self.assertEquals(self.client.prompt, "# ")
+            self.assertEquals(self.client.extra_prompt, "> ")
+            self.assertEquals(self.client.intro, "Hello")
+        finally:
+            try:
+                del sys.modules['curses']
+            except KeyError:
+                pass
+
+    def test_setupPrompt_no_color(self):
+        class StdinStub:
+            isatty = lambda self: True
+        class CursesStub:
+            error = Exception
+            _terminfo = {}
+            def setupterm(self):
+                pass
+            def tigetstr(self, s):
+                return self._terminfo.get(s)
+        try:
+            sys.modules['curses'] = CursesStub()
+            self.client.stdin = StdinStub()
+            self.client.prompt = "# "
+            self.client.extra_prompt = "> "
+            self.client.intro = "Hello"
+            self.client._setupPrompt()
+            self.assertEquals(self.client.prompt, "# ")
+            self.assertEquals(self.client.extra_prompt, "> ")
+            self.assertEquals(self.client.intro, "Hello")
+        finally:
+            try:
+                del sys.modules['curses']
+            except KeyError:
+                pass
+
+    def test_setupPrompt_color(self):
+        class StdinStub:
+            isatty = lambda self: True
+        class CursesStub:
+            error = Exception
+            _terminfo = {'bold': '<B>', 'sgr0': '<N>'}
+            def setupterm(self):
+                pass
+            def tigetstr(self, s):
+                return self._terminfo.get(s)
+        try:
+            sys.modules['curses'] = CursesStub()
+            self.client.stdin = StdinStub()
+            self.client.prompt = "# "
+            self.client.extra_prompt = "> "
+            self.client.intro = "Hello"
+            self.client._setupPrompt()
+            self.assertEquals(self.client.prompt,
+                              "\001<B>\002SchoolTool>\001<N>\002 ")
+            self.assertEquals(self.client.extra_prompt,
+                              "\001<B>\002%(what)s>\001<N>\002 ")
+            self.assertEquals(self.client.intro, "Hello")
+        finally:
+            try:
+                del sys.modules['curses']
+            except KeyError:
+                pass
+
+    def test_help(self):
+        self.client.onecmd("?help")
+        self.assertEmitted("This help.")
+
+    def test_server(self):
+        self.client.do_server('x y z w')
+        self.assertEmitted("Extra arguments provided")
+
+        self.emitted = ""
+        self.client.do_server("server.example.com")
+        self.assertEqual(self.client.server, "server.example.com")
+        self.assertEmitted("Error: could not connect to server.example.com:80")
+
+        self.emitted = ""
+        self.client.do_server("srvr2.example.com  \t")
+        self.assertEqual(self.client.server, "srvr2.example.com")
+        self.assertEmitted("Error: could not connect to srvr2.example.com:80")
+
+        self.emitted = ""
+        self.client.do_server("")
+        self.assertEqual(self.client.server, "srvr2.example.com")
+        self.assertEmitted("srvr2.example.com")
+
+        self.emitted = ""
+        self.client.do_server("server 31337 plain")
+        self.assertEqual(self.client.server, "server")
+        self.assertEqual(self.client.port, 31337)
+        self.assertEqual(self.client.ssl, False)
+        self.assertEmitted("Error: could not connect to server:31337")
+
+        self.emitted = ""
+        self.client.do_server("server 443 ssl")
+        self.assertEqual(self.client.server, "server")
+        self.assertEqual(self.client.port, 443)
+        self.assertEqual(self.client.ssl, True)
+        self.assertEmitted("Error: could not connect to server:443")
+
+        self.emitted = ""
+        self.client.do_server("other www")
+        self.assertEqual(self.client.server, "server")
+        self.assertEqual(self.client.port, 443)
+        self.assertEqual(self.client.ssl, True)
+        self.assertEmitted("Invalid port number")
+
+        self.emitted = ""
+        self.client.do_server("server 31337")
+        self.assertEqual(self.client.server, "server")
+        self.assertEqual(self.client.port, 31337)
+        # Make sure the SSL option has been reset.
+        self.assertEqual(self.client.ssl, False)
+        self.assertEmitted("Error: could not connect to server:31337")
+
+        self.emitted = ""
+        self.client.do_server("ignored 567 bogus")
+        self.assertEmitted("'ssl' or 'plain' expected, got 'bogus'")
+        self.assertEqual(self.client.server, "server")
+        self.assertEqual(self.client.port, 31337)
+        self.assertEqual(self.client.ssl, False)
+
+    def test_accept(self):
+        self.client.do_accept(" ")
+        self.assertEmitted('text/xml')
+
+        self.emitted = ""
+        self.client.do_accept("text/plain  ")
+        self.assertEmitted('text/plain')
+
+        self.emitted = ""
+        self.client.do_accept("text/xml, text/plain,  text/*   ")
+        self.assertEmitted('text/xml, text/plain, text/*')
+
+    def test_accept(self):
+        self.assertEqual(self.client.user, None)
+        self.assertEqual(self.client.password, "")
+        self.client.do_user(" ")
+        self.assertEqual(self.client.user, None)
+        self.assertEqual(self.client.password, "")
+        self.assertEmitted('User Anonymous')
+        self.emitted = ""
+        self.client.do_user("foo")
+        self.assertEqual(self.client.user, "foo")
+        self.assertEqual(self.client.password, "")
+        self.assertEmitted('User foo')
+
+        self.emitted = ""
+        self.client.do_user("foo bar")
+        self.assertEqual(self.client.user, "foo")
+        self.assertEqual(self.client.password, "bar")
+        self.assertEmitted('User foo')
+
+    def test_get(self):
+        self.client.do_get('   ')
+        self.assertEmitted("Resource not provided")
+
+        self.emitted = ""
+        self.client.do_get('x y')
+        self.assertEmitted("Extra arguments provided")
+
+        self.emitted = ""
+        self.client.server = 'localhost'
+        self.client.links = False
+        self.client.do_get("/")
+        self.assertEmitted(dedent("""
+            200 OK
+            Content-Type: text/plain
+            Welcome"""))
+        self.assertEqual(self.client.last_data, "Welcome")
+        self.assertEqual(HTTPStub.open_connections, [])
+
+    def test_get_binary(self):
+        self.client.server = 'localhost'
+        self.client.do_get("/binfile")
+        self.assertEmitted(dedent("""
+            200 OK
+            Content-Type: application/octet-stream
+            Resource is not text, use save <filename> to save it"""))
+        self.assertEqual(self.client.last_data, "(binary data)")
+
+    def test_get_error(self):
+        self.client.server = 'badhost'
+        self.client.do_get("/")
+        self.assertEmitted("Error: could not connect to badhost:7001")
+        self.assert_(self.client.last_data is None)
+
+    def test_save_no_get(self):
+        self.client.do_save("tempfile")
+        self.assertEmitted("Perform a get first")
+
+    def test_save_no_filename(self):
+        self.client.last_data = "xyzzy"
+        self.client.do_save("")
+        self.assertEmitted("No filename")
+
+    def test_save(self):
+        instances = []
+        class FileStub(StringIO):
+            def __init__(self, filename, mode):
+                StringIO.__init__(self)
+                self.filename = filename
+                self.mode = mode
+                self.closed = False
+                instances.append(self)
+            def close(self):
+                self.closed = True
+        filename = "tempfile"
+        self.client.last_data = data = "xyzzy"
+        self.client.file_hook = FileStub
+        self.client.do_save(filename)
+        self.assertEqual(len(instances), 1)
+        file = instances[0]
+        self.assertEqual(file.filename, filename)
+        self.assertEqual(file.mode, 'wb')
+        self.assertEqual(file.getvalue(), data)
+        self.assert_(file.closed)
+        self.assertEmitted("Saved %s: %d bytes" % (filename, len(data)))
+
+    def test_save_failure(self):
+        class FileStub:
+            msg = 'simulated failure'
+            def __init__(self, filename, mode):
+                raise EnvironmentError(self.msg)
+        filename = "tempfile"
+        self.client.last_data = data = "xyzzy"
+        self.client.file_hook = FileStub
+        self.client.do_save(filename)
+        self.assertEmitted(FileStub.msg)
+
+    def test_put(self):
+        self.do_test_put_or_post('put')
+
+    def test_post(self):
+        self.do_test_put_or_post('post')
+
+    def do_test_put_or_post(self, what):
+        doit = getattr(self.client, 'do_%s' % what)
+        self.client.input_hook = lambda prompt: '.'
+        doit('   ')
+        self.assertEmitted("Resource not provided")
+
+        self.emitted = ""
+        doit('x y z')
+        self.assertEmitted("Extra arguments provided")
+
+        self.emitted = ""
+        self.client.resources = ['x']
+        doit('/place_to_put_things')
+        self.assertEmitted(dedent("""
+            End data with a line containing just a single period.
+            200 OK
+            Content-Type: text/plain
+            %s text/plain 0
+            """) % what.upper())
+        self.assertEqual(self.client.resources, [])
+        self.assertEqual(self.client.last_data,
+                         '%s text/plain 0\n' % what.upper())
+
+        self.emitted = ""
+        lines = ['.', '..', '...', 'foo']
+        self.client.input_hook = lambda prompt: lines.pop()
+        doit('/place_to_put_things text/x-plain')
+        self.assertEmitted(dedent("""
+            End data with a line containing just a single period.
+            200 OK
+            Content-Type: text/plain
+            %s text/x-plain 9
+            foo
+            ..
+            .
+            """) % what.upper())
+
+        def raise_eof(prompt):
+            raise EOFError
+        self.emitted = ""
+        self.client.input_hook = raise_eof
+        doit('/place_to_put_things')
+        self.assertEmitted(dedent("""
+            End data with a line containing just a single period.
+            Unexpected EOF -- %s aborted""") % what.upper())
+
+        self.emitted = ""
+        self.client.input_hook = lambda prompt: '.'
+        doit('/binfile')
+        self.assertEmitted(dedent("""
+            End data with a line containing just a single period.
+            200 OK
+            Content-Type: application/octet-stream
+            Resource is not text, use save <filename> to save it"""))
+        self.assertEqual(self.client.last_data, "(binary data)")
+
+    def test_delete(self):
+        self.client.do_delete('   ')
+        self.assertEmitted("Resource not provided")
+
+        self.emitted = ""
+        self.client.do_delete('x y')
+        self.assertEmitted("Extra arguments provided")
+
+        self.emitted = ""
+        self.client.resources = ['x']
+        self.client.do_delete('/delete_me')
+        self.assertEmitted(dedent("""
+            200 OK
+            Content-Type: text/plain
+            DELETE"""))
+        self.assertEqual(self.client.resources, [])
+        self.assertEqual(self.client.last_data, 'DELETE')
+
+    def test_headers(self):
+        self.assertEqual(self.client.headers, False) # initial state
+        data = (('on', True), ('off', False), ('ON', True), ('OFf', False))
+        for arg, result in data:
+            self.client.do_headers(arg)
+            self.assertEqual(self.client.headers, result)
+        self.assertEmitted("")
+
+        self.client.do_headers("")
+        self.assertEmitted("off")
+        self.client.do_headers("on")
+        self.emitted = ""
+        self.client.do_headers("")
+        self.assertEmitted("on")
+
+        self.emitted = ""
+        self.client.do_headers("42")
+        self.assertEmitted("'on' or 'off' expected, got '42'")
+
+    def test_request_shows_headers(self):
+        self.client.headers = True
+        self.client._request('GET', '/')
+        self.assertEmitted(dedent("""
+            200 OK
+            Content-Type: text/plain
+            X-Random-Server-Header: 42
+
+            Welcome"""))
+
+    def test_links(self):
+        self.assertEqual(self.client.links, True)
+        data = (('on', True), ('off', False), ('ON', True), ('OFf', False))
+        for set, result in data:
+            self.client.do_links(set)
+            self.assertEqual(self.client.links, result)
+        self.assertEmitted("")
+
+        self.client.do_links("")
+        self.assertEmitted("off")
+        self.client.do_links("on")
+        self.emitted = ""
+        self.client.do_links("")
+        self.assertEmitted("on")
+
+        self.emitted = ""
+        self.client.do_links("42")
+        self.assertEmitted("'on' or 'off' expected, got '42'")
+
+    def test_links_get(self):
+        self.assertEqual(self.client.links, True)
+        self.client.do_get("/doc.xml")
+        self.assertEmitted(dedent(u"""
+            200 OK
+            Content-Type: text/xml; charset=UTF-8
+            <index xmlns:xlink="http://www.w3.org/1999/xlink">
+              <student xlink:type="simple"
+                       xlink:href="student1"
+                       xlink:title="John \u263B"/>
+              <student xlink:type="simple"
+                       xlink:href="student2"
+                       xlink:title="Kate"/>
+            </index>
+
+            ==================================================
+            1   John \u263B (student1)
+            2   Kate (student2)"""))
+        self.assertEqual(self.client.resources,
+                         ['/student1', '/student2'])
+
+        self.emitted = ""
+        self.client.do_get("/")
+        self.assertEmitted(dedent("""
+            200 OK
+            Content-Type: text/plain
+            Welcome"""))
+
+    def test_follow(self):
+        self.client.links = False
+        self.client.do_follow('1')
+        self.assertEmitted("Wrong link number")
+        self.emitted = ""
+        self.client.resources = ['/doc.xml']
+        self.client.do_follow('1')
+        self.assertEmitted(dedent(u"""
+            200 OK
+            Content-Type: text/xml; charset=UTF-8
+            <index xmlns:xlink="http://www.w3.org/1999/xlink">
+              <student xlink:type="simple"
+                       xlink:href="student1"
+                       xlink:title="John \u263B"/>
+              <student xlink:type="simple"
+                       xlink:href="student2"
+                       xlink:title="Kate"/>
+            </index>
+            """))
+
+    def test_quit(self):
+        self.assert_(self.client.do_quit(""))
+
+    def test_default(self):
+        self.assert_(self.client.default("EOF"))
+        self.assertEmitted("quit")
+        self.emitted = ""
+        self.assert_(not self.client.default("somethingelse"))
+        self.assertEmitted("I beg your pardon?")
+
+    def test_emptyline(self):
+        self.client.lastcmd = "quit"
+        self.assert_(not self.client.emptyline())
+        self.assertEmitted("")
+
+    def test_authentication(self):
+        self.client.user = "foo"
+        self.client.password = "bar"
+        hash = base64.encodestring("foo:bar").strip()
+        self.client._request("GET", "/")
+        self.assertEqual(self.client.lastconn.sent_headers['authorization'],
+                         "Basic " + hash)
+
+    def test_no_authentication(self):
+        self.client._request("GET", "/")
+        self.assert_('authorization' not in self.client.lastconn.sent_headers)
+
+    def assertEmitted(self, what):
+        self.assertEqual(self.emitted, what, "\n" + diff(what, self.emitted))
+
+    # TODO: unit tests for load_snapshot and save_snapshot would be nice
+
+
+class TestXLinkHandler(unittest.TestCase):
+
+    def setUp(self):
+        from schooltool.client import XLinkHandler
+        self.parser = make_parser()
+        self.handler = XLinkHandler()
+        self.parser.setContentHandler(self.handler)
+        self.parser.setFeature(feature_namespaces, 1)
+
+    def test_simple(self):
+        link = dedent("""
+            <top xmlns:xlink="http://www.w3.org/1999/xlink">
+              <tag xlink:type="simple"
+                   xlink:title="foo"
+                   xlink:href="bar"
+                   name="Bond"
+                   />
+
+              <noxlinks />
+              <tag xlink:type="simple"
+                   xlink:title="moo"
+                   xlink:href="spoo"
+                   xlink:role="http://www.example.com/role"/>
+            </top>
+            """)
+        self.parser.parse(StringIO(link))
+        self.assertEqual(self.handler.links,
+                         [{'type':'simple', 'title': 'foo', 'href': 'bar'},
+                          {'type':'simple', 'title': 'moo', 'href': 'spoo',
+                           'role': "http://www.example.com/role"}])
+
+
+class TestUtilities(unittest.TestCase):
+
+    def test_http_join(self):
+        from schooltool.client import http_join
+        self.assertEqual(http_join('/', 'foo'), '/foo')
+        self.assertEqual(http_join('/foo', 'bar'), '/bar')
+        self.assertEqual(http_join('/foo/bar', '../baz'), '/baz')
+        self.assertEqual(http_join('/foo/bar', '/baz'), '/baz')
+        self.assertEqual(http_join('/foo/bar', './baz'), '/foo/baz')
+        self.assertEqual(http_join('/foo/bar/', './baz'), '/foo/bar/baz')
+        self.assertRaises(IndexError, http_join, '/foo/bar', '../../baz')
+        self.assertRaises(ValueError, http_join, 'foo/bar', '../baz')
+        self.assertRaises(ValueError, http_join, '/foo/bar', 'baz//quux')
+        # That ain't right, but let's document it anyway
+        self.assertRaises(ValueError, http_join,
+                          'http://example.com/foo', '../baz')
+        self.assertRaises(ValueError, http_join,
+                          '/foo/bar', 'http://www.akl.lt/programos')
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestClient))
+    suite.addTest(unittest.makeSuite(TestXLinkHandler))
+    suite.addTest(unittest.makeSuite(TestUtilities))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/tests/test_client.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/tests/test_common.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/tests/test_common.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/tests/test_common.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,75 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2004 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.common
+
+$Id: test_common.py 5185 2005-10-07 17:11:28Z mg $
+"""
+
+import unittest
+import datetime
+from zope.testing.doctest import DocTestSuite
+
+__metaclass__ = type
+
+
+class TestHelpers(unittest.TestCase):
+
+    # parse_date has a doctest
+
+    def test_parse_datetime(self):
+        from schooltool.common import parse_datetime
+        dt = datetime.datetime
+        valid_dates = (
+            ("2000-01-01 00:00:00", dt(2000, 1, 1, 0, 0, 0, 0)),
+            ("2000-01-01 00:00:00.000000", dt(2000, 1, 1, 0, 0, 0, 0)),
+            ("2000-01-01T00:00:00", dt(2000, 1, 1, 0, 0, 0, 0)),
+            ("2005-12-23 11:22:33", dt(2005, 12, 23, 11, 22, 33)),
+            ("2005-12-23T11:22:33", dt(2005, 12, 23, 11, 22, 33)),
+            ("2005-12-23T11:22:33.4", dt(2005, 12, 23, 11, 22, 33, 400000)),
+            ("2005-12-23T11:22:33.456789", dt(2005, 12, 23, 11, 22, 33,
+                                              456789)),
+        )
+        for s, d in valid_dates:
+            result = parse_datetime(s)
+            self.assertEquals(result, d,
+                              "parse_datetime(%r) returned %r" % (s, result))
+        invalid_dates = (
+            "2000/01/01",
+            "2100-02-29 00:00:00",
+            "2005-12-23 11:22:33 "
+        )
+        for s in invalid_dates:
+            try:
+                result = parse_datetime(s)
+            except ValueError:
+                pass
+            else:
+                self.fail("parse_datetime(%r) did not raise" % s)
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(DocTestSuite('schooltool.common'))
+    suite.addTest(unittest.makeSuite(TestHelpers))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/tests/test_common.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/tests/test_xmlparsing.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/tests/test_xmlparsing.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/tests/test_xmlparsing.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,207 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2004 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.xmlparsing
+
+$Id: test_xmlparsing.py 5202 2005-10-10 13:30:24Z mg $
+"""
+
+import unittest
+import libxml2
+from zope.testing.doctest import DocTestSuite
+from schooltool.testing.util import QuietLibxml2Mixin
+
+
+def test_xpath_context_sharing():
+    """XMLDocument and XMLNode instances share the same XPath context.
+
+    We want to make sure that this sharing does not break XPath queries.
+
+        >>> from schooltool.xmlparsing import XMLDocument
+        >>> doc = XMLDocument('''
+        ...    <sample>
+        ...      <child>
+        ...        <grandchild/>
+        ...      </child>
+        ...    </sample>
+        ... ''')
+
+    Queries performed from the document are relative to the document node
+    (which is a parent of the document element).
+
+        >>> len(doc.query('sample'))
+        1
+        >>> len(doc.query('child'))
+        0
+
+    Queries performed from a child node are relative to that node.
+
+        >>> child = doc.query('//child')[0]
+        >>> len(child.query('grandchild'))
+        1
+        >>> len(child.query('sample'))
+        0
+
+    XMLDocument.query resets the context node of the shared XPath context.
+
+        >>> len(doc.query('sample'))
+        1
+        >>> len(doc.query('child'))
+        0
+
+    """
+
+
+def test_xpath_namespace_sharing():
+    """XMLDocument and XMLNode instances share the same set of namespaces.
+
+        >>> from schooltool.xmlparsing import XMLDocument
+        >>> doc = XMLDocument('''
+        ...   <sample xmlns="http://example.com/ns/samplens"
+        ...           xmlns:xlink="http://www.w3.org/1999/xlink">
+        ...      <a xlink:type="simple" xlink:href="http://example.com" />
+        ...   </sample>
+        ... '''.lstrip())
+        >>> doc.registerNs('sample', 'http://example.com/ns/samplens')
+        >>> doc.registerNs('xlnk', 'http://www.w3.org/1999/xlink')
+
+        >>> node = doc.query('/sample:sample')[0]
+        >>> len(node.query('a'))
+        0
+        >>> len(node.query('sample:a'))
+        1
+
+        >>> node = doc.query('//sample:a')[0]
+        >>> node['xlnk:type']
+        u'simple'
+
+    """
+
+
+def test_multilevel_query():
+    """Regression test for a bug in XMLNode.query.
+
+    XMLNode.query would pass self instead of self._doc to XMLNodes
+    that it created.
+
+        >>> from schooltool.xmlparsing import XMLDocument
+        >>> doc = XMLDocument('<a><b><c>d</c></b></a>')
+        >>> a = doc.query('a')[0]
+        >>> b = a.query('b')[0]
+        >>> c = b.query('c')[0]
+        >>> c.content
+        u'd'
+
+    """
+
+
+def test_xmlnode_repr():
+    """The XML Node represents itself as the serialized version of the XML.
+
+        >>> from schooltool.xmlparsing import XMLDocument
+        >>> doc = XMLDocument('<html><body><h1>Title</h1></body></html>')
+        >>> doc.query('html/body/h1')[0]
+        '<h1>Title</h1>'
+        >>> print str(doc.query('html/body/h1')[0])
+        <h1>Title</h1>
+
+        >>> doc.free()
+    """
+
+
+def test_validate_ill_formed_document():
+    """Regression test for a bug in XMLDocument.__init__.
+
+    validate_against_schema may raise a libxml2.parseError that was not
+    caught in XMLDocument.__init__.
+
+        >>> from schooltool.xmlparsing import XMLDocument
+        >>> schema = '''
+        ...   <grammar xmlns="http://relaxng.org/ns/structure/1.0">
+        ...     <start>
+        ...       <element name="sample">
+        ...         <text/>
+        ...       </element>
+        ...     </start>
+        ...   </grammar>
+        ... '''
+        >>> XMLDocument("<ill></formed>", schema)
+        Traceback (most recent call last):
+          ...
+        XMLParseError: Ill-formed document.
+
+    Double-check that invalid schemas are caught.
+
+        >>> XMLDocument("<sample>Foo!</sample>", '<ill></formed>')
+        Traceback (most recent call last):
+          ...
+        XMLSchemaError: Invalid RelaxNG schema.
+
+    """
+
+
+class TestRelaxNGValidation(QuietLibxml2Mixin, unittest.TestCase):
+
+    def setUp(self):
+        self.setUpLibxml2()
+
+    def tearDown(self):
+        self.tearDownLibxml2()
+
+    def test_validate_against_schema(self):
+        from schooltool.xmlparsing import validate_against_schema
+        schema = '''<?xml version="1.0" encoding="UTF-8"?>
+            <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                ns="http://schooltool.org/ns/test"
+                datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+              <start>
+                <element name="foo">
+                    <attribute name="bar">
+                      <text/>
+                    </attribute>
+                </element>
+              </start>
+            </grammar>
+            '''
+
+        xml = '<foo xmlns="http://schooltool.org/ns/test" bar="baz"/>'
+        self.assert_(validate_against_schema(schema, xml))
+
+        badxml = '<foo xmlns="http://schooltool.org/ns/test" baz="baz"/>'
+        self.assert_(not validate_against_schema(schema, badxml))
+
+        notxml = 'who am I?'
+        self.assertRaises(libxml2.parserError,
+                          validate_against_schema, schema, notxml)
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    mixin = QuietLibxml2Mixin()
+    suite.addTest(unittest.makeSuite(TestRelaxNGValidation))
+    suite.addTest(DocTestSuite('schooltool.xmlparsing',
+                               setUp=lambda *args: mixin.setUpLibxml2(),
+                               tearDown=lambda *args: mixin.tearDownLibxml2()))
+    suite.addTest(DocTestSuite(setUp=lambda *args: mixin.setUpLibxml2(),
+                               tearDown=lambda *args: mixin.tearDownLibxml2()))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/tests/test_xmlparsing.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+Note that most of the documentation for this package is in __init__.py.


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,691 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetabling in SchoolTool
+=========================
+
+Note: timetabling here refers to the management of timetables of resources,
+persons and groups.  It is not related to automatic timetable generation
+or constraint solving.
+
+Every application object (person, group or a resource) can have a number of
+timetables.  First, the timetables can vary in the timetable schema (e.g. a
+school may have a 4-day rotating timetable for classes, and then another
+timetable for events that recur weekly). Second, there are separate timetables
+for different time periods (terms).
+
+Global containers
+-----------------
+
+A list of all defined timetable schemas is available in app['ttschemas']
+(see ISchoolToolApplication, ITimetableSchemaContainer).
+
+A list of all defined terms is available in app['terms'] (see
+ISchoolToolApplication, ITermContainer).
+
+Every timetable is defined for a given schema and a given term.  A tuple
+consisting of the schema's ID and the terms's ID is often refered to as a
+timetable's key.
+
+Objects that have timetables
+----------------------------
+
+An object that has (or may have) timetables implements
+IHaveTimetables.  The timetables themselves are stored in annotations
+and can be accessed through by adapting the owner to ITimetables.
+
+An object's composite timetable is derived by combining the object's
+timetable with composite timetables of other objects, acquired by
+calling subscribers of ITimetableSource interface.
+
+Timetables
+----------
+
+A timetable consists of several days, each of which has several periods (the
+sets of periods for different days may be different), and each period may have
+zero or more timetable activities (two or more activities represent scheduling
+conflicts).  See ITimetable, ITimetableDay, ITimetableActivity.
+
+A timetable model describes the mapping between timetable days and calendar
+days, and also the mapping between period IDs and time of the day.  Currently
+SchoolTool has two kinds of timetable models:
+
+  - Sequential days model may jump over calendar days if they are not school
+    days.  For example, if July 3 was timetable day 3, and July 4 is a holiday,
+    then July 5 will be timetable day 4.
+
+  - Weekly model maps week days directly to timetable days, that is, Monday is
+    always timetable day 1, and sunday is always timetable day 7.
+
+It is possible to define additional models.  See ITimetableModel.
+
+Example of a timetable::
+
+    day_id:     Monday      Tuesday     ... Friday
+    period_ids: 8:00-8:45   8:00-8:45   ... 8:00-8:40
+                9:00-9:45   9:00-9:45   ... 8:55-9:35
+                10:00-10:45 10:00-10:45 ... 10:50-10:30
+                ...         ...         ... ...
+                17:00-17:45 17:00-17:45 ... 16:15-16:55
+
+    For this particular timetable, timetable days are named after week days
+    (but note that there is no Saturday or Sunday because there are no classes
+    on those days), periods are named after time periods, and the set of
+    periods is the same for all days except for Friday.  This timetable
+    will be used with a weekly timetable model.
+
+Another example:
+
+    day_id:     Day 1  Day 2 ... Day 10
+    period_ids: 8:00   8:00  ... 8:00
+                9:00   9:00  ... 9:00
+                10:00  10:00 ... 10:00
+                ...    ...   ... ...
+                17:00  17:00 ... 17:00
+
+    For this particular timetable, timetable days are named sequentially,
+    periods are named after time periods (but only include the starting time),
+    and the set of periods is the same for all days.  This timetable will
+    be used with a sequential timetable model.
+
+Another example:
+
+    day_id:     Day 1  Day 2 ... Day 4
+    period_ids: A      B     ... D
+                B      C     ... A
+                C      D     ... B
+                D      A     ... C
+
+    For this particular timetable, timetable days are named sequentially,
+    periods are named arbitrarily, and the set of periods is the same for all
+    days, but listed in a different order.  This timetable will be used with a
+    sequential timetable model.
+
+Timetable schemas
+-----------------
+
+A timetable schema is like a timetable that has no activities and no exeptions.
+You can create an empty timetable by calling the createTimetable method of a
+schema.  See ITimetableSchema, ITimetableSchemaDay.
+
+$Id: __init__.py 6565 2007-01-11 16:43:11Z ignas $
+"""
+
+from sets import Set, ImmutableSet
+
+import zope.event
+from persistent import Persistent
+from persistent.dict import PersistentDict
+from zope.component import adapts
+from zope.interface import directlyProvides, implements
+
+from zope.app import zapi
+from zope.annotation.interfaces import IAnnotations
+from zope.location.interfaces import ILocation
+from zope.traversing.api import getPath
+from zope.app.generations.utility import findObjectsProviding
+
+from schooltool.calendar.simple import ImmutableCalendar
+
+# appease the gods of circular imports
+from schooltool.app.interfaces import ISchoolToolCalendarEvent
+from schooltool.app.interfaces import ISchoolToolCalendar
+
+from schooltool.timetable.interfaces import ITimetableCalendarEvent
+from schooltool.timetable.interfaces import IBookResources
+from schooltool.timetable.interfaces import ITimetable, ITimetableWrite
+from schooltool.timetable.interfaces import ITimetableDay, ITimetableDayWrite
+from schooltool.timetable.interfaces import ITimetableDict
+from schooltool.timetable.interfaces import ITimetableActivity
+from schooltool.timetable.interfaces import ITimetableActivityAddedEvent
+from schooltool.timetable.interfaces import ITimetableActivityRemovedEvent
+from schooltool.timetable.interfaces import ITimetableReplacedEvent
+from schooltool.timetable.interfaces import ISchooldaySlot
+from schooltool.timetable.interfaces import ISchooldayTemplate
+from schooltool.timetable.interfaces import ISchooldayTemplateWrite
+from schooltool.timetable.interfaces import ITimetables, IHaveTimetables, IOwnTimetables
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.timetable.interfaces import ITimetableSource
+from schooltool.timetable.interfaces import ITimetableSchema
+from schooltool.timetable.interfaces import Unchanged
+from schooltool.term.interfaces import ITerm
+from schooltool.app.app import getSchoolToolApplication
+
+# Imports for ZODB compatibility
+from schooltool.timetable.model import BaseTimetableModel
+from schooltool.timetable.model import WeeklyTimetableModel
+from schooltool.timetable.model import SequentialDaysTimetableModel
+from schooltool.timetable.model import SequentialDayIdBasedTimetableModel
+from schooltool.timetable.model import TimetableCalendarEvent
+
+
+##############################################################################
+
+#
+# Timetabling
+#
+
+class Timetable(Persistent):
+
+    implements(ITimetable, ITimetableWrite)
+
+    __name__ = None
+    __parent__ = None
+
+    timezone = 'UTC'
+
+    def __init__(self, day_ids):
+        """Create a new empty timetable.
+
+        day_ids is a sequence of the day ids of this timetable.
+
+        The caller must then assign a TimetableDay for each day ID and
+        set the model before trying to use the timetable.
+        """
+        self.day_ids = day_ids
+        self.days = PersistentDict()
+        self.model = None
+
+    def keys(self):
+        return list(self.day_ids)
+
+    def items(self):
+        return [(day, self.days[day]) for day in self.day_ids]
+
+    def __repr__(self):
+        return '<Timetable: %s, %s, %s>' % (self.day_ids, dict(self.days),
+                                            self.model)
+
+    def __getitem__(self, key):
+        return self.days[key]
+
+    def __setitem__(self, key, value):
+        if not ITimetableDay.providedBy(value):
+            raise TypeError("Timetable can only contain ITimetableDay objects "
+                            "(got %r)" % (value,))
+        elif key not in self.day_ids:
+            raise ValueError("Key %r not in day_ids %r" % (key, self.day_ids))
+        elif value.timetable is not None:
+            raise ValueError("%r already belongs to timetable %r"
+                             % (value, value.timetable))
+        value.timetable = self
+        value.day_id = key
+        self.days[key] = value
+
+    def clear(self, send_events=True):
+        for day in self.days.itervalues():
+            for period in day.periods:
+                day.clear(period, send_events)
+
+    def update(self, other):
+        if self.cloneEmpty() != other.cloneEmpty():
+            raise ValueError("Timetables have different schemas")
+        for day, period, activity in other.activities():
+            self[day].add(period, activity, send_events=False)
+
+    def cloneEmpty(self):
+        other = Timetable(self.day_ids)
+        other.model = self.model
+        other.timezone = self.timezone
+        for day_id in self.day_ids:
+            other[day_id] = TimetableDay(self[day_id].periods,
+                                         self[day_id].homeroom_period_ids)
+        return other
+
+    def __eq__(self, other):
+        if ITimetable.providedBy(other):
+            return (self.items() == other.items()
+                    and self.model == other.model
+                    and self.timezone == other.timezone)
+        else:
+            return False
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def activities(self):
+        act = []
+        for day_id in self.day_ids:
+            for period_id, iactivities in self.days[day_id].items():
+                act.extend([(day_id, period_id, activity) for activity in iactivities])
+        return act
+
+
+class TimetableDay(Persistent):
+
+    implements(ITimetableDay, ITimetableDayWrite)
+
+    timetable = None
+    day_id = None
+
+    def __init__(self, periods=(), homeroom_period_ids=None):
+        if homeroom_period_ids is not None:
+            for id in homeroom_period_ids:
+                assert id in periods
+        else:
+            homeroom_period_ids = []
+        self.periods = periods
+        self.homeroom_period_ids = homeroom_period_ids
+        self.activities = PersistentDict()
+        for p in periods:
+            self.activities[p] = Set() # MaybePersistentKeysSet()
+
+    def keys(self):
+        return self.periods
+
+    def items(self):
+        return [(period, self.activities[period]) for period in self.periods]
+
+    def __getitem__(self, period):
+        return self.activities[period]
+
+    def clear(self, period, send_events=True):
+        if period not in self.periods:
+            raise ValueError("Key %r not in periods %r" % (period,
+                                                           self.periods))
+        activities = [act.replace(timetable=self.timetable)
+                      for act in self.activities[period]]
+        self.activities[period].clear()
+        if send_events:
+            for act in activities:
+                ev = TimetableActivityRemovedEvent(act, self.day_id, period)
+                zope.event.notify(ev)
+
+    def add(self, period, activity, send_events=True):
+        if period not in self.periods:
+            raise ValueError("Key %r not in periods %r" % (period,
+                                                           self.periods))
+        if not ITimetableActivity.providedBy(activity):
+            raise TypeError("TimetableDay can only contain ITimetableActivity"
+                            " objects (got %r)" % (activity, ))
+
+        if activity.timetable is None:
+            activity = activity.replace(timetable=self.timetable)
+        self.activities[period].add(activity)
+
+        if send_events:
+            activity = activity.replace(timetable=self.timetable)
+            event = TimetableActivityAddedEvent(activity, self.day_id, period)
+            zope.event.notify(event)
+
+    def remove(self, period, value, send_events=True):
+        if period not in self.periods:
+            raise ValueError("Key %r not in periods %r"
+                             % (period, self.periods))
+        self.activities[period].remove(value)
+        if send_events:
+            activity = value.replace(timetable=self.timetable)
+            ev = TimetableActivityRemovedEvent(activity, self.day_id, period)
+            zope.event.notify(ev)
+
+    def __eq__(self, other):
+        if not ITimetableDay.providedBy(other):
+            return False
+        if self.periods != other.periods:
+            return False
+        if self.homeroom_period_ids != other.homeroom_period_ids:
+            return False
+        for period in self.periods:
+            if Set(self.activities[period]) != Set(other.activities[period]):
+                return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+
+class TimetableActivity(object):
+    """Timetable activity.
+
+    Instances are immutable.
+
+    Equivalent timetable activities must compare and hash equally after
+    pickling and unpickling.
+    """
+
+    implements(ITimetableActivity)
+
+    def __init__(self, title=None, owner=None, timetable=None, resources=None):
+        self._title = title
+        self._owner = owner
+        self._timetable = timetable
+        if resources:
+            self._resources = tuple(resources)
+        else:
+            self._resources = ()
+
+    title = property(lambda self: self._title)
+    owner = property(lambda self: self._owner)
+    timetable = property(lambda self: self._timetable)
+    resources = property(lambda self: self._resources)
+
+    def __repr__(self):
+        return ("TimetableActivity(%r, %r, %r, %r)"
+                % (self.title, self.owner, self.timetable, self.resources))
+
+    def __eq__(self, other):
+        # Is it really a good idea to ignore self.timetable?
+        # On further thought it does not matter -- we never compare activities
+        # that come from timetables with different keys.
+        if ITimetableActivity.providedBy(other):
+            return self.title == other.title and self.owner == other.owner
+        else:
+            return False
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __hash__(self):
+        return hash((self.title, self.owner))
+
+    def replace(self, title=Unchanged, owner=Unchanged, timetable=Unchanged,
+                resources=Unchanged):
+        if title is Unchanged: title = self.title
+        if owner is Unchanged: owner = self.owner
+        if timetable is Unchanged: timetable = self.timetable
+        if resources is Unchanged: resources = self.resources
+        return TimetableActivity(title=title, owner=owner, timetable=timetable,
+                                 resources=resources)
+
+
+class TimetableReplacedEvent(object):
+
+    implements(ITimetableReplacedEvent)
+
+    def __init__(self, object, key, old_timetable, new_timetable):
+        self.object = object
+        self.key = key
+        self.old_timetable = old_timetable
+        self.new_timetable = new_timetable
+
+    def __unicode__(self):
+        return ("TimetableReplacedEvent object=%s (%s) key=%s"
+                % (getPath(self.object), self.object.title, self.key))
+
+
+class TimetableActivityEvent(object):
+
+    def __init__(self, activity, day_id, period_id):
+        self.activity = activity
+        self.day_id = day_id
+        self.period_id = period_id
+
+
+class TimetableActivityAddedEvent(TimetableActivityEvent):
+    implements(ITimetableActivityAddedEvent)
+
+
+class TimetableActivityRemovedEvent(TimetableActivityEvent):
+    implements(ITimetableActivityRemovedEvent)
+
+
+class SchooldaySlot(object):
+
+    implements(ISchooldaySlot)
+
+    def __init__(self, tstart, duration):
+        self.tstart = tstart
+        self.duration = duration
+
+    def __eq__(self, other):
+        if not ISchooldaySlot.providedBy(other):
+            return False
+        return (self.tstart == other.tstart and
+                self.duration == other.duration)
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    def __cmp__(self, other):
+        return cmp((self.tstart, self.duration),
+                   (other.tstart, other.duration))
+
+    def __hash__(self):
+        return hash((self.tstart, self.duration))
+
+
+# BBB for ZODB
+# The hash function was changed, but an exmeriment showed that we're
+# alright, the identical slots will be collapsed in the
+# SchooldayTemplate.events set.
+SchooldayPeriod = SchooldaySlot
+
+
+class SchooldayTemplate(object):
+
+    # TODO: ideally, schoolday template should be an object that takes
+    # a date and a period id and returns a schoolday period.  This way
+    # we would get rid of the bizzare weekday -> schoolday template
+    # mapping in the timetable model.
+
+    implements(ISchooldayTemplate, ISchooldayTemplateWrite)
+
+    def __init__(self):
+        self.events = Set()
+
+    def __iter__(self):
+        return iter(sorted(self.events))
+
+    def add(self, obj):
+        if not ISchooldaySlot.providedBy(obj):
+            raise TypeError("SchooldayTemplate can only contain "
+                            "ISchooldaySlots (got %r)" % (obj,))
+        self.events.add(obj)
+
+    def remove(self, obj):
+        self.events.remove(obj)
+
+    def __eq__(self, other):
+        if isinstance(other, SchooldayTemplate):
+            return self.events == other.events
+        else:
+            return False
+
+    def __ne__(self, other):
+        return not self == other
+
+
+
+#
+#  Things for integrating timetabling into the core code.
+#
+
+class TimetableDict(PersistentDict):
+
+    implements(ILocation, ITimetableDict)
+
+    __name__ = 'timetables'
+    __parent__ = None
+
+    def __setitem__(self, key, value):
+        assert ITimetable.providedBy(value)
+        keys = key.split(".")
+        if len(keys) != 2 or not keys[0] or not keys[1]:
+            raise ValueError("The key should be composed of a term id and a"
+                             " schema id separated with a . (got %r)" % key)
+        old_value = self.get(key)
+        if old_value is not None:
+            old_value.__parent__ = None
+            old_value.__name__ = None
+        value.__parent__ = self
+        value.__name__ = key
+        PersistentDict.__setitem__(self, key, value)
+        event = TimetableReplacedEvent(self.__parent__, key, old_value, value)
+        zope.event.notify(event)
+
+    def __delitem__(self, key):
+        value = self[key]
+        value.__parent__ = None
+        value.__name__ = None
+        PersistentDict.__delitem__(self, key)
+        zope.event.notify(
+            TimetableReplacedEvent(self.__parent__, key, value, None))
+
+    def clear(self):
+        for key, value in self.items():
+            del self[key]
+
+    def _not_implemented(self, *args, **kw):
+        raise NotImplementedError(
+                "This method is not implemented in TimetableDict.  Feel free"
+                " to implement it, if you need it, but make sure the semantics"
+                " of changes are preserved (i.e. update __parent__ and"
+                " __name__, and send out events when needed).")
+
+    update = _not_implemented
+    setdefault = _not_implemented
+    pop = _not_implemented
+    popitem = _not_implemented
+
+
+TIMETABLES_KEY = 'schooltool.timetable.timetables'
+
+class TimetablesAdapter(object):
+    """This adapter adapts any annotatable object to be timetabled.
+
+    It provides ``ITimetables`` with the default semantics of
+    timetable composition by membership and logic for searching for
+    ``ICompositeTimetableProvider`` facets.
+    """
+    implements(ITimetables)
+    adapts(IOwnTimetables)
+
+    def __init__(self, context):
+        self.object = context
+        annotations = IAnnotations(context)
+        self.timetables = annotations.get(TIMETABLES_KEY)
+        if self.timetables is None:
+            self.timetables = annotations[TIMETABLES_KEY] = TimetableDict()
+            self.timetables.__parent__ = context
+
+
+class CompositeTimetables(object):
+    """Adapter of IHaveTimetables to ICompositeTimetables.
+
+    It just wraps a IHaveTimetables object under an ICompositeTimetables
+    interface.
+
+        >>> from schooltool.timetable.tests.test_timetable import Parent
+        >>> obj = Parent()
+        >>> ct = CompositeTimetables(obj)
+        >>> ICompositeTimetables.providedBy(ct)
+        True
+
+        >>> obj.getCompositeTimetable = lambda term, schema: [term, schema]
+        >>> ct.getCompositeTimetable("term", "schema")
+        ['term', 'schema']
+
+    """
+    adapts(IHaveTimetables)
+    implements(ICompositeTimetables)
+
+    def __init__(self, context):
+        self.context = context
+
+    def _collectSourceObjects(self):
+        objs = []
+        for adapter in zapi.subscribers((self.context, ), ITimetableSource):
+            objs.extend(adapter.getTimetableSourceObjects())
+        return set(objs)
+
+    def makeTimetableCalendar(self, first=None, last=None):
+
+        limited = (first is not None and
+                   last is not None)
+        def inRange(event):
+            return first <= event.schoolDay() <= last
+
+        events = []
+        for obj in self._collectSourceObjects():
+            cal = ISchoolToolCalendar(obj)
+            for event in cal:
+                if (ITimetableCalendarEvent.providedBy(event) and
+                    (not limited or inRange(event))):
+                    events.append(event)
+        result = ImmutableCalendar(events)
+        # Parent is needed so that we can find out the owner of this calendar.
+        directlyProvides(result, ILocation)
+        result.__parent__ = self.context
+        result.__name__ = 'timetable-calendar'
+        return result
+
+
+def findRelatedTimetables(ob):
+    """Finds all timetables in the app instance that use a given object
+
+    The object can be either a school timetable or a term.
+
+    Returns a list of Timetable objects.
+    """
+    if ITerm.providedBy(ob):
+        index = 0
+    elif ITimetableSchema.providedBy(ob):
+        index = 1
+    else:
+        raise TypeError("Expected a Term or a TimetableSchema, got %r" %
+                        (ob, ))
+
+    app = getSchoolToolApplication(ob)
+    timetables = []
+
+    for ttowner in findObjectsProviding(app, IOwnTimetables):
+        timetables += ITimetables(ttowner).timetables.values()
+
+    result = []
+    for tt in timetables:
+        if tt.__name__.split('.')[index] == ob.__name__:
+            result.append(tt)
+
+    return result
+
+
+def addToApplication(event):
+    from schooltool.timetable.schema import TimetableSchemaContainer
+    event.object['ttschemas'] = TimetableSchemaContainer()
+
+
+def registerTestSetup():
+    from schooltool.testing import registry
+
+    def addTTSchemasContainer(app):
+        from schooltool.timetable.schema import TimetableSchemaContainer
+        app['ttschemas'] = TimetableSchemaContainer()
+
+    registry.register('ApplicationContainers', addTTSchemasContainer)
+
+registerTestSetup()
+del registerTestSetup
+
+##############################################################################
+# BBB: Make sure the old data object references are still there.
+from zope.deprecation import deprecated
+
+from schooltool.term.term import TermContainer, Term
+deprecated(('TermContainer', 'Term'),
+           'This class has moved to schooltool.term.term. '
+           'The reference will be gone in 0.15')
+
+from schooltool.timetable.schema import (TimetableSchemaContainer,
+                                         TimetableSchema,
+                                         TimetableSchemaDay)
+
+deprecated(('TimetableSchemaContainer', 'TimetableSchema',
+            'TimetableSchemaDay'),
+           'This class has moved to schooltool.timetable.schema. '
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,821 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool timetabling views.
+
+$Id: __init__.py 6887 2007-04-24 11:14:07Z ignas $
+"""
+import datetime
+import sets
+import re
+
+from zope.app import zapi
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.component import adapts
+from zope.interface import implements
+from zope.publisher.browser import BrowserView
+from zope.publisher.interfaces import NotFound
+from zope.security.proxy import removeSecurityProxy
+
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolCalendar
+from schooltool.app.membership import URIGroup, URIMember
+from schooltool.calendar.utils import parse_date, parse_time
+from schooltool.course.booking import URISection
+from schooltool.course.interfaces import ISection
+from schooltool.person.interfaces import IPerson
+from schooltool.relationship.relationship import getRelatedObjects
+from schooltool.resource.interfaces import IBaseResource
+from schooltool.term.term import getNextTermForDate, getTermForDate
+from schooltool.timetable import SchooldaySlot
+from schooltool.timetable import Timetable, TimetableDay
+from schooltool.timetable import TimetableActivity
+from schooltool.timetable.interfaces import ITimetable, IOwnTimetables
+from schooltool.timetable.interfaces import ITimetables, IHaveTimetables
+from schooltool.traverser.interfaces import ITraverserPlugin
+from schooltool import SchoolToolMessage as _
+
+
+class TabindexMixin(object):
+    """Tab index calculator mixin for views."""
+
+    def __init__(self):
+        self.__tabindex = 0
+        self.__tabindex_matrix = []
+
+    def next_tabindex(self):
+        """Return the next tabindex.
+
+          >>> view = TabindexMixin()
+          >>> [view.next_tabindex() for n in range(5)]
+          [1, 2, 3, 4, 5]
+
+        See the docstring for tabindex_matrix for an example where
+        next_tabindex() returns values out of order
+        """
+        if self.__tabindex_matrix:
+            return self.__tabindex_matrix.pop(0)
+        else:
+            self.__tabindex += 1
+            return self.__tabindex
+
+    def tabindex_matrix(self, nrows, ncols):
+        """Ask next_tabindex to return transposed tab indices for a matrix.
+
+        For example, suppose that you have a 3 x 5 matrix like this:
+
+               col1 col2 col3 col4 col5
+          row1   1    4    7   10   13
+          row2   2    5    8   11   14
+          row3   3    6    9   12   15
+
+        Then you do
+
+          >>> view = TabindexMixin()
+          >>> view.tabindex_matrix(3, 5)
+          >>> [view.next_tabindex() for n in range(5)]
+          [1, 4, 7, 10, 13]
+          >>> [view.next_tabindex() for n in range(5)]
+          [2, 5, 8, 11, 14]
+          >>> [view.next_tabindex() for n in range(5)]
+          [3, 6, 9, 12, 15]
+
+        After the matrix is finished, next_tabindex reverts back to linear
+        allocation:
+
+          >>> [view.next_tabindex() for n in range(5)]
+          [16, 17, 18, 19, 20]
+
+        """
+        first = self.__tabindex + 1
+        self.__tabindex_matrix += [first + col * nrows + row
+                                     for row in range(nrows)
+                                       for col in range(ncols)]
+        self.__tabindex += nrows * ncols
+
+
+class TimetablesTraverser(object):
+    """A traverser that allows to traverse to a timetable of its context."""
+
+    adapts(IOwnTimetables)
+    implements(ITraverserPlugin)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        if name == 'timetables':
+            return ITimetables(self.context).timetables
+
+        raise NotFound(self.context, name, request)
+
+
+def fix_duplicates(names):
+    """Change a list of names so that there are no duplicates.
+
+    Trivial cases:
+
+      >>> fix_duplicates([])
+      []
+      >>> fix_duplicates(['a', 'b', 'c'])
+      ['a', 'b', 'c']
+
+    Simple case:
+
+      >>> fix_duplicates(['a', 'b', 'b', 'a', 'b'])
+      ['a', 'b', 'b (2)', 'a (2)', 'b (3)']
+
+    More interesting cases:
+
+      >>> fix_duplicates(['a', 'b', 'b', 'a', 'b (2)', 'b (2)'])
+      ['a', 'b', 'b (3)', 'a (2)', 'b (2)', 'b (2) (2)']
+
+    """
+    seen = sets.Set(names)
+    if len(seen) == len(names):
+        return names    # no duplicates
+    result = []
+    used = sets.Set()
+    for name in names:
+        if name in used:
+            n = 2
+            while True:
+                candidate = '%s (%d)' % (name, n)
+                if not candidate in seen:
+                    name = candidate
+                    break
+                n += 1
+            seen.add(name)
+        result.append(name)
+        used.add(name)
+    return result
+
+
+def parse_time_range(value, default_duration=None):
+    """Parse a range of times (e.g. 9:45-14:20).
+
+    Example:
+
+        >>> parse_time_range('9:45-14:20')
+        (datetime.time(9, 45), datetime.timedelta(0, 16500))
+
+        >>> parse_time_range('00:00-24:00')
+        (datetime.time(0, 0), datetime.timedelta(1))
+
+        >>> parse_time_range('10:00-10:00')
+        (datetime.time(10, 0), datetime.timedelta(0))
+
+    Time ranges may span midnight
+
+        >>> parse_time_range('23:00-02:00')
+        (datetime.time(23, 0), datetime.timedelta(0, 10800))
+
+    When the default duration is specified, you may omit the second time
+
+        >>> parse_time_range('23:00', 45)
+        (datetime.time(23, 0), datetime.timedelta(0, 2700))
+
+    Invalid values cause a ValueError
+
+        >>> parse_time_range('something else')
+        Traceback (most recent call last):
+          ...
+        ValueError: bad time range: something else
+
+        >>> parse_time_range('9:00')
+        Traceback (most recent call last):
+          ...
+        ValueError: duration is not specified
+
+        >>> parse_time_range('9:00-9:75')
+        Traceback (most recent call last):
+          ...
+        ValueError: minute must be in 0..59
+
+        >>> parse_time_range('5:99-6:00')
+        Traceback (most recent call last):
+          ...
+        ValueError: minute must be in 0..59
+
+        >>> parse_time_range('14:00-24:01')
+        Traceback (most recent call last):
+          ...
+        ValueError: hour must be in 0..23
+
+    White space can be inserted between times
+
+        >>> parse_time_range(' 9:45 - 14:20 ')
+        (datetime.time(9, 45), datetime.timedelta(0, 16500))
+
+    but not inside times
+
+        >>> parse_time_range('9: 45-14:20')
+        Traceback (most recent call last):
+          ...
+        ValueError: bad time range: 9: 45-14:20
+
+    """
+    m = re.match(r'\s*(\d+):(\d+)\s*(?:-\s*(\d+):(\d+)\s*)?$', value)
+    if not m:
+        raise ValueError('bad time range: %s' % value)
+    h1, m1 = int(m.group(1)), int(m.group(2))
+    if not m.group(3):
+        if default_duration is None:
+            raise ValueError('duration is not specified')
+        duration = default_duration
+    else:
+        h2, m2 = int(m.group(3)), int(m.group(4))
+        if (h2, m2) != (24, 0):   # 24:00 is expressly allowed here
+            datetime.time(h2, m2) # validate the second time
+        duration = (h2*60+m2) - (h1*60+m1)
+        if duration < 0:
+            duration += 1440
+    return datetime.time(h1, m1), datetime.timedelta(minutes=duration)
+
+
+def format_time_range(start, duration):
+    """Format a range of times (e.g. 9:45-14:20).
+
+    Example:
+
+        >>> format_time_range(datetime.time(9, 45),
+        ...                   datetime.timedelta(0, 16500))
+        '09:45-14:20'
+
+        >>> format_time_range(datetime.time(0, 0), datetime.timedelta(1))
+        '00:00-24:00'
+
+        >>> format_time_range(datetime.time(10, 0), datetime.timedelta(0))
+        '10:00-10:00'
+
+        >>> format_time_range(datetime.time(23, 0),
+        ...                   datetime.timedelta(0, 10800))
+        '23:00-02:00'
+
+    """
+    end = (datetime.datetime.combine(datetime.date.today(), start) + duration)
+    ends = end.strftime('%H:%M')
+    if ends == '00:00' and duration == datetime.timedelta(1):
+        return '00:00-24:00' # special case
+    else:
+        return '%s-%s' % (start.strftime('%H:%M'), ends)
+
+
+# XXX: copied this from schooltool-0.9.rest.timetable
+# Remove this once there is a thing like that in REST
+# alga 2005-05-12
+def format_timetable_for_presentation(timetable):
+    """Prepare a timetable for presentation with Page Templates.
+
+    Returns a matrix where columns correspond to days, rows correspond to
+    periods, and cells contain a dict with two keys
+
+      'period' -- the name of this period (different days may have different
+                  periods)
+
+      'activity' -- activity or activities that occur during that period of a
+                    day.
+
+    First, let us create a timetable:
+
+      >>> from pprint import pprint
+      >>> from schooltool.timetable import TimetableActivity
+      >>> timetable = Timetable(['day 1', 'day 2', 'day 3'])
+      >>> timetable['day 1'] = TimetableDay(['A', 'B'])
+      >>> timetable['day 2'] = TimetableDay(['C', 'D', 'E'])
+      >>> timetable['day 3'] = TimetableDay(['F'])
+      >>> timetable['day 1'].add('A', TimetableActivity('Something'))
+      >>> timetable['day 1'].add('B', TimetableActivity('A2'))
+      >>> timetable['day 1'].add('B', TimetableActivity('A1'))
+      >>> timetable['day 2'].add('C', TimetableActivity('Else'))
+      >>> timetable['day 3'].add('F', TimetableActivity('A3'))
+
+    Here's how it looks like
+
+      >>> matrix = format_timetable_for_presentation(timetable)
+      >>> for row in matrix:
+      ...    for cell in row:
+      ...        print '%(period)1s: %(activity)-11s |' % cell,
+      ...    print
+      A: Something   | C: Else        | F: A3          |
+      B: A1 / A2     | D:             |  :             |
+       :             | E:             |  :             |
+
+
+    """
+    rows = []
+    for ncol, (id, day) in enumerate(timetable.items()):
+        for nrow, (period, actiter) in enumerate(day.items()):
+            activities = []
+            for a in actiter:
+                activities.append(a.title)
+            activities.sort()
+            if nrow >= len(rows):
+                rows.append([{'period': '', 'activity': ''}] * ncol)
+            rows[nrow].append({'period': period,
+                               'activity': " / ".join(activities)})
+        for nrow in range(nrow + 1, len(rows)):
+            rows[nrow].append({'period': '', 'activity': ''})
+    return rows
+
+
+class TimetableView(BrowserView):
+
+    __used_for__ = ITimetable
+
+    def title(self):
+        timetabled = self.context.__parent__.__parent__
+        msg = _("${object}'s timetable",
+                mapping = {'object': timetabled.title})
+        return msg
+
+    def rows(self):
+        return format_timetable_for_presentation(self.context)
+
+
+class TimetableConflictMixin(object):
+    """A mixin for views that check for booking conflicts."""
+
+    def sections(self):
+        return getSchoolToolApplication()['sections'].values()
+
+    def sectionMap(self, term, ttschema):
+        """Compute a mapping of timetable slots to sections.
+
+        Returns a dict {(day_id, period_id): Set([section])}.  The set for
+        each period contains all sections that have activities in the
+        (non-composite) timetable during that timetable period.
+        """
+        ttkey = "%s.%s" % (term.__name__, ttschema.__name__)
+        section_map = {}
+        for day_id, day in ttschema.items():
+            for period_id in day.periods:
+                section_map[day_id, period_id] = sets.Set()
+        for section in self.sections():
+            timetable = ITimetables(section).timetables.get(ttkey)
+            if timetable:
+                for day_id, period_id, activity in timetable.activities():
+                    section_map[day_id, period_id].add(section)
+        return section_map
+
+    def getSchema(self):
+        """Return the chosen timetable schema.
+
+        If there are no timetable schemas, None is returned.
+        """
+        app = getSchoolToolApplication()
+        ttschemas = app["ttschemas"]
+        ttschema_id = self.request.get('ttschema', ttschemas.default_id)
+        ttschema = ttschemas.get(ttschema_id, None)
+        if not ttschema and ttschemas:
+            ttschema = ttschemas.values()[0]
+        return ttschema
+
+    def getTerm(self):
+        """Return the chosen term."""
+        if 'term' in self.request:
+            terms = getSchoolToolApplication()["terms"]
+            return terms[self.request['term']]
+        else:
+            return getNextTermForDate(datetime.date.today())
+
+    def getSections(self, item):
+        raise NotImplementedError(
+            "This method should be implemented in subclasses")
+
+    def getGroupSections(self):
+        raise NotImplementedError(
+            "This method should be implemented in subclasses")
+
+    def getTimetable(self):
+        timetables = ITimetables(self.context).timetables
+        term = self.getTerm()
+        ttschema = self.getSchema()
+        key = '.'.join((term.__name__, ttschema.__name__))
+        try:
+            # All timetables for a given ttschema will have the same pattern
+            # regardless of term.
+            return timetables[key]
+        except KeyError:
+            return None
+
+
+class TimetableSetupViewBase(BrowserView, TimetableConflictMixin):
+    """Common methods for setting up timetables."""
+
+    def allSections(self, section_map):
+        """Return a set of all sections that can be selected."""
+        sections = sets.Set()
+        for sectionset in section_map.itervalues():
+            sections.update(sectionset)
+        return sections
+
+    def getDays(self, ttschema, section_map):
+        """Return the current selection.
+
+        Returns a list of dicts with the following keys
+
+            title   -- title of the timetable day
+            periods -- list of timetable periods in that day
+
+        Each period is represented by a dict with the following keys
+
+            title    -- title of the period
+            sections -- all sections that are scheduled for this slot
+            selected -- a list of sections of which self.context is a member,
+                        or a list containing [None] if there are none.
+            in_group -- user is a member of a section as part of a group.
+
+        """
+
+        person_sections = self.getSections(self.context)
+        group_sections = self.getGroupSections()
+
+        def days(schema):
+            for day_id, day in schema.items():
+                yield {'title': day_id,
+                       'periods': list(periods(day_id, day))}
+
+        def sortedbytitle(seq, key=None):
+            l = list(seq)
+            if key is None:
+                l.sort(lambda x, y: cmp(x.title, y.title))
+            else:
+                l.sort(lambda x, y: cmp(x[key].title, y[key].title))
+            return l
+
+        def periods(day_id, day):
+            for period_id in day.periods:
+                sections = section_map[day_id, period_id]
+                sections = sortedbytitle(sections)
+                section_set = set(sections)
+
+                in_group = []
+                for group, section in group_sections:
+                    if section in section_set:
+                        in_group.append({'group': group,
+                                         'section': section})
+                in_group = sortedbytitle(in_group, 'section')
+
+                selected = []
+                if not in_group:
+                    selected = [section for section in person_sections
+                                if section in section_set]
+                    selected = sortedbytitle(selected)
+                if not selected:
+                    selected = [None]
+
+                yield {'title': period_id,
+                       'selected': selected,
+                       'sections': sections,
+                       'in_group': in_group}
+
+        return list(days(ttschema))
+
+    def __call__(self):
+        self.app = getSchoolToolApplication()
+        self.has_timetables = bool(self.app["terms"] and self.app["ttschemas"])
+        if not self.has_timetables:
+            return self.template()
+
+        # TODO Are these really needed in view attributes?
+        self.term = self.getTerm()
+        self.ttschema = self.getSchema()
+        assert self.ttschema is not None, 'no timetable schema'
+        section_map = self.sectionMap(self.term, self.ttschema)
+
+        self.days = self.getDays(self.ttschema, section_map)
+        if 'SAVE' in self.request:
+            student = removeSecurityProxy(self.context)
+            all_sections = self.allSections(section_map)
+            selected = self.request.get('sections', [])
+            for section in all_sections:
+                want = section.__name__ in selected
+                have = student in section.members
+                if want and not have:
+                    section.members.add(student)
+                elif not want and have:
+                    section.members.remove(student)
+            self.days = self.getDays(self.ttschema, section_map)
+        return self.template()
+
+
+class ResourceTimetableSetupView(TimetableSetupViewBase):
+    """A view for scheduling a resource."""
+
+    __used_for__ = IBaseResource
+
+    template = ViewPageTemplateFile('templates/person-timetable-setup.pt')
+
+    def getSections(self, item):
+        return getRelatedObjects(item, URISection)
+
+    def getGroupSections(self):
+        return []
+
+
+class PersonTimetableSetupView(TimetableSetupViewBase):
+    """A view for scheduling a student.
+
+    This view displays a drop-down for every timetable period, listing the
+    sections scheduled for that period.  When the user submits the form, the
+    person is added to selected sections and removed from unselected ones.
+    """
+
+    __used_for__ = IPerson
+
+    template = ViewPageTemplateFile('templates/person-timetable-setup.pt')
+
+    def getSections(self, item):
+        return [section for section in getRelatedObjects(item, URIGroup)
+                if ISection.providedBy(section)]
+
+    def getGroupSections(self):
+        group_sections = []
+        for group in self.context.groups:
+            for section in self.getSections(group):
+                group_sections.append((group, section))
+        return group_sections
+
+
+class SectionTimetableSetupView(TimetableSetupViewBase):
+
+    __used_for__ = ISection
+
+    template = ViewPageTemplateFile('templates/section-timetable-setup.pt')
+
+    def singleSchema(self):
+        return len(self.app['ttschemas'].values()) == 1
+
+    def singleTerm(self):
+        return len(self.app['terms'].values()) == 1
+
+    def getTerms(self):
+        """Return the chosen term."""
+        if 'terms' in self.request:
+            terms = getSchoolToolApplication()['terms']
+            requested_terms = []
+
+            # request['terms'] may be a list of strings or a single string, we
+            # need to handle both cases
+            try:
+                requested_terms = requested_terms + self.request['terms']
+            except TypeError:
+                requested_terms.append(self.request['terms'])
+            return [terms[term] for term in requested_terms]
+        else:
+            return [getNextTermForDate(datetime.date.today()),]
+
+    def getDays(self, ttschema):
+        """Return the current selection.
+
+        Returns a list of dicts with the following keys
+
+            title   -- title of the timetable day
+            periods -- list of timetable periods in that day
+
+        Each period is represented by a dict with the following keys
+
+            title    -- title of the period
+            selected -- a boolean whether that period is in self.context's tt
+                            for this shcema
+
+        """
+        timetable = self.getTimetable()
+
+        def days(schema):
+            for day_id, day in schema.items():
+                yield {'title': day_id,
+                       'periods': list(periods(day_id, day))}
+
+        def periods(day_id, day):
+            for period_id in day.periods:
+                if timetable:
+                    selected = timetable[day_id][period_id]
+                else:
+                    selected = False
+                yield {'title': period_id,
+                       'selected': selected}
+
+        return list(days(ttschema))
+
+    def __call__(self):
+        self.app = getSchoolToolApplication()
+        self.has_timetables = bool(self.app["terms"] and self.app["ttschemas"])
+        if not self.has_timetables:
+            return self.template()
+        self.terms = self.getTerms()
+        self.ttschema = self.getSchema()
+        self.ttkeys = ['.'.join((term.__name__, self.ttschema.__name__))
+                       for term in self.terms]
+        self.days = self.getDays(self.ttschema)
+        #XXX dumb, this doesn't space course names
+        course_title = ''.join([course.title
+                                for course in self.context.courses])
+
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(
+                zapi.absoluteURL(self.context, self.request))
+        if 'SAVE' in self.request:
+            section = removeSecurityProxy(self.context)
+            for key in self.ttkeys:
+                if ITimetables(section).timetables.get(key, None):
+                    timetable = ITimetables(section).timetables[key]
+                else:
+                    timetable = self.ttschema.createTimetable()
+                    ITimetables(section).timetables[key] = timetable
+                for day_id, day in timetable.items():
+                    for period_id, period in list(day.items()):
+                        if '.'.join((day_id, period_id)) in self.request:
+                            if not period:
+                                # XXX Resource list is being copied
+                                # from section as this view can't do
+                                # proper resource booking
+                                act = TimetableActivity(title=course_title,
+                                                        owner=section,
+                                                        resources=section.resources)
+                                day.add(period_id, act)
+                        else:
+                            if period:
+                                for act in list(period):
+                                    day.remove(period_id, act)
+
+            # TODO: find a better place to redirect to
+            self.request.response.redirect(
+                zapi.absoluteURL(
+                    ITimetables(self.context).timetables[self.ttkeys[0]],
+                    self.request))
+
+        return self.template()
+
+
+class SpecialDayView(BrowserView):
+    """The view for changing the periods for a particular day.
+
+    The typical use case: some periods get shortened or and some get
+    cancelled altogether if some special event is held at noon.
+    """
+
+    select_template = ViewPageTemplateFile('templates/specialday_select.pt')
+    form_template = ViewPageTemplateFile('templates/specialday_change.pt')
+
+    error = None
+    field_errors = None
+    date = None
+    term = None
+
+    def delta(self, start, end):
+        """
+        Returns a timedelta between two times
+
+            >>> from datetime import time, timedelta
+            >>> view = SpecialDayView(None, None)
+            >>> view.delta(time(11, 10), time(12, 20))
+            datetime.timedelta(0, 4200)
+
+        If a result is negative, it is 'wrapped around':
+
+            >>> view.delta(time(11, 10), time(10, 10)) == timedelta(hours=23)
+            True
+        """
+        today = datetime.date.today()
+        dtstart = datetime.datetime.combine(today, start)
+        dtend = datetime.datetime.combine(today, end)
+        delta = dtend - dtstart
+        if delta < datetime.timedelta(0):
+            delta += datetime.timedelta(1)
+        return delta
+
+    def extractPeriods(self):
+        """Return a list of three-tuples with period titles, tstarts,
+        durations.
+
+        If errors are encountered in some fields, the names of the
+        fields get added to field_errors.
+        """
+        model = self.context.model
+        result = []
+        for info in model.originalPeriodsInDay(self.term, self.context,
+                                               self.date):
+            period_id, tstart, duration = info
+            start_name = period_id + '_start'
+            end_name = period_id + '_end'
+            if (start_name in self.request and end_name in self.request
+                and (self.request[start_name] or self.request[end_name])):
+                start = end = None
+                try:
+                    start = parse_time(self.request[start_name])
+                except ValueError:
+                    pass
+                try:
+                    end = parse_time(self.request[end_name])
+                except ValueError:
+                    pass
+                if start is None:
+                    self.field_errors.append(start_name)
+                if end is None:
+                    self.field_errors.append(end_name)
+                elif start is not None:
+                    duration = self.delta(start, end)
+                    result.append((period_id, start, duration))
+
+        return result
+
+    def update(self):
+        """Read and validate form data, and update model if necessary.
+
+        Also choose the correct template to render.
+        """
+        self.field_errors = []
+        self.template = self.select_template
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(
+                zapi.absoluteURL(self.context, self.request))
+            return
+        if 'date' in self.request:
+            try:
+                self.date = parse_date(self.request['date'])
+            except ValueError:
+                self.error = _("Invalid date. Please use YYYY-MM-DD format.")
+            else:
+                self.term = getTermForDate(self.date)
+                if self.term is None:
+                    self.error = _("The date does not belong to any term.")
+                    self.date = None
+        if self.date:
+            self.template = self.form_template
+        if self.date and 'SUBMIT' in self.request:
+            daytemplate = []
+            for title, start, duration in self.extractPeriods():
+                daytemplate.append((title, SchooldaySlot(start, duration)))
+            if self.field_errors:
+                self.error = _('Some values were invalid.'
+                               '  They are highlighted in red.')
+            else:
+                exceptionDays = removeSecurityProxy(
+                    self.context.model.exceptionDays)
+                exceptionDays[self.date] = daytemplate
+                self.request.response.redirect(
+                    zapi.absoluteURL(self.context, self.request))
+
+
+    def timeplustd(self, t, td):
+        """Add a timedelta to time.
+
+        datetime authors are cowards.
+
+            >>> view = SpecialDayView(None, None)
+            >>> from datetime import time, timedelta
+            >>> view.timeplustd(time(10,0), timedelta(0, 5))
+            datetime.time(10, 0, 5)
+            >>> view.timeplustd(time(23,0), timedelta(0, 3660))
+            datetime.time(0, 1)
+        """
+        dt = datetime.datetime.combine(datetime.date.today(), t)
+        dt += td
+        return dt.time()
+
+    def getPeriods(self):
+        """A helper method that returns a list of tuples of:
+
+        (period_title, orig_start, orig_end, actual_start, actual_end)
+        """
+        model = self.context.model
+        result = []
+        actual_times = {}
+        for info in model.periodsInDay(self.term, self.context, self.date):
+            period_id, tstart, duration = info
+            endtime = self.timeplustd(tstart, duration)
+            actual_times[period_id] = (tstart.strftime("%H:%M"),
+                                       endtime.strftime("%H:%M"))
+        for info in model.originalPeriodsInDay(self.term, self.context,
+                                                 self.date):
+            period_id, tstart, duration = info
+            # datetime authors are cowards
+            endtime = self.timeplustd(tstart, duration)
+            result.append((period_id,
+                           tstart.strftime("%H:%M"),
+                           endtime.strftime("%H:%M")) +
+                          actual_times.get(period_id, ('', '')))
+        return result
+
+    def __call__(self):
+        self.update()
+        return self.template()


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,169 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/browser"
+           xmlns:zope="http://namespaces.zope.org/zope"
+           i18n_domain="schooltool">
+
+  <!-- Traversers -->
+
+  <zope:class class=".TimetablesTraverser">
+    <zope:allow
+        interface="schooltool.traverser.interfaces.ITraverserPlugin" />
+  </zope:class>
+
+  <zope:subscriber
+      for="schooltool.timetable.interfaces.IOwnTimetables
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".TimetablesTraverser"
+      />
+
+  <!-- Menu Items -->
+
+  <menuItem
+      menu="schooltool_actions"
+      title="View Timetables"
+      for="schooltool.timetable.interfaces.IOwnTimetables"
+      action="timetables/index.html"
+      />
+
+  <!-- Views -->
+
+  <page
+      name="schedule.html"
+      for="schooltool.course.interfaces.ISection"
+      class="schooltool.timetable.browser.SectionTimetableSetupView"
+      permission="schooltool.view"
+      menu="schooltool_actions"
+      title="Schedule" />
+
+  <page
+      name="schedule.html"
+      for="schooltool.person.interfaces.IPerson"
+      class="schooltool.timetable.browser.PersonTimetableSetupView"
+      permission="schooltool.view" />
+
+  <configure package="schooltool.skin">
+    <navigationViewlet
+      name="schedule-student"
+      for="schooltool.person.interfaces.IPerson"
+      manager="schooltool.skin.IActionMenuManager"
+      template="templates/actionsViewlet.pt"
+      permission="schooltool.view"
+      link="schedule.html"
+      title="Schedule"
+      order="10"
+      />
+  </configure>
+
+  <page
+      name="schedule.html"
+      for="schooltool.resource.interfaces.IBaseResource"
+      class="schooltool.timetable.browser.ResourceTimetableSetupView"
+      permission="schooltool.view"
+      menu="schooltool_actions"
+      title="Schedule" />
+
+  <page
+      name="index.html"
+      for="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      class=".schema.TimetableSchemaContainerView"
+      template="templates/timetable-schema-container.pt"
+      permission="schooltool.view"
+      menu="zmi_views"
+      title="View"
+      />
+
+  <page
+      name="delete.html"
+      for="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      class=".schema.TimetableDependentDeleteView"
+      template="templates/schooltt-delete.pt"
+      permission="schooltool.edit"
+      menu="zmi_views"
+      title="View"
+      />
+
+  <configure package="schooltool.skin">
+    <navigationViewlet
+      name="ttschemas"
+      for="*"
+      manager="schooltool.skin.INavigationManager"
+      template="templates/navigationViewlet.pt"
+      class="schooltool.skin.TopLevelContainerNavigationViewlet"
+      permission="schooltool.view"
+      link="ttschemas"
+      title="School Timetables"
+      order="80"
+      />
+  </configure>
+
+  <page
+      name="simpleadd.html"
+      for="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      class=".schema.SimpleTimetableSchemaAdd"
+      permission="schooltool.edit"
+      />
+
+  <page
+      name="complexadd.html"
+      for="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      class=".schema.AdvancedTimetableSchemaAdd"
+      permission="schooltool.edit"
+      />
+
+  <page
+      name="index.html"
+      for="schooltool.timetable.interfaces.ITimetableSchema"
+      class=".schema.TimetableSchemaView"
+      template="templates/timetableschema.pt"
+      permission="schooltool.view"
+      menu="zmi_views" title="View"
+      />
+
+  <page
+      name="special.html"
+      for="schooltool.timetable.interfaces.ITimetableSchema"
+      class=".SpecialDayView"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="Change Timetable for One Day"
+      />
+
+  <page
+      name="index.html"
+      for="schooltool.timetable.interfaces.ITimetable"
+      class=".TimetableView"
+      template="templates/timetable.pt"
+      permission="schooltool.view"
+      menu="zmi_views" title="View"
+      />
+
+  <page
+      name="index.html"
+      for="schooltool.timetable.interfaces.ITimetableDict"
+      template="templates/timetable_list.pt"
+      permission="schooltool.view"
+      menu="zmi_views" title="View"
+      />
+
+  <!-- ttwizard -->
+  <page
+      name="add.html"
+      for="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      class=".ttwizard.TimetableSchemaWizard"
+      permission="schooltool.edit"
+      menu="schooltool_actions"
+      title="New Timetable"
+      />
+
+  <!-- ttevent -->
+
+   <page
+      for="schooltool.timetable.interfaces.ITimetableCalendarEvent"
+      name="edit.html"
+      layer="schooltool.skin.ISchoolToolLayer"
+      class=".event.TimetableEventEditView"
+      permission="schooltool.edit"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/event.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/event.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/event.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,81 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Views for timetable event.
+
+$Id: event.py 6611 2007-01-26 18:57:22Z ignas $
+"""
+
+from zope.app import zapi
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.interface import Interface
+from zope.schema import Text
+from zope.formlib import form
+from zope.html.field import HtmlFragment
+
+from schooltool.app.browser.cal import CalendarEventView
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool import SchoolToolMessage as _
+
+class IEditTimetableEvent(Interface):
+
+    description = HtmlFragment(
+        title=_("Description"),
+        required=False)
+
+
+class TimetableEventEditView(CalendarEventView, form.Form):
+
+    title = _("Modify event information")
+
+    form_fields = form.fields(Text(__name__='description',
+                                   title=_("Description"),
+                                   required=False))
+    template = ViewPageTemplateFile("templates/timetable_event_edit.pt")
+
+    def setUpEditorWidget(self, editor):
+        editor.editorWidth = 430
+        editor.editorHeight = 300
+        editor.toolbarConfiguration = "schooltool"
+        url = zapi.absoluteURL(ISchoolToolApplication(None), self.request)
+        editor.configurationPath = (url + '/@@/editor_config.js')
+
+    def setUpWidgets(self, ignore_request=False):
+        self.widgets = form.setUpEditWidgets(
+            self.form_fields, self.prefix, self.context, self.request,
+            ignore_request=ignore_request)
+        self.setUpEditorWidget(self.widgets["description"])
+
+    def __init__(self, context, request):
+        form.Form.__init__(self, context, request)
+        CalendarEventView.__init__(self, context, request)
+
+    def redirect_to_parent(self):
+        url = zapi.absoluteURL(self.context.__parent__, self.request)
+        self.request.response.redirect(url)
+        return ''
+
+    @form.action(_("Apply"))
+    def handle_edit_action(self, action, data):
+        self.context.description = data['description']
+        return self.redirect_to_parent()
+
+    @form.action(_("Cancel"), condition=form.haveInputWidgets)
+    def handle_cancel_action(self, action, data):
+        return self.redirect_to_parent()


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/event.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.timetable.
+
+$Id: test_all.py 6552 2007-01-09 18:18:32Z ignas $
+"""
+
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.timetable.ftesting import timetable_functional_layer
+
+def test_suite():
+    return collect_ftests(layer=timetable_functional_layer)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetable-events.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetable-events.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetable-events.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,73 @@
+Tests for timetable events in calendar views
+--------------------------------------------
+
+Regression test for issue405:
+
+Traceback when trying to render weekly view when there are timetable
+events.
+
+A manager logs in and sets up timetabling:
+
+    >>> from schooltool.app.browser.ftests import setup
+    >>> setup.addPerson('Frog', 'frog')
+    >>> setup.setUpTimetabling(username='frog')
+
+Frog logs in:
+
+    >>> frog = setup.logIn('frog')
+
+Looks at his daily view:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-09-07')
+    >>> print analyze.queryHTML('id("content-body")', frog.contents)[0]
+    <div id="content-body">
+    ...
+      <h6 style="background: #...">
+        <a href="http://localhost/sections/history6a/calendar/..." title="History 6">
+          History 6
+          <span class="start-end">
+            (<span>11:35</span>
+               -
+             <span>12:20</span>)
+          </span>
+        </a>
+      </h6>
+    ...
+
+And tries to get an overview of the whole week:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-w37')
+    >>> print analyze.queryHTML('id("content-body")', frog.contents)[0]
+    <div id="content-body">
+    ...
+
+Month:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005-09')
+
+    >>> def print_table_cell_for_day(date):
+    ...    print analyze.queryHTML('id("content-body")'
+    ...                            '//td/a[contains(@href, "%s")]' % date,
+    ...                            frog.contents)[0]
+
+    >>> print_table_cell_for_day('2005-09-11')
+    <a href="http://localhost/persons/frog/calendar/2005-09-11">
+      <span class="">11</span>
+    </a>
+
+    >>> print_table_cell_for_day('2005-09-12')
+    <a href="http://localhost/persons/frog/calendar/2005-09-12">
+      <span class="">12</span>
+          <span style="background: #...;
+                                border-color: #..." class="event">History 6 (09:30...10:25)</span>
+    </a>
+
+Year:
+
+    >>> frog.open('http://localhost/persons/frog/calendar/2005')
+    >>> print_table_cell_for_day('2005-09-11')
+    <a href="http://localhost/persons/frog/calendar/2005-09-11" class="cal_yearly_day">11</a>
+
+    >>> print_table_cell_for_day('2005-09-12')
+    <a href="http://localhost/persons/frog/calendar/2005-09-12" class="cal_yearly_day_busy">12</a>
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetable-events.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetabling.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetabling.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetabling.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,322 @@
+Timetabling in SchoolTool
+=========================
+
+This functional doctest demonstrates and tests SchoolTool's timetables.
+
+
+Overview
+--------
+
+1. Definition of terms
+2. Definition of timetable schemas
+3. Import of timetables
+4. Usage of timetables
+
+
+Prologue
+--------
+
+    >>> from zope.testbrowser.testing import Browser
+    >>> manager = Browser()
+    >>> manager.addHeader('Authorization', 'Basic manager:schooltool')
+    >>> manager.handleErrors = False
+    >>> manager.open('http://localhost/')
+
+Let's create a person for use in tests:
+
+    >>> from schooltool.app.browser.ftests.setup import addPerson
+    >>> addPerson('Frog', 'frog', 'pwd')
+
+And a group:
+
+    >>> manager.getLink('Groups').click()
+    >>> manager.getLink('New Group').click()
+
+    >>> manager.getControl('Title').value = 'Animals'
+    >>> manager.getControl('Add').click()
+
+And a resource:
+
+    >>> manager.getLink('Resources').click()
+    >>> manager.getLink('New Resource').click()
+
+    >>> manager.getControl('Title').value = 'Mud'
+    >>> manager.getControl('Add').click()
+
+
+Terms
+-----
+
+Terms are periods of time (such as semesters or trimesters) that also say which
+days are holidays and which are not.  You can define any number of terms -- and
+you have to have at least one if you want to use timetables.
+
+Initially there are no terms defined.
+
+    >>> manager.getLink('Terms').click()
+    >>> '<p>There are none.</p>' in manager.contents
+    True
+
+The manager can add one.
+
+    >>> manager.getLink('New Term').click()
+
+First you have to specify the title and date.
+
+    >>> manager.getControl('Title').value = '2005 Fall'
+    >>> manager.getControl('Start date').value = '2005-09-01'
+    >>> manager.getControl('End date').value = '2005-12-31'
+    >>> manager.getControl('Next').click()
+
+Then you can click on a couple of the toggle buttons to mark all Saturdays and
+Sundays as holidays.
+
+    >>> manager.getControl('Saturday').click()
+    >>> manager.getControl('Sunday').click()
+
+Now, for example, September 10th is checked, but the 9th is not:
+
+    >>> print analyze.queryHTML('//input[@id="c9"]', manager.contents)[0]
+    <input type="checkbox" name="holiday" class="chk"
+           onchange="javascript:update(9)" id="c9" value="2005-09-09">
+
+    >>> print analyze.queryHTML('//input[@id="c10"]', manager.contents)[0]
+    <input type="checkbox" name="holiday" class="chk"
+           onchange="javascript:update(10)" checked id="c10"
+           value="2005-09-10">
+
+Finally, you click on the 'Add term' button.
+
+    >>> manager.getControl('Add term').click()
+
+    >>> manager.url
+    'http://localhost/terms'
+    >>> '2005 Fall' in manager.contents
+    True
+
+You can look at it
+
+    >>> manager.getLink('2005 Fall').click()
+
+    # XXX: I don't like this for the test, but libxml2's `fn:contains`
+    #      function for XPath seems to always return true :-(
+
+    >>> print analyze.queryHTML('//td[@class="schoolday"]', manager.contents)[1]
+    <td class="schoolday">
+      <label> 1 </label>
+    </td>
+
+    >>> print analyze.queryHTML('//td[@class="holiday"]', manager.contents)[1]
+    <td class="holiday">
+      <label> 3 </label>
+    </td>
+
+You can edit it
+
+    >>> manager.getLink('Edit').click()
+
+    >>> manager.getControl('Title').value
+    '2005 Fall'
+    >>> manager.getControl('Start date').value
+    '2005-09-01'
+    >>> manager.getControl('End date').value
+    '2005-12-31'
+
+    >>> manager.getControl('Title').value = 'Fall 2005'
+    >>> manager.getControl('Start date').value = '2005-08-01'
+    >>> manager.getControl('End date').value = '2005-11-30'
+    >>> manager.getControl('Save changes').click()
+
+    >>> 'Saved changes' in manager.contents
+    True
+    >>> manager.getControl('Title').value
+    'Fall 2005'
+    >>> manager.getControl('Start date').value
+    '2005-08-01'
+    >>> manager.getControl('End date').value
+    '2005-11-30'
+
+
+TODO: verify that you can delete terms
+TODO: check that there's an error message when end date < start date
+MAYBE TODO: add an 'Identifier (optional)' field to the term addition form,
+            just like in group/resource addition form
+
+
+Definition of timetable schemas
+-------------------------------
+
+We will create a timetable schema using the simple schema definition form:
+
+    >>> manager.getLink('School Timetables').click()
+    >>> manager.getLink('New Timetable').click()
+    >>> manager.getLink('simple weekly timetable schema').click()
+
+    >>> manager.getControl(name='field.period_name_1').value = 'A'
+    >>> manager.getControl(name='field.period_start_1').value = '9:00'
+    >>> manager.getControl(name='field.period_finish_1').value = '10:00'
+
+    >>> manager.getControl(name='field.period_name_2').value = 'B'
+    >>> manager.getControl(name='field.period_start_2').value = '10:30'
+    >>> manager.getControl(name='field.period_finish_2').value = '11:30'
+
+    >>> manager.getControl('Create').click()
+
+Let's look at the new timetable:
+
+    >>> manager.getLink('default').click()
+
+    >>> len(analyze.queryHTML('//th[text()="A"]', manager.contents))
+    5
+    >>> len(analyze.queryHTML('//th[text()="B"]', manager.contents))
+    5
+
+(The more complex timetable schema definition pages are tested in
+`ttschema.txt` and `ttschema-wizard.txt`).
+
+
+Importing timetables
+--------------------
+
+We will need to define a person who will be a learner.
+
+    >>> addPerson('Tadpole', 'tadpole', 'pwd')
+
+We will also need a course.
+
+    >>> manager.getLink('Courses').click()
+    >>> manager.getLink('New Course').click()
+
+    >>> manager.getControl('Title').value = 'Swimming'
+    >>> manager.getControl('Add').click()
+
+We can import timetables using the CSV timetable import page.
+
+    >>> manager.getLink('Sections').click()
+    >>> manager.getLink('Import Sections').click()
+
+    >>> manager.getControl('CSV File')
+    <Control name='csvfile' type='file'>
+    >>> manager.getControl('CSV Data')
+    <Control name='csvtext' type='textarea'>
+
+As you can see, the form allows to submit the CSV data either by sending the
+file or typing/pasting it into a text area field.
+
+    >>> manager.getControl('CSV Data').value = """\
+    ... "2005-fall","default"
+    ... ""
+    ... "swimming","frog"
+    ... "Monday","A"
+    ... "Tuesday","B"
+    ... "***"
+    ... "tadpole"
+    ... """
+    >>> manager.getControl('Submit').click()
+    >>> print analyze.queryHTML('//div[@class="info"]', manager.contents)[0]
+    <div class="info">
+      <p>CSV text imported successfully.</p>
+    </div>
+
+A new section should have been created:
+
+    >>> manager.getLink('Sections').click()
+    >>> print analyze.queryHTML('//table/tr[2]', manager.contents)[0]
+    <tr><td>
+        <input type="checkbox" name="delete.swimming--frog"></td>
+      <td>
+        <a href="http://localhost/courses/swimming">Swimming</a>
+      </td>
+      <td>
+        <a href=".../sections/swimming--frog">Swimming - Frog</a>
+      </td>
+      <td>
+    <BLANKLINE>
+    <BLANKLINE>
+        <a href="http://localhost/persons/frog">Frog</a>
+    <BLANKLINE>
+      </td>
+      <td>
+    <BLANKLINE>
+    <BLANKLINE>
+        <a href=".../sections/swimming--frog/timetables/2005-fall.default">2005-Fall.Default</a>
+    <BLANKLINE>
+      </td>
+      <td>
+        <span class="hint">
+          (1
+          <span>Students</span>)
+        </span>
+      </td>
+    </tr>
+
+We should see a timetable in the section's timetable list:
+
+    >>> manager.getLink('Swimming - Frog').click()
+    >>> manager.getLink('View Timetables').click()
+
+    >>> manager.getLink('2005-fall.default')
+    <Link text='2005-fall.default'
+          url='.../sections/swimming--frog/timetables/2005-fall.default'>
+
+We can have a look at the timetable too, and see a few timetable activities:
+
+    >>> manager.getLink('2005-fall.default').click()
+
+    >>> print analyze.queryHTML('//table/tr[2]', manager.contents)[0]
+    <tr><th class="period" width="2%">A</th>
+          <td class="activity" width="18%">Swimming</td>
+    <BLANKLINE>
+          <th class="period" width="2%">A</th>
+          <td class="activity" width="18%"></td>
+    <BLANKLINE>
+          <th class="period" width="2%">A</th>
+          <td class="activity" width="18%"></td>
+    <BLANKLINE>
+          <th class="period" width="2%">A</th>
+          <td class="activity" width="18%"></td>
+    <BLANKLINE>
+          <th class="period" width="2%">A</th>
+          <td class="activity" width="18%"></td>
+        </tr>
+
+    >>> print analyze.queryHTML('//table/tr[3]', manager.contents)[0]
+    <tr><th class="period" width="2%">B</th>
+          <td class="activity" width="18%"></td>
+    <BLANKLINE>
+          <th class="period" width="2%">B</th>
+          <td class="activity" width="18%">Swimming</td>
+    <BLANKLINE>
+          <th class="period" width="2%">B</th>
+          <td class="activity" width="18%"></td>
+    <BLANKLINE>
+          <th class="period" width="2%">B</th>
+          <td class="activity" width="18%"></td>
+    <BLANKLINE>
+          <th class="period" width="2%">B</th>
+          <td class="activity" width="18%"></td>
+        </tr>
+
+The activities should show up in the calendar of the users that are in
+this section too:
+
+    >>> manager.open('http://localhost/'
+    ...              'persons/frog/calendar/2005-09-05')
+
+    >>> print analyze.queryHTML('//h6[fn:contains(text(), "Swimming")]',
+    ...                         manager.contents)[0]
+    <h6 style="background: #7590ae">
+      <a href="http://localhost/sections/swimming--frog/calendar/..." title="Swimming">
+        Swimming
+        <span class="start-end">
+          (<span>09:00</span>
+             -
+           <span>10:00</span>)
+        </span>
+      </a>
+    </h6>
+
+Epilogue
+--------
+
+ vim: ft=rest


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ftests/timetabling.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/schema.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/schema.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/schema.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,440 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetabling Schema views.
+
+$Id: schema.py 6602 2007-01-26 13:17:25Z ignas $
+"""
+from zope.i18n import translate
+from zope.component import adapts
+from zope.interface import Interface, implements
+from zope.schema import TextLine, Int
+from zope.schema.interfaces import RequiredMissing
+from zope.app import zapi
+from zope.app.container.interfaces import INameChooser
+from zope.app.form.interfaces import IInputWidget
+from zope.app.form.interfaces import WidgetsError
+from zope.app.form.utility import getWidgetsData, setUpWidgets
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.publisher.browser import BrowserView
+from zope.traversing.api import getParent, getName
+from zope.publisher.interfaces.browser import IBrowserPublisher
+from zope.publisher.interfaces.browser import IBrowserRequest
+
+from schooltool import SchoolToolMessage as _
+from schooltool.skin.containers import ContainerView, ContainerDeleteView
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+from schooltool.timetable.interfaces import ITimetableModelFactory
+from schooltool.timetable.interfaces import ITimetableSchema
+from schooltool.timetable.interfaces import ITimetableSchemaContainer
+from schooltool.timetable.schema import TimetableSchema, TimetableSchemaDay
+from schooltool.timetable import findRelatedTimetables
+
+from schooltool.timetable.browser import TimetableView, TabindexMixin
+from schooltool.timetable.browser import fix_duplicates, parse_time_range
+from schooltool.timetable.browser import format_timetable_for_presentation
+from schooltool.timetable.browser import format_time_range
+
+
+class TimetableSchemaView(TimetableView):
+
+    __used_for__ = ITimetableSchema
+
+    def homerooms(self):
+        """Returns a dictionary of day indexes to homeroom period indexes"""
+        result = {}
+        for daynr, dayid in enumerate(self.context.keys()):
+            day = self.context[dayid]
+            result[daynr] = set()
+            if day.homeroom_period_ids:
+                for periodnr, periodid in enumerate(day.keys()):
+                    if periodid in day.homeroom_period_ids:
+                        result[daynr].add(periodnr)
+        return result
+
+    def title(self):
+        msg = _("Timetable schema ${schema}",
+                mapping = {'schema': self.context.title})
+        return msg
+
+    @property
+    def timezone(self):
+        """Return a timezone if it is different from app default.
+
+        Return None if it is not.
+        """
+        app = ISchoolToolApplication(None)
+        apptz = IApplicationPreferences(app).timezone
+        if self.context.timezone != apptz:
+            return self.context.timezone
+
+
+class SimpleTimetableSchemaAdd(BrowserView):
+    """A simple timetable schema definition view"""
+
+    _nrperiods = 9
+
+    day_ids = (_("Monday"),
+               _("Tuesday"),
+               _("Wednesday"),
+               _("Thursday"),
+               _("Friday"),
+               )
+
+    error = None
+
+    template = ViewPageTemplateFile('templates/simpletts.pt')
+
+    def __init__(self, content, request):
+        BrowserView.__init__(self, content, request)
+        self._schema = {}
+        self._schema['title'] = TextLine(__name__='title', title=u"Title")
+        for nr in range(1, self._nrperiods + 1):
+            pname = 'period_name_%s' % nr
+            pstart = 'period_start_%s' % nr
+            pfinish = 'period_finish_%s' % nr
+            self._schema[pname] = TextLine(__name__=pname,
+                                           title=u"Period title",
+                                           required=False)
+            self._schema[pstart] = TextLine(__name__=pstart,
+                                            title=u"Period start time",
+                                            required=False)
+            self._schema[pfinish] = TextLine(__name__=pfinish,
+                                             title=u"Period finish time",
+                                             required=False)
+        setUpWidgets(self, self._schema, IInputWidget,
+                     initial={'title': 'default'})
+
+    def _setError(self, name, error=RequiredMissing()):
+        """Set an error on a widget."""
+        # XXX Touching widget._error is bad, see
+        #     http://dev.zope.org/Zope3/AccessToWidgetErrors
+        # The call to setRenderedValue is necessary because
+        # otherwise _getFormValue will call getInputValue and
+        # overwrite _error while rendering.
+        widget = getattr(self, name + '_widget')
+        widget.setRenderedValue(widget._getFormValue())
+        if not IWidgetInputError.providedBy(error):
+            error = WidgetInputError(name, widget.label, error)
+        widget._error = error
+
+    def getPeriods(self):
+        try:
+            data = getWidgetsData(self, self._schema)
+        except WidgetsError:
+            return []
+
+        result = []
+        for nr in range(1, self._nrperiods + 1):
+            pname = 'period_name_%s' % nr
+            pstart = 'period_start_%s' % nr
+            pfinish = 'period_finish_%s' % nr
+            if data.get(pstart) or data.get(pfinish):
+                try:
+                    start, duration = parse_time_range(
+                        "%s-%s" % (data[pstart], data[pfinish]))
+                except ValueError:
+                    self.error = _('Please use HH:MM format for period '
+                                   'start and end times')
+                    continue
+                name = data[pname]
+                if not name:
+                    name = data[pstart]
+                result.append((name, start, duration))
+        return result
+
+    def createSchema(self, periods):
+        daytemplate = SchooldayTemplate()
+        for title, start, duration in periods:
+            daytemplate.add(SchooldaySlot(start, duration))
+
+        factory = zapi.getUtility(ITimetableModelFactory,
+                                  'WeeklyTimetableModel')
+        model = factory(self.day_ids, {None: daytemplate})
+        app = ISchoolToolApplication(None)
+        tzname = IApplicationPreferences(app).timezone
+        schema = TimetableSchema(self.day_ids, timezone=tzname)
+        for day_id in self.day_ids:
+            schema[day_id] = TimetableSchemaDay(
+                [title for title, start, duration in periods])
+        schema.model = model
+        return schema
+
+    def __call__(self):
+        try:
+            data = getWidgetsData(self, self._schema)
+        except WidgetsError:
+            return self.template()
+
+        if 'CANCEL' in self.request:
+            self.request.response.redirect(
+                zapi.absoluteURL(self.context, self.request))
+        elif 'CREATE' in self.request:
+            periods = self.getPeriods()
+            if self.error:
+                return self.template()
+
+            if not periods:
+                self.error = _('You must specify at least one period.')
+                return self.template()
+
+            schema = self.createSchema(periods)
+            schema.title = data['title']
+
+            nameChooser = INameChooser(self.context)
+            name = nameChooser.chooseName('', schema)
+
+            self.context[name] = schema
+            self.request.response.redirect(
+                zapi.absoluteURL(self.context, self.request))
+
+        return self.template()
+
+
+class TimetableSchemaContainerView(ContainerView):
+    """TimetableSchema Container view."""
+
+    __used_for__ = ITimetableSchemaContainer
+
+    index_title = _("School Timetables")
+
+    def update(self):
+        if 'UPDATE_SUBMIT' in self.request:
+            self.context.default_id = self.request['ttschema'] or None
+        return ''
+
+
+class TimetableDependentDeleteView(ContainerDeleteView):
+    """The delete view for school timetables and schemas.
+
+    Finds all timetables that use the object to be deleted and deletes
+    them too.
+    """
+
+    adapts((ITimetableSchemaContainer, IBrowserRequest))
+    implements(IBrowserPublisher)
+
+    def timetables(self, obj):
+        return findRelatedTimetables(obj)
+
+    def update(self):
+        if 'CONFIRM' in self.request:
+            for key in self.listIdsForDeletion():
+                for tt in findRelatedTimetables(self.context[key]):
+                    ttdict = getParent(tt)
+                    del ttdict[getName(tt)]
+                del self.context[key]
+            self.request.response.redirect(self.nextURL())
+        elif 'CANCEL' in self.request:
+            self.request.response.redirect(self.nextURL())
+
+
+class IAdvancedTimetableSchemaAddSchema(Interface):
+
+    title = TextLine(title=u"Title", required=False)
+    duration = Int(title=u"Duration", description=u"Duration in minutes",
+                   required=False)
+
+
+class AdvancedTimetableSchemaAdd(BrowserView, TabindexMixin):
+    """View for defining a new timetable schema.
+
+    Can be accessed at /ttschemas/complexadd.html.
+    """
+
+    __used_for__ = ITimetableSchemaContainer
+
+    template = ViewPageTemplateFile("templates/advancedtts.pt")
+
+    # Used in the page template
+    days_of_week = (_("Monday"),
+                    _("Tuesday"),
+                    _("Wednesday"),
+                    _("Thursday"),
+                    _("Friday"),
+                    _("Saturday"),
+                    _("Sunday"),
+                   )
+
+    _schema = IAdvancedTimetableSchemaAddSchema
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+        TabindexMixin.__init__(self)
+        setUpWidgets(self, self._schema, IInputWidget,
+                     initial={'title': 'default'})
+
+    def __call__(self):
+
+        # We could build a custom widget for the model radio buttons, but I do
+        # not think it is worth the trouble.
+        self.model_error = None
+        self.model_name = self.request.get('model')
+
+        self.ttschema = self._buildSchema()
+        self.day_templates = self._buildDayTemplates()
+
+        if 'CREATE' in self.request:
+            data = getWidgetsData(self, self._schema)
+            factory = zapi.queryUtility(ITimetableModelFactory,
+                                        name=self.model_name)
+            if factory is None:
+                self.model_error = _("Please select a value")
+            if not self.title_widget.error() and not self.model_error:
+                model = factory(self.ttschema.day_ids, self.day_templates)
+                self.ttschema.model = model
+                self.ttschema.title = data['title']
+                nameChooser = INameChooser(self.context)
+                key = nameChooser.chooseName('', self.ttschema)
+                self.context[key] = self.ttschema
+                #Note: if you uncomment this, fix the i18n bug inside too.
+                #self.request.appLog(_("Timetable schema %s created") %
+                #               getPath(self.context[key]))
+                return self.request.response.redirect(
+                    zapi.absoluteURL(self.context, self.request))
+        return self.template()
+
+    def rows(self):
+        return format_timetable_for_presentation(self.ttschema)
+
+    def _buildSchema(self):
+        """Build a timetable schema from data in the request."""
+        n = 1
+        day_ids = []
+        day_idxs = []
+        while 'day%d' % n in self.request:
+            if 'DELETE_DAY_%d' % n not in self.request:
+                day_id = self.request['day%d' % n].strip()
+                if not day_id:
+                    day_id_msgid = _('Day ${number}',
+                                     mapping={'number': len(day_ids) + 1})
+                    day_id = translate(day_id_msgid, context=self.request)
+                day_ids.append(day_id)
+                day_idxs.append(n)
+            n += 1
+        if 'ADD_DAY' in self.request or not day_ids:
+            day_id_msgid = _('Day ${number}',
+                             mapping={'number': len(day_ids) + 1})
+            day_id = translate(day_id_msgid, context=self.request)
+            day_ids.append(day_id)
+            day_idxs.append(-1)
+        day_ids = fix_duplicates(day_ids)
+
+        periods_for_day = []
+        longest_day = None
+        previous_day = None
+        for idx, day in zip(day_idxs, day_ids):
+            n = 1
+            if ('COPY_DAY_%d' % (idx - 1) in self.request
+                and previous_day is not None):
+                periods = list(previous_day)
+            else:
+                periods = []
+                while 'day%d.period%d' % (idx, n) in self.request:
+                    per_id = self.request['day%d.period%d' % (idx, n)].strip()
+                    periods.append(per_id)
+                    n += 1
+                periods = filter(None, periods)
+                if not periods:
+                    period1 = translate(_("Period 1"), context=self.request)
+                    periods = [period1]
+                else:
+                    periods = fix_duplicates(periods)
+            periods_for_day.append(periods)
+            if longest_day is None or len(periods) > len(longest_day):
+                longest_day = periods
+            previous_day = periods
+
+        if 'ADD_PERIOD' in self.request:
+            period_name_msgid = _('Period ${number}',
+                                  mapping={'number': len(longest_day) + 1})
+            period_name = translate(period_name_msgid, context=self.request)
+            longest_day.append(period_name)
+
+        app = ISchoolToolApplication(None)
+        tzname = IApplicationPreferences(app).timezone
+        ttschema = TimetableSchema(day_ids, timezone=tzname)
+        for day, periods in zip(day_ids, periods_for_day):
+            ttschema[day] = TimetableSchemaDay(periods)
+
+        return ttschema
+
+    def _buildDayTemplates(self):
+        """Built a dict of day templates from data contained in the request.
+
+        The dict is suitable to be passed as the second argument to the
+        timetable model factory.
+        """
+        data = getWidgetsData(self, self._schema)
+        default_duration = data.get('duration')
+        result = {None: SchooldayTemplate()}
+        n = 1
+        self.discarded_some_periods = False
+        while 'time%d.day0' % n in self.request:
+            raw_value = [0]
+            for day in range(7):
+                value = self.request.form.get('time%d.day%d' % (n, day), '')
+                if not value:
+                    continue
+                try:
+                    start, duration = parse_time_range(value, default_duration)
+                except ValueError:
+                    # ignore invalid values for now, but tell the user
+                    self.discarded_some_periods = True
+                    continue
+                if day not in result:
+                    result[day] = SchooldayTemplate()
+                result[day].add(SchooldaySlot(start, duration))
+            n += 1
+        for day in range(1, 7):
+            if 'COPY_PERIODS_%d' % day in self.request:
+                if (day - 1) in result:
+                    result[day] = result[day - 1]
+                elif day in result:
+                    del result[day]
+        return result
+
+    def all_periods(self):
+        """Return a list of all period names in order of occurrence."""
+        periods = []
+        for day_id in self.ttschema.day_ids:
+            for period in self.ttschema[day_id].periods:
+                if period not in periods:
+                    periods.append(period)
+        return periods
+
+    def slot_times(self):
+        """Return a list of lists of time periods for each day for each slot.
+
+                      |  mo tu we thu fri sa su
+             ---------+-------------------------
+             1st slot |
+             2nd slot |
+             ...      |
+        """
+        nr_rows = max([len(day.keys())
+                       for day_id, day in self.ttschema.items()])
+        result =  [[None] * 7 for i in range(nr_rows)]
+        for day, template in self.day_templates.items():
+            for idx, slot in enumerate(template):
+                slotfmt = format_time_range(slot.tstart, slot.duration)
+                result[idx][day] = slotfmt
+        return result


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/schema.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/advancedtts.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/advancedtts.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/advancedtts.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,207 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">New timetable schema</h1>
+<metal:block metal:fill-slot="body">
+
+<form class="plain" method="POST" tal:attributes="action request/URL"
+      tal:define="tt view/ttschema;
+                  ncols python:len(tt.day_ids) or 1;
+                  rows view/rows;
+                  nrows python:len(rows);
+                  slot_times view/slot_times;
+                  nslots python:len(slot_times)">
+
+<p i18n:translate="">
+Please choose a name for the timetable schema you want to create.
+</p>
+
+<div class="form">
+  <div class="row" tal:define="widget nocall:view/title_widget">
+      <metal:block use-macro="context/@@form_macros/widget_row" />
+  </div>
+
+  <div class="controls">
+    <!-- The first button in the form must be a harmelss one, because
+         Mozilla uses it when you press Enter in a text field -->
+    <input type="submit" class="button-ok" name="UPDATE" value="Update"
+           tal:attributes="tabindex view/next_tabindex"
+           i18n:attributes="value" />
+  </div>
+
+</div>
+
+<p i18n:translate="">
+First, please define the days and periods of the timetable.
+</p>
+
+<div class="form">
+
+  <table class="timetable"
+         tal:define="col_width python:'%d%%' % (100 / ncols)">
+    <tr><tal:block repeat="day tt/day_ids">
+      <th class="day">
+        <input class="text" type="text" tal:define="n repeat/day/number"
+               tal:attributes="name string:day$n; value day;
+                               tabindex view/next_tabindex" />
+      </th>
+      <th class="day" width="1%" tal:condition="not:repeat/day/start">
+        <input class="button-ok" type="submit" tal:define="n repeat/day/index"
+               tal:attributes="name string:COPY_DAY_$n;
+                               tabindex view/next_tabindex"
+               value="C" title="Copy periods from previous day"
+               i18n:attributes="value; title" />
+      </th>
+      <th class="day" width="1%">
+        <input class="button-cancel" type="submit"
+               tal:define="n repeat/day/number"
+               tal:attributes="name string:DELETE_DAY_$n;
+                               tabindex view/next_tabindex"
+               value="X" title="Remove this day"
+               i18n:attributes="value; title" />
+      </th>
+    </tal:block></tr>
+    <tr tal:define="dummy python:view.tabindex_matrix(nrows, ncols)"
+        tal:repeat="row rows"><tal:block define="row_n repeat/row/number"
+                                         repeat="col row">
+      <td class="period" tal:define="col_n repeat/col/number"
+          tal:attributes="width col_width;
+                          colspan python: repeat['col'].start() and 2 or 3">
+        <input type="text" class="text"
+               tal:attributes="name string:day${col_n}.period${row_n};
+                               tabindex view/next_tabindex;
+                               value col/period" />
+      </td>
+    </tal:block></tr>
+  </table>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="UPDATE" value="Update"
+           tal:attributes="tabindex view/next_tabindex"
+           i18n:attributes="value" />
+    <input type="submit" class="button-ok" name="ADD_DAY" value="Add day"
+           tal:attributes="tabindex view/next_tabindex"
+           i18n:attributes="value" />
+    <input type="submit" class="button-ok" name="ADD_PERIOD" value="Add period"
+           tal:attributes="tabindex view/next_tabindex"
+           i18n:attributes="value" />
+  </div>
+
+</div>
+
+<p i18n:translate="">
+Second, select the way timetable days are aligned with calendar days.
+</p>
+
+<div class="form">
+  <div class="error" i18n:translate=""
+       tal:condition="view/model_error"
+       tal:content="view/model_error">
+    Error.
+  </div>
+  <table>
+    <tr>
+      <td>
+        <input id="weekly_model" type="radio" name="model"
+               tal:attributes="checked
+                      python:view.model_name == 'WeeklyTimetableModel';
+                      tabindex view/next_tabindex"
+               value="WeeklyTimetableModel" />
+      </td>
+      <td>
+        <label class="block" for="weekly_model" i18n:translate="">
+          Timetable day always coincides with the day of week (i.e. on Mondays
+          the first timetable day is used, on Tuesdays the second, and so on).
+        </label>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <input id="sequential_model" type="radio" name="model"
+               tal:attributes="checked
+                      python:view.model_name == 'SequentialDaysTimetableModel';
+                      tabindex view/next_tabindex"
+               value="SequentialDaysTimetableModel" />
+      </td>
+      <td>
+        <label class="block" for="sequential_model" i18n:translate="">
+          Timetable days are used sequentially, jumping over days that are not
+          school days.
+        </label>
+      </td>
+</div>
+
+<p i18n:translate="">
+Third, define the time and duration of periods when they fall on certain
+days of week.  Use one of the the following format: <tt>HH:MM</tt> (also, don't
+forget to specify the duration in the text box below) or <tt>HH:MM-HH:MM</tt>
+(when you want to specify both endpoints explicitly, e.g., 9:30-10:15).  It is
+not necessary to define all periods for all days of week, omissions will just
+cause that period to be skipped if it happens to fall on that day of week.  If
+the list of periods is not up to date with the changes you made in the table
+above, use the Update button to refresh the form.
+</p>
+
+<div class="form">
+  <table class="timetable">
+    <tr tal:define="dummy python:view.tabindex_matrix(nslots + 1, 7);
+                    skip view/next_tabindex">
+      <tal:block repeat="day view/days_of_week">
+      <th class="day" tal:content="day" i18n:translate="">Monday</th>
+      <th class="day" width="1%"
+          tal:condition="not: repeat/day/start">
+        <input class="button-ok" type="submit" tal:define="n repeat/day/index"
+               tal:attributes="name string:COPY_PERIODS_$n;
+                               tabindex view/next_tabindex"
+               value="C" title="Copy periods from previous day"
+               i18n:attributes="value; title" />
+      </th>
+      </tal:block>
+    </tr>
+    <tr tal:repeat="slots slot_times"><tal:block
+                                          define="n repeat/slots/number">
+      <td class="time" width="12%" tal:repeat="time slots"
+          tal:attributes="colspan python: repeat['time'].start() and 1 or 2">
+        <input class="text" type="text"
+               tal:define="day repeat/time/index"
+               tal:attributes="tabindex view/next_tabindex;
+                               name string:time$n.day$day;
+                               value time" />
+      </td>
+    </tal:block></tr>
+  </table>
+  <div class="error" tal:condition="view/discarded_some_periods"
+       i18n:translate="">
+    Certain period specifications were incorrect, and therefore were discarded.
+  </div>
+
+  <div class="row" tal:define="widget nocall:view/duration_widget">
+      <metal:block use-macro="context/@@form_macros/widget_row" />
+  </div>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="UPDATE" value="Update"
+           tal:attributes="tabindex view/next_tabindex"
+           i18n:attributes="value" />
+  </div>
+</div>
+
+<p i18n:translate="">
+Finally, make sure the information in this form is correct, because the only
+way to correct it will be to remove this timetable schema and recreate it.
+</p>
+
+<div class="controls">
+  <input type="submit" class="button-ok" name="CREATE"
+         value="Create timetable schema"
+         tal:attributes="tabindex view/next_tabindex"
+         i18n:attributes="value" />
+</div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/advancedtts.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/person-timetable-setup.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/person-timetable-setup.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/person-timetable-setup.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,117 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Scheduling for <span i18n:name="person" tal:replace="context/title" />
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header" i18n:translate="">
+  Scheduling for <span i18n:name="person" tal:replace="context/title" />
+</h1>
+
+<metal:block metal:fill-slot="body">
+
+<p tal:condition="not:view/has_timetables"
+   i18n:translate="">There are no terms or timetable schemas defined.</p>
+
+<tal:if tal:condition="view/has_timetables">
+<form tal:attributes="action request/URL" class="plain" method="post">
+
+  <fieldset>
+    <legend i18n:translate="">Timetable</legend>
+
+    <label for="term" i18n:translate="">Term</label>
+    <select id="term" name="term"
+            tal:define="terms view/app/terms/values">
+      <option tal:repeat="term terms/sortby:first"
+              tal:attributes="value term/__name__;
+                              selected python:term is view.term
+                                          and 'selected' or None"
+              tal:content="term/title"></option>
+    </select>
+
+    <label for="ttschema" i18n:translate="">Schema</label>
+    <select id="ttschema" name="ttschema"
+            tal:define="ttschemas view/app/ttschemas/values">
+      <option tal:repeat="ttschema ttschemas/sortby:__name__"
+              tal:attributes="value ttschema/__name__;
+                              selected python:ttschema is view.ttschema
+                                          and 'selected' or None"
+              tal:content="ttschema/__name__"></option>
+    </select>
+    <input class="button-ok" type="submit" name="REFRESH" value="Choose"
+           i18n:attributes="value" />
+  </fieldset>
+</form>
+
+<form tal:attributes="action request/URL" class="plain" method="post">
+
+  <input type="hidden" name="term" tal:attributes="value view/term/__name__" />
+  <input type="hidden" name="ttschema"
+         tal:attributes="value view/ttschema/__name__" />
+
+  <p i18n:translate="">
+  This form lets you set up the timetable of a person by adding and removing
+  the person to and from sections that have classes in their timetables.
+  </p>
+
+  <tal:block repeat="day view/days">
+    <h2 i18n:translate="" tal:content="day/title">Day N</h2>
+
+    <table class="timetable_setup">
+      <tal:block tal:repeat="period day/periods">
+        <tr tal:define="conflict python: len(period['selected']) > 1 or len(period['in_group']) > 1  "
+          tal:attributes="class python: conflict and 'conflict' or ''">
+        <th tal:content="period/title">Period N</th>
+        <td tal:condition="period/in_group"
+            tal:repeat="in_group period/in_group">
+          <a href=""
+             tal:attributes="href in_group/section/@@absolute_url"
+             tal:content="in_group/section/title" />
+          <span class="hint">
+            <span i18n:translate="">as part of</span>
+            <a href=""
+               tal:attributes="href in_group/group/@@absolute_url"
+               tal:content="in_group/group/title" />
+          </span>
+        </td>
+        <td tal:condition="not:period/in_group"
+            tal:repeat="selection period/selected">
+          <select name="sections:list">
+            <option value=""
+                    tal:attributes="selected python:selection is None
+                                                and 'selected' or None"
+                    i18n:translate="">none</option>
+            <option i18n:translate=""
+                    tal:repeat="section period/sections/sortby:title"
+                    tal:attributes="value section/__name__;
+                        selected python:(selection and section.__name__ == selection.__name__)
+                                        and 'selected' or None"
+                    tal:content="section/label"></option>
+          </select>
+        </td>
+        <td class="conflict" tal:condition="conflict" i18n:translate="">
+        Scheduling conflict.
+        </td>
+      </tr>
+      </tal:block>
+    </table>
+  </tal:block>
+
+  <p i18n:translate="">
+  Note: if a section appears in more than one slot, all of them have
+  to be set to <em>none</em> to remove it.
+  </p>
+
+  <div class="controls">
+    <input class="button-ok" type="submit" name="SAVE" value="Save"
+           i18n:attributes="value" />
+  </div>
+
+</form>
+</tal:if>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/person-timetable-setup.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/schooltt-delete.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/schooltt-delete.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/schooltt-delete.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,38 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title">
+    Delete  School Timetables
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header" i18n:translate="">
+  Are you sure you want to delete the selected school timetables?
+</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="objects view/itemsToDelete">
+  <p tal:condition="not:objects" i18n:translate="">You have not
+  selected any items.</p>
+  <ul tal:condition="objects">
+    <form method="post"
+          action="delete.html">
+      <li tal:repeat="obj objects/sortby:title">
+        <input type="hidden" tal:attributes="name string:delete.${obj/zope:name}" />
+        <a tal:content="obj/title" tal:attributes="href
+        obj/@@absolute_url">Title</a>. This school timetable is used
+        by <span tal:replace="python:len(view.timetables(obj))"/>
+        individual timetables.
+      </li>
+      <div class="controls">
+        <input type="submit" class="button-cancel" name="CONFIRM" value="Confirm"
+               i18n:attributes="value delete-button;" />
+        <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+               i18n:attributes="value cancel-button" />
+      </div>
+    </form>
+  </ul>
+
+</metal:block>
+</body></html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/schooltt-delete.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/section-timetable-setup.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/section-timetable-setup.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/section-timetable-setup.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,118 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+      Scheduling for <span i18n:name="section"
+                           tal:replace="context/label" i18n:translate="" />
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header" i18n:translate="">
+  Scheduling for <span i18n:name="section"
+                       tal:replace="context/label" i18n:translate="" />
+</h1>
+
+<metal:block metal:fill-slot="body">
+
+<p tal:condition="not:view/has_timetables"
+   i18n:translate="">There are no terms or timetable schemas defined.</p>
+
+<tal:if tal:condition="view/has_timetables">
+<form tal:attributes="action request/URL" class="plain" method="post">
+
+  <fieldset tal:define="terms view/app/terms/values;
+                        ttschemas view/app/ttschemas/values">
+    <legend i18n:translate="">Choose schedule template</legend>
+
+    <p i18n:translate="">For term(s):</p>
+
+    <tal:if condition="view/singleTerm">
+      <tal:loop tal:repeat="term terms/sortby:first">
+        <strong tal:content="term/title" i18n:translate="" />
+      </tal:loop>
+    </tal:if>
+    <tal:if condition="not:view/singleTerm">
+      <tal:loop tal:repeat="term terms/sortby:first">
+        <input type="checkbox" name="terms"
+               tal:attributes="value term/__name__;
+                               checked python:term in view.terms
+                                                  and 'checked' or None" />
+        <span tal:content="term/title" i18n:translate="" />
+      </tal:loop>
+      <input class="button-ok" type="submit" name="REFRESH" value="Update"
+             i18n:attributes="value" />
+    </tal:if>
+
+    <p i18n:translate="">Using timetable:</p>
+
+    <tal:if condition="view/singleSchema">
+      <tal:loop tal:repeat="ttschema ttschemas/sortby:__name__">
+        <strong tal:content="ttschema/title" i18n:translate="" />
+      </tal:loop>
+    </tal:if>
+    <tal:if condition="not:view/singleSchema">
+      <tal:loop tal:repeat="ttschema ttschemas/sortby:title">
+        <input type="radio" name="ttschema"
+               tal:attributes="value ttschema/__name__;
+                               checked python:ttschema is view.ttschema
+                                                   and 'checked' or None" />
+        <span tal:content="ttschema/title" i18n:translate="" />
+      </tal:loop>
+      <input class="button-ok" type="submit" name="REFRESH" value="Update"
+             i18n:attributes="value" />
+    </tal:if>
+  </fieldset>
+</form>
+
+<form tal:attributes="action request/URL" class="plain" method="post">
+
+  <tal:loop repeat="term view/terms">
+    <input type="hidden" name="terms"
+           tal:attributes="value term/__name__" />
+  </tal:loop>
+  <input type="hidden" name="ttschema"
+         tal:attributes="value view/ttschema/__name__" />
+
+  <table class="timetable">
+    <tr>
+      <tal:block repeat="day view/days">
+        <th class="day" tal:content="day/title" i18n:translate="">Day N</th>
+      </tal:block>
+    </tr>
+    <tr>
+      <tal:block repeat="day view/days">
+        <td >
+          <ul>
+            <tal:block tal:repeat="period day/periods">
+              <li>
+                <input class="activity" type="checkbox"
+                       tal:attributes="checked period/selected;
+                                       id string:${day/title}.${period/title};
+                                       name string:${day/title}.${period/title};
+                                       value string:${day/title}.${period/title}" />
+                <label class="period"
+                       tal:attributes="for string:${day/title}.${period/title}"
+                       tal:content="period/title">
+                  Period N
+                </label>
+              </li>
+            </tal:block>
+          </ul>
+        </td>
+      </tal:block>
+    </tr>
+  </table>
+
+  <div class="controls">
+    <input class="button-ok" type="submit" name="SAVE" value="Save"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value cancel-button" />
+  </div>
+
+</form>
+</tal:if>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/section-timetable-setup.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/simpletts.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/simpletts.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/simpletts.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,71 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">
+    New timetable schema
+  </h1>
+<metal:block metal:fill-slot="body">
+
+<p i18n:translate="">
+This is a simple way to create a weekly timetable schema.  Just fill
+in a sufficient number of lines for your periods.
+</p>
+
+<p i18n:translate="">
+If you need more flexibility, you can use the <a href="add.html">timetable
+schema creation wizard</a>, or a <a href="complexadd.html">complex timetable
+schema set up form</a>.
+</p>
+
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <div class="error"
+       tal:content="view/error"
+       tal:condition="view/error"
+       i18n:translate=""
+       />
+
+  <div class="row" tal:define="widget nocall:view/title_widget">
+      <metal:block use-macro="context/@@form_macros/widget_row" />
+  </div>
+
+<table>
+  <tr>
+    <th i18n:translate="">Period title (optional)</th>
+    <th i18n:translate="">Period start time</th>
+    <th i18n:translate="">Period end time </th>
+  <tr>
+  <tr tal:repeat="nr python:range(1, view._nrperiods)">
+    <th tal:define="widget python:getattr(view, 'period_name_%s_widget' % nr)">
+      <span class="error"
+           tal:condition="widget/error" tal:content="structure widget/error" />
+      <div tal:content="structure widget"/>
+    </th>
+    <th tal:define="widget python:getattr(view, 'period_start_%s_widget' % nr)">
+      <span class="error"
+           tal:condition="widget/error" tal:content="structure widget/error" />
+      <div tal:content="structure widget"/>
+    </th>
+    <th tal:define="widget python:getattr(view, 'period_finish_%s_widget' % nr)">
+      <span class="error"
+           tal:condition="widget/error" tal:content="structure widget/error" />
+      <div tal:content="structure widget"/>
+    </th>
+  </tr>
+</table>
+
+<div class="controls">
+  <input type="submit" class="button-ok" name="CREATE" value="Create"
+         i18n:attributes="value" />
+  <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+         i18n:attributes="value cancel-button" />
+</div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/simpletts.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_change.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_change.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_change.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,73 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Choose a special day</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">
+    Choose a special day
+  </h1>
+<metal:block metal:fill-slot="body">
+
+<p i18n:translate="">
+  You can adjust the start and end times of periods for
+  <span tal:replace="view/date"/> in the form below.  In order to
+  remove a period from the day, just delete the period's start and end
+  times.
+</p>
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+  <input type="hidden" name="date" tal:attributes="value view/date"/>
+
+  <div class="error"
+       tal:content="view/error"
+       tal:condition="view/error"
+       i18n:translate=""
+       />
+
+   <table>
+     <tr>
+       <th i18n:translate="">Period title</th>
+       <th i18n:translate="">Original start</th>
+       <th i18n:translate="">Original end</th>
+       <th i18n:translate="">New start</th>
+       <th i18n:translate="">New end</th>
+     </tr>
+     <tr tal:repeat="period view/getPeriods">
+     <tal:block define="title python: period[0];
+                        orig_start python: period[1];
+                        orig_end python: period[2];
+                        start python: period[3];
+                        end python: period[4];">
+       <td tal:content="title"/>
+       <td tal:content="orig_start"/>
+       <td tal:content="orig_end"/>
+       <td tal:define="name string:${title}_start"
+           tal:attributes="
+             class python: name in view.field_errors and 'error' or None">
+         <input type="text"
+                tal:attributes="name name;
+                                value python: request.form.get(name, start)"/>
+       </td>
+       <td tal:define="name string:${title}_end"
+           tal:attributes="
+             class python: name in view.field_errors and 'error' or None">
+         <input type="text"
+                tal:attributes="name name;
+                                value python: request.form.get(name, end)"/>
+       </td>
+     </tal:block>
+     </tr>
+   </table>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="SUBMIT" value="Modify"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value cancel-button" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_change.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_select.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_select.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_select.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,50 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">Choose a special day</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">
+    Choose a special day
+  </h1>
+<metal:block metal:fill-slot="body">
+
+<p i18n:translate="">
+This form allows you to change the start and end times for periods on
+a certain date, or to cancel some periods altogether.
+</p>
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <div class="error"
+       tal:content="view/error"
+       tal:condition="view/error"
+       i18n:translate=""
+       />
+
+  <p i18n:translate="">
+    Please enter the date when the periods need to be changed below.
+  </p>
+
+  <div class="row">
+    <label for="date" i18n:translate="">Date</label>
+    <input type="text" name="date" id="date"
+           tal:attributes="value request/date|nothing"/>
+    <img class="CalIcon" onClick="clickWidgetIcon('date');" id="dateIcon"
+         alt="[popup calendar]" i18n:attributes="alt"
+         tal:attributes="src context/++resource++calwidget-icon.gif"/>
+    <div id="dateDiv"
+         style="background: #fff; position: absolute; display: none;"/>
+  </div>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="CHOOSE" value="Proceed"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value cancel-button" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/specialday_select.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable-schema-container.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable-schema-container.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable-schema-container.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,68 @@
+<tal:defs define="dummy view/update" />
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title"
+         tal:content="view/index_title" i18n:translate="">Contents</title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/index_title" i18n:translate="">Contents</h1>
+
+<metal:block metal:fill-slot="body"
+             tal:define="objects context/values;
+                         canModify view/canModify">
+  <p tal:condition="not:objects" i18n:translate="">There are none.</p>
+  <tal:block tal:condition="objects"
+             tal:define="default_id context/default_id">
+    <form tal:condition="canModify"
+          method="post"
+          tal:attributes="action string:${context/@@absolute_url}/delete.html">
+      <div tal:repeat="obj objects/sortby:title">
+        <input type="checkbox"
+               tal:attributes="name string:delete.${obj/zope:name};
+                               disabled obj/schooltool:has_dependents" />
+        <a tal:content="obj/title"
+           tal:attributes="href obj/@@absolute_url">Some Object</a>
+      </div>
+      <div class="controls">
+        <input type="submit" class="button-cancel" value="Delete"
+               i18n:attributes="value delete-button;" />
+      </div>
+    </form>
+    <ul tal:condition="not:canModify">
+      <li tal:repeat="obj objects/sortby:title">
+        <a tal:content="obj/title"
+           tal:attributes="href obj/@@absolute_url">Some Object</a>
+      </li>
+    </ul>
+    <div class="row">
+      <label i18n:translate="" for="ttschema">Default Timetable Schema:</label>
+      <tal:block tal:condition="not:canModify">
+        <a tal:condition="default_id"
+           tal:define="default context/getDefault"
+           tal:content="default/title"
+           tal:attributes="href default/@@absolute_url">(Default Schema)</a>
+        <span tal:condition="not:default_id" i18n:translate="">Not Selected</span>
+      </tal:block>
+      <form tal:condition="canModify"
+            method="post"
+            action=".">
+        <select name="ttschema" size="1"
+                id="ttschema">
+          <option value="" i18n:translate="">Not Selected</option>
+          <option tal:repeat="obj objects/sortby:title"
+                  tal:content="obj/title"
+                  tal:attributes="selected python:obj.__name__ == default_id;
+                                  value python: obj.__name__">(Schema title)</option>
+        </select>
+        <input type="submit" class="button-ok" name="UPDATE_SUBMIT" value="Change"
+               title="Shortcut: Alt-A" accesskey="A"
+               i18n:attributes="value change-button; accesskey" />
+      </form>
+    </div>
+  </tal:block>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable-schema-container.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,34 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title"
+         tal:content="view/title" i18n:translate="" />
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/title" i18n:translate="" />
+
+<metal:block metal:fill-slot="body"
+             tal:define="owner_url context/__parent__/__parent__/@@absolute_url;
+                         calendar_url string:$owner_url/calendar/daily.html">
+
+  <table class="timetable"
+         tal:define="ncols python:len(context.keys()) or 1;
+                     col_width python:'%d%%' % (100 / ncols);
+                     th_width python: '%d%%' % (10 / ncols);
+                     td_width python: '%d%%' % (90 / ncols)">
+    <tr>
+      <th tal:repeat="day context/keys" tal:content="day" i18n:translate=""
+          tal:attributes="width col_width" colspan="2" class="day">Day N</th>
+    </tr>
+    <tr tal:repeat="row view/rows"><tal:block tal:repeat="col row">
+      <th tal:attributes="width th_width" tal:content="col/period"
+          class="period">1</th>
+      <td tal:attributes="width td_width" tal:content="col/activity"
+          class="activity">Act1</td>
+    </tal:block></tr>
+  </table>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_event_edit.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_event_edit.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_event_edit.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,89 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate=""
+         tal:content="context/title">Add/edit event</title>
+</head>
+<body>
+
+<metal:block fill-slot="content-header">
+  <h1>
+    <span tal:replace="context/title" />
+    -
+    <span tal:replace="view/day" />
+  </h1>
+  <tal:if condition="context/allday">
+    <div><strong i18n:translate="">All day event</strong></div>
+  </tal:if>
+
+  <metal:block use-macro="view/@@formlib_macros/edit" />
+
+  <p tal:condition="context/recurrence">
+    <em i18n:translate="">
+      This is a recurring event.
+    </em>
+  </p>
+
+</metal:block>
+
+<metal:block metal:fill-slot="body"
+             tal:define="evdate python:context.dtstart.strftime('%Y-%m-%d')">
+
+  <tal:block replace="structure context/@@notes|nothing"/>
+
+  <div class="info-block">
+    <h5 i18n:translate="">Details</h5>
+    <table class="person-details">
+      <tal:if condition="not:context/allday">
+        <tr tal:condition="view/start">
+          <td class="dr" i18n:translate="">Starts</td>
+          <td>:&nbsp;</td>
+          <td class="dl" tal:content="view/start" />
+        </tr>
+        <tr tal:condition="view/end">
+          <td class="dr" i18n:translate="">Ends</td>
+          <td>:&nbsp;</td>
+          <td class="dl" tal:content="view/end" />
+        </tr>
+      </tal:if>
+      <tr tal:condition="context/location|nothing">
+        <td class="dr" i18n:translate="">Location</td>
+        <td>:&nbsp;</td>
+        <td class="dl" tal:content="context/location" />
+      </tr>
+    </table>
+    <a class="modify" href=""
+       title="Change the details of this event"
+       tal:attributes="href string:${context/@@absolute_url}/edit.html"
+       i18n:attributes="title"
+       i18n:translate="">
+       edit event
+    </a>
+  </div>
+
+  <div class="info-block"
+       tal:define="resources view/display/getBookedResources">
+    <h5 i18n:translate="">Scheduled resources</h5>
+    <ul tal:condition="resources">
+      <li tal:repeat="resource resources">
+        <a href=""
+           tal:attributes="href string:${resource/@@absolute_url}"
+           tal:content="resource/title" />
+      </li>
+    </ul>
+    <a class="modify" href=""
+      title="Change the resources scheduled for this event"
+      i18n:translate=""
+      tal:attributes="href string:${context/@@absolute_url}/booking.html?date=${evdate}">
+      edit resources
+    </a>
+  </div>
+
+  <a href="" class="modify destructive" title="Delete this event"
+    i18n:translate=""
+    tal:attributes="href string:${context/__parent__/@@absolute_url}/delete.html?event_id=${context/unique_id}&date=${evdate}">
+    delete event
+  </a>
+
+
+</metal:block>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_event_edit.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_list.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_list.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_list.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,28 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">
+    Timetables for <span i18n:name="object"
+                         tal:replace="context/__parent__/title" />
+  </title>
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header" i18n:translate="">
+  Timetables for <span i18n:name="object"
+                       tal:replace="context/__parent__/title" />
+</h1>
+
+<metal:block metal:fill-slot="body">
+  <div class="info-block">
+    <h3>Timetables</h3>
+    <ul>
+      <li tal:repeat="timetable context/values">
+        <a tal:attributes="href timetable/@@absolute_url"
+           tal:content="timetable/__name__">some.timetable</a>
+      </li>
+    </ul>
+  </div>
+</metal:block>
+
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetable_list.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetableschema.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetableschema.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetableschema.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,39 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title"
+         tal:content="view/title" i18n:translate="" />
+</head>
+<body>
+
+<h1 metal:fill-slot="content-header"
+    tal:content="view/title" i18n:translate="" />
+
+<metal:block metal:fill-slot="body"
+             tal:define="owner_url context/__parent__/__parent__/@@absolute_url;
+                         calendar_url string:$owner_url/calendar/daily.html">
+
+  <p tal:condition="view/timezone"
+     tal:content="string:Timezone: ${view/timezone}"/>
+  <table class="timetable"
+         tal:define="ncols python:len(context.keys()) or 1;
+                     col_width python:'%d%%' % (100 / ncols);
+                     th_width python: '%d%%' % (10 / ncols);
+                     td_width python: '%d%%' % (90 / ncols);
+                     homerooms view/homerooms">
+    <tr>
+      <th tal:repeat="day context/keys" tal:content="day" i18n:translate=""
+          tal:attributes="width col_width" colspan="2" class="day">Day N</th>
+    </tr>
+    <tr tal:repeat="row view/rows"><tal:block tal:repeat="col row">
+      <th tal:attributes="width th_width" tal:content="col/period"
+          class="period">1</th>
+      <td tal:attributes="width td_width" class="activity">
+            <span tal:condition="python: repeat['row'].index() in homerooms[repeat['col'].index()]"
+                  i18n:translate="">Homeroom</span>
+      </td>
+    </tal:block></tr>
+  </table>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/timetableschema.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,30 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">New timetable schema</h1>
+<metal:block metal:fill-slot="body">
+
+<p>This wizard presents you with a series of questions.  You may alternatively
+create a <a href="simpleadd.html">simple weekly timetable schema</a>, or use
+a more complex <a href="complexadd.html">advanced adding form</a>.</p>
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <div class="row" tal:define="widget nocall:view/title_widget">
+    <metal:block use-macro="context/@@form_macros/widget_row" />
+  </div>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="NEXT" value="Next"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_choice.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_choice.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_choice.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,28 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">New timetable schema</h1>
+<metal:block metal:fill-slot="body">
+
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <p tal:content="view/question" i18n:translate="">(Question)</p>
+
+  <div class="controls">
+    <input tal:repeat="choice view/choices"
+           class="button-ok" type="submit"
+           tal:attributes="name string:NEXT.${repeat/choice/index};
+                           value python:choice[1]"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_choice.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_form.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_form.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_form.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,30 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">New timetable schema</h1>
+<metal:block metal:fill-slot="body">
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <p tal:condition="view/description" tal:content="view/description"
+     i18n:translate="">(informative text)</p>
+
+  <div tal:condition="view/error" tal:content="view/error" class="error"
+       i18n:translate="">(error message)</div>
+
+  <metal:block use-macro="context/@@form_macros/widget_rows" />
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="NEXT" value="Next"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_form.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,51 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">New timetable schema</h1>
+<metal:block metal:fill-slot="body">
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <p tal:condition="view/description" tal:content="view/description"
+     i18n:translate="">(informative text)</p>
+
+  <div tal:condition="view/error" tal:content="view/error" class="error"
+       i18n:translate="">(error message)</div>
+
+  <table>
+    <tr>
+      <th tal:repeat="day view/days" tal:content="day" i18n:translate="" />
+    </tr>
+    <tr>
+      <td tal:repeat="periods view/periodsInOrder">
+        <tal:for define="daynr repeat/periods/index"
+                 repeat="period periods">
+          <tal:defs define="name string:homeroom_${daynr}_${period}">
+            <input type="checkbox"
+                   tal:attributes="name name;
+                                   id name;
+                                   checked python:request.get(name)" />
+            <label tal:content="period"
+                   tal:attributes="for name" />
+          </tal:defs>
+          <br />
+        </tal:for>
+
+      </td>
+    </tr>
+  </table>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="NEXT" value="Next"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,40 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">New timetable schema</h1>
+<metal:block metal:fill-slot="body">
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <p tal:condition="view/description" tal:content="view/description"
+     i18n:translate="">(informative text)</p>
+
+  <div tal:condition="view/error" tal:content="view/error" class="error"
+       i18n:translate="">(error message)</div>
+
+  <div class="row" tal:repeat="slotnr python:range(view.numPeriods())">
+  <tal:block define="slot python:view.periods()[slotnr]">
+    <select tal:attributes="name name"
+            tal:define="name string:period_${slotnr}">
+      <option tal:repeat="period view/periods"
+              tal:attributes="selected
+                      python:(period == request.get(name, slot)) or None"
+              tal:content="period" />
+    </select>
+  </tal:block>
+  </div>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="NEXT" value="Next"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,49 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">New timetable schema</h1>
+<metal:block metal:fill-slot="body">
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <p tal:condition="view/description" tal:content="view/description"
+     i18n:translate="">(informative text)</p>
+
+  <div tal:condition="view/error" tal:content="view/error" class="error"
+       i18n:translate="">(error message)</div>
+
+  <table>
+    <tr>
+      <th tal:repeat="day view/days" tal:content="day" i18n:translate="" />
+    </tr>
+    <tr tal:repeat="slotnr python: range(max(numslots))"
+        tal:define="numslots view/numSlots">
+      <td tal:define="slot python:view.periods()[slotnr]"
+          tal:repeat="day view/days">
+        <select tal:define="daynr repeat/day/index;
+                            name string:period_${daynr}_${slotnr}"
+                tal:attributes="name name"
+                tal:condition="python: slotnr &lt; numslots[daynr]">
+          <option tal:repeat="period view/periods"
+                  tal:attributes="selected
+                          python:(period == request.get(name, slot)) or None"
+                  tal:content="period" />
+        </select>
+      </td>
+    </tr>
+  </table>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="NEXT" value="Next"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,45 @@
+<html metal:use-macro="view/@@standard_macros/page" i18n:domain="schooltool">
+<head>
+  <title metal:fill-slot="title" i18n:translate="">New timetable schema</title>
+</head>
+<body>
+  <h1 metal:fill-slot="content-header" i18n:translate="">New timetable schema</h1>
+<metal:block metal:fill-slot="body">
+
+<form class="plain" method="POST" tal:attributes="action request/URL">
+
+  <p tal:condition="view/description" tal:content="view/description"
+     i18n:translate="">(informative text)</p>
+
+  <div tal:condition="view/error" tal:content="view/error" class="error"
+       i18n:translate="">(error message)</div>
+
+  <table>
+    <tr>
+      <th tal:repeat="day_name view/dayNames"
+          tal:content="day_name"
+          i18n:translate=""/>
+    </tr>
+    <tr>
+      <td tal:repeat="day_name view/dayNames">
+        <textarea tal:define="name string:times.${repeat/day_name/index}"
+                tal:attributes="name name"
+                tal:content="python:request.get(name, view.example_intervals)"
+                rows="12" cols="15">
+        </textarea>
+      </td>
+    </tr>
+  </table>
+
+  <div class="controls">
+    <input type="submit" class="button-ok" name="NEXT" value="Next"
+           i18n:attributes="value" />
+    <input type="submit" class="button-cancel" name="CANCEL" value="Cancel"
+           i18n:attributes="value" />
+  </div>
+
+</form>
+
+</metal:block>
+</body>
+</html>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/specialdays.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/specialdays.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/specialdays.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,455 @@
+================
+Special Day View
+================
+
+Special days are days for which some periods are shortened or cancelled
+altogether.  Our view for that presents the administrator with a way to alter
+the schoolday template for this day.
+
+First of all, we need an app object:
+
+    >>> from schooltool.testing import setup as sbsetup
+    >>> app = sbsetup.setUpSchoolToolSite()
+
+We have a timetable schema to put the view on:
+
+    >>> from schooltool.timetable.browser.tests.test_timetable import \
+    ...      createSchema
+    >>> from schooltool.timetable.browser import SpecialDayView
+    >>> ttschema = createSchema(['Day 1', 'Day 2'],
+    ...                         ['First',
+    ...                          'Second',
+    ...                          'Third',
+    ...                          'Fourth'])
+    >>> app['ttschemas']['usual'] = ttschema
+
+The schema has a model attribute:
+
+    >>> from schooltool.timetable.browser.tests.test_timetable import \
+    ...      createDayTemplate
+    >>> from schooltool.timetable import SequentialDaysTimetableModel
+    >>> default = createDayTemplate([(9, 0, 45),
+    ...                              (10, 0, 45),
+    ...                              (11, 0, 45),
+    ...                              (12, 0, 45)])
+    >>> ttschema.model = SequentialDaysTimetableModel(['Day 1', 'Day 2'],
+    ...                                               {None: default})
+
+We will need a term:
+
+    >>> import datetime
+    >>> from schooltool.term.term import Term
+    >>> app["terms"]["2005-summer"] = Term('2005 summer',
+    ...                                    datetime.date(2005, 6, 1),
+    ...                                    datetime.date(2005, 8, 31))
+    >>> app["terms"]["2005-summer"].addWeekdays(0, 1, 2, 3, 4)
+
+Now we can call the view.  First we get asked what day do we want to change:
+
+    >>> from zope.publisher.browser import TestRequest
+    >>> request = TestRequest()
+    >>> view = SpecialDayView(ttschema, request)
+    >>> print view()
+    <BLANKLINE>
+    ...
+      <p>
+        Please enter the date when the periods need to be changed below.
+      </p>
+    <BLANKLINE>
+      <div class="row">
+        <label for="date">Date</label>
+        <input type="text" name="date" id="date" />
+        <img class="CalIcon" onclick="clickWidgetIcon('date');"
+             id="dateIcon" alt="[popup calendar]"
+             src="a dummy resource" />
+        <div id="dateDiv" style="background: #fff; position: absolute; display: none;" />
+      </div>
+    <BLANKLINE>
+      <div class="controls">
+        <input type="submit" class="button-ok" name="CHOOSE"
+               value="Proceed" />
+        <input type="submit" class="button-cancel" name="CANCEL"
+               value="Cancel" />
+      </div>
+    ...
+
+    >>> `view.template` == `view.select_template`
+    True
+
+If we pass a correct date to the view, it gets set as an attribute:
+
+    >>> request = TestRequest(form={'date': '2005-07-05'})
+    >>> view = SpecialDayView(ttschema, request)
+    >>> view.update()
+    >>> view.date
+    datetime.date(2005, 7, 5)
+    >>> `view.template` == `view.form_template`
+    True
+
+Our view now can get a list of period titles, start and end times:
+
+    >>> pprint(view.getPeriods())
+    [('First', '09:00', '09:45', '09:00', '09:45'),
+     ('Second', '10:00', '10:45', '10:00', '10:45'),
+     ('Third', '11:00', '11:45', '11:00', '11:45'),
+     ('Fourth', '12:00', '12:45', '12:00', '12:45')]
+
+The user is taken to the next step.  He gets a table with period names and
+times, and fields for new start and end times:
+
+    >>> print view()
+    <BLANKLINE>
+    ...
+       <input type="hidden" name="date" value="2005-07-05" />
+       <table>
+         <tr>
+           <th>Period title</th>
+           <th>Original start</th>
+           <th>Original end</th>
+           <th>New start</th>
+           <th>New end</th>
+         </tr>
+         <tr>
+           <td>First</td>
+           <td>09:00</td>
+           <td>09:45</td>
+           <td>
+             <input type="text" name="First_start" value="09:00" />
+           </td>
+           <td>
+             <input type="text" name="First_end" value="09:45" />
+           </td>
+         </tr>
+         <tr>
+           <td>Second</td>
+           <td>10:00</td>
+           <td>10:45</td>
+           <td>
+             <input type="text" name="Second_start"
+                    value="10:00" />
+           </td>
+           <td>
+             <input type="text" name="Second_end" value="10:45" />
+           </td>
+         </tr>
+         <tr>
+           <td>Third</td>
+           <td>11:00</td>
+           <td>11:45</td>
+           <td>
+             <input type="text" name="Third_start" value="11:00" />
+           </td>
+           <td>
+             <input type="text" name="Third_end" value="11:45" />
+           </td>
+         </tr>
+         <tr>
+           <td>Fourth</td>
+           <td>12:00</td>
+           <td>12:45</td>
+           <td>
+             <input type="text" name="Fourth_start"
+                    value="12:00" />
+           </td>
+           <td>
+             <input type="text" name="Fourth_end" value="12:45" />
+           </td>
+         </tr>
+       </table>
+    ...
+        <input type="submit" class="button-ok" name="SUBMIT"
+               value="Modify" />
+    ...
+
+Now the user can fill in the form and create an exception template for this
+day.
+
+    >>> request = TestRequest(form={'date': '2005-07-05',
+    ...                             'SUBMIT': 'next',
+    ...                             'First_start': '8:00',
+    ...                             'First_end': '8:30',
+    ...                             'Second_start': '',
+    ...                             'Second_end': '',
+    ...                             'Third_start': '9:30',
+    ...                             'Third_end': '10:00',
+    ...                             'Fourth_start': '',
+    ...                             'Fourth_end': '',
+    ...                             })
+    >>> view = SpecialDayView(ttschema, request)
+    >>> from datetime import time, date, timedelta
+    >>> view.update()
+    >>> pprint(view.extractPeriods())
+    [('First', datetime.time(8, 0), datetime.timedelta(0, 1800)),
+     ('Third', datetime.time(9, 30), datetime.timedelta(0, 1800))]
+
+The processing does not raise:
+
+    >>> result = view()
+
+There are no field errors:
+
+    >>> view.field_errors
+    []
+
+The actual exception gets added:
+
+    >>> exception = ttschema.model.exceptionDays[datetime.date(2005, 7, 5)]
+    >>> exception
+    [('First', <schooltool.timetable.SchooldaySlot object at ...>),
+     ('Third', <schooltool.timetable.SchooldaySlot object at ...>)]
+
+    >>> for period, slot in exception:
+    ...     print period, slot.tstart, slot.duration
+    First 08:00:00 0:30:00
+    Third 09:30:00 0:30:00
+
+The user is redirected to the schema main page:
+
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('location')
+    'http://127.0.0.1/ttschemas/usual'
+
+If we revisit this date, we see the original times on the left, and the times
+of the exceptional template filled in in the form:
+
+    >>> request = TestRequest(form={'date': '2005-07-05'})
+    >>> view = SpecialDayView(ttschema, request)
+    >>> print view()
+    <BLANKLINE>
+    ...
+       <table>
+         <tr>
+           <th>Period title</th>
+           <th>Original start</th>
+           <th>Original end</th>
+           <th>New start</th>
+           <th>New end</th>
+         </tr>
+         <tr>
+           <td>First</td>
+           <td>09:00</td>
+           <td>09:45</td>
+           <td>
+             <input type="text" name="First_start" value="08:00" />
+           </td>
+           <td>
+             <input type="text" name="First_end" value="08:30" />
+           </td>
+         </tr>
+         <tr>
+           <td>Second</td>
+           <td>10:00</td>
+           <td>10:45</td>
+           <td>
+             <input type="text" name="Second_start" value="" />
+           </td>
+           <td>
+             <input type="text" name="Second_end" value="" />
+           </td>
+         </tr>
+         <tr>
+           <td>Third</td>
+           <td>11:00</td>
+           <td>11:45</td>
+           <td>
+             <input type="text" name="Third_start" value="09:30" />
+           </td>
+           <td>
+             <input type="text" name="Third_end" value="10:00" />
+           </td>
+         </tr>
+         <tr>
+           <td>Fourth</td>
+           <td>12:00</td>
+           <td>12:45</td>
+           <td>
+             <input type="text" name="Fourth_start" value="" />
+           </td>
+           <td>
+             <input type="text" name="Fourth_end" value="" />
+           </td>
+         </tr>
+       </table>
+    ...
+        <input type="submit" class="button-ok" name="SUBMIT"
+               value="Modify" />
+    ...
+
+The disabled periods can be reenabled:
+
+    >>> request = TestRequest(form={'date': '2005-07-05',
+    ...                             'SUBMIT': 'next',
+    ...                             'First_start': '8:00',
+    ...                             'First_end': '8:30',
+    ...                             'Second_start': '8:45',
+    ...                             'Second_end': '9:15',
+    ...                             'Third_start': '9:30',
+    ...                             'Third_end': '10:00',
+    ...                             'Fourth_start': '11:00',
+    ...                             'Fourth_end': '12:00',
+    ...                             })
+    >>> view = SpecialDayView(ttschema, request)
+    >>> from datetime import time, date, timedelta
+    >>> view.update()
+    >>> pprint(view.extractPeriods())
+    [('First', datetime.time(8, 0), datetime.timedelta(0, 1800)),
+     ('Second', datetime.time(8, 45), datetime.timedelta(0, 1800)),
+     ('Third', datetime.time(9, 30), datetime.timedelta(0, 1800)),
+     ('Fourth', datetime.time(11, 0), datetime.timedelta(0, 3600))]
+
+
+Cancel button
+-------------
+
+If the user hits the Cancel button, he gets redurected to the ttschema default
+view:
+
+    >>> request = TestRequest(form={'date': '2005-07-06',
+    ...                             'CANCEL': 'next',
+    ...                             'First_start': '8:00',
+    ...                             'First_end': '8:30',
+    ...                             'Second_start': '8:45',
+    ...                             'Second_end': '9:15',
+    ...                             'Third_start': '9:30',
+    ...                             'Third_end': '10:00',
+    ...                             'Fourth_start': '',
+    ...                             'Fourth_end': '',
+    ...                             })
+    >>> view = SpecialDayView(ttschema, request)
+    >>> result = view()
+    >>> request.response.getStatus()
+    302
+    >>> request.response.getHeader('location')
+    'http://127.0.0.1/ttschemas/usual'
+
+No exception gets added:
+
+    >>> ttschema.model.exceptionDays[datetime.date(2005, 7, 6)]
+    Traceback (most recent call last):
+      ...
+    KeyError: datetime.date(2005, 7, 6)
+
+
+The Boring Bit -- Various Error Conditions
+------------------------------------------
+
+What if the date is incorrect?
+
+    >>> request = TestRequest(form={'date': 'Your father was a hamster'})
+    >>> view = SpecialDayView(ttschema, request)
+    >>> result = view()
+    >>> view.error == 'Invalid date. Please use YYYY-MM-DD format.'
+    True
+    >>> view.error in result
+    True
+    >>> `view.template` == `view.select_template`
+    True
+
+What if the date is not in a term?
+
+    >>> request = TestRequest(form={'date': '2004-01-01'})
+    >>> view = SpecialDayView(ttschema, request)
+    >>> result = view()
+    >>> view.error == 'The date does not belong to any term.'
+    True
+    >>> view.error in result
+    True
+
+We\'re courteous enough though to leave the date intact in the input field:
+
+    >>> 'value="2004-01-01"' in result
+    True
+
+What if the start/end times are incorrect?  Highlight them with a red border.
+
+If either a start or an end time is provided, the other must be provided as
+well.  Otherwise it is considered an error.
+
+    >>> request = TestRequest(form={'date': '2005-07-13',
+    ...                             'SUBMIT': 'next',
+    ...                             'First_start': '800',
+    ...                             'First_end': '8:30',
+    ...                             'Second_start': '',
+    ...                             'Second_end': '9:15',
+    ...                             'Third_start': '9:30',
+    ...                             'Third_end': '',
+    ...                             'Fourth_start': '14:00',
+    ...                             'Fourth_end': '15:00',
+    ...                             })
+    >>> view = SpecialDayView(ttschema, request)
+    >>> result = view()
+
+Update did not happen:
+
+    >>> ttschema.model.exceptionDays[datetime.date(2005, 7, 13)]
+    Traceback (most recent call last):
+      ...
+    KeyError: datetime.date(2005, 7, 13)
+
+The erroneous fields are noticed:
+
+    >>> view.field_errors
+    ['First_start', 'Second_start', 'Third_end']
+
+    >>> view.error
+    u'Some values were invalid.  They are highlighted in red.'
+
+    >>> print result
+    <BLANKLINE>
+    ...
+       <table>
+         <tr>
+           <th>Period title</th>
+           <th>Original start</th>
+           <th>Original end</th>
+           <th>New start</th>
+           <th>New end</th>
+         </tr>
+         <tr>
+           <td>First</td>
+           <td>09:00</td>
+           <td>09:45</td>
+           <td class="error">
+             <input type="text" name="First_start" value="800" />
+           </td>
+           <td>
+             <input type="text" name="First_end" value="8:30" />
+           </td>
+         </tr>
+         <tr>
+           <td>Second</td>
+           <td>10:00</td>
+           <td>10:45</td>
+           <td class="error">
+             <input type="text" name="Second_start" value="" />
+           </td>
+           <td>
+           <input type="text" name="Second_end" value="9:15" />
+           </td>
+         </tr>
+         <tr>
+           <td>Third</td>
+           <td>11:00</td>
+           <td>11:45</td>
+           <td>
+             <input type="text" name="Third_start" value="9:30" />
+           </td>
+           <td class="error">
+             <input type="text" name="Third_end" value="" />
+           </td>
+         </tr>
+         <tr>
+           <td>Fourth</td>
+           <td>12:00</td>
+           <td>12:45</td>
+           <td>
+             <input type="text" name="Fourth_start"
+                    value="14:00" />
+           </td>
+           <td>
+             <input type="text" name="Fourth_end" value="15:00" />
+           </td>
+         </tr>
+       </table>
+    ...


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/specialdays.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_schema.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_schema.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_schema.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,977 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool timetable schema views.
+
+$Id: test_schema.py 6602 2007-01-26 13:17:25Z ignas $
+"""
+
+import unittest
+from pprint import pprint
+
+from zope.interface import directlyProvides
+from zope.interface import directlyProvidedBy
+from zope.i18n import translate
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.app.container.interfaces import INameChooser
+from zope.app.testing import ztapi, setup
+from zope.annotation.interfaces import IAttributeAnnotatable
+
+from schooltool.app.app import SimpleNameChooser
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.testing import setup as sbsetup
+from schooltool.testing.util import NiceDiffsMixin
+from schooltool.timetable import SequentialDaysTimetableModel
+from schooltool.timetable import WeeklyTimetableModel
+from schooltool.timetable.interfaces import ITimetableModelFactory
+from schooltool.timetable.interfaces import ITimetableSchemaContainer
+from schooltool.timetable.browser.tests.test_timetable import setUp, tearDown
+from schooltool.timetable.browser.tests import test_timetable
+from schooltool.timetable.browser.tests.test_timetable import createDayTemplate
+
+
+def createSchema(*args):
+    tts = test_timetable.createSchema(*args)
+    tts.timezone = 'Asia/Tokyo'
+    return tts
+
+
+class TestAdvancedTimetableSchemaAdd(NiceDiffsMixin, unittest.TestCase):
+
+    def setUp(self):
+        setUp()
+        self.app = sbsetup.setUpSchoolToolSite()
+        IApplicationPreferences(self.app).timezone = 'Asia/Tokyo'
+
+        # Register the timetable models
+        ztapi.provideUtility(ITimetableModelFactory,
+                             SequentialDaysTimetableModel,
+                             'SequentialDaysTimetableModel')
+        ztapi.provideUtility(ITimetableModelFactory,
+                             WeeklyTimetableModel,
+                             'WeeklyTimetableModel')
+        ztapi.provideAdapter(ITimetableSchemaContainer,
+                             INameChooser,
+                             SimpleNameChooser)
+
+    def tearDown(self):
+        tearDown()
+
+    def createView(self, request=None):
+        from schooltool.timetable.browser.schema import \
+             AdvancedTimetableSchemaAdd
+        context = self.app["ttschemas"]
+        context['default'] = createSchema(['Day 1'], ['Period 1'])
+        if request is None:
+            request = TestRequest()
+        view = AdvancedTimetableSchemaAdd(context, request)
+        return view
+
+    def test(self):
+        view = self.createView()
+        result = view()
+        self.assert_('name="field.title" size="20" type="text" value="default"'
+                     in result)
+
+    def test_with_data(self):
+        request = TestRequest(form={'day1': 'Monday',
+                                    'field.title': 'something',
+                                    'model': 'SequentialDaysTimetableModel',
+                                    'time1.period': 'Period 1',
+                                    'time1.day0': '9:00-9:45',
+                                    })
+        view = self.createView(request)
+        result = view()
+        self.assertEquals(view.ttschema,
+                          createSchema(['Monday'], ['Period 1']))
+        self.assert_('value="something"' in result, result)
+        self.assertEquals(view.title_widget.error(), '')
+        self.assertEquals(view.model_name, 'SequentialDaysTimetableModel')
+        self.assertEquals(view.model_error, None)
+        self.assertEquals(view.day_templates,
+                          {None: createDayTemplate([]),
+                           0: createDayTemplate([(9, 0, 45)])})
+
+    def test_creation(self):
+        request = TestRequest(form={'day1': 'Monday',
+                                    'field.title': 'some.thing',
+                                    'model': 'SequentialDaysTimetableModel',
+                                    'time1.period': 'Period 1',
+                                    'time1.day0': '9:00-9:45',
+                                    'CREATE': 'Create', })
+        view = self.createView(request)
+        result = view()
+        self.assertEquals(view.model_error, None)
+        self.assertEquals(request.response.getStatus(), 302)
+        self.assertEquals(request.response.getHeader('location'),
+                          'http://127.0.0.1/ttschemas')
+        schema = view.context['something']
+        self.assertEquals(schema, view.ttschema)
+        self.assertEquals(schema.model.timetableDayIds, view.ttschema.keys())
+        self.assertEquals(schema.model.dayTemplates, view.day_templates)
+        self.assertEquals(schema.timezone, 'Asia/Tokyo')
+
+    def test_model_error(self):
+        request = TestRequest(form={'model': 'xxx',
+                                    'CREATE': 'Create'})
+        view = self.createView(request)
+        view()
+        self.assertEquals(view.model_error, "Please select a value")
+
+    def test_model_error_ignored_unless_this_is_the_final_submit(self):
+        view = self.createView(TestRequest(form={'field.title': 'Schema',
+                                                 'model': 'xxx'}))
+        view()
+        self.assertEquals(view.model_error, None)
+
+    def test_buildDayTemplates_empty(self):
+        view = self.createView()
+        dt = view._buildDayTemplates()
+        self.assertEquals(dt, {None: createDayTemplate([])})
+
+    def test_buildDayTemplates_simple(self):
+        request = TestRequest(form={
+            'time1.day0': '9:00',
+            'time2.day0': '10:00-10:45',
+            'time2.day6': '10:30-11:10',
+            'field.duration': '45'})
+        view = self.createView(request)
+        dt = view._buildDayTemplates()
+        self.assertEquals(dt,
+                          {None: createDayTemplate([]),
+                           0: createDayTemplate([(9, 0, 45),
+                                                 (10, 0, 45)]),
+                           6: createDayTemplate([(10, 30, 40)])})
+        self.assert_(not view.discarded_some_periods)
+
+    def test_buildDayTemplates_copy_day(self):
+        request = TestRequest(form={'time1.period': 'Period 1',
+                                     'time1.day0': '9:00-9:45',
+                                     'time1.day1': '13:00-13:45',
+                                     'time2.period': 'Period 2',
+                                     'time2.day0': '10:00-10:45',
+                                     'time2.day6': '10:30-11:10',
+                                     'COPY_PERIODS_1': 'C'})
+        view = self.createView(request)
+        dt = view._buildDayTemplates()
+        self.assertEquals(dt,
+                          {None: createDayTemplate([]),
+                           0: createDayTemplate([(9, 0, 45),
+                                                 (10, 0, 45)]),
+                           1: createDayTemplate([(9, 0, 45),
+                                                 (10, 0, 45)]),
+                           6: createDayTemplate([(10, 30, 40)])})
+
+    def test_buildDayTemplates_copy_empty_day(self):
+        request = TestRequest(form={
+            'time1.period': 'Period 1',
+            'time1.day0': '9:00-9:45',
+            'time2.period': 'Period 2',
+            'time2.day0': '10:00-10:45',
+            'time2.day6': '10:30-11:10',
+            'COPY_PERIODS_6': 'C'})
+        view = self.createView(request)
+        dt = view._buildDayTemplates()
+        self.assertEquals(dt,
+                          {None: createDayTemplate([]),
+                           0: createDayTemplate([(9, 0, 45),
+                                                 (10, 0, 45)])})
+
+    def test_buildDayTemplates_copy_empty_day_over_empty_day(self):
+        request = TestRequest(form={
+            'time1.period': 'Period 1',
+            'time1.day0': '9:00-9:45',
+            'time2.period': 'Period 2',
+            'time2.day0': '10:00-10:45',
+            'time2.day6': '10:30-11:10',
+            'COPY_PERIODS_4': 'C'})
+        view = self.createView(request)
+        dt = view._buildDayTemplates()
+        self.assertEquals(dt,
+                          {None: createDayTemplate([]),
+                           0: createDayTemplate([(9, 0, 45),
+                                                 (10, 0, 45)]),
+                           6: createDayTemplate([(10, 30, 40)])})
+
+    def test_buildDayTemplates_copy_first_day_ignored(self):
+        request = TestRequest(form={
+            'time1.period': 'Period 1',
+            'time1.day0': '9:00-9:45',
+            'time2.period': 'Period 2',
+            'time2.day0': '10:00-10:45',
+            'time2.day6': '10:30-11:10',
+            'COPY_PERIODS_0': 'C'})
+        view = self.createView(request)
+        dt = view._buildDayTemplates()
+        self.assertEquals(dt,
+                          {None: createDayTemplate([]),
+                           0: createDayTemplate([(9, 0, 45),
+                                                 (10, 0, 45)]),
+                           6: createDayTemplate([(10, 30, 40)])})
+
+    def test_buildDayTemplates_errors(self):
+        request = TestRequest(form={
+            'time1.period': 'Period 1',
+            'time1.day0': 'foo',
+            # When duration_widget.value is None, both endpoints are required
+            'time1.day1': '9:00'
+            })
+        view = self.createView(request)
+        dt = view._buildDayTemplates()
+        self.assertEquals(dt, {None: createDayTemplate([])})
+        self.assert_(view.discarded_some_periods)
+
+    def test_buildSchema_empty(self):
+        view = self.createView()
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Day 1'], ['Period 1']))
+
+    def test_buildSchema_from_request(self):
+        request = TestRequest(form={
+            'day1': 'Monday',
+            'day2': ' Tuesday ',
+            'day1.period1': 'A',
+            'day1.period2': ' B ',
+            'day2.period1': 'C',
+            'day2.period2': ''})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Monday', 'Tuesday'],
+                                               ['A', 'B'], ['C']))
+
+    def test_buildSchema_empty_day(self):
+        request = TestRequest(form={
+            'day1': 'Monday',
+            'day2': 'Tuesday',
+            'day1.period1': 'A',
+            'day1.period2': 'B',
+            'day2.period1': '',
+            'day2.period2': ''})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Monday', 'Tuesday'],
+                                               ['A', 'B'], ['Period 1']))
+
+    def test_buildSchema_repeated_day_name(self):
+        request = TestRequest(form={
+            'day1': 'D',
+            'day2': 'D',
+            'day3': 'D',
+            'day1.period1': 'A',
+            'day2.period1': 'B',
+            'day3.period1': 'C'})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['D', 'D (2)', 'D (3)'],
+                                               ['A'], ['B'], ['C']))
+
+    def test_buildSchema_repeated_period_nam(self):
+        request = TestRequest(form={
+            'day1': 'D',
+            'day1.period1': 'A',
+            'day1.period2': 'A'})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['D'], ['A', 'A (2)']))
+
+    def test_buildSchema_add_day(self):
+        request = TestRequest(form={
+            'day1': 'Monday',
+            'ADD_DAY': "Add"})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Monday', 'Day 2'],
+                                               ['Period 1'], ['Period 1']))
+
+    def test_buildSchema_add_period(self):
+        request = TestRequest(form={
+            'day1': 'Monday',
+            'day2': 'Tuesday',
+            'day1.period1': 'A',
+            'day1.period2': 'B',
+            'day2.period1': 'C',
+            'day2.period2': '',
+            'ADD_PERIOD': "Add"})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Monday', 'Tuesday'],
+                                               ['A', 'B', 'Period 3'], ['C']))
+
+    def test_buildSchema_add_period_not_first_day(self):
+        request = TestRequest(form={
+            'day1': 'Monday',
+            'day2': 'Tuesday',
+            'day1.period1': 'A',
+            'day2.period1': 'C',
+            'day2.period2': 'D',
+            'ADD_PERIOD': "Add"})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Monday', 'Tuesday'],
+                                               ['A'], ['C', 'D', 'Period 3']))
+
+    def test_buildSchema_delete_day(self):
+        request = TestRequest(form={
+            'day1': 'Day 1',
+            'day2': 'Day 1',
+            'day1.period1': 'A',
+            'day1.period2': 'B',
+            'day2.period1': 'C',
+            'day2.period2': 'D',
+            'DELETE_DAY_1': "Delete"})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Day 1'], ['C', 'D']))
+
+    def test_buildSchema_copy_day(self):
+        request = TestRequest(form={
+            'day1': 'Day 1',
+            'day2': 'Day 2',
+            'day1.period1': 'A',
+            'day1.period2': 'B',
+            'day2.period1': 'C',
+            'day2.period2': 'D',
+            'COPY_DAY_1': "Copy"})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Day 1', 'Day 2'],
+                                               ['A', 'B'], ['A', 'B']))
+
+    def test_buildSchema_copy_first_day_ignored(self):
+        request = TestRequest(form={
+            'day1': 'Day 1',
+            'day2': 'Day 2',
+            'day1.period1': 'A',
+            'day1.period2': 'B',
+            'day2.period1': 'C',
+            'day2.period2': 'D',
+            'COPY_DAY_0': "Copy"})
+        view = self.createView(request)
+        schema = view._buildSchema()
+        self.assertEquals(schema, createSchema(['Day 1', 'Day 2'],
+                                               ['A', 'B'], ['C', 'D']))
+
+    def test_all_periods(self):
+        view = self.createView()
+        view.ttschema = createSchema(['Day 1', 'Day 2', 'Day 3'],
+                                     ['A', 'C'], ['B', 'D'], ['A', 'F'])
+        self.assertEquals(view.all_periods(), ['A', 'C', 'B', 'D', 'F'])
+
+    def test_slot_times(self):
+        view = self.createView()
+        view.ttschema = createSchema(['Day 1', 'Day 2', 'Day 3'],
+                                     ['A', 'C'], ['B', 'D'], ['A', 'F', 'G'])
+        view.day_templates = {}
+        result = view.slot_times()
+        # The length of the result is equal to the longest day in the tt.
+        self.assertEquals(len(result), 3)
+        for row in result:
+            self.assertEquals(row, 7 * [None])
+
+    def test_slot_times_with_data(self):
+        view = self.createView()
+        view.ttschema = createSchema(['Day 1', 'Day 2', 'Day 3'],
+                                     ['A', 'C'], ['B', 'D'], ['A', 'F', 'G'])
+        view.day_templates = {0: createDayTemplate([(9, 0, 45),
+                                                    (10, 30, 40),
+                                                    (11, 22, 33)]),
+                              6: createDayTemplate([(8, 55, 45),
+                                                    (0, 0, 24*60)])}
+        times = view.slot_times()
+        self.assertEquals(len(times), 3)
+        self.assertEquals(times[0], ['09:00-09:45', None, None, None,
+                                     None, None, '00:00-24:00'])
+        self.assertEquals(times[1], ['10:30-11:10', None, None, None,
+                                     None, None, '08:55-09:40'])
+        self.assertEquals(times[2], ['11:22-11:55'] + [None] * 6)
+
+
+def doctest_TimetableSchemaView():
+    """Test for TimetableSchemaView.
+
+        >>> from schooltool.timetable.browser.schema import TimetableSchemaView
+        >>> from schooltool.timetable.schema import TimetableSchema
+        >>> from schooltool.timetable.schema import TimetableSchemaDay
+        >>> from schooltool.timetable import TimetableActivity
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+    Create some context:
+
+        >>> tts = TimetableSchema(['day 1', 'day 2'])
+        >>> tts.__name__ = 'some-schema'
+        >>> tts.title = "Some Schema"
+        >>> tts['day 1'] = ttd1 = TimetableSchemaDay(['A', 'B'])
+        >>> tts['day 2'] = ttd2 = TimetableSchemaDay(['A', 'B'])
+
+        >>> request = TestRequest()
+        >>> view = TimetableSchemaView(tts, request)
+
+    title() returns the view's title:
+
+        >>> translate(view.title())
+        u'Timetable schema Some Schema'
+
+    ``rows()`` delegates the job to ``format_timetable_for_presentation``:
+
+        >>> view.rows()
+        [[{'period': 'A', 'activity': ''}, {'period': 'A', 'activity': ''}],
+         [{'period': 'B', 'activity': ''}, {'period': 'B', 'activity': ''}]]
+
+    ``homerooms()`` returns a dict of homeroom periods.  It is for use
+    by the template, so the days and the periods are designated by
+    their index rather than id:
+
+        >>> ttd1.homeroom_period_ids = ['A', 'B']
+        >>> ttd2.homeroom_period_ids = []
+        >>> view.homerooms()
+        {0: set([0, 1]), 1: set([])}
+
+    ``timezone`` is a property that is not None only if the schema
+    timezone is different from the app default:
+
+        >>> tts.timezone
+        'UTC'
+
+        >>> view.timezone
+
+        >>> tts.timezone = 'Asia/Tokyo'
+        >>> view.timezone
+        'Asia/Tokyo'
+    """
+
+
+def doctest_SimpleTimetableSchemaAdd():
+    r"""Doctest for the SimpleTimetableSchemaAdd view
+
+        >>> from schooltool.timetable import WeeklyTimetableModel
+        >>> from schooltool.timetable.interfaces import ITimetableModelFactory
+        >>> ztapi.provideUtility(ITimetableModelFactory,
+        ...                      WeeklyTimetableModel,
+        ...                      'WeeklyTimetableModel')
+        >>> from schooltool.timetable.interfaces import \
+        ...                           ITimetableSchemaContainer
+        >>> from schooltool.app.app import SimpleNameChooser
+        >>> from zope.app.container.interfaces import INameChooser
+        >>> ztapi.provideAdapter(ITimetableSchemaContainer,
+        ...                      INameChooser,
+        ...                      SimpleNameChooser)
+
+    Suppose we have a SchoolTool instance, and create a view for its
+    timetable schemas container:
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> IApplicationPreferences(app).timezone = 'Asia/Tokyo'
+
+        >>> request = TestRequest()
+        >>> from schooltool.timetable.browser.schema import \
+        ...      SimpleTimetableSchemaAdd
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+
+    Let's render it.  There is a widget for title there:
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+                  <div class="field"><input class="textType"
+                             id="field.title"
+                             name="field.title" size="20" type="text"
+                             value="default"  /></div>
+        ...
+          <tr>
+            <th>
+              <div><input class="textType" id="field.period_name_1"
+                          name="field.period_name_1" size="20" type="text"
+                          value=""  /></div>
+            </th>
+            <th>
+              <div><input class="textType" id="field.period_start_1"
+                          name="field.period_start_1" size="20"
+                          type="text" value="" /></div>
+            </th>
+            <th>
+              <div><input class="textType" id="field.period_finish_1"
+                          name="field.period_finish_1" size="20"
+                          type="text" value="" /></div>
+            </th>
+          </tr>
+        ...
+
+    getPeriods returns None, as the form is not yet filled:
+
+        >>> view.getPeriods()
+        []
+
+    Now, let's create a simple case with all the fields filled:
+
+        >>> request = TestRequest(form={'field.title': 'default',
+        ...                             'field.period_name_1': 'Period 1',
+        ...                             'field.period_start_1': '9:00',
+        ...                             'field.period_finish_1': '9:45',
+        ...                             'field.period_name_2': 'Period 2',
+        ...                             'field.period_start_2': '10:00',
+        ...                             'field.period_finish_2': '10:45',
+        ...                             'field.period_name_3': '',
+        ...                             'field.period_name_4': '',
+        ...                             'CREATE': 'Go'
+        ...                            })
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+
+    getPeriods should extract a list of periods:
+
+        >>> pprint(view.getPeriods())
+        [(u'Period 1',
+          datetime.time(9, 0),
+          datetime.timedelta(0, 2700)),
+         (u'Period 2',
+          datetime.time(10, 0),
+          datetime.timedelta(0, 2700))]
+
+    If we call the view, a new timetable schema is created:
+
+        >>> result = view()
+        >>> list(view.context.keys())
+        [u'default']
+        >>> schema = view.context['default']
+        >>> print " ".join(schema.day_ids)
+        Monday Tuesday Wednesday Thursday Friday
+        >>> print ", ".join(schema['Monday'].periods)
+        Period 1, Period 2
+
+    All days are the same
+
+        >>> for day_id, day in schema.items():
+        ...     assert day == schema['Monday']
+
+    The schema uses the weekly timetable model
+
+        >>> print schema.model.__class__.__name__
+        WeeklyTimetableModel
+        >>> print " ".join(schema.model.timetableDayIds)
+        Monday Tuesday Wednesday Thursday Friday
+        >>> for period in schema.model.dayTemplates[None]:
+        ...     print period.tstart, period.duration
+        09:00:00 0:45:00
+        10:00:00 0:45:00
+        >>> schema.timezone
+        'Asia/Tokyo'
+
+    We should get redirected to the ttschemas index:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1/ttschemas'
+
+    If period names are not provided, use start times:
+
+        >>> request = TestRequest(form={'field.title': 'default',
+        ...                             'field.period_name_1': '',
+        ...                             'field.period_start_1': '9:00',
+        ...                             'field.period_finish_1': '9:45',
+        ...                             'field.period_name_2': '',
+        ...                             'field.period_start_2': '10:00',
+        ...                             'field.period_finish_2': '10:45',
+        ...                             'CREATE': 'Go'
+        ...                            })
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+
+        >>> pprint(view.getPeriods())
+        [(u'9:00',
+          datetime.time(9, 0),
+          datetime.timedelta(0, 2700)),
+         (u'10:00',
+          datetime.time(10, 0),
+          datetime.timedelta(0, 2700))]
+
+    If a cancel button is pressed, nothing is done and the user is
+    redirected to ttschemas index:
+
+        >>> request = TestRequest(form={'field.title': 'default2',
+        ...                             'field.period_name_1': 'Period 1',
+        ...                             'field.period_start_1': '9:00',
+        ...                             'field.period_finish_1': '9:45',
+        ...                             'field.period_name_2': 'Period 2',
+        ...                             'field.period_start_2': '10:00',
+        ...                             'field.period_finish_2': '10:45',
+        ...                             'field.period_name_3': '',
+        ...                             'field.period_name_4': '',
+        ...                             'CANCEL': 'Cancel'
+        ...                            })
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+        >>> result = view()
+        >>> list(view.context.keys())
+        [u'default']
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1/ttschemas'
+
+    If there's a period skipped in a form, consequent periods are not included:
+
+        >>> request = TestRequest(form={'field.title': 'default',
+        ...                             'field.period_name_1': 'Period 1',
+        ...                             'field.period_start_1': '9:00',
+        ...                             'field.period_finish_1': '9:45',
+        ...                             'field.period_name_3': 'Period 2',
+        ...                             'field.period_start_3': '10:00',
+        ...                             'field.period_finish_3': '10:45',
+        ...                             'field.period_name_4': '',
+        ...                            })
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+        >>> view.getPeriods()
+        [(u'Period 1',
+          datetime.time(9, 0),
+          datetime.timedelta(0, 2700)),
+         (u'Period 2',
+          datetime.time(10, 0),
+          datetime.timedelta(0, 2700))]
+
+    If a period does not have a start time or end time specified, it
+    is skipped:
+
+        >>> request = TestRequest(form={'field.title': 'default',
+        ...                             'field.period_name_1': 'Period 1',
+        ...                             'field.period_start_1': '9:00',
+        ...                             'field.period_finish_1': '9:45',
+        ...                             'field.period_name_2': 'Period 2',
+        ...                             'field.period_start_2': '',
+        ...                             'field.period_finish_2': '10:45',
+        ...                             'field.period_name_3': 'Period 3',
+        ...                             'field.period_start_3': '11:00',
+        ...                             'field.period_finish_3': '',
+        ...                            })
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+        >>> view.getPeriods()
+        [(u'Period 1',
+          datetime.time(9, 0),
+          datetime.timedelta(0, 2700))]
+
+    Incorrect start and end times are handled gracefully:
+
+        >>> request = TestRequest(form={'field.title': 'default',
+        ...                             'field.period_name_1': 'Period 1',
+        ...                             'field.period_start_1': '9:00',
+        ...                             'field.period_finish_1': '9:45',
+        ...                             'field.period_name_2': '',
+        ...                             'field.period_start_2': '10h',
+        ...                             'field.period_finish_2': '',
+        ...                            })
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+
+    getPeriods fails:
+
+        >>> view.getPeriods()
+        [(u'Period 1', datetime.time(9, 0), datetime.timedelta(0, 2700))]
+
+    The widgets responsible get an error set on them:
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+            <div class="error">Please use HH:MM format for period start
+                               and end times</div>
+        ...
+
+        >>> request.response.getStatus() != 302
+        True
+
+
+   One can provide the same title more than once (thought it is not
+   advised to do so):
+
+        >>> request = TestRequest(form={
+        ...                             'field.title': 'already',
+        ...                             'field.period_name_1': 'p1',
+        ...                             'field.period_start_1': '9:00',
+        ...                             'field.period_finish_1': '10:00',
+        ...                             'CREATE': 'Create'
+        ...                            })
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+        >>> from schooltool.timetable.schema import TimetableSchema
+        >>> app['ttschemas']['already'] = TimetableSchema([])
+        >>> result = view()
+        >>> request.response.getStatus() == 302
+        True
+        >>> 'already-2' in app['ttschemas']
+        True
+
+    """
+
+
+def doctest_SimpleTimetableSchemaAdd_errors():
+    r"""Doctest for the SimpleTimetableSchemaAdd view
+
+        >>> from schooltool.timetable import WeeklyTimetableModel
+        >>> from schooltool.timetable.interfaces import ITimetableModelFactory
+        >>> ztapi.provideUtility(ITimetableModelFactory,
+        ...                      WeeklyTimetableModel,
+        ...                      'WeeklyTimetableModel')
+
+    Suppose we have a SchoolTool instance, and create a view for its
+    timetable schemas container:
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+    No name specified:
+
+        >>> request = TestRequest(form={
+        ...                             'field.title': '',
+        ...                             'field.period_name_1': 'p1',
+        ...                             'field.period_start_1': '9:00',
+        ...                             'field.period_finish_1': '10:00',
+        ...                             'CREATE': 'Create'
+        ...                            })
+        >>> from schooltool.timetable.browser.schema import \
+        ...      SimpleTimetableSchemaAdd
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+        >>> print view()
+        <BLANKLINE>
+        ...
+                 <div class="label">
+                    <label for="field.title" title="">Title</label>
+                  </div>
+                  <span class="error">Required input is missing.</span>
+                  <div class="field"><input class="textType" id="field.title"
+                                            name="field.title" size="20"
+                                            type="text" value=""  /></div>
+        ...
+          <tr>
+            <th>
+              <div><input class="textType" id="field.period_name_1"
+                          name="field.period_name_1" size="20" type="text"
+                          value="p1"  /></div>
+            </th>
+            <th>
+              <div><input class="textType" id="field.period_start_1"
+                          name="field.period_start_1" size="20"
+                          type="text" value="9:00" /></div>
+            </th>
+            <th>
+              <div><input class="textType" id="field.period_finish_1"
+                          name="field.period_finish_1" size="20"
+                          type="text" value="10:00" /></div>
+            </th>
+          </tr>
+        ...
+
+        >>> request.response.getStatus() != 302
+        True
+
+    No periods:
+
+        >>> request = TestRequest(form={
+        ...                             'field.title': 'empty',
+        ...                             'field.period_name_1': '',
+        ...                             'field.period_start_1': '',
+        ...                             'field.period_finish_1': '',
+        ...                             'CREATE': 'Create'
+        ...                            })
+        >>> view = SimpleTimetableSchemaAdd(app['ttschemas'], request)
+        >>> print view()
+        <BLANKLINE>
+        ...
+            <div class="error">You must specify at least one period.</div>
+        ...
+                  <div class="label">
+                    <label for="field.title" title="">Title</label>
+                  </div>
+                  <div class="field"><input class="textType" id="field.title"
+                                            name="field.title" size="20"
+                                            type="text" value="empty"
+                                            /></div>
+        ...
+
+        >>> request.response.getStatus() != 302
+        True
+
+    """
+
+
+def doctest_TimetableSchemaContainerView():
+    r"""A test for TimetableSchemaContainer view
+
+    We will need an application:
+
+        >>> app = sbsetup.createSchoolToolApplication()
+
+    Some timetable schemas:
+
+        >>> from schooltool.timetable.schema import TimetableSchema
+        >>> app["ttschemas"]["schema1"] = TimetableSchema([])
+        >>> app["ttschemas"]["schema2"] = TimetableSchema([])
+
+    Let's create our view:
+
+        >>> from schooltool.timetable.browser.schema import \
+        ...      TimetableSchemaContainerView
+        >>> from zope.publisher.browser import TestRequest
+        >>> view = TimetableSchemaContainerView(app["ttschemas"],
+        ...                                     TestRequest())
+
+    The default ttschema id should be "schema1":
+
+        >>> app["ttschemas"].default_id
+        'schema1'
+
+    If the view is submited without any data - the default ttschema
+    should not change:
+
+        >>> view.update()
+        ''
+        >>> app["ttschemas"].default_id
+        'schema1'
+
+    We can change the default schema:
+
+        >>> view.request = TestRequest(form={
+        ...                                  'ttschema': 'schema2',
+        ...                                  'UPDATE_SUBMIT': 'Change'
+        ...                                 })
+        >>> view.update()
+        ''
+        >>> app["ttschemas"].default_id
+        'schema2'
+
+    We can set the default_id to none:
+
+        >>> view.request = TestRequest(form={
+        ...                                  'ttschema': '',
+        ...                                  'UPDATE_SUBMIT': 'Change'
+        ...                                 })
+        >>> view.update()
+        ''
+        >>> app["ttschemas"].default_id is None
+        True
+
+    """
+
+
+def doctest_TimetableDependentDeleteView():
+    r"""Tests for TimetableDependentDeleteView.
+
+    This view is used to delete school timetables and terms, and
+    recursively deletes all timetables that use the object to be
+    deleted.
+
+    First, let's set up:
+
+        >>> from schooltool.timetable import TimetablesAdapter
+        >>> from schooltool.timetable.interfaces import ITimetables
+        >>> setup.placefulSetUp()
+        >>> ztapi.provideAdapter(IAttributeAnnotatable, ITimetables,
+        ...                      TimetablesAdapter)
+        >>> setup.setUpAnnotations()
+
+    Now, let's create a couple of timetables to operate on:
+
+        >>> from schooltool.timetable.schema import TimetableSchema
+        >>> from schooltool.timetable.schema import TimetableSchemaDay
+        >>> from schooltool.testing.setup import createSchoolToolApplication
+        >>> from schooltool.timetable.interfaces import IOwnTimetables
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> directlyProvides(app, directlyProvidedBy(app) + IOwnTimetables)
+
+        >>> days = ('A', 'B')
+        >>> periods1 = ('Green', 'Blue')
+        >>> tts = TimetableSchema(days)
+        >>> tts["A"] = TimetableSchemaDay(periods1)
+        >>> tts["B"] = TimetableSchemaDay(periods1)
+
+        >>> days = ('C', 'D')
+        >>> tts2 = TimetableSchema(days)
+        >>> tts2["C"] = TimetableSchemaDay(periods1)
+        >>> tts2["D"] = TimetableSchemaDay(periods1)
+
+        >>> app['ttschemas']['simple'] = tts
+        >>> app['ttschemas']['other'] = tts2
+
+    Let's create a couple of timetables on the application:
+
+        >>> ITimetables(app).timetables['2006.simple'] = tts.createTimetable()
+        >>> ITimetables(app).timetables['2006.other'] = tts2.createTimetable()
+
+    Now, we can run the view:
+
+        >>> from schooltool.timetable.browser.schema \
+        ...     import TimetableDependentDeleteView
+        >>> request = TestRequest(form={'delete.simple': 'on',
+        ...                             'CONFIRM': 'Confirm'})
+        >>> view = TimetableDependentDeleteView(app['ttschemas'],
+        ...                                           request)
+        >>> view.update()
+
+    The timetable schema is deleted:
+
+        >>> list(app['ttschemas'].keys())
+        [u'other']
+
+    Also, the dependent timetables have been deleted:
+
+        >>> ITimetables(app).timetables.keys()
+        ['2006.other']
+
+    The user is redirected to the school timetable index view:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/ttschemas'
+
+    The user can also cancel the deletion:
+
+        >>> from schooltool.timetable.browser.schema \
+        ...     import TimetableDependentDeleteView
+        >>> request = TestRequest(form={'delete.other': 'on',
+        ...                             'CANCEL': 'Cancel'})
+        >>> view = TimetableDependentDeleteView(app['ttschemas'],
+        ...                                           request)
+        >>> view.update()
+
+    In that case, the data is unchanged:
+
+        >>> list(app['ttschemas'].keys())
+        [u'other']
+        >>> ITimetables(app).timetables.keys()
+        ['2006.other']
+
+    The user is also redirected to the school timetable index view:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/ttschemas'
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF |
+                   doctest.REPORT_ONLY_FIRST_FAILURE |
+                   doctest.NORMALIZE_WHITESPACE)
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=optionflags))
+    suite.addTest(unittest.makeSuite(TestAdvancedTimetableSchemaAdd))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_schema.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_timetable.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_timetable.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_timetable.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,807 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for schooltool timetabling views.
+
+$Id: test_timetable.py 6602 2007-01-26 13:17:25Z ignas $
+"""
+
+import unittest
+import datetime
+
+from zope.i18n import translate
+from zope.interface import implements
+from zope.publisher.browser import TestRequest
+from zope.testing import doctest
+from zope.testing.doctestunit import pprint
+from zope.app.testing import ztapi
+
+from schooltool.app.browser import testing
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.timetable.interfaces import ITimetables
+from schooltool.timetable.interfaces import IOwnTimetables
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.timetable import TimetablesAdapter
+from schooltool.testing import setup as sbsetup
+
+
+def setUp(test=None):
+    testing.setUp(test)
+    sbsetup.setUpTimetabling()
+    sbsetup.setUpApplicationPreferences()
+    ztapi.provideAdapter(None, ISchoolToolApplication,
+                         getSchoolToolApplication)
+
+
+tearDown = testing.tearDown
+
+
+def createSchema(days, *periods_for_each_day):
+    """Create a timetable schema.
+
+    Example:
+
+        createSchema(['D1', 'D2', 'D3'], ['A'], ['B', 'C'], ['D'])
+
+    creates a schema with three days, the first of which (D1) has one
+    period (A), the second (D2) has two periods (B and C), and the third
+    (D3) has again one period (D).
+    """
+
+    from schooltool.timetable.schema import TimetableSchema
+    from schooltool.timetable.schema import TimetableSchemaDay
+    schema = TimetableSchema(days)
+    for day, periods in zip(days, periods_for_each_day):
+        schema[day] = TimetableSchemaDay(list(periods))
+    return schema
+
+
+def createDayTemplate(periods):
+    """Create a SchooldayTemplate.
+
+    Example:
+
+        createDayTemplate([(9, 30, 45),
+                           (10, 30, 45)])
+
+    would create a day template containing two periods, the first one starting
+    at 9:30, the second one starting at 10:30, both 45 minutes long.
+    """
+    from schooltool.timetable import SchooldayTemplate
+    from schooltool.timetable import SchooldaySlot
+    day = SchooldayTemplate()
+    for h, m, duration in periods:
+        day.add(SchooldaySlot(datetime.time(h, m),
+                              datetime.timedelta(minutes=duration)))
+    return day
+
+
+def doctest_TimetablesTraverser():
+    """Tests for TimetablesTraverser.
+
+        >>> from schooltool.timetable.browser import TimetablesTraverser
+        >>> from schooltool.timetable.interfaces import ITimetables
+        >>> class TimetablesStub:
+        ...     implements(ITimetables)
+        ...     timetables = 'Timetables'
+        ...     calendar = 'Calendar'
+        >>> request = TestRequest()
+        >>> t = TimetablesTraverser(TimetablesStub(), request)
+
+    If we ask for timetables, the corresponding object will be returned:
+
+        >>> t.publishTraverse(request, 'timetables')
+        'Timetables'
+    """
+
+
+def print_cal(calendar, day_format='%(number)3d'):
+    """Print a calendar as returned by TermRenderer.calendar."""
+    for month in calendar:
+        title = '%s %d' % (month['month'], month['year'])
+        print '*%35s' % title
+        print '         Mon Tue Wed Thu Fri Sat Sun'
+        for week in month['weeks']:
+            s = ['Week %-2d:' % week['number']]
+            for day in week['days']:
+                if day['number'] is None:
+                    s.append('   ')
+                else:
+                    s.append(day_format % day)
+            print ' '.join(s).rstrip()
+
+
+def doctest_TimetableView():
+    """Test for TimetableView.
+
+        >>> from schooltool.timetable.browser import TimetableView
+        >>> from schooltool.timetable import Timetable
+        >>> from schooltool.timetable import TimetableDay, TimetableActivity
+        >>> from schooltool.timetable.interfaces import ITimetables
+
+        >>> from schooltool.course.section import Section as STSection
+        >>> class Section(STSection):
+        ...     implements(IOwnTimetables)
+
+    Create some context:
+
+        >>> s = Section()
+        >>> ITimetables(s).timetables['term.schema'] = tt = Timetable(['day 1'])
+        >>> tt['day 1'] = ttd = TimetableDay(['A'])
+        >>> ttd.add('A', TimetableActivity('Something'))
+
+        >>> request = TestRequest()
+        >>> view = TimetableView(tt, request)
+
+    title() returns the view's title:
+
+        >>> translate(view.title())
+        u"Section's timetable"
+
+    rows() delegates the job to format_timetable_for_presentation:
+
+        >>> view.rows()
+        [[{'period': 'A', 'activity': 'Something'}]]
+
+    """
+
+
+def doctest_ResourceTimetableSetupiew():
+    """Doctest for the ResourceTimetableSetupView.
+
+    ResourceTimetableSetupView inherits from TimetableSetupViewMixin
+    and implements these methods:
+
+    getGroupSections which plainly returns an empty list:
+
+        >>> from schooltool.timetable.browser import ResourceTimetableSetupView
+        >>> view = ResourceTimetableSetupView(None, None)
+        >>> view.getGroupSections()
+        []
+
+    and getSections, which returns all related sections of the item
+    passed as a parameter:
+
+        >>> from zope.component import adapts
+        >>> from zope.interface import implements
+        >>> from schooltool.relationship.interfaces import IRelationshipLinks
+        >>> from zope.component import provideAdapter
+        >>> class RelationshipLinks(object):
+        ...     adapts(None)
+        ...     implements(IRelationshipLinks)
+        ...     def __init__(self, context):
+        ...         self.context = context
+        ...     def getTargetsByRole(self, role, reltype):
+        ...         return ["Relation for %s of type %s" % (
+        ...                      self.context, role)]
+        >>> provideAdapter(RelationshipLinks)
+        >>> resource = "A book"
+        >>> view.getSections(resource)
+        ['Relation for A book of type <URIObject Section>']
+
+    """
+
+
+def doctest_PersonTimetableSetupView():
+    """Doctest for the PersonTimetableSetupView view
+
+    We will need an application object
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> ztapi.provideAdapter(IOwnTimetables, ITimetables,
+        ...                      TimetablesAdapter)
+
+    and a Person from that application
+
+        >>> from schooltool.person.person import Person
+        >>> from schooltool.group.group import Group
+        >>> context = Person("student", "Steven Udent")
+        >>> app["persons"]["whatever"] = context
+        >>> app["groups"]["juniors"] = juniors = Group("Juniors")
+        >>> juniors.members.add(context)
+
+    We will need some sections
+
+        >>> from schooltool.course.section import Section as STSection
+        >>> class Section(STSection):
+        ...     implements(IOwnTimetables)
+        >>> app["sections"]["math"] = math = Section("Math")
+        >>> app["sections"]["biology"] = biology = Section("Biology")
+        >>> app["sections"]["physics"] = physics = Section("Physics")
+        >>> app["sections"]["history"] = history = Section("History")
+
+    We will also need a timetable schema, and a term.  Two of each, in fact.
+
+        >>> app["ttschemas"]["default"] = createSchema(["Mon", "Tue"],
+        ...                                            ["9:00", "10:00"],
+        ...                                            ["9:00", "10:00"])
+        >>> app["ttschemas"]["other"] = createSchema([], [])
+
+        >>> from schooltool.term.term import Term
+        >>> app["terms"]["2005-spring"] = Term('2005 Spring',
+        ...                                    datetime.date(2004, 2, 1),
+        ...                                    datetime.date(2004, 6, 30))
+        >>> app["terms"]["2005-fall"] = Term('2005 Fall',
+        ...                                    datetime.date(2004, 9, 1),
+        ...                                    datetime.date(2004, 12, 31))
+
+    We can now create the view.
+
+        >>> from schooltool.timetable.browser import PersonTimetableSetupView
+        >>> request = TestRequest()
+        >>> view = PersonTimetableSetupView(context, request)
+
+    There are two helper methods, getSchema and getTerm, that extract the
+    schema and term from the request, or pick suitable defaults.
+
+        >>> view.getSchema() is app["ttschemas"].getDefault()
+        True
+        >>> request.form['ttschema'] = 'other'
+        >>> view.getSchema() is app["ttschemas"]["other"]
+        True
+        >>> request.form['ttschema'] = 'default'
+        >>> view.getSchema() is app["ttschemas"]["default"]
+        True
+
+    The default for a term is "the current term", or, if there's none, the
+    next one.  Since this depends on today's date, we can't explicitly test
+    it here.
+
+        >>> (view.getTerm() is app["terms"]["2005-spring"] or
+        ...  view.getTerm() is app["terms"]["2005-fall"])
+        True
+        >>> request.form['term'] = '2005-spring'
+        >>> view.getTerm() is app["terms"]["2005-spring"]
+        True
+        >>> request.form['term'] = '2005-fall'
+        >>> view.getTerm() is app["terms"]["2005-fall"]
+        True
+
+    sectionMap finds out which sections are scheduled in which timetable slots.
+
+        >>> term = app["terms"]["2005-fall"]
+        >>> ttschema = app["ttschemas"]["default"]
+        >>> section_map = view.sectionMap(term, ttschema)
+
+        >>> from zope.testing.doctestunit import pprint
+        >>> pprint(section_map)
+        {('Mon', '10:00'): Set([]),
+         ('Mon', '9:00'): Set([]),
+         ('Tue', '10:00'): Set([]),
+         ('Tue', '9:00'): Set([])}
+
+    It gets more interesting when sections actually have some scheduled
+    activities:
+
+        >>> from schooltool.timetable.interfaces import ITimetables
+        >>> from schooltool.timetable import TimetableActivity
+        >>> ttkey = "2005-fall.default"
+        >>> ITimetables(math).timetables[ttkey] = ttschema.createTimetable()
+        >>> ITimetables(math).timetables[ttkey]['Tue'].add('10:00',
+        ...                                   TimetableActivity('Math'))
+
+        >>> ITimetables(history).timetables[ttkey] = ttschema.createTimetable()
+        >>> ITimetables(history).timetables[ttkey]['Tue'].add('10:00',
+        ...                                   TimetableActivity('History'))
+
+        >>> section_map = view.sectionMap(term, ttschema)
+        >>> pprint(section_map)
+        {('Mon', '10:00'): Set([]),
+         ('Mon', '9:00'): Set([]),
+         ('Tue', '10:00'): Set([<schooltool...Section ...>]),
+         ('Tue', '9:00'): Set([])}
+
+    allSections simply takes a union of a number of sets containing sections.
+
+        >>> from sets import Set
+        >>> sections = view.allSections({1: Set([math]),
+        ...                              2: Set([math, biology]),
+        ...                              3: Set([])})
+        >>> sections = [s.title for s in sections]
+        >>> sections.sort()
+        >>> sections
+        ['Biology', 'Math']
+
+    getDays does most of the work
+
+        >>> def printDays(days):
+        ...     for day in days:
+        ...         print day['title']
+        ...         for period in day['periods']:
+        ...             sections = [s.title for s in period['sections']]
+        ...             selected = [s and s.title or "none"
+        ...                         for s in period['selected']]
+        ...             print "%7s: [%s] [%s]" % (period['title'],
+        ...                                       ', '.join(sections),
+        ...                                       ', '.join(selected))
+
+        >>> days = view.getDays(ttschema, section_map)
+        >>> printDays(days)
+        Mon
+           9:00: [] [none]
+          10:00: [] [none]
+        Tue
+           9:00: [] [none]
+          10:00: [History, Math] [none]
+
+        >>> math.members.add(context)
+
+        >>> days = view.getDays(ttschema, section_map)
+        >>> printDays(days)
+        Mon
+           9:00: [] [none]
+          10:00: [] [none]
+        Tue
+           9:00: [] [none]
+          10:00: [History, Math] [Math]
+
+    And finally, __call__ ties everything together -- it processes the form and
+    renders a page template.
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <title> Scheduling for Steven Udent </title>
+        ...
+        <h1> Scheduling for Steven Udent </h1>
+        ...
+        <form class="plain" method="post" action="http://127.0.0.1">
+        ...
+            <label for="term">Term</label>
+            <select id="term" name="term">
+              <option value="2005-spring">2005 Spring</option>
+              <option selected="selected" value="2005-fall">2005 Fall</option>
+            </select>
+            <label for="ttschema">Schema</label>
+            <select id="ttschema" name="ttschema">
+              <option selected="selected" value="default">default</option>
+              <option value="other">other</option>
+            </select>
+        ...
+        </form>
+        <form class="plain" method="post" action="http://127.0.0.1">
+          <input type="hidden" name="term" value="2005-fall" />
+          <input type="hidden" name="ttschema" value="default" />
+        ...
+            <h2>Mon</h2>
+        ...
+                <th>9:00</th>
+                <td>
+                  <select name="sections:list">
+                    <option value="" selected="selected">none</option>
+                  </select>
+        ...
+            <h2>Tue</h2>
+        ...
+                <th>10:00</th>
+                <td>
+                  <select name="sections:list">
+                    <option value="">none</option>
+                    <option value="history"> -- </option>
+                    <option selected="selected" value="math"> -- </option>
+                  </select>
+        ...
+        </form>
+        ...
+
+    If the form contains 'SAVE', the form gets processed.  Suppose we unselect
+    Math
+
+        >>> request.form['SAVE'] = 'Save'
+        >>> request.form['sections'] = ['']
+        >>> content = view()
+
+        >>> context in math.members
+        False
+
+    If we select it back
+
+        >>> request.form['SAVE'] = 'Save'
+        >>> request.form['sections'] = ['math']
+        >>> content = view()
+
+        >>> context in math.members
+        True
+
+        >>> math.members.remove(context)
+
+        >>> days = view.getDays(ttschema, section_map)
+        >>> printDays(days)
+        Mon
+           9:00: [] [none]
+          10:00: [] [none]
+        Tue
+           9:00: [] [none]
+          10:00: [History, Math] [none]
+
+    When people are members of a section as part of a form (group) we don't
+    allow changing that period from here.  They must be removed from the
+    group.
+
+        >>> math.members.add(juniors)
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <title> Scheduling for Steven Udent </title>
+        ...
+            <h2>Tue</h2>
+        ...
+                <th>10:00</th>
+                <td>
+                  <a href="http://127.0.0.1/sections/math">Math</a>
+                  <span class="hint">
+                    <span>as part of</span>
+                    <a href="http://127.0.0.1/groups/juniors">Juniors</a>
+                  </span>
+                </td>
+        ...
+
+
+        >>> history.members.add(juniors)
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <title> Scheduling for Steven Udent </title>
+        ...
+            <h2>Tue</h2>
+        ...
+        <BLANKLINE>
+              <tr class="conflict">
+                <th>10:00</th>
+                <td>
+                  <a href="http://127.0.0.1/sections/history">History</a>
+                  <span class="hint">
+                  <span>as part of</span>
+                  <a href="http://127.0.0.1/groups/juniors">Juniors</a>
+                </span>
+              </td>
+                <td>
+                  <a href="http://127.0.0.1/sections/math">Math</a>
+                  <span class="hint">
+                    <span>as part of</span>
+                    <a href="http://127.0.0.1/groups/juniors">Juniors</a>
+                  </span>
+                </td>
+              <td class="conflict">
+              Scheduling conflict.
+              </td>
+            </tr>
+        <BLANKLINE>
+        ...
+
+    """
+
+
+def doctest_PersonTimetableSetupView_no_timetables():
+    """Doctest for the PersonTimetableSetupView view
+
+    What if there are no terms/timetable schemas?
+
+    We will need an application object
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+    and a Person from that application
+
+        >>> from schooltool.person.person import Person
+        >>> context = Person("student", "Steven Udent")
+        >>> app["persons"]["whatever"] = context
+
+        >>> len(app['ttschemas'])
+        0
+        >>> len(app['terms'])
+        0
+
+    We can now create the view.
+
+        >>> from schooltool.timetable.browser import PersonTimetableSetupView
+        >>> request = TestRequest()
+        >>> view = PersonTimetableSetupView(context, request)
+
+    getSchema returns None:
+
+        >>> print view.getSchema()
+        None
+
+    What does __call__ do?
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <title> Scheduling for Steven Udent </title>
+        ...
+        <h1> Scheduling for Steven Udent </h1>
+        ...
+        <p>There are no terms or timetable schemas defined.</p>
+        ...
+
+    """
+
+
+def doctest_PersonTimetableSetupView_no_default_ttschema():
+    """Doctest for the PersonTimetableSetupView view
+
+    What if there is no default timetable schema?
+
+    We will need an application object
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+    and a Person from that application
+
+        >>> from schooltool.person.person import Person
+        >>> context = Person("student", "Steven Udent")
+        >>> app["persons"]["whatever"] = context
+
+    There is one timetable schema, but it is not the default one.
+
+        >>> app["ttschemas"]["default"] = createSchema(["Mon", "Tue"],
+        ...                                            ["9:00", "10:00"],
+        ...                                            ["9:00", "10:00"])
+        >>> app["ttschemas"]["other"] = createSchema([], [])
+        >>> del app["ttschemas"]["default"]
+        >>> app["ttschemas"].default_id is None
+        True
+
+    We can now create the view.
+
+        >>> from schooltool.timetable.browser import PersonTimetableSetupView
+        >>> request = TestRequest()
+        >>> view = PersonTimetableSetupView(context, request)
+
+    What does getSchema return?
+
+        >>> view.getSchema() is app["ttschemas"]["other"]
+        True
+
+    """
+
+
+def doctest_SectionTimetableSetupView():
+    """Doctest for the SectionTimetableSetupView view
+
+    We will need an application object
+
+        >>> app = sbsetup.setUpSchoolToolSite()
+        >>> ztapi.provideAdapter(IOwnTimetables, ITimetables,
+        ...                      TimetablesAdapter)
+
+        >>> from schooltool.course.section import Section as STSection
+        >>> class Section(STSection):
+        ...     implements(IOwnTimetables)
+
+    We will need a section
+
+        >>> from schooltool.timetable.interfaces import ITimetables
+        >>> app["sections"]["math"] = math = Section("Math")
+        >>> ITimetables(math).timetables.keys()
+        []
+
+    We will also need a timetable schema, and a term.
+
+        >>> app["ttschemas"]["default"] = createSchema(["Mon", "Tue"],
+        ...                                            ["9:00", "10:00"],
+        ...                                            ["9:00", "10:00"])
+
+
+        >>> from schooltool.term.term import Term
+        >>> app["terms"]["2005-spring"] = Term('2005 Spring',
+        ...                                    datetime.date(2004, 2, 1),
+        ...                                    datetime.date(2004, 6, 30))
+
+    We can now create the view to look at the Math timetable
+
+        >>> from schooltool.timetable.browser import SectionTimetableSetupView
+        >>> context = math
+        >>> request = TestRequest()
+        >>> view = SectionTimetableSetupView(context, request)
+
+    We have some helper methods to simplify the form if there's only one
+    option for terms or schemas:
+
+        >>> view.app = app
+        >>> view.singleTerm()
+        True
+        >>> view.singleSchema()
+        True
+
+    Another term and schema:
+
+        >>> app["ttschemas"]["other"] = createSchema([], [])
+        >>> app["terms"]["2005-fall"] = Term('2005 Fall',
+        ...                                    datetime.date(2004, 9, 1),
+        ...                                    datetime.date(2004, 12, 31))
+
+        >>> view.singleTerm()
+        False
+        >>> view.singleSchema()
+        False
+
+    We have getSchema from the Mixin class to get the schema from the request
+    or choose a default.
+
+        >>> view.getSchema() is app["ttschemas"].getDefault()
+        True
+        >>> request.form['ttschema'] = 'other'
+        >>> view.getSchema() is app["ttschemas"]["other"]
+        True
+        >>> request.form['ttschema'] = 'default'
+        >>> view.getSchema() is app["ttschemas"]["default"]
+        True
+
+    getTerms will give us a list of available terms from the request or a list
+    with just the current term if we're working at a time not during any term.
+
+    Without any terms in the request we get the output of getNextTermForDate
+    today
+
+        >>> import datetime
+        >>> from schooltool.term.term import getNextTermForDate
+        >>> getNextTermForDate(datetime.date.today()) in view.getTerms()
+        True
+        >>> len(view.getTerms())
+        1
+
+        >>> request.form['terms'] = ['2005-spring', '2005-fall']
+        >>> [t.__name__ for t in view.getTerms()]
+        [u'2005-spring', u'2005-fall']
+
+        >>> request.form['terms'] = ['2005-spring']
+        >>> [t.__name__ for t in view.getTerms()]
+        [u'2005-spring']
+
+        >>> request.form['terms'] = ['2005-fall']
+        >>> [t.__name__ for t in view.getTerms()]
+        [u'2005-fall']
+
+    Single terms may be returned as a single string, rather than a list:
+
+        >>> request.form['terms'] = '2005-spring'
+        >>> [t.__name__ for t in view.getTerms()]
+        [u'2005-spring']
+
+    If we cancel the form, we get redirected to the section
+
+        >>> request = TestRequest(form={'CANCEL': 'Cancel'})
+        >>> view = SectionTimetableSetupView(context, request)
+        >>> result = view()
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1/sections/math'
+
+    If we save the form, we're redirected to the timetable view for the schema
+    that we just saved:
+
+        >>> request = TestRequest(form={'SAVE': 'Save'})
+        >>> view = SectionTimetableSetupView(context, request)
+        >>> result = view()
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('location')
+        'http://127.0.0.1/sections/math/timetables/2005-fall.default'
+
+    An empty save request will create an empty timetable:
+
+        >>> ITimetables(math).timetables['2005-fall.default']
+        <Timetable: ...>
+        >>> ITimetables(math).timetables['2005-fall.default']['Mon'].items()
+        [('9:00', Set([])), ('10:00', Set([]))]
+        >>> ITimetables(math).timetables['2005-fall.default']['Tue'].items()
+        [('9:00', Set([])), ('10:00', Set([]))]
+
+    Let's add some scheduled classes:
+
+        >>> request = TestRequest(form={'ttschema': 'default',
+        ...                             'term': '2005-fall',
+        ...                             'Mon.9:00':'ON',
+        ...                             'Tue.9:00':'ON',
+        ...                             'SAVE': 'Save'})
+
+        >>> view = SectionTimetableSetupView(context, request)
+
+    First we submit the view::
+
+        >>> result = view()
+        >>> view.request.response.getStatus()
+        302
+        >>> view.request.response.getHeader('location')
+        'http://127.0.0.1/sections/math/timetables/2005-fall.default'
+
+    Now we have a schedule for our course:
+
+        >>> ITimetables(math).timetables['2005-fall.default']['Mon']['9:00']
+        Set([TimetableActivity('', ...
+        >>> ITimetables(math).timetables['2005-fall.default']['Mon']['10:00']
+        Set([])
+        >>> ITimetables(math).timetables['2005-fall.default']['Tue']['9:00']
+        Set([TimetableActivity('', ...
+        >>> ITimetables(math).timetables['2005-fall.default']['Tue']['10:00']
+        Set([])
+
+    All the periods that were 'ON' are now checked:
+
+        >>> view = SectionTimetableSetupView(context, TestRequest())
+        >>> print view()
+        ...
+        <BLANKLINE>
+        ...
+                            checked="checked" id="Mon.9:00"
+        ...
+                            id="Mon.10:00" value="Mon.10:00"
+        ...
+                            checked="checked" id="Tue.9:00"
+        ...
+                            id="Tue.10:00" value="Tue.10:00"
+        ...
+
+    To remove a period from our schedule we create a new save request without
+    that period listed.
+
+        >>> request = TestRequest(form={'ttschema': 'default',
+        ...                             'term': '2005-fall',
+        ...                             'Mon.9:00':'ON',
+        ...                             'SAVE': 'Save'})
+        >>> view = SectionTimetableSetupView(context, request)
+        >>> result = view()
+
+        >>> view = SectionTimetableSetupView(context, TestRequest())
+        >>> print view()
+        <BLANKLINE>
+        ...
+                            checked="checked" id="Mon.9:00"
+        ...
+                            id="Mon.10:00" value="Mon.10:00"
+        ...
+                            id="Tue.9:00" value="Tue.9:00"
+        ...
+                            id="Tue.10:00" value="Tue.10:00"
+        ...
+
+    Tuesday's Activity is no longer there:
+
+        >>> ITimetables(math).timetables['2005-fall.default']['Tue']['9:00']
+        Set([])
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF |
+                   doctest.REPORT_ONLY_FIRST_FAILURE |
+                   doctest.NORMALIZE_WHITESPACE)
+    suite.addTest(doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                       optionflags=optionflags))
+    suite.addTest(doctest.DocTestSuite('schooltool.timetable.browser',
+                                       optionflags=optionflags))
+    suite.addTest(doctest.DocFileSuite(
+        'specialdays.txt', setUp=setUp, tearDown=tearDown,
+        globs={'createSchema': createSchema,
+               'createDayTemplate': createDayTemplate,
+               'pprint': pprint},
+        optionflags=optionflags))
+    return suite
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_timetable.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_ttwizard.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_ttwizard.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_ttwizard.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,2102 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Tests for SchoolTool timetable schema wizard.
+
+$Id: test_ttwizard.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+import datetime
+from pprint import pprint
+
+from zope.testing import doctest
+from zope.publisher.browser import TestRequest
+from zope.interface import Interface
+from zope.schema import TextLine
+from zope.i18n import translate
+from zope.app.testing import ztapi
+from zope.app.container.interfaces import INameChooser
+
+from schooltool.testing import setup
+from schooltool.app.browser import testing as schooltool_setup
+from schooltool.app.app import SimpleNameChooser
+from schooltool.app.app import getApplicationPreferences
+from schooltool.app.app import getSchoolToolApplication
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.testing.setup import setUpApplicationPreferences
+from schooltool.timetable.interfaces import ITimetableSchemaContainer
+from schooltool.timetable.browser import format_time_range
+
+
+def setUpNameChoosers():
+    """Set up name choosers.
+
+    This particular test module is only interested in name chooser
+    for ITimetableSchemaContainer.
+    """
+    ztapi.provideAdapter(ITimetableSchemaContainer, INameChooser,
+                         SimpleNameChooser)
+
+
+def setUp(test):
+    """Test setup.
+
+    Sets up enough of Zope 3 to be able to render page templates.
+
+    Creates a SchoolTool application and makes it both the current site
+    and the containment root.  The application object is available as
+    a global named `app` in all doctests.
+    """
+    schooltool_setup.setUp(test)
+    setup.setUpSessions()
+    setUpApplicationPreferences()
+    setUpNameChoosers()
+    ztapi.provideAdapter(ISchoolToolApplication, IApplicationPreferences,
+                         getApplicationPreferences)
+    ztapi.provideAdapter(None, ISchoolToolApplication,
+                         getSchoolToolApplication)
+
+    test.globs['app'] = setup.setUpSchoolToolSite()
+
+
+def tearDown(test):
+    """Test cleanup."""
+    schooltool_setup.tearDown(test)
+
+
+def print_day_templates(daytemplates):
+    """Print day templates."""
+    keys = daytemplates.keys()
+    keys.sort()
+    for key in keys:
+        print "--- day template %r" % key
+        slots = [(period.tstart, period.duration)
+                 for period in daytemplates[key]]
+        slots.sort()
+        for tstart, duration in slots:
+            print format_time_range(tstart, duration)
+
+
+def print_ttschema(ttschema):
+    """Print a timetable schema as a grid."""
+    for row in map(None, *[[day_id] + list(day.periods)
+                           for day_id, day in ttschema.items()]):
+        print " ".join(['%-12s' % cell for cell in row])
+
+
+def doctest_getSessionData():
+    """Unit test for getSessionData.
+
+    This function is used as a method for both Step and TimetableSchemaWizard
+    classes (and subclasses of the former).
+
+        >>> from schooltool.timetable.browser.ttwizard import Step
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> step = Step(context, request)
+        >>> data = step.getSessionData()
+        >>> data
+        <...SessionPkgData...>
+        >>> data['something'] = 42
+
+        >>> request = TestRequest()
+        >>> step = Step(context, request)
+        >>> data['something']
+        42
+
+        >>> from schooltool.timetable.browser.ttwizard import \\
+        ...                                     TimetableSchemaWizard
+        >>> view = TimetableSchemaWizard(context, request)
+        >>> data['something']
+        42
+
+    """
+
+
+def doctest_ChoiceStep():
+    """Unit test for ChoiceStep
+
+        >>> from schooltool.timetable.browser.ttwizard import ChoiceStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = ChoiceStep(context, request)
+
+    ChoiceStep wants some attributes
+
+        >>> view.key = 'meaning'
+        >>> view.question = 'What is the meaning of life?'
+        >>> view.choices = [('42', "Fourty two"),
+        ...                 ('huh', "I don't know")]
+
+        >>> print view()
+        <BLANKLINE>
+        ...What is the meaning of life?...
+        ...<input class="button-ok" type="submit" name="NEXT.0"
+                  value="Fourty two" />
+        ...<input class="button-ok" type="submit" name="NEXT.1"
+                  value="I don't know" />
+        ...
+
+    Update does something if you choose a valid choice
+
+        >>> view.update()
+        False
+
+        >>> view.request = TestRequest(form={'NEXT.0': "Whatever"})
+        >>> view.update()
+        True
+        >>> view.getSessionData()[view.key]
+        '42'
+
+        >>> view.request = TestRequest(form={'NEXT.1': "Whatever"})
+        >>> view.update()
+        True
+        >>> view.getSessionData()[view.key]
+        'huh'
+    """
+
+
+def doctest_FormStep():
+    """Unit test for FormStep
+
+    FormStep needs to be subclassed, and a subclass has to provide a `schema`
+    attribute
+
+        >>> from schooltool.timetable.browser.ttwizard import FormStep
+        >>> class SampleFormStep(FormStep):
+        ...     description = "Informative text shown above the form."
+        ...     class schema(Interface):
+        ...         a_field = TextLine(title=u"A field")
+        ...         b_field = TextLine(title=u"B field")
+
+    The constructor sets up input widgets.
+
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = SampleFormStep(context, request)
+        >>> view.a_field_widget
+        <...TextWidget...>
+        >>> view.b_field_widget
+        <...TextWidget...>
+
+    The `widgets` method returns all widgets in oroder
+
+        >>> view.widgets() == [view.a_field_widget, view.b_field_widget]
+        True
+
+    Calling the view renders the form
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <form class="plain" method="POST" action="http://127.0.0.1">
+          <p>Informative text shown above the form.</p>
+              <div class="row">
+                  <div class="label">
+                    <label for="field.a_field" title="">A field</label>
+                  </div>
+                  <div class="field"><input class="textType" id="field.a_field" name="field.a_field" size="20" type="text" value=""  /></div>
+              </div>
+              <div class="row">
+                  <div class="label">
+                    <label for="field.b_field" title="">B field</label>
+                  </div>
+                  <div class="field"><input class="textType" id="field.b_field" name="field.b_field" size="20" type="text" value=""  /></div>
+              </div>
+          <div class="controls">
+            <input type="submit" class="button-ok" name="NEXT"
+                   value="Next" />
+            <input type="submit" class="button-cancel" name="CANCEL"
+                   value="Cancel" />
+          </div>
+        </form>
+        ...
+
+    An error message may come from the `error` attribute.
+
+        >>> view.error = "A terrible error has occurred!"
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <form class="plain" method="POST" action="http://127.0.0.1">
+          <p>Informative text shown above the form.</p>
+          <div class="error">A terrible error has occurred!</div>
+        ...
+
+    """
+
+
+def doctest_FirstStep():
+    """Unit test for FirstStep
+
+        >>> from schooltool.timetable.browser.ttwizard import FirstStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = FirstStep(context, request)
+
+        >>> print view()
+        <BLANKLINE>
+        ...<input class="textType" id="field.title" name="field.title"
+                  size="20" type="text" value="default" />...
+        ...<input type="submit" class="button-ok" name="NEXT"
+                  value="Next" />
+        ...
+
+    FirstStep.update can take the title from the request and put it into
+    the session.
+
+        >>> request = TestRequest(form={'field.title': u'Sample Schema'})
+        >>> view = FirstStep(context, request)
+        >>> view.update()
+        True
+
+        >>> view.getSessionData()['title']
+        u'Sample Schema'
+
+    If the form is incomplete, update says so by returning False
+
+        >>> request = TestRequest(form={'field.title': u''})
+        >>> view = FirstStep(context, request)
+        >>> view.update()
+        False
+
+    The next step is always CycleStep
+
+        >>> view.next()
+        <...CycleStep...>
+
+    """
+
+
+def doctest_CycleStep():
+    """Unit test for CycleStep
+
+        >>> from schooltool.timetable.browser.ttwizard import CycleStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = CycleStep(context, request)
+        >>> session = view.getSessionData()
+
+    The next step is DayEntryStep for rotating cycle
+
+        >>> session['cycle'] = 'rotating'
+        >>> view.next()
+        <...DayEntryStep...>
+
+    The next step is IndependentDaysStep for weekly cycle
+
+        >>> session['cycle'] = 'weekly'
+        >>> view.next()
+        <...IndependentDaysStep...>
+
+    The session variable day_names is filled with weekday
+    names in view.update() if and only if the cycle is weekly
+
+        >>> view.request.form['NEXT.1'] = 'Rotating' # rotating
+        >>> view.update()
+        True
+        >>> 'day_names' in session
+        False
+
+        >>> view.request.form['NEXT.0'] = 'weekly' # weekly
+        >>> view.update()
+        True
+        >>> session['day_names']
+        [u'Monday', u'Tuesday', u'Wednesday', u'Thursday', u'Friday']
+
+    """
+
+
+def doctest_DayEntryStep():
+    r"""Unit test for DayEntryStep
+
+        >>> from schooltool.timetable.browser.ttwizard import DayEntryStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = DayEntryStep(context, request)
+
+        >>> print view()
+        <BLANKLINE>
+        ...<textarea cols="60" id="field.days" name="field.days"
+                     rows="15" ></textarea>...
+
+    DayEntryStep.update wants at least one day name
+
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least one day name.
+
+        >>> request = TestRequest(form={'field.days': u''})
+        >>> view = DayEntryStep(context, request)
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least one day name.
+
+        >>> request = TestRequest(form={'field.days': u'\n\n\n'})
+        >>> view = DayEntryStep(context, request)
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least one day name.
+
+        >>> request = TestRequest(form={'field.days': u'A\nB\nA\n'})
+        >>> view = DayEntryStep(context, request)
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please make sure the day names are unique.
+
+        >>> request = TestRequest(form={'field.days': u'A\nB\n\n'})
+        >>> view = DayEntryStep(context, request)
+        >>> view.update()
+        True
+        >>> view.error
+
+        >>> view.getSessionData()['day_names']
+        [u'A', u'B']
+
+    The next page is IndependentDaysStep.
+
+        >>> view.next()
+        <...IndependentDaysStep...>
+
+    """
+
+
+def doctest_IndependentDaysStep():
+    r"""Unit test for IndependentDaysStep
+
+        >>> from schooltool.timetable.browser.ttwizard \
+        ...                                         import IndependentDaysStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = IndependentDaysStep(context, request)
+
+    The next step is SimpleSlotEntryStep if days are similar:
+
+        >>> view.getSessionData()['similar_days'] = True
+        >>> view.next()
+        <...ttwizard.SimpleSlotEntryStep...>
+
+    The next step cares about day names in the session.
+
+        >>> view.getSessionData()['day_names'] = ['Day A', 'Day B']
+
+    The next step is WeeklySlotEntryStep if each day is different and you chose
+    the weekly cycle:
+
+        >>> view.getSessionData()['similar_days'] = False
+        >>> view.getSessionData()['cycle'] = 'weekly'
+        >>> view.next()
+        <...ttwizard.WeeklySlotEntryStep...>
+
+    If you chose the rotating cycle, you will be asked another question
+    about the time model:
+
+        >>> view.getSessionData()['cycle'] = 'rotating'
+        >>> view.next()
+        <...ttwizard.SequentialModelStep...>
+
+    """
+
+
+def doctest_SequentialModelStep():
+    r"""Unit test for SequentialModelStep
+
+        >>> from schooltool.timetable.browser.ttwizard import SequentialModelStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = SequentialModelStep(context, request)
+
+    If you choose the weekly cycle, you will be redirected to
+    WeeklySlotEntryStep:
+
+        >>> session = view.getSessionData()
+        >>> session['time_model'] = 'weekly'
+        >>> view.next()
+        <...ttwizard.WeeklySlotEntryStep...>
+
+    Otherwise, the rotating cycle will be used:
+
+        >>> session['time_model'] = 'cycle_day'
+        >>> view.next()
+        <...ttwizard.RotatingSlotEntryStep...>
+
+    """
+
+
+def doctest_SimpleSlotEntryStep():
+    r"""Unit test for SimpleSlotEntryStep
+
+        >>> from schooltool.timetable.browser.ttwizard import SimpleSlotEntryStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = SimpleSlotEntryStep(context, request)
+
+        >>> print view()
+        <BLANKLINE>
+        ...<textarea cols="60" id="field.times" name="field.times"
+                     rows="15" >...</textarea>...
+
+    SimpleSlotEntryStep.update wants at least one slot
+
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least one time slot.
+
+        >>> request = TestRequest(form={'field.times': u''})
+        >>> view = SimpleSlotEntryStep(context, request)
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least one time slot.
+
+        >>> request = TestRequest(form={'field.times': u'\n\n\n'})
+        >>> view = SimpleSlotEntryStep(context, request)
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least one time slot.
+
+        >>> request = TestRequest(form={'field.times': u'not a time\n\n\n'})
+        >>> view = SimpleSlotEntryStep(context, request)
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Not a valid time slot: not a time.
+
+        >>> request = TestRequest(form={'field.times': u'unicode is tr\u00efcky'})
+        >>> view = SimpleSlotEntryStep(context, request)
+        >>> view.update()
+        False
+        >>> translate(view.error)
+        u'Not a valid time slot: unicode is tr\xefcky.'
+
+    Let's cover the successful case.  We will need day names in the session.
+
+        >>> request = TestRequest(form={'field.times': u'9:30-10:25\n\n'})
+        >>> view = SimpleSlotEntryStep(context, request)
+        >>> view.getSessionData()['day_names'] = ['DA', 'DB', 'DC']
+        >>> view.update()
+        True
+        >>> view.error
+
+    The time_slots structure will be filled with as many duplicates of the
+    slot times as there are day names.
+
+        >>> pprint(view.getSessionData()['time_slots'])
+        [[(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+         [(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+         [(datetime.time(9, 30), datetime.timedelta(0, 3300))]]
+
+    The text area contains one slot per line; extra spaces are stripped;
+    empty lines are ignored.
+
+    The next page is the named periods page.
+
+        >>> view.next()
+        <...ttwizard.NamedPeriodsStep...>
+
+    """
+
+
+def doctest_RotatingSlotEntryStep():
+    r"""Unit test for RotatingSlotEntryStep
+
+        >>> from schooltool.timetable.browser.ttwizard import RotatingSlotEntryStep
+        >>> from schooltool.timetable.browser.ttwizard import getSessionData
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = RotatingSlotEntryStep(context, request)
+
+        >>> view.getSessionData()['day_names'] = ['Oneday', 'Twoday']
+
+        >>> view.dayNames()
+        ['Oneday', 'Twoday']
+
+    At first we get a table with one empty row of input fields:
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <tr>
+          <th>Oneday</th>
+          <th>Twoday</th>
+        </tr>
+        <tr>
+          <td>
+            <textarea rows="12" cols="15" name="times.0">8:00 - 8:45
+        9:05 - 9:50
+        </textarea>
+          </td>
+          <td>
+            <textarea rows="12" cols="15" name="times.1">8:00 - 8:45
+        9:05 - 9:50
+        </textarea>
+          </td>
+        </tr>
+        </table>
+        ...
+
+        >>> print view.error
+        None
+
+    SlotEntryStep.update wants at least one slot on each day:
+
+        >>> view.request.form['times.0'] = u'9:30 - 10:25'
+        >>> view.request.form['times.1'] = u''
+        >>> view.update()
+        False
+
+        >>> print translate(view.error)
+        Please enter at least one time slot for Twoday.
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <tr>
+          <th>Oneday</th>
+          <th>Twoday</th>
+        </tr>
+        <tr>
+          <td>
+            <textarea rows="12" cols="15" name="times.0">9:30 - 10:25</textarea>
+          </td>
+          <td>
+            <textarea rows="12" cols="15" name="times.1"></textarea>
+          </td>
+        </tr>
+        </table>
+        ...
+
+    If we provide an invalid interval, an error message will be shown:
+
+        >>> view.request.form['times.1'] = u'9:15 - 10:73'
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Not a valid time slot: 9:15 - 10:73.
+
+    If we provide both fields, the form will be parsed successfully:
+
+        >>> view.request.form['times.1'] = u'9:15 - 10:10\n10:35 - 11:20'
+        >>> view.update()
+        True
+
+        >>> pprint(view.getSessionData()['time_slots'])
+        [[(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+         [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+          (datetime.time(10, 35), datetime.timedelta(0, 2700))]]
+
+    The next page is the period naming step.
+
+        >>> view.next()
+        <...ttwizard.NamedPeriodsStep...>
+
+    """
+
+
+def doctest_WeeklySlotEntryStep():
+    r"""Unit test for WeeklySlotEntryStep
+
+        >>> from schooltool.timetable.browser.ttwizard import WeeklySlotEntryStep
+        >>> from schooltool.timetable.browser.ttwizard import getSessionData
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = WeeklySlotEntryStep(context, request)
+        >>> view.getSessionData()['cycle'] = 'weekly'
+
+        >>> view.dayNames()
+        [u'Monday', u'Tuesday', u'Wednesday', u'Thursday', u'Friday']
+
+    At first we get a table with one empty row of input fields:
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <tr>
+          <th>Monday</th>
+          ...
+          <th>Friday</th>
+        </tr>
+        <tr>
+          <td>
+            <textarea rows="12" cols="15" name="times.0">8:00 - 8:45
+        9:05 - 9:50
+        </textarea>
+          </td>
+          ...
+          <td>
+            <textarea rows="12" cols="15" name="times.4">8:00 - 8:45
+        9:05 - 9:50
+        </textarea>
+          </td>
+        </tr>
+        </table>
+        ...
+
+        >>> print view.error
+        None
+
+    SlotEntryStep.update wants at least one slot on each day:
+
+        >>> view.request.form['times.0'] = u'9:30 - 10:25'
+        >>> view.request.form['times.1'] = u''
+        >>> view.update()
+        False
+
+        >>> print translate(view.error)
+        Please enter at least one time slot for Tuesday.
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+        <tr>
+          <td>
+            <textarea rows="12" cols="15" name="times.0">9:30 - 10:25</textarea>
+          </td>
+          <td>
+            <textarea rows="12" cols="15" name="times.1"></textarea>
+          </td>
+          ...
+        </tr>
+        </table>
+        ...
+
+    If we provide an invalid interval, an error message will be shown:
+
+        >>> view.request.form['times.1'] = u'9:15 - 10:73'
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Not a valid time slot: 9:15 - 10:73.
+
+    If we provide both fields, the form will be parsed successfully:
+
+        >>> for i in range(1, 5):
+        ...     field_name = 'times.%d' % i
+        ...     view.request.form[field_name] = u'9:15 - 10:10\n10:35 - 11:20'
+        >>> view.update()
+        True
+
+        >>> pprint(view.getSessionData()['time_slots'])
+        [[(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+         [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+          (datetime.time(10, 35), datetime.timedelta(0, 2700))],
+         [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+          (datetime.time(10, 35), datetime.timedelta(0, 2700))],
+         [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+          (datetime.time(10, 35), datetime.timedelta(0, 2700))],
+         [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+          (datetime.time(10, 35), datetime.timedelta(0, 2700))]]
+
+    If we choose a rotating timetable cycle and slots vary based on day of
+    week, each day must have the same number of slots.
+
+        >>> form = {'times.4': '9:15 - 10:10\n10:35 - 11:20\n11:30 - 12:15\n'}
+        >>> for i in range(0, 4):
+        ...     field_name = 'times.%d' % i
+        ...     form[field_name] = u'9:15 - 10:10\n10:35 - 11:20'
+        >>> request = TestRequest(form=form)
+        >>> view = WeeklySlotEntryStep(context, request)
+
+        >>> session = view.getSessionData()
+        >>> session['cycle'] = 'rotating'
+        >>> session['time_model'] = 'weekly'
+
+        >>> view.update()
+        False
+        >>> translate(view.error)
+        u'As you have selected a rotating timetable cycle and slots based on day of week, all days must have the same number of time periods.'
+
+    If we change the time model, the same data will pass:
+
+        >>> session['time_model'] = 'cycle_day'
+        >>> view.update()
+        True
+
+    Or we can delete that key altogether:
+
+        >>> del session['time_model']
+        >>> view.update()
+        True
+
+    The next page is the period naming step.
+
+        >>> view.next()
+        <...ttwizard.NamedPeriodsStep...>
+
+    """
+
+
+def doctest_NamedPeriodsStep():
+    r"""Unit test for NamedPeriodsStep
+
+        >>> from schooltool.timetable.browser.ttwizard \
+        ...     import NamedPeriodsStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = NamedPeriodsStep(context, request)
+
+    The next step is PeriodNamesStep if perods should be named:
+
+        >>> view.getSessionData()['named_periods'] = True
+        >>> view.next()
+        <schooltool.timetable.browser.ttwizard.PeriodNamesStep...>
+
+    If periods are not named, go straight to the homeroom step, and compute
+    the default period names:
+
+        >>> from datetime import time, timedelta
+        >>> periods = [(time(9, 0), timedelta(minutes=50)),
+        ...            (time(12, 35), timedelta(minutes=50)),
+        ...            (time(14, 15), timedelta(minutes=55))]
+        >>> periods2 = [(time(9, 10), timedelta(minutes=50)),
+        ...             (time(12, 35), timedelta(minutes=50))]
+        >>> view.getSessionData()['time_slots'] = [periods] * 2 + [periods2]
+        >>> view.getSessionData()['named_periods'] = False
+
+        >>> view.next()
+        <...ttwizard.HomeroomStep...>
+
+        >>> pprint(view.getSessionData()['periods_order'])
+        [['09:00-09:50', '12:35-13:25', '14:15-15:10'],
+         ['09:00-09:50', '12:35-13:25', '14:15-15:10'],
+         ['09:10-10:00', '12:35-13:25']]
+
+    """
+
+
+def doctest_PeriodNamesStep():
+    r"""Unit test for PeriodNamesStep
+
+        >>> from schooltool.timetable.browser.ttwizard import PeriodNamesStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = PeriodNamesStep(context, request)
+
+    The number of the required periods depends on the maximum number
+    of slots:
+
+        >>> session = view.getSessionData()
+        >>> interval = (datetime.time(9, 15), datetime.timedelta(0, 3300))
+        >>> view.getSessionData()['time_slots'] = \
+        ...     [[interval] * 3, [interval] * 5, [interval] * 2]
+        >>> view.requiredPeriods()
+        5
+        >>> del session['time_slots']
+
+    The view asks the user to enter at least 3 period names:
+
+        >>> default_slots = [[interval] * 3]
+        >>> view.getSessionData()['time_slots'] = default_slots
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least 3 periods.
+
+        >>> request = TestRequest(form={'field.periods': u''})
+        >>> view = PeriodNamesStep(context, request)
+        >>> view.getSessionData()['time_slots'] = default_slots
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least 3 periods.
+
+        >>> request = TestRequest(form={'field.periods': u'\n\n\n'})
+        >>> view = PeriodNamesStep(context, request)
+        >>> view.getSessionData()['time_slots'] = default_slots
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least 3 periods.
+
+        >>> request = TestRequest(form={'field.periods': u'A\nB\nB\n'})
+        >>> view = PeriodNamesStep(context, request)
+        >>> view.getSessionData()['time_slots'] = default_slots
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please make sure the period names are unique.
+
+        >>> request = TestRequest(form={'field.periods': u'A\n'})
+        >>> view = PeriodNamesStep(context, request)
+        >>> view.getSessionData()['time_slots'] = default_slots
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please enter at least 3 periods.
+
+        >>> request = TestRequest(form={'field.periods': u'A\nB\nC\nD'})
+        >>> view = PeriodNamesStep(context, request)
+        >>> view.getSessionData()['time_slots'] = default_slots
+        >>> view.update()
+        True
+        >>> view.error
+
+        >>> view.getSessionData()['period_names']
+        [u'A', u'B', u'C', u'D']
+
+    The next page is HomeroomStep.
+
+        >>> view.next()
+        <schooltool.timetable.browser.ttwizard.PeriodSequenceSameStep ...>
+
+    """
+
+
+def doctest_PeriodSequenceSameStep():
+    r"""Unit test for PeriodSequenceSameStep
+
+        >>> from schooltool.timetable.browser.ttwizard \
+        ...     import PeriodSequenceSameStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = PeriodSequenceSameStep(context, request)
+
+    The next step is PeriodOrderSimple if periods are the same:
+
+        >>> view.getSessionData()['periods_same'] = True
+        >>> view.next()
+        <schooltool.timetable.browser.ttwizard.PeriodOrderSimple...>
+
+    The next step is PeriodOrderComplex if periods are not the same:
+
+        >>> view.getSessionData()['periods_same'] = False
+        >>> view.next()
+        <schooltool.timetable.browser.ttwizard.PeriodOrderComplex...>
+
+    """
+
+
+def doctest_PeriodOrderSimple():
+    """Unit test for PeriodOrderSimple view
+
+        >>> from schooltool.timetable.browser.ttwizard import PeriodOrderSimple
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = PeriodOrderSimple(context, request)
+
+    Let's say we have some periods:
+
+        >>> view.getSessionData()['period_names'] = ['A', 'B', 'C', 'D']
+
+    Our view lets the template easily access them:
+
+        >>> view.periods()
+        ['A', 'B', 'C', 'D']
+
+    The number of period dropdowns is the maximum of slots in a day:
+
+        >>> time_slots = [
+        ...     [(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+        ...     [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+        ...      (datetime.time(10, 35), datetime.timedelta(0, 2700)),
+        ...      (datetime.time(10, 35), datetime.timedelta(0, 2700)),]]
+        >>> view.getSessionData()['time_slots'] = time_slots
+        >>> view.numPeriods()
+        3
+
+    If we render the view, we get a list of dropdowns with consecutive
+    periods selected:
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+          <div class="row">
+            <select name="period_0">
+              <option selected="selected">A</option>
+              <option>B</option>
+              <option>C</option>
+              <option>D</option>
+            </select>
+          </div>
+          <div class="row">
+            <select name="period_1">
+              <option>A</option>
+              <option selected="selected">B</option>
+              <option>C</option>
+              <option>D</option>
+            </select>
+          </div>
+          <div class="row">
+            <select name="period_2">
+              <option>A</option>
+              <option>B</option>
+              <option selected="selected">C</option>
+              <option>D</option>
+            </select>
+          </div>
+        ...
+
+    When the user shuffles the dropdowns and submits them, the order
+    of periods is changed:
+
+        >>> request = TestRequest(form={'period_0': 'D', 'period_1': 'C',
+        ...                             'period_2': 'B', 'period_3': 'A'})
+        >>> view = PeriodOrderSimple(context, request)
+        >>> view.getSessionData()['period_names'] = ['A', 'B', 'C', 'D',
+        ...                                          'E', 'F']
+        >>> view.getSessionData()['day_names'] = ['1', '2']
+        >>> view.getSessionData()['time_slots'] = time_slots
+
+        >>> view.update()
+        True
+        >>> print view.getSessionData()['periods_order']
+        [['D', 'C', 'B'], ['D', 'C', 'B']]
+
+    The next step is always the homeroom step:
+
+        >>> view.next()
+        <...ttwizard.HomeroomStep ...>
+
+    If not all periods are in the request, update fails and the user
+    gets an error.  This is unlikely in real life as the dropdowns
+    have values preselected:
+
+        >>> request = TestRequest(form={'period_0': 'D', 'period_1': 'C'})
+        >>> view = PeriodOrderSimple(context, request)
+        >>> view.getSessionData()['period_names'] = ['A', 'B', 'C', 'D']
+        >>> view.getSessionData()['time_slots'] = time_slots
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please provide all periods.
+        >>> 'periods_order' in view.getSessionData()
+        False
+
+    A much more likely scenario is that some period was selected
+    twice, and some was missed out:
+
+        >>> request = TestRequest(form={'period_0': 'D', 'period_1': 'C',
+        ...                             'period_2': 'C'})
+        >>> view = PeriodOrderSimple(context, request)
+        >>> view.getSessionData()['period_names'] = ['A', 'B', 'C', 'D']
+        >>> view.getSessionData()['time_slots'] = time_slots
+        >>> view.getSessionData()['day_names'] = ['1', '2']
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        The following periods were selected more than once: C
+        >>> 'periods_order' in view.getSessionData()
+        False
+
+    The view will display the order the user has selected though:
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+          <div class="row">
+            <select name="period_0">
+              <option>A</option>
+              <option>B</option>
+              <option>C</option>
+              <option selected="selected">D</option>
+            </select>
+          </div>
+          <div class="row">
+            <select name="period_1">
+              <option>A</option>
+              <option>B</option>
+              <option selected="selected">C</option>
+              <option>D</option>
+            </select>
+          </div>
+          <div class="row">
+            <select name="period_2">
+              <option>A</option>
+              <option>B</option>
+              <option selected="selected">C</option>
+              <option>D</option>
+            </select>
+          </div>
+          ...
+
+    """
+
+
+def doctest_PeriodOrderComplex():
+    """Unit test for PeriodOrderComplex view
+
+        >>> from schooltool.timetable.browser.ttwizard import \\
+        ...     PeriodOrderComplex
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = PeriodOrderComplex(context, request)
+
+    Let's say we have some periods and days in a rotating cycle:
+
+        >>> session = view.getSessionData()
+        >>> session['period_names'] = ['A', 'B', 'C', 'D']
+        >>> session['day_names'] = ['Day One', 'Day Two']
+        >>> session['cycle'] = 'rotating'
+        >>> session['time_model'] = 'cycle_day'
+
+    The number of period dropdowns is the maximum of slots in a day:
+
+        >>> time_slots = [
+        ...     [(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+        ...     [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+        ...      (datetime.time(10, 35), datetime.timedelta(0, 2700)),
+        ...      (datetime.time(10, 35), datetime.timedelta(0, 2700)),]]
+        >>> session['time_slots'] = time_slots
+
+    Our view lets the template easily access period and days names:
+
+        >>> view.periods()
+        ['A', 'B', 'C', 'D']
+
+        >>> view.days()
+        ['Day One', 'Day Two']
+
+    The number of dropdowns for a day is equal to the number of slots:
+
+        >>> view.numSlots()
+        [1, 3]
+
+    If we render the view, we get a list of dropdowns with consecutive
+    periods selected:
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+          <table>
+            <tr>
+              <th>Day One</th>
+              <th>Day Two</th>
+            </tr>
+            <tr>
+              <td>
+                <select name="period_0_0">
+                  <option selected="selected">A</option>
+                  <option>B</option>
+                  <option>C</option>
+                  <option>D</option>
+                </select>
+              </td>
+              <td>
+                <select name="period_1_0">
+                  <option selected="selected">A</option>
+                  <option>B</option>
+                  <option>C</option>
+                  <option>D</option>
+                </select>
+              </td>
+            </tr>
+            <tr>
+              <td>
+              </td>
+              <td>
+                <select name="period_1_1">
+                  <option>A</option>
+                  <option selected="selected">B</option>
+                  <option>C</option>
+                  <option>D</option>
+                </select>
+              </td>
+            </tr>
+            <tr>
+              <td>
+              </td>
+              <td>
+                <select name="period_1_2">
+                  <option>A</option>
+                  <option>B</option>
+                  <option selected="selected">C</option>
+                  <option>D</option>
+                </select>
+              </td>
+            </tr>
+          </table>
+        ...
+
+    When the user shuffles the dropdowns and submits them, the order
+    of periods is changed:
+
+        >>> request = TestRequest(form={'period_0_0': 'A',
+        ...                             'period_1_0': 'B', 'period_1_1': 'A',
+        ...                             'period_1_2': 'C'})
+        >>> view = PeriodOrderComplex(context, request)
+        >>> view.getSessionData()['period_names'] = ['A', 'B', 'C', 'D']
+        >>> view.getSessionData()['day_names'] = ['Day 1', 'Day 2']
+        >>> view.getSessionData()['time_slots'] = time_slots
+        >>> view.getSessionData()['cycle'] = 'rotating'
+        >>> view.getSessionData()['time_model'] = 'cycle_day'
+        >>> view.update()
+        True
+        >>> print view.getSessionData()['periods_order']
+        [['A'], ['B', 'A', 'C']]
+
+    The next step is always the homeroom step:
+
+        >>> view.next()
+        <...ttwizard.HomeroomStep ...>
+
+    If not all periods are in the request, update fails and the user
+    gets an error.  This is unlikely in real life as the dropdowns
+    have values preselected:
+
+        >>> request = TestRequest(form={'period_0_0': 'A', 'period_0_1': 'B',
+        ...                             'period_1_1': 'A'})
+        >>> view = PeriodOrderComplex(context, request)
+        >>> view.getSessionData()['period_names'] = ['A', 'B', 'C', 'D']
+        >>> view.getSessionData()['day_names'] = ['Z', 'X']
+        >>> view.getSessionData()['time_slots'] = time_slots
+        >>> view.getSessionData()['cycle'] = 'rotating'
+        >>> view.getSessionData()['time_model'] = 'cycle_day'
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        Please provide all periods.
+        >>> 'periods_order' not in view.getSessionData()
+        True
+
+    A much more likely scenario is that some period was selected
+    twice, and some was missed out:
+
+        >>> request = TestRequest(form={'period_0_0': 'B', 'period_0_1': 'B',
+        ...                             'period_1_2': 'C',
+        ...                             'period_1_0': 'A', 'period_1_1': 'A'})
+        >>> view = PeriodOrderComplex(context, request)
+        >>> view.getSessionData()['period_names'] = ['A', 'B', 'C', 'D']
+        >>> view.getSessionData()['day_names'] = ['X', 'Y']
+        >>> view.getSessionData()['time_slots'] = [
+        ...     [(datetime.time(9, 30), datetime.timedelta(0, 3300)),
+        ...      (datetime.time(10, 30), datetime.timedelta(0, 3300))],
+        ...     [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+        ...      (datetime.time(10, 35), datetime.timedelta(0, 2700)),
+        ...      (datetime.time(10, 35), datetime.timedelta(0, 2700)),]]
+        >>> view.getSessionData()['cycle'] = 'rotating'
+        >>> view.getSessionData()['time_model'] = 'cycle_day'
+        >>> view.update()
+        False
+        >>> print translate(view.error)
+        The following periods were selected more than once: B on day X, A on day Y
+        >>> 'periods_order' not in view.getSessionData()
+        True
+
+    The view will display the order the user has selected though:
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+          <div class="error">The following periods were selected more
+            than once: B on day X, A on day Y</div>
+          <table>
+            <tr>
+              <th>X</th>
+              <th>Y</th>
+            </tr>
+            <tr>
+              <td>
+                <select name="period_0_0">
+                  <option>A</option>
+                  <option selected="selected">B</option>
+                  <option>C</option>
+                  <option>D</option>
+                </select>
+              </td>
+              <td>
+                <select name="period_1_0">
+                  <option selected="selected">A</option>
+                  <option>B</option>
+                  <option>C</option>
+                  <option>D</option>
+                </select>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <select name="period_0_1">
+                  <option>A</option>
+                  <option selected="selected">B</option>
+                  <option>C</option>
+                  <option>D</option>
+                </select>
+              </td>
+              <td>
+                <select name="period_1_1">
+                  <option selected="selected">A</option>
+                  <option>B</option>
+                  <option>C</option>
+                  <option>D</option>
+                </select>
+              </td>
+            </tr>
+            <tr>
+              <td>
+              </td>
+              <td>
+                <select name="period_1_2">
+                  <option>A</option>
+                  <option>B</option>
+                  <option selected="selected">C</option>
+                  <option>D</option>
+                </select>
+              </td>
+            </tr>
+          </table>
+        ...
+
+    """
+
+
+def doctest_PeriodOrderComplex_weekly_rotating():
+    """Unit test for PeriodOrderComplex view
+
+        >>> from schooltool.timetable.browser.ttwizard import \\
+        ...     PeriodOrderComplex
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = PeriodOrderComplex(context, request)
+
+    There is one special case: a rotating cycle that uses weekdays to determine
+    time slots.
+
+        >>> session = view.getSessionData()
+        >>> session['cycle'] = 'rotating'
+        >>> session['time_model'] = 'weekly'
+
+    Let's say we have some periods:
+
+        >>> session['period_names'] = ['A', 'B', 'C', 'D']
+        >>> session['day_names'] = ['Day One', 'Day Two']
+
+    The number of period dropdowns is the maximum of slots in a day:
+
+        >>> time_slots = [
+        ...     [(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+        ...     [(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+        ...     [(datetime.time(9, 15), datetime.timedelta(0, 3300)),
+        ...      (datetime.time(10, 35), datetime.timedelta(0, 2700)),
+        ...      (datetime.time(11, 35), datetime.timedelta(0, 2700)),],
+        ...     [(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+        ...     [(datetime.time(9, 30), datetime.timedelta(0, 3300))],
+        ... ]
+        >>> view.getSessionData()['time_slots'] = time_slots
+
+    Our view lets the template easily access them:
+
+        >>> view.periods()
+        ['A', 'B', 'C', 'D']
+
+        >>> view.days()
+        ['Day One', 'Day Two']
+
+    The number of dropdowns for a day is equal to the number of slots:
+
+        >>> view.numSlots()
+        [1, 1, 3, 1, 1]
+
+    """
+
+
+def doctest_HomeroomStep():
+    r"""Unit test for HomeroomStep
+
+        >>> from schooltool.timetable.browser.ttwizard import HomeroomStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = HomeroomStep(context, request)
+
+    If you say that your school does not take attendance in a homeroom period,
+    you will be redirected to FinalStep.
+
+        >>> session = view.getSessionData()
+        >>> session['homeroom'] = False
+        >>> view.next()
+        <...ttwizard.FinalStep...>
+
+    Otherwise, you will have to specify the homeroom period for each day
+
+        >>> session['homeroom'] = True
+        >>> view.next()
+        <...ttwizard.HomeroomPeriodsStep...>
+
+    """
+
+
+def doctest_HomeroomPeriodsStep():
+    r"""Unit test for HomeroomPeriodsStep view
+
+        >>> from schooltool.timetable.browser.ttwizard \
+        ...         import HomeroomPeriodsStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = HomeroomPeriodsStep(context, request)
+
+    Let's say we have some days with periods:
+
+        >>> view.getSessionData()['day_names'] = ['Day1', 'Day2', 'Day3']
+        >>> view.getSessionData()['periods_order'] = [['A', 'B', 'C', 'D'],
+        ...                                           ['B', 'C', 'D', 'E'],
+        ...                                           ['C', 'D', 'E', 'F']]
+
+    Our view lets the template easily access them:
+
+        >>> view.days()
+        ['Day1', 'Day2', 'Day3']
+
+        >>> view.periodsInOrder()
+        [['A', 'B', 'C', 'D'],
+         ['B', 'C', 'D', 'E'],
+         ['C', 'D', 'E', 'F']]
+
+    If we render the view, we get lists of checkboxes with period names,
+    one list for each day.
+
+        >>> print view()
+        <BLANKLINE>
+        ...
+              <td>
+        <BLANKLINE>
+        <BLANKLINE>
+                    <input type="checkbox" name="homeroom_0_A"
+                           id="homeroom_0_A" />
+                    <label for="homeroom_0_A">A</label>
+        <BLANKLINE>
+                  <br />
+        <BLANKLINE>
+        <BLANKLINE>
+        <BLANKLINE>
+                    <input type="checkbox" name="homeroom_0_B"
+                           id="homeroom_0_B" />
+                    <label for="homeroom_0_B">B</label>
+        <BLANKLINE>
+                  <br />
+        ...
+
+    When the user selects some of the items and submits the form, the choice
+    is remembered.
+
+        >>> request = TestRequest(form={'homeroom_0_A': 'checked',
+        ...                             'homeroom_0_C': 'checked',
+        ...                             'homeroom_2_C': 'checked',
+        ...                             'homeroom_2_F': 'checked'})
+        >>> view = HomeroomPeriodsStep(context, request)
+        >>> view.getSessionData()['day_names'] = ['Day 1', 'Day 2', 'Day 3']
+        >>> view.getSessionData()['periods_order'] = [['A', 'B', 'C', 'D'],
+        ...                                           ['B', 'C', 'D', 'E'],
+        ...                                           ['C', 'D', 'E', 'F']]
+
+        >>> view.update()
+        True
+        >>> print view.getSessionData()['homeroom_periods']
+        [['A', 'C'], [], ['C', 'F']]
+
+    The next step is always the final step:
+
+        >>> view.next()
+        <...ttwizard.FinalStep ...>
+
+    """
+
+
+def doctest_FinalStep():
+    r"""Unit test for FinalStep
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = FinalStep(context, request)
+
+        >>> from datetime import time, timedelta
+        >>> data = view.getSessionData()
+        >>> data['title'] = u'Sample Schema'
+        >>> data['cycle'] = 'weekly'
+        >>> data['day_names'] = ['Monday', 'Tuesday', 'Wednesday',
+        ...                      'Thursday', 'Friday']
+        >>> data['similar_days'] = True
+        >>> data['time_slots'] = [[(time(9, 30), timedelta(minutes=55)),
+        ...                        (time(10, 30), timedelta(minutes=55))]]
+        >>> data['named_periods'] = False
+        >>> from schooltool.timetable.browser.ttwizard \
+        ...     import default_period_names
+        >>> data['periods_order'] = default_period_names(data['time_slots'])
+        >>> data['homeroom'] = False
+
+        >>> view()
+
+        >>> ttschema = context['sample-schema']
+        >>> ttschema
+        <...TimetableSchema object at ...>
+        >>> print ttschema.title
+        Sample Schema
+
+    We should get redirected to the ttschemas index:
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/ttschemas'
+
+    The cycle of steps loops here
+
+        >>> view.update()
+        True
+        >>> view.next()
+        <...FirstStep...>
+
+    """
+
+
+def doctest_FinalStep_dayTemplates():
+    """Unit test for FinalStep.dayTemplates
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> from datetime import time, timedelta
+        >>> names = ['A', 'B', 'C']
+        >>> slots = [(time(9, 0), timedelta(minutes=50)),
+        ...          (time(12, 35), timedelta(minutes=50)),
+        ...          (time(14, 15), timedelta(minutes=55))]
+
+    Simple case: all days are the same.
+
+        >>> dt = FinalStep.dayTemplates([names] * 4, [slots] * 4)
+        >>> print_day_templates(dt)
+        --- day template None
+        09:00-09:50
+        12:35-13:25
+        14:15-15:10
+
+    Time slots are the same for all days, but period order differs.
+
+        >>> dt = FinalStep.dayTemplates([['A', 'B', 'C'],
+        ...                              ['B', 'C', 'A'],
+        ...                              ['C', 'A', 'B'],
+        ...                              ['B', 'A', 'C']],
+        ...                             [slots] * 4)
+        >>> print_day_templates(dt)
+        --- day template None
+        09:00-09:50
+        12:35-13:25
+        14:15-15:10
+
+    Time slots are different.
+
+        >>> duration = timedelta(minutes=30)
+        >>> dt = FinalStep.dayTemplates([['A', 'B', 'C'],
+        ...                              ['B', 'C', 'A'],
+        ...                              ['C', 'A', 'B'],
+        ...                              ['B', 'A', 'C']],
+        ...                             [[(time(9+n, 5*d), duration)
+        ...                               for n in range(3)]
+        ...                              for d in range(4)])
+        >>> print_day_templates(dt)
+        --- day template None
+        --- day template 0
+        09:00-09:30
+        10:00-10:30
+        11:00-11:30
+        --- day template 1
+        09:05-09:35
+        10:05-10:35
+        11:05-11:35
+        --- day template 2
+        09:10-09:40
+        10:10-10:40
+        11:10-11:40
+        --- day template 3
+        09:15-09:45
+        10:15-10:45
+        11:15-11:45
+
+    """
+
+
+def doctest_FinalStep_createSchema():
+    r"""Unit test for FinalStep.createSchema
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = FinalStep(context, request)
+        >>> data = view.getSessionData()
+        >>> data['title'] = u'Default'
+
+    First, let's try the simple weekly model.
+
+        >>> data['cycle'] = 'weekly'
+        >>> data['day_names'] = ['Monday', 'Tuesday', 'Wednesday',
+        ...                      'Thursday', 'Friday']
+        >>> from datetime import time, timedelta
+        >>> data['similar_days'] = True
+        >>> data['time_slots'] = [[(time(9, 30), timedelta(minutes=55)),
+        ...                        (time(10, 30), timedelta(minutes=55))]] * 5
+        >>> data['named_periods'] = False
+        >>> from schooltool.timetable.browser.ttwizard \
+        ...     import default_period_names
+        >>> data['periods_order'] = default_period_names(data['time_slots'])
+        >>> data['homeroom'] = False
+
+        >>> ttschema = view.createSchema()
+        >>> ttschema
+        <...TimetableSchema object at ...>
+        >>> print ttschema.title
+        Default
+        >>> print_ttschema(ttschema)
+        Monday       Tuesday      Wednesday    Thursday     Friday
+        09:30-10:25  09:30-10:25  09:30-10:25  09:30-10:25  09:30-10:25
+        10:30-11:25  10:30-11:25  10:30-11:25  10:30-11:25  10:30-11:25
+
+        >>> ttschema.model
+        <...WeeklyTimetableModel object at ...>
+        >>> print " ".join(ttschema.model.timetableDayIds)
+        Monday Tuesday Wednesday Thursday Friday
+
+    There is a single day template
+
+        >>> print_day_templates(ttschema.model.dayTemplates)
+        --- day template None
+        09:30-10:25
+        10:30-11:25
+
+    The model can also be rotating.
+
+        >>> data['cycle'] = 'rotating'
+        >>> data['day_names'] = ['D1', 'D2', 'D3']
+        >>> ttschema = view.createSchema()
+        >>> ttschema.model
+        <...SequentialDayIdBasedTimetableModel object at ...>
+        >>> print_ttschema(ttschema)
+        D1           D2           D3
+        09:30-10:25  09:30-10:25  09:30-10:25
+        10:30-11:25  10:30-11:25  10:30-11:25
+
+    The periods can be named rather than be designated by time:
+
+        >>> data['cycle'] = 'rotating'
+        >>> data['day_names'] = ['D1', 'D2', 'D3']
+        >>> data['named_periods'] = True
+        >>> data['period_names'] = ['Green', 'Blue']
+        >>> data['periods_same'] = True
+        >>> data['periods_order'] = [['Green', 'Blue']] * 3
+        >>> ttschema = view.createSchema()
+        >>> ttschema.model
+        <...SequentialDayIdBasedTimetableModel object at ...>
+        >>> print_ttschema(ttschema)
+        D1           D2           D3
+        Green        Green        Green
+        Blue         Blue         Blue
+
+    The ttschema's timezone is 'UTC', the app default:
+
+        >>> ttschema.timezone
+        'UTC'
+
+    However if we set a school preferred timezone and try again:
+
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> IApplicationPreferences(app).timezone = 'Australia/Canberra'
+        >>> ttschema = view.createSchema()
+        >>> ttschema.timezone
+        'Australia/Canberra'
+
+    """
+
+
+def doctest_FinalStep_createSchema_different_order_on_different_days_weekly():
+    """Unit test for FinalStep.createSchema
+
+    Weekly cycle, same time slots on each day, different period order in
+    each day.
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> view = FinalStep(app['ttschemas'], TestRequest())
+        >>> data = view.getSessionData()
+
+        >>> from datetime import time, timedelta
+        >>> slots = [(time(8+n, 0), timedelta(minutes=45))
+        ...          for n in range(4)]
+
+        >>> data['title'] = u'Default'
+        >>> data['cycle'] = 'weekly'
+        >>> data['day_names'] = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
+        ...                      'Friday']
+        >>> data['similar_days'] = True
+        >>> data['time_slots'] = [slots] * 5
+        >>> data['named_periods'] = True
+        >>> data['period_names'] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
+        >>> data['periods_same'] = False
+        >>> data['periods_order'] = [['A', 'B', 'C', 'D'],
+        ...                          ['B', 'C', 'D', 'E'],
+        ...                          ['C', 'D', 'E', 'F'],
+        ...                          ['D', 'E', 'F', 'G'],
+        ...                          ['E', 'F', 'G', 'H']]
+        >>> data['homeroom'] = False
+        >>> ttschema = view.createSchema()
+
+        >>> print_ttschema(ttschema)
+        Monday       Tuesday      Wednesday    Thursday     Friday
+        A            B            C            D            E
+        B            C            D            E            F
+        C            D            E            F            G
+        D            E            F            G            H
+
+        >>> ttschema.model
+        <...WeeklyTimetableModel object at ...>
+
+        >>> print_day_templates(ttschema.model.dayTemplates)
+        --- day template None
+        08:00-08:45
+        09:00-09:45
+        10:00-10:45
+        11:00-11:45
+
+    """
+
+
+def doctest_FinalStep_createSchema_different_order_on_different_days_cyclic():
+    """Unit test for FinalStep.createSchema
+
+    Rotating cycle, same time slots on each day, different period order in
+    each day.
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> view = FinalStep(app['ttschemas'], TestRequest())
+        >>> data = view.getSessionData()
+
+        >>> from datetime import time, timedelta
+        >>> slots = [(time(8+n, 0), timedelta(minutes=45))
+        ...          for n in range(4)]
+
+        >>> data['title'] = u'Default'
+        >>> data['cycle'] = 'rotating'
+        >>> data['day_names'] = ['Day 1', 'Day 2', 'Day 3']
+        >>> data['similar_days'] = True
+        >>> data['time_slots'] = [slots] * 3
+        >>> data['named_periods'] = True
+        >>> data['period_names'] = ['A', 'B', 'C', 'D', 'E', 'F']
+        >>> data['periods_same'] = False
+        >>> data['periods_order'] = [['A', 'B', 'C', 'D'],
+        ...                          ['B', 'C', 'D', 'E'],
+        ...                          ['C', 'D', 'E', 'F']]
+        >>> data['homeroom'] = False
+        >>> ttschema = view.createSchema()
+
+        >>> print_ttschema(ttschema)
+        Day 1        Day 2        Day 3
+        A            B            C
+        B            C            D
+        C            D            E
+        D            E            F
+
+        >>> ttschema.model
+        <...SequentialDayIdBasedTimetableModel object at ...>
+
+        >>> print_day_templates(ttschema.model.dayTemplates)
+        --- day template 'Day 1'
+        08:00-08:45
+        09:00-09:45
+        10:00-10:45
+        11:00-11:45
+        --- day template 'Day 2'
+        08:00-08:45
+        09:00-09:45
+        10:00-10:45
+        11:00-11:45
+        --- day template 'Day 3'
+        08:00-08:45
+        09:00-09:45
+        10:00-10:45
+        11:00-11:45
+
+    """
+
+
+def doctest_FinalStep_createSchema_different_order_cyclic_weekly():
+    """Unit test for FinalStep.createSchema
+
+    Rotating cycle, different time slots on a weekly basis, different period
+    order in each day.
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> view = FinalStep(app['ttschemas'], TestRequest())
+        >>> data = view.getSessionData()
+
+        >>> from datetime import time, timedelta
+        >>> slots = [[(time(8+n, d*5), timedelta(minutes=45))
+        ...           for n in range(4)]
+        ...          for d in range(5)]
+
+        >>> data['title'] = u'Default'
+        >>> data['cycle'] = 'rotating'
+        >>> data['day_names'] = ['Day 1', 'Day 2', 'Day 3']
+        >>> data['similar_days'] = False
+        >>> data['time_model'] = 'weekly'
+        >>> data['time_slots'] = slots
+        >>> data['named_periods'] = True
+        >>> data['period_names'] = ['A', 'B', 'C', 'D', 'E', 'F']
+        >>> data['periods_same'] = False
+        >>> data['periods_order'] = [['A', 'B', 'C', 'D', 'E', 'F'],
+        ...                          ['B', 'C', 'D', 'E', 'F', 'A'],
+        ...                          ['C', 'D', 'E', 'F', 'A', 'B']]
+        >>> data['homeroom'] = False
+        >>> ttschema = view.createSchema()
+
+        >>> print_ttschema(ttschema)
+        Day 1        Day 2        Day 3
+        A            B            C
+        B            C            D
+        C            D            E
+        D            E            F
+        E            F            A
+        F            A            B
+
+        >>> ttschema.model
+        <...SequentialDaysTimetableModel object at ...>
+
+        >>> print_day_templates(ttschema.model.dayTemplates)
+        --- day template None
+        --- day template 0
+        08:00-08:45
+        09:00-09:45
+        10:00-10:45
+        11:00-11:45
+        --- day template 1
+        08:05-08:50
+        09:05-09:50
+        10:05-10:50
+        11:05-11:50
+        --- day template 2
+        08:10-08:55
+        09:10-09:55
+        10:10-10:55
+        11:10-11:55
+        --- day template 3
+        08:15-09:00
+        09:15-10:00
+        10:15-11:00
+        11:15-12:00
+        --- day template 4
+        08:20-09:05
+        09:20-10:05
+        10:20-11:05
+        11:20-12:05
+
+    """
+
+
+def doctest_FinalStep_createSchema_different_times():
+    """Unit test for FinalStep.createSchema
+
+    Weekly cycle, different time slots on each day, different period order in
+    each day.
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> view = FinalStep(app['ttschemas'], TestRequest())
+        >>> data = view.getSessionData()
+
+        >>> from datetime import time, timedelta
+        >>> slots = [[(time(8+n, d*5), timedelta(minutes=45))
+        ...           for n in range(4)]
+        ...          for d in range(5)]
+
+        >>> data['title'] = u'Default'
+        >>> data['cycle'] = 'weekly'
+        >>> data['day_names'] = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
+        ...                      'Friday']
+        >>> data['similar_days'] = False
+        >>> data['time_slots'] = slots
+        >>> data['named_periods'] = True
+        >>> data['period_names'] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
+        >>> data['periods_same'] = False
+        >>> data['periods_order'] = [['A', 'B', 'C', 'D'],
+        ...                          ['B', 'C', 'D', 'E'],
+        ...                          ['C', 'D', 'E', 'F'],
+        ...                          ['D', 'E', 'F', 'G'],
+        ...                          ['E', 'F', 'G', 'H']]
+        >>> data['homeroom'] = False
+        >>> ttschema = view.createSchema()
+
+        >>> print_ttschema(ttschema)
+        Monday       Tuesday      Wednesday    Thursday     Friday
+        A            B            C            D            E
+        B            C            D            E            F
+        C            D            E            F            G
+        D            E            F            G            H
+
+        >>> for day_id, day in ttschema.items():
+        ...     if day.homeroom_period_ids:
+        ...         print "Homeroom on %s is %s" % (day_id,
+        ...                                         day.homeroom_period_ids[0])
+
+        >>> ttschema.model
+        <...WeeklyTimetableModel object at ...>
+
+        >>> print_day_templates(ttschema.model.dayTemplates)
+        --- day template None
+        --- day template 0
+        08:00-08:45
+        09:00-09:45
+        10:00-10:45
+        11:00-11:45
+        --- day template 1
+        08:05-08:50
+        09:05-09:50
+        10:05-10:50
+        11:05-11:50
+        --- day template 2
+        08:10-08:55
+        09:10-09:55
+        10:10-10:55
+        11:10-11:55
+        --- day template 3
+        08:15-09:00
+        09:15-10:00
+        10:15-11:00
+        11:15-12:00
+        --- day template 4
+        08:20-09:05
+        09:20-10:05
+        10:20-11:05
+        11:20-12:05
+
+    """
+
+
+def doctest_FinalStep_createSchema_with_homeroom():
+    """Unit test for FinalStep.createSchema
+
+    Weekly cycle, different time slots on each day, different period order in
+    each day, homeroom periods.
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> view = FinalStep(app['ttschemas'], TestRequest())
+        >>> data = view.getSessionData()
+
+        >>> from datetime import time, timedelta
+        >>> slots = [[(time(8+n, d*5), timedelta(minutes=45))
+        ...           for n in range(4)]
+        ...          for d in range(5)]
+
+        >>> data['title'] = u'Default'
+        >>> data['cycle'] = 'weekly'
+        >>> data['day_names'] = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
+        ...                      'Friday']
+        >>> data['similar_days'] = False
+        >>> data['time_slots'] = slots
+        >>> data['named_periods'] = True
+        >>> data['period_names'] = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
+        >>> data['periods_same'] = False
+        >>> data['periods_order'] = [['A', 'B', 'C', 'D'],
+        ...                          ['B', 'C', 'D', 'E'],
+        ...                          ['C', 'D', 'E', 'F'],
+        ...                          ['D', 'E', 'F', 'G'],
+        ...                          ['E', 'F', 'G', 'H']]
+        >>> data['homeroom'] = True
+        >>> data['homeroom_periods'] = [['A'], ['C'], [], ['F'], ['H']]
+        >>> ttschema = view.createSchema()
+
+        >>> print_ttschema(ttschema)
+        Monday       Tuesday      Wednesday    Thursday     Friday
+        A            B            C            D            E
+        B            C            D            E            F
+        C            D            E            F            G
+        D            E            F            G            H
+
+        >>> for day_id, day in ttschema.items():
+        ...     if day.homeroom_period_ids:
+        ...         print "Homeroom on %s is %s" % (day_id,
+        ...                                         day.homeroom_period_ids[0])
+        Homeroom on Monday is A
+        Homeroom on Tuesday is C
+        Homeroom on Thursday is F
+        Homeroom on Friday is H
+
+        >>> ttschema.model
+        <...WeeklyTimetableModel object at ...>
+
+        >>> print_day_templates(ttschema.model.dayTemplates)
+        --- day template None
+        --- day template 0
+        08:00-08:45
+        09:00-09:45
+        10:00-10:45
+        11:00-11:45
+        --- day template 1
+        08:05-08:50
+        09:05-09:50
+        10:05-10:50
+        11:05-11:50
+        --- day template 2
+        08:10-08:55
+        09:10-09:55
+        10:10-10:55
+        11:10-11:55
+        --- day template 3
+        08:15-09:00
+        09:15-10:00
+        10:15-11:00
+        11:15-12:00
+        --- day template 4
+        08:20-09:05
+        09:20-10:05
+        10:20-11:05
+        11:20-12:05
+
+    """
+
+
+def doctest_FinalStep_add():
+    """Unit test for FinalStep.createSchema
+
+        >>> from schooltool.timetable.browser.ttwizard import FinalStep
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = FinalStep(context, request)
+
+        >>> from schooltool.timetable.schema import TimetableSchema
+        >>> ttschema = TimetableSchema([], title="Timetable Schema")
+        >>> view.add(ttschema)
+
+        >>> context['timetable-schema'] is ttschema
+        True
+
+    """
+
+
+def doctest_TimetableSchemaWizard():
+    """Unit test for TimetableSchemaWizard
+
+        >>> from schooltool.timetable.browser.ttwizard import \\
+        ...                                     TimetableSchemaWizard
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = TimetableSchemaWizard(context, request)
+
+    We shall stub it heavily.
+
+        >>> class StepStub:
+        ...     update_succeeds = False
+        ...     def __repr__(self):
+        ...         return '<same step>'
+        ...     def update(self):
+        ...         print 'Updating...'
+        ...         return self.update_succeeds
+        ...     def __call__(self):
+        ...         return 'Rendered step'
+        ...     def next(self):
+        ...         return NextStepStub()
+
+        >>> class NextStepStub:
+        ...     def __repr__(self):
+        ...         return '<next step>'
+        ...     def __call__(self):
+        ...         return 'Rendered next step'
+
+        >>> view.getLastStep = StepStub
+
+        >>> def rememberLastStep(step):
+        ...     print 'Remembering step: %s' % step
+        >>> view.rememberLastStep = rememberLastStep
+
+    There are three main cases.
+
+    Case 1: the user completes the current step successfully.
+
+        >>> StepStub.update_succeeds = True
+        >>> print view()
+        Updating...
+        Remembering step: <next step>
+        Rendered next step
+
+    Case 2: the user does not complete the current step successfully.
+
+        >>> StepStub.update_succeeds = False
+        >>> print view()
+        Updating...
+        Remembering step: <same step>
+        Rendered step
+
+    Case 3: the user presses the 'Cancel' button
+
+        >>> view.request.form['CANCEL'] = 'Cancel'
+        >>> view()
+        Remembering step: <...FirstStep...>
+
+        >>> request.response.getStatus()
+        302
+        >>> request.response.getHeader('Location')
+        'http://127.0.0.1/ttschemas'
+
+    """
+
+
+def doctest_TimetableSchemaWizard_getLastStep():
+    """Unit test for TimetableSchemaWizard.getLastStep
+
+        >>> from schooltool.timetable.browser.ttwizard import \\
+        ...                                    TimetableSchemaWizard
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = TimetableSchemaWizard(context, request)
+
+    When there is no step saved in the session, getLastStep returns the first
+    step.
+
+        >>> view.getLastStep()
+        <...FirstStep...>
+
+    When there is one, that's what getLastStep returns.
+
+        >>> from schooltool.timetable.browser.ttwizard import CycleStep
+        >>> view.getSessionData()['last_step'] = CycleStep
+        >>> view.getLastStep()
+        <...CycleStep...>
+
+    """
+
+
+def doctest_TimetableSchemaWizard_rememberLastStep():
+    """Unit test for TimetableSchemaWizard.rememberLastStep
+
+        >>> from schooltool.timetable.browser.ttwizard import \\
+        ...                                     TimetableSchemaWizard
+        >>> context = app['ttschemas']
+        >>> request = TestRequest()
+        >>> view = TimetableSchemaWizard(context, request)
+
+        >>> from schooltool.timetable.browser.ttwizard import CycleStep
+        >>> view.rememberLastStep(CycleStep(context, request))
+        >>> view.getSessionData()['last_step']
+        <class 'schooltool.timetable.browser.ttwizard.CycleStep'>
+
+    """
+
+
+def test_suite():
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF |
+                   doctest.NORMALIZE_WHITESPACE |
+                   doctest.REPORT_ONLY_FIRST_FAILURE)
+    return unittest.TestSuite([
+                doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                                     optionflags=optionflags),
+                doctest.DocTestSuite('schooltool.timetable.browser.ttwizard',
+                                     optionflags=optionflags),
+           ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/tests/test_ttwizard.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ttwizard.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/browser/ttwizard.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/browser/ttwizard.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,924 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetable setup wizard for SchoolTool.
+
+This module implements a the workflow described by Tom Hoffman on Jun 9 2005
+on the schooltool mailing list, in ttschema-wireframes.pdf[1].
+
+    [1] http://lists.schooltool.org/pipermail/schooltool/2005-June/001347.html
+
+It has been slightly modified since.  You can find an up-to-date diagram
+of the workflow in src/schooltool/app/browser/ftests/images/
+
+The workflow is as follows:
+
+    1. "New timetable schema"
+
+       (The user enters a name.)
+
+    2. "Does your school's timetable cycle use days of the week, or a rotating
+        cycle?"
+
+        Skip to step 3 if days of the week was chosen.
+
+    3. "Enter names of days in cycle:"
+
+        (The user enters a list of day names in a single textarea.)
+
+    4. "Do classes begin and end at the same time each day in your school's
+        timetable?"
+
+        Continue with step 5 if "yes".
+        Skip to step 6 if "no", and "cycle" was chosen in step 2.
+        Skip to step 7 if "no", and "days of the week" was chosen in step 2.
+
+    5. "Enter start and end times for each slot"
+
+        (The user enters a list of start and end times in a single textarea.)
+
+        Jump to step 9.
+
+    6. "Do the start and end times vary based on the day of the week, or the
+        day in the cycle?"
+
+        Continue with step 7 if "days of week".
+        Continue with step 8 if "cycle".
+
+    7. "Enter the start and end times of each slot on each day:"
+
+        (The user sees 5 columns of text lines, with five buttons that let him
+        add an extra slot for each column.)
+
+        Jump to step 9.
+
+    8. "Enter the start and end times of each slot on each day:"
+
+        (The user sees N columns of text lines, with five buttons that let him
+        add an extra slot for each column.)
+
+    9. "Do periods have names or are they simply designated by time?"
+
+        Skip to step 14 if periods are simply designated by time.
+
+    10. "Enter names of the periods:"
+
+        (The user enters a list of periods in a single textarea.)
+
+    11. "Is the sequence of periods each day the same or different?"
+
+        Skip to step 13 if it is different
+
+    12. "Put the periods in order for each day:"
+
+        (The user sees a list of drop-downs.)
+
+        Jump to step 14.
+
+    13. "Put the periods in order:"
+
+        (The user sees a grid of drop-downs.)
+
+    14. "Does your school have a homeroom period?"
+
+        Skip to step 16 if it doesn't.
+
+    15. "Indicate which period is the homeroom period."
+
+        (The user sees a list of drop-downs.)
+
+    16. The timetable schema is created.
+
+
+The shortest path through this workflow contains 7 steps, the longest contains
+13 steps.
+
+Step 16 needs the following data:
+
+    - title (determined in step 1)
+    - timetable model factory (determined in step 2)
+    - a list of day IDs (determined in step 3)
+    - a list of periods for each day ID
+    - a list of day templates (weekday -> period_id -> start time & duration)
+
+$Id: ttwizard.py 5988 2006-04-27 16:13:52Z faassen $
+"""
+from sets import Set
+
+from zope.interface import Interface
+from zope.schema import TextLine, Text, getFieldNamesInOrder
+from zope.i18n import translate
+from zope.app import zapi
+from zope.app.form.utility import setUpWidgets
+from zope.app.form.utility import getWidgetsData
+from zope.app.form.interfaces import IInputWidget
+from zope.app.form.interfaces import WidgetsError
+from zope.publisher.browser import BrowserView
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.app.container.interfaces import INameChooser
+from zope.app.session.interfaces import ISession
+
+from schooltool.app.browser.cal import day_of_week_names
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.timetable.browser import parse_time_range
+from schooltool.timetable.browser import format_time_range
+from schooltool import SchoolToolMessage as _
+from schooltool.timetable.interfaces import ITimetableSchemaContainer
+from schooltool.timetable.schema import TimetableSchema, TimetableSchemaDay
+from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+from schooltool.timetable import WeeklyTimetableModel
+from schooltool.timetable import SequentialDaysTimetableModel
+from schooltool.timetable import SequentialDayIdBasedTimetableModel
+
+
+def getSessionData(view):
+    """Return the data container stored in the session."""
+    return ISession(view.request)['schooltool.ttwizard']
+
+
+#
+# Abstract step classes
+#
+
+class Step(BrowserView):
+    """A step, one of many.
+
+    Each step has three important methods:
+
+        `__call__` renders the page.
+
+        `update` processes the form, and then either stores the data in the
+        session, and returns True if the form was submitted correctly, or
+        returns False if it wasn't.
+
+        `next` returns the next step.
+
+    """
+
+    __used_for__ = ITimetableSchemaContainer
+
+    getSessionData = getSessionData
+
+
+class ChoiceStep(Step):
+    """A step that requires the user to make a choice.
+
+    Subclasses should provide three attributes:
+
+        `question` -- question text
+
+        `choices` -- a list of tuples (choice_value, choice_text)
+
+        `key` -- name of the session dict key that will store the value.
+
+    They should also define the `next` method.
+    """
+
+    __call__ = ViewPageTemplateFile("templates/ttwizard_choice.pt")
+
+    def update(self):
+        session = self.getSessionData()
+        for n, (value, text) in enumerate(self.choices):
+            if 'NEXT.%d' % n in self.request:
+                session[self.key] = value
+                return True
+        return False
+
+
+class FormStep(Step):
+    """A step that presents a form.
+
+    Subclasses should provide a `schema` attribute.
+
+    They can override the `description` attribute and specify some informative
+    text to be displayed above the form.
+
+    They should also define the `update` and `next` methods.
+    """
+
+    __call__ = ViewPageTemplateFile("templates/ttwizard_form.pt")
+
+    description = None
+
+    error = None
+
+    def __init__(self, context, request):
+        BrowserView.__init__(self, context, request)
+        setUpWidgets(self, self.schema, IInputWidget)
+
+    def widgets(self):
+        return [getattr(self, name + '_widget')
+                for name in getFieldNamesInOrder(self.schema)]
+
+
+#
+# Concrete wizard steps
+#
+
+class FirstStep(FormStep):
+    """First step: enter the title for the new schema."""
+
+    __call__ = ViewPageTemplateFile("templates/ttwizard.pt")
+
+    class schema(Interface):
+        title = TextLine(title=_("Title"), default=u"default")
+
+    def update(self):
+        try:
+            data = getWidgetsData(self, self.schema)
+        except WidgetsError:
+            return False
+        session = self.getSessionData()
+        session['title'] = data['title']
+        return True
+
+    def next(self):
+        return CycleStep(self.context, self.request)
+
+
+class CycleStep(ChoiceStep):
+    """A step for choosing the timetable cycle."""
+
+    key = 'cycle'
+
+    question = _("Does your school's timetable cycle use days of the week,"
+                 " or a rotating cycle?")
+
+    choices = (('weekly',   _("Days of the week")),
+               ('rotating', _("Rotating cycle")))
+
+    def next(self):
+        session = self.getSessionData()
+        if session['cycle'] == 'weekly':
+            return IndependentDaysStep(self.context, self.request)
+        else:
+            return DayEntryStep(self.context, self.request)
+
+    def update(self):
+        success = ChoiceStep.update(self)
+        session = self.getSessionData()
+        if success and session['cycle'] == 'weekly':
+            weekday_names = [translate(day_of_week_names[i],
+                                       context=self.request)
+                             for i in range(5)]
+            session['day_names'] = weekday_names
+        return success
+
+
+class DayEntryStep(FormStep):
+    """A step for entering names of days."""
+
+    description = _("Enter names of days in cycle, one per line.")
+
+    class schema(Interface):
+        days = Text(required=False)
+
+    def update(self):
+        try:
+            data = getWidgetsData(self, self.schema)
+        except WidgetsError, e:
+            return False
+        day_names = parse_name_list(data.get('days') or '')
+        if not day_names:
+            self.error = _("Please enter at least one day name.")
+            return False
+
+        seen = Set()
+        for day in day_names:
+            if day in seen:
+                self.error = _("Please make sure the day names are unique.")
+                return False
+            seen.add(day)
+        session = self.getSessionData()
+        session['day_names'] = day_names
+        return True
+
+    def next(self):
+        return IndependentDaysStep(self.context, self.request)
+
+
+class IndependentDaysStep(ChoiceStep):
+    """A step for choosing if all period times are the same each day."""
+
+    key = 'similar_days'
+
+    question = _("Do classes begin and end at the same time each day in"
+                 " your school's timetable?")
+
+    choices = ((True,  _("Same time each day")),
+               (False, _("Different times")))
+
+    def next(self):
+        session = self.getSessionData()
+        if session['similar_days']:
+            return SimpleSlotEntryStep(self.context, self.request)
+        else:
+            if session['cycle'] == 'weekly':
+                return WeeklySlotEntryStep(self.context, self.request)
+            else:
+                return SequentialModelStep(self.context, self.request)
+
+
+class SequentialModelStep(ChoiceStep):
+    """Step for choosing if start and end times vay based on the day of
+    the week or the day in the cycle."""
+
+    key = 'time_model'
+
+    question = _("Do start and end times vary based on the day of the week"
+                 " (Monday - Friday) or the day in the cycle?")
+
+    choices = [('weekly', _("Day of week")),
+               ('cycle_day', _("Day in cycle"))]
+
+    def next(self):
+        session = self.getSessionData()
+        if session['time_model'] == 'weekly':
+            return WeeklySlotEntryStep(self.context, self.request)
+        else:
+            return RotatingSlotEntryStep(self.context, self.request)
+
+
+def parse_name_list(names):
+    r"""Parse a multi-line string into a list of names.
+
+    One day name per line.  Empty lines are ignored.  Extra spaces
+    are stripped.
+
+        >>> parse_name_list(u'Day 1\n Day 2\nDay 3 \n\n\n Day 4 ')
+        [u'Day 1', u'Day 2', u'Day 3', u'Day 4']
+        >>> parse_name_list(u'  \n\n ')
+        []
+        >>> parse_name_list(u'')
+        []
+
+    """
+    return [s.strip() for s in names.splitlines() if s.strip()]
+
+
+def parse_time_range_list(times):
+    r"""Parse a multi-line string into a list of time slots.
+
+    One slot per line (HH:MM - HH:MM).  Empty lines are ignored.  Extra
+    spaces are stripped.
+
+        >>> parse_time_range_list(u' 9:30 - 10:25 \n \n 12:30 - 13:25 \n')
+        [(datetime.time(9, 30), datetime.timedelta(0, 3300)),
+         (datetime.time(12, 30), datetime.timedelta(0, 3300))]
+
+        >>> parse_time_range_list(u'  \n\n ')
+        []
+        >>> parse_time_range_list(u'')
+        []
+
+        >>> parse_time_range_list(u'9:30-12:20\nbad value\nanother bad value')
+        Traceback (most recent call last):
+          ...
+        ValueError: bad value
+
+    """
+    result = []
+    for line in times.splitlines():
+        line = line.strip()
+        if line:
+            try:
+                result.append(parse_time_range(line))
+            except ValueError:
+                raise ValueError(line)
+    return result
+
+
+class SimpleSlotEntryStep(FormStep):
+    """A step for entering times for classes.
+
+    This step is used when the times are the same in each day.
+    """
+
+    description = _("Enter start and end times for each slot,"
+                    " one slot (HH:MM - HH:MM) per line.")
+
+    class schema(Interface):
+        times = Text(default=u"9:30-10:25\n10:30-11:25", required=False)
+
+    def update(self):
+        try:
+            data = getWidgetsData(self, self.schema)
+        except WidgetsError, e:
+            return False
+        try:
+            times = parse_time_range_list(data.get('times') or '')
+        except ValueError, e:
+            self.error = _("Not a valid time slot: $slot.",
+                           mapping={'slot': unicode(e.args[0])})
+            return False
+        if not times:
+            self.error = _("Please enter at least one time slot.")
+            return False
+        session = self.getSessionData()
+        num_days = len(session['day_names'])
+        session['time_slots'] = [times] * num_days
+        return True
+
+    def next(self):
+        return NamedPeriodsStep(self.context, self.request)
+
+
+class RotatingSlotEntryStep(Step):
+    """Step for entering start and end times of slots in each day.
+
+    This step is taken when the start/end times are different for each day,
+    the rotating cycle is chosen in the CycleStep and 'day in the cycle' is
+    chosen in the SequentialModelStep.
+    """
+
+    __call__ = ViewPageTemplateFile("templates/ttwizard_slottimes.pt")
+
+    description = _("Enter start and end times for each slot on each day,"
+                    " one slot (HH:MM - HH:MM) per line.")
+
+    error = None
+    example_intervals = '8:00 - 8:45\n9:05 - 9:50\n'
+
+    def dayNames(self):
+        """Return the list of day names."""
+        return self.getSessionData()['day_names']
+
+    def update(self):
+        result = []
+        for i, day_name in enumerate(self.dayNames()):
+            s = self.request.form.get('times.%d' % i, '')
+            try:
+                times = parse_time_range_list(s)
+            except ValueError, e:
+                self.error = _("Not a valid time slot: $slot.",
+                               mapping={'slot': unicode(e.args[0])})
+                return False
+            if not times:
+                self.error = _("Please enter at least one time slot for $day.",
+                               mapping={'day': day_name})
+                return False
+            result.append(times)
+
+        session = self.getSessionData()
+        session['time_slots'] = result
+        return True
+
+    def next(self):
+        return NamedPeriodsStep(self.context, self.request)
+
+
+class WeeklySlotEntryStep(RotatingSlotEntryStep):
+    """Step for entering start and end times of slots in each day.
+
+    This step is taken when the start/end times are different for each day,
+    and the weekly cycle is chosen in the CycleStep or in the
+    SequentialModelStep.
+    """
+
+    def dayNames(self):
+        """Return the list of day names."""
+        return [translate(day_of_week_names[i], context=self.request)
+                for i in range(5)]
+
+    def update(self):
+        """Store the slots in the session.
+
+        If a rotating timetable cycle is selected and slots vary based on day
+        of week, each day must have the same number of slots.
+        """
+        result = RotatingSlotEntryStep.update(self)
+        session = self.getSessionData()
+        if (result and session['cycle'] == 'rotating'
+            and session.get('time_model') == 'weekly'):
+            slots = session['time_slots']
+            assert len(slots) == 5 # Monday - Friday
+            num_slots = len(slots[0])
+            for day in slots[1:]:
+                if len(day) != num_slots:
+                    self.error = _('As you have selected a rotating timetable'
+                                   ' cycle and slots based on day of week,'
+                                   ' all days must have the same number'
+                                   ' of time periods.')
+                    return False
+        return result
+
+
+class NamedPeriodsStep(ChoiceStep):
+    """A step for choosing if periods have names or are designated by time"""
+
+    key = 'named_periods'
+
+    question = _("Do periods have names or are they simply"
+                 " designated by time?")
+
+    choices = ((True,  _("Have names")),
+               (False, _("Designated by time")))
+
+    def next(self):
+        session = self.getSessionData()
+        if session['named_periods']:
+            return PeriodNamesStep(self.context, self.request)
+        else:
+            periods_order = default_period_names(session['time_slots'])
+            session['periods_order'] = periods_order
+            return HomeroomStep(self.context, self.request)
+
+
+def default_period_names(time_slots):
+    """Derive period names and order from time slots.
+
+        >>> from datetime import time, timedelta
+        >>> periods = [(time(9, 0), timedelta(minutes=50)),
+        ...            (time(12, 35), timedelta(minutes=50)),
+        ...            (time(14, 15), timedelta(minutes=55))]
+        >>> periods2 = [(time(9, 10), timedelta(minutes=50)),
+        ...             (time(12, 35), timedelta(minutes=50))]
+        >>> default_period_names([periods] * 3 + [periods2])
+        [['09:00-09:50', '12:35-13:25', '14:15-15:10'],
+         ['09:00-09:50', '12:35-13:25', '14:15-15:10'],
+         ['09:00-09:50', '12:35-13:25', '14:15-15:10'],
+         ['09:10-10:00', '12:35-13:25']]
+
+    """
+    return [[format_time_range(tstart, duration)
+             for tstart, duration in slots]
+            for slots in time_slots]
+
+
+class PeriodNamesStep(FormStep):
+    """A step for entering names of periods"""
+
+    description = _("Enter names of periods, one per line.")
+
+    class schema(Interface):
+        periods = Text(required=False)
+
+    def update(self):
+        try:
+            data = getWidgetsData(self, self.schema)
+        except WidgetsError, e:
+            return False
+        periods = parse_name_list(data.get('periods') or '')
+        min_periods = self.requiredPeriods()
+        if len(periods) < min_periods:
+            self.error = _("Please enter at least $number periods.",
+                           mapping={'number': min_periods})
+            return False
+        seen = Set()
+        for period in periods:
+            if period in seen:
+                self.error = _("Please make sure the period names are unique.")
+                return False
+            seen.add(period)
+        session = self.getSessionData()
+        session['period_names'] = periods
+        return True
+
+    def requiredPeriods(self):
+        """Return the maximum number of slots there can be on a day."""
+        session = self.getSessionData()
+        times = session['time_slots']
+        return max(map(len, times))
+
+    def next(self):
+        return PeriodSequenceSameStep(self.context, self.request)
+
+
+class PeriodSequenceSameStep(ChoiceStep):
+    """A step for choosing whether periods are the same on all days"""
+
+    key = 'periods_same'
+
+    question = _("Is the sequence of periods each day the same or different?")
+
+    choices = ((True,  _("Same")),
+               (False, _("Different")))
+
+    def next(self):
+        session = self.getSessionData()
+        if session[self.key]:
+            return PeriodOrderSimple(self.context, self.request)
+        else:
+            return PeriodOrderComplex(self.context, self.request)
+
+
+class PeriodOrderSimple(Step):
+    """Step to put periods in order if all days are the same."""
+
+    __call__ = ViewPageTemplateFile('templates/ttwizard_period_order1.pt')
+
+    description = _('Please put the periods in order:')
+
+    error = None
+
+    def periods(self):
+        return self.getSessionData()['period_names']
+
+    def numPeriods(self):
+        return max([len(day) for day in self.getSessionData()['time_slots']])
+
+    def update(self):
+        result = []
+        periods = self.getSessionData()['period_names']
+        for i in range(self.numPeriods()):
+            name = 'period_%d' % i
+            if name not in self.request:
+                self.error = _('Please provide all periods.')
+                return False
+            result.append(self.request[name])
+
+        # Validate that all periods are selected
+        seen = Set()
+        errors = Set()
+        for period in result:
+            if period not in seen:
+                seen.add(period)
+            else:
+                errors.add(period)
+        if errors:
+            self.error = _('The following periods were selected more'
+                           ' than once: $periods',
+                           mapping={'periods': ', '.join(errors)})
+            return False
+
+        day_names = self.getSessionData()['day_names']
+        self.getSessionData()['periods_order'] = [result] * len(day_names)
+        return True
+
+    def next(self):
+        return HomeroomStep(self.context, self.request)
+
+
+class PeriodOrderComplex(Step):
+    """Step to put periods in order if order is different on different days"""
+
+    __call__ = ViewPageTemplateFile('templates/ttwizard_period_order2.pt')
+
+    description = _('Please put the periods in order for each day:')
+
+    error = None
+
+    def periods(self):
+        return self.getSessionData()['period_names']
+
+    def days(self):
+        session = self.getSessionData()
+        return session['day_names']
+
+    def numSlots(self):
+        return [len(day) for day in self.getSessionData()['time_slots']]
+
+    def update(self):
+        result = []
+        periods = self.periods()
+        numSlots = self.numSlots()
+        for i in range(len(self.days())):
+            day = []
+            for j in range(numSlots[i]):
+                name = 'period_%d_%d' % (i, j)
+                if name not in self.request:
+                    self.error = _('Please provide all periods.')
+                    return False
+                day.append(self.request[name])
+            result.append(day)
+
+        # Validate that all periods are selected
+        errors = Set()
+        for i, day in enumerate(self.days()):
+            seen = Set()
+            for period in result[i]:
+                if period not in seen:
+                    seen.add(period)
+                else:
+                    error = _("$period on day $day",
+                              mapping={'period': period, 'day': self.days()[i]})
+                    errors.add(translate(error, context=self.request))
+        if errors:
+            self.error = _('The following periods were selected more'
+                           ' than once: $periods',
+                           mapping={'periods': ', '.join(errors)})
+            return False
+
+        self.getSessionData()['periods_order'] = result
+        return True
+
+    def next(self):
+        return HomeroomStep(self.context, self.request)
+
+
+class HomeroomStep(ChoiceStep):
+    """A step for choosing whether the school has homeroom periods."""
+
+    key = 'homeroom'
+
+    question = _("Do you check student attendance for the day in a homeroom"
+                 " period or equivalent?")
+
+    choices = ((True,  _("Yes")),
+               (False, _("No")))
+
+    def next(self):
+        session = self.getSessionData()
+        if session['homeroom']:
+            return HomeroomPeriodsStep(self.context, self.request)
+        else:
+            return FinalStep(self.context, self.request)
+
+
+class HomeroomPeriodsStep(Step):
+    """Step to indicate the homeroom period for each day."""
+
+    __call__ = ViewPageTemplateFile('templates/ttwizard_homeroom.pt')
+
+    description = _('Please indicate the homeroom period(s) for each day:')
+
+    error = None
+
+    def periodsInOrder(self):
+        return self.getSessionData()['periods_order']
+
+    def days(self):
+        session = self.getSessionData()
+        return session['day_names']
+
+    def update(self):
+        result = []
+        for daynr, periods in enumerate(self.periodsInOrder()):
+            homeroom_period_ids = []
+            for period in periods:
+                period_id = 'homeroom_%d_%s' % (daynr, period)
+                if period_id in self.request:
+                    homeroom_period_ids.append(period)
+            result.append(homeroom_period_ids)
+        self.getSessionData()['homeroom_periods'] = result
+        return True
+
+    def next(self):
+        return FinalStep(self.context, self.request)
+
+
+class FinalStep(Step):
+    """Final step: create the schema."""
+
+    def __call__(self):
+        ttschema = self.createSchema()
+        self.add(ttschema)
+        self.request.response.redirect(
+            zapi.absoluteURL(self.context, self.request))
+
+    def update(self):
+        return True
+
+    def next(self):
+        return FirstStep(self.context, self.request)
+
+    def modelFactory(cycle, similar_days, time_model):
+        """Return the timetable model factory for the chosen cycle.
+
+        Cycle can be either 'weekly' or 'rotating'.  Weekly cycles always
+        use the WeeklyTimetableModel.
+
+            >>> FinalStep.modelFactory('weekly', None, None)
+            <...WeeklyTimetableModel...>
+
+        Rotating cycles can either vary based on the day of the week, or
+        on the day in the cycle.
+
+            >>> FinalStep.modelFactory('rotating', False, 'weekly')
+            <...SequentialDaysTimetableModel...>
+
+            >>> FinalStep.modelFactory('rotating', False, 'cycle_day')
+            <...SequentialDayIdBasedTimetableModel...>
+
+        but there's no distinction between the two if all days have the same
+        time slots.
+
+            >>> FinalStep.modelFactory('rotating', True, None)
+            <...SequentialDayIdBasedTimetableModel...>
+
+        """
+        assert cycle in ('weekly', 'rotating')
+        if cycle == 'weekly':
+            return WeeklyTimetableModel
+        if similar_days:
+            return SequentialDayIdBasedTimetableModel
+        assert time_model in ('weekly', 'cycle_day')
+        if time_model == 'weekly':
+            return SequentialDaysTimetableModel
+        else:
+            return SequentialDayIdBasedTimetableModel
+
+    modelFactory = staticmethod(modelFactory)
+
+    def dayTemplates(periods_order, time_slots):
+        """Return a dict of day templates for ITimetableModelFactory.
+
+        `periods_order` is a list of lists of period names in order (one list
+        per day).
+
+        `time_slots` is a list of day definitions, where each day is a
+        list of slots, and each slot is a tuple (tstart, duration).
+        """
+        templates = {None: SchooldayTemplate()}
+        same = True
+        for n, slots in enumerate(time_slots):
+            template = SchooldayTemplate()
+            for tstart, duration in slots:
+                template.add(SchooldaySlot(tstart, duration))
+            templates[n] = template
+            if n > 0 and template != templates[n-1]:
+                same = False
+        if same:
+            return {None: templates[0]}
+        else:
+            return templates
+
+    dayTemplates = staticmethod(dayTemplates)
+
+    def createSchema(self):
+        """Create the timetable schema."""
+        session = self.getSessionData()
+        title = session['title']
+        day_ids = session['day_names']
+        periods_order = session['periods_order']
+        if session['homeroom']:
+            homeroom_periods = session['homeroom_periods']
+        else:
+            homeroom_periods = [None] * len(day_ids)
+
+        day_templates = self.dayTemplates(periods_order, session['time_slots'])
+
+        model_factory = self.modelFactory(session['cycle'],
+                                          session['similar_days'],
+                                          session.get('time_model'))
+        if model_factory is SequentialDayIdBasedTimetableModel:
+            # This conversion is not very nice
+            default = day_templates[None]
+            day_templates = dict([(day_id, day_templates.get(idx, default))
+                                  for idx, day_id in enumerate(day_ids)])
+        model = model_factory(day_ids, day_templates)
+        app = ISchoolToolApplication(None)
+        tzname = IApplicationPreferences(app).timezone
+        ttschema = TimetableSchema(day_ids, title=title, model=model,
+                                   timezone=tzname)
+        for day_id, periods, hpids in zip(day_ids, periods_order,
+                                          homeroom_periods):
+            ttschema[day_id] = TimetableSchemaDay(periods, hpids)
+        return ttschema
+
+    def add(self, ttschema):
+        """Add the timetable schema to self.context."""
+        nameChooser = INameChooser(self.context)
+        key = nameChooser.chooseName('', ttschema)
+        self.context[key] = ttschema
+
+
+#
+# The wizard itself
+#
+
+class TimetableSchemaWizard(BrowserView):
+    """View for defining a new timetable schema."""
+
+    __used_for__ = ITimetableSchemaContainer
+
+    getSessionData = getSessionData
+
+    def getLastStep(self):
+        session = self.getSessionData()
+        step_class = session.get('last_step', FirstStep)
+        step = step_class(self.context, self.request)
+        return step
+
+    def rememberLastStep(self, step):
+        session = self.getSessionData()
+        session['last_step'] = step.__class__
+
+    def __call__(self):
+        if 'CANCEL' in self.request:
+            self.rememberLastStep(FirstStep(self.context, self.request))
+            self.request.response.redirect(
+                    zapi.absoluteURL(self.context, self.request))
+            return
+        current_step = self.getLastStep()
+        if current_step.update():
+            current_step = current_step.next()
+        self.rememberLastStep(current_step)
+        return current_step()


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/browser/ttwizard.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,201 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:security="http://schooltool.org/securitypolicy"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="schooltool">
+
+  <!-- Application hook -->
+  <subscriber
+      for="schooltool.app.interfaces.IApplicationInitializationEvent"
+      handler=".addToApplication"
+      />
+
+  <!-- Subscribers -->
+
+  <subscriber
+      for=".interfaces.IHaveTimetables"
+      provides=".interfaces.ITimetableSource"
+      factory="schooltool.timetable.source.MembershipTimetableSource"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for=".interfaces.IHaveTimetables"
+      provides=".interfaces.ITimetableSource"
+      factory="schooltool.timetable.source.InstructionTimetableSource"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for=".interfaces.IOwnTimetables"
+      provides=".interfaces.ITimetableSource"
+      factory="schooltool.timetable.source.OwnedTimetableSource"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for=".interfaces.ITimetableSchemaContainer"
+      factory="schooltool.app.app.SimpleNameChooser"
+      provides="zope.app.container.interfaces.INameChooser" />
+
+  <adapter
+      factory=".TimetablesAdapter"
+      trusted="true"
+      permission="zope.Public" />
+
+  <class class=".CompositeTimetables">
+    <allow interface=".interfaces.ICompositeTimetables" />
+  </class>
+
+  <adapter
+      factory=".CompositeTimetables"
+      trusted="true"
+      permission="zope.Public" />
+
+  <utility
+      provides=".interfaces.ITimetableModelFactory"
+      name="SequentialDaysTimetableModel"
+      component="schooltool.timetable.SequentialDaysTimetableModel"
+      />
+
+  <utility
+      provides=".interfaces.ITimetableModelFactory"
+      name="SequentialDayIdBasedTimetableModel"
+      component="schooltool.timetable.SequentialDayIdBasedTimetableModel"
+      />
+
+  <utility
+      provides=".interfaces.ITimetableModelFactory"
+      name="WeeklyTimetableModel"
+      component="schooltool.timetable.WeeklyTimetableModel"
+      />
+
+  <class class=".TimetableActivity">
+    <allow interface=".interfaces.ITimetableActivity" />
+  </class>
+
+  <class class=".TimetableCalendarEvent">
+    <!-- TTCalendarEvent does not have a __parent__, so fine-grained
+         security declarations won't work. -->
+    <allow interface=".interfaces.ITimetableCalendarEvent" />
+  </class>
+
+  <class class=".model.PersistentTimetableCalendarEvent">
+    <allow interface=".interfaces.ITimetableCalendarEvent" />
+    <require
+       permission="schooltool.edit"
+       set_schema=".interfaces.ITimetableCalendarEvent" />
+  </class>
+
+  <class class=".TimetableDict">
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer" />
+    <require permission="schooltool.view"
+             interface="zope.app.container.interfaces.IReadContainer" />
+  </class>
+
+  <interface
+      interface=".interfaces.ITimetableSchemaContainer"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".schema.TimetableSchemaContainer">
+    <require permission="schooltool.edit"
+             interface="zope.app.container.interfaces.IWriteContainer"
+             set_attributes="default_id" />
+    <require permission="zope.View"
+             interface="zope.app.container.interfaces.IReadContainer"
+             attributes="getDefault default_id" />
+  </class>
+
+  <class class=".Timetable">
+    <allow interface=".interfaces.ITimetable" />
+    <require permission="schooltool.edit"
+             interface=".interfaces.ITimetableWrite"
+             set_schema=".interfaces.ITimetable" />
+  </class>
+
+  <class class=".TimetableDay">
+    <allow interface=".interfaces.ITimetableDay" />
+    <require permission="schooltool.edit"
+             interface=".interfaces.ITimetableDayWrite"
+             set_schema=".interfaces.ITimetableDay" />
+  </class>
+
+  <interface
+      interface=".interfaces.ITimetableSchema"
+      type="zope.app.content.interfaces.IContentType"
+      />
+
+  <class class=".schema.TimetableSchema">
+    <allow interface=".interfaces.ITimetableSchema" />
+    <require permission="schooltool.edit"
+             interface=".interfaces.ITimetableSchemaWrite"
+             set_schema=".interfaces.ITimetableSchema" />
+  </class>
+
+  <class class=".schema.TimetableSchemaDay">
+    <allow interface=".interfaces.ITimetableSchemaDay" />
+  </class>
+
+  <class class=".SchooldayTemplate">
+    <allow interface=".interfaces.ISchooldayTemplate" />
+    <require permission="schooltool.edit"
+             interface=".interfaces.ISchooldayTemplateWrite"
+             set_schema=".interfaces.ISchooldayTemplate" />
+  </class>
+
+  <class class=".SequentialDaysTimetableModel">
+    <allow interface=".interfaces.IWeekdayBasedTimetableModel" />
+  </class>
+
+  <class class=".SequentialDayIdBasedTimetableModel">
+    <allow interface=".interfaces.IDayIdBasedTimetableModel" />
+  </class>
+
+  <class class=".WeeklyTimetableModel">
+    <allow interface=".interfaces.IWeekdayBasedTimetableModel" />
+  </class>
+
+  <class class=".SchooldaySlot">
+    <allow interface=".interfaces.ISchooldaySlot" />
+  </class>
+
+  <!-- sample data -->
+  <configure
+      xmlns:zcml="http://namespaces.zope.org/zcml"
+      zcml:condition="have devmode">
+
+    <utility
+        factory=".sampledata.SampleTimetableSchema"
+        provides="schooltool.sampledata.interfaces.ISampleDataPlugin"
+        name="ttschema"
+        />
+
+  </configure>
+
+  <include package=".browser" />
+  <include package=".rest" />
+
+  <security:allow
+      interface="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      crowds="administration everybody"
+      permission="schooltool.view" />
+  <security:allow
+      interface="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      crowds="administration"
+      permission="schooltool.edit" />
+
+  <subscriber
+      for="schooltool.timetable.interfaces.ITimetableActivityAddedEvent"
+      handler=".model.addEventsToCalendar" />
+
+  <subscriber
+      for="schooltool.timetable.interfaces.ITimetableActivityRemovedEvent"
+      handler=".model.removeEventsFromCalendar" />
+
+  <subscriber
+      for="schooltool.timetable.interfaces.ITimetableReplacedEvent"
+      handler=".model.handleTimetableReplacedEvent" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional Testing Utilities for timetabling
+
+$Id: ftesting.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+import os
+
+from schooltool.testing.functional import ZCMLLayer
+
+dir = os.path.abspath(os.path.dirname(__file__))
+filename = os.path.join(dir, 'ftesting.zcml')
+
+timetable_functional_layer = ZCMLLayer(filename,
+                                       __name__,
+                                       'timetable_functional_layer')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,11 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="zope">
+
+  <include package="schooltool.skin" file="meta.zcml" />
+  <include package="schooltool" />
+
+  <include package="schooltool.course" />
+  <include package="schooltool.term" />
+  <include package="schooltool.timetable" />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,749 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool application interfaces
+
+$Id: interfaces.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+
+import datetime
+
+from zope.interface import Interface, Attribute, implements
+from zope.schema import Field, Object, Int, TextLine, List, Set, Tuple
+from zope.schema import Dict, Date, Timedelta
+from zope.schema import Iterable
+from zope.schema.interfaces import IField
+from zope.annotation.interfaces import IAnnotatable
+from zope.app.container.constraints import contains, containers
+from zope.app.container.interfaces import IContainer, IContained
+from zope.location.interfaces import ILocation
+
+from schooltool.app.interfaces import ISchoolToolCalendarEvent
+from schooltool.calendar.interfaces import Unchanged
+
+from schooltool import SchoolToolMessage as _
+
+#
+# Time field used in timetabling interfaces
+#
+
+class ITime(IField):
+    u"""Field containing time."""
+
+
+class Time(Field):
+    __doc__ = ITime.__doc__
+    _type = datetime.time
+
+    implements(ITime)
+
+
+#
+#  Timetabling
+#
+
+class ISchooldayTemplate(Interface):
+    """A school-day template represents the times that periods are
+    scheduled during a prototypical school day.
+
+    Some schools need only one school-day template. For example, they
+    have seven periods in a day, and the periods are always in the
+    sequence 1 to 7, and start and end at the same time on each school
+    day.
+
+    Other schools will need more than one school-day template. For
+    example, a school that has shorter school days on Wednesdays will
+    have one template for Wednesdays, and one other template for
+    Monday, Tuesday, Thursday and Friday.
+    """
+
+    def __iter__():
+        """Return an iterator over the ISchooldaySlots of this template."""
+
+
+class ISchooldayTemplateWrite(Interface):
+    """Write access to schoolday templates."""
+
+    def add(obj):
+        """Add an ISchooldaySlot to the template.
+
+        Raises a TypeError if obj is not an ISchooldaySlot."""
+
+    def remove(obj):
+        """Remove an object from the template."""
+
+
+class ISchooldaySlot(Interface):
+    """A time interval during which a period can be scheduled."""
+
+    tstart = Time(
+        title=u"Time of the start of the event")
+
+    duration = Timedelta(
+        title=u"Timedelta of the duration of the event")
+
+    def __eq__(other):
+        """SchooldaySlots are equal if their start times and durations
+        are equal.
+
+        Raises TypeError if other does not implement ISchooldaySlot.
+        """
+
+    def __ne__(other):
+        """SchooldaySlots are not equal if either their start times
+        and durations are not equal.
+
+        Raises TypeError if other does not implement ISchooldaySlot.
+        """
+
+    def __hash__():
+        """Hashes of ISchooldaySlots are equal iff those
+        ISchooldaySlots are equal.
+        """
+
+
+class ITimetableModel(Interface):
+    """A timetable model knows how to create an ICalendar object when
+    it is given a School-day model and a Timetable.
+
+    The implementation of the timetable model knows how to arrange
+    timetable days within the available school days.
+
+    For example, a school with four timetable days 1, 2, 3, 4 has its
+    timetable days laid out in sequence across consecutive school
+    days. A school with a timetable days for Monday through Friday has
+    its timetable days laid out to match the day of the week that a
+    school day occurs on.
+
+    The ICalendar produced will use an appropriate school-day template
+    for each day, depending on (for example) what day of the week that
+    day occurs on, or whatever other rules the implementation of the
+    timetable model is coded to use.
+    """
+
+    factory_id = Attribute("""Name of the ITimetableModelFactory utility
+                              that was used to create this model.""")
+
+    timetableDayIds = List(
+        title=u"A sequence of day_ids which can be used in the timetable.",
+        value_type=TextLine(title=u"Day id"))
+
+    exceptionDays = Dict(
+        title=u"Exception schoolday templates",
+        key_type=Date(title=u"Date"),
+        value_type=List(title=u"Schoolday template"),
+        description=u"""
+        Timetables for special days
+
+        The values are lists of tuples of (period_id, SchooldaySlot).
+        """)
+
+    exceptionDayIds = Dict(
+        title=u"Day ids for special dates",
+        key_type=Date(title=u"Date"),
+        value_type=Object(title=u"Schoolday template",
+                          schema=ISchooldayTemplate),
+        description=u"""
+        Day ids for special dates
+
+        This allows to indicate, that a certain timetable day id
+        should be used for a particular date, for example when the day
+        is a replacement for some other day.
+        """)
+
+    def createCalendar(term, timetable, first=None, last=None):
+        """Return an ICalendar composed out of term and timetable.
+
+        This method has model-specific knowledge as to how the schooldays,
+        weekends and holidays map affects the mapping of the timetable
+        onto the real-world calendar.
+
+        You can specify a range of dates to generate a calendar spanning a
+        given date range (inclusive) only.
+        """
+
+    def periodsInDay(term, timetable, date):
+        """Return a sequence of periods defined in this day"""
+
+    def originalPeriodsInDay(term, timetable, date):
+        """Return a sequence of original periods defined in this day.
+
+        This method is similar to periodsInDay, but it disregards the
+        exceptionDays.
+        """
+
+    def getDayId(term, timetable, date):
+        """Return what day id a certain date will use in this model"""
+
+
+class IWeekdayBasedTimetableModel(ITimetableModel):
+    """A model that chooses the day template according to the day of week."""
+
+    dayTemplates = Dict(
+        title=u"Schoolday templates",
+        key_type=Int(title=u"Weekday", required=False),
+        value_type=Object(title=u"Schoolday template",
+                          schema=ISchooldayTemplate),
+        description=u"""
+        Schoolday templates.
+
+        The template with the key of None is used if there is no template
+        for a particular weekday.
+        """)
+
+
+class IDayIdBasedTimetableModel(ITimetableModel):
+    """A model that chooses the day template according to the day id."""
+
+    dayTemplates = Dict(
+        title=u"Schoolday templates",
+        key_type=TextLine(title=u"Day Id", required=False),
+        value_type=Object(title=u"Schoolday template",
+                          schema=ISchooldayTemplate),
+        description=u"""
+        Schoolday templates indexed by day id.
+        """)
+
+
+class ITimetableModelFactory(Interface):
+    """A factory of a timetable model"""
+
+    def __call__(day_ids, day_templates):
+        """Return a timetable model.
+
+        `day_ids` is a sequence of day ids.
+
+        `day_templates` is a dict ITimetableDay objects as values and
+        implementation dependent keys.
+        """
+
+
+class ITimetableActivity(Interface):
+    """An event in a timetable.
+
+    Something that happens on a certain period_id in a certain day_id.
+
+    Timetable activities are immutable and can be hashed or compared for
+    equality.
+    """
+
+    title = TextLine(
+        title=u"The title of the activity.")
+
+    owner = Field(
+        title=u"The group or person or other object that owns the activity.",
+        description=u"""
+        The activity lives in the owner's timetable.
+        """)
+
+    resources = Iterable(
+        title=u"A set of resources assigned to this activity.",
+        description=u"""
+        The activity is also present in the timetables of all resources
+        assigned to this activity.
+        """)
+
+    timetable = Field(
+        title=u"The timetable that contains this activity.",
+        description=u"""
+        This attribute refers to the timetable of `owner`.  It never refers
+        to a composite timetable or a timetable of a resource.
+        """)
+
+    def replace(title=Unchanged, owner=Unchanged, timetable=Unchanged):
+        """Return a copy of this activity with some fields changed."""
+
+    def __eq__(other):
+        """Is this timetable activity equal to `other`?
+
+        Timetable activities are equal iff their title and owner
+        attributes are equal.
+
+        Returns false if other is not a timetable activity.
+        """
+
+    def __ne__(other):
+        """Is this timetable activity different from `other`?
+
+        The opposite of __eq__.
+        """
+
+    def __hash__():
+        """Calculate the hash value of a timetable activity."""
+
+
+class ITimetableException(Interface):
+    """An exception in a timetable.
+
+    An exception specifies that on a particular day a particular activity
+    either does not occur, or occurs but at a different time, or is replaced
+    by a different activity.
+    """
+
+    date = Date(
+        title=u"Date of the exception")
+
+    period_id = TextLine(
+        title=u"ID of the period that is exceptional.")
+
+    activity = Object(
+        title=u"The activity that does not occur.",
+        schema=ITimetableActivity)
+
+    replacement = Field(
+        title=u"A replacement calendar event",
+        # schema=IExceptionalTTCalendarEvent,
+        required=False,
+        description=u"""
+        A calendar event that should replace the exceptional activity.
+        If None, then the activity is simply removed.
+        """)
+
+    def __eq__(other):
+        """See if self == other."""
+
+    def __ne__(other):
+        """See if self != other."""
+
+
+class ITimetableSchema(IContained):
+    """A timetable schema.
+
+    A timetable schema is an ordered collection of timetable days that contain
+    periods.
+    """
+
+    title = TextLine(
+        title=u"The title of the timetable schema.")
+
+    model = Object(
+        title=u"A timetable model this timetable should be used with.",
+        schema=ITimetableModel)
+
+    timezone = TextLine(title=u"The name of a timezone of this timetable")
+
+    def keys():
+        """Return a sequence of identifiers for days within the timetable.
+
+        The order of day IDs is fixed.
+        """
+
+    def items():
+        """Return a sequence of tuples of (day_id, ITimetableSchemaDay).
+
+        The order of day IDs is fixed and is the same as returned by keys().
+        """
+
+    def __getitem__(key):
+        """Return a ITimetableSchemaDay for a given day id."""
+
+    def createTimetable():
+        """Return a new empty timetable with the same structure.
+
+        The new timetable has the same set of day_ids, and the sets of
+        period ids within each day.  It has no activities.
+        """
+
+
+class ITimetableSchemaWrite(Interface):
+    """Interface for initializing timetable schemas."""
+
+    def __setitem__(key, value):
+        """Set an ITimetableSchemaDay for a given day id.
+
+        Throws a TypeError if the value does not implement ITimetableSchemaDay.
+        Throws a ValueError if the key is not a valid day id.
+        """
+
+
+class ITimetableSchemaDay(Interface):
+    """A day in a timetable schema.
+
+    A timetable day is an ordered collection of periods.
+
+    Different days within the same timetable schema may have different periods.
+
+    ITimetableSchemaDay has keys, items and __getitem__ for interface
+    compatibility with ITimetableDay -- so that, for example, views for
+    ITimetable can be used to render ITimetableSchemas.
+    """
+
+    periods = List(
+        title=u"A list of period IDs for this day.",
+        value_type=TextLine(title=u"A period id"))
+
+    homeroom_period_ids = List(
+        title=u"A list of homeroom period IDs for this day",
+        required=False)
+
+    def keys():
+        """Return self.periods."""
+
+    def items():
+        """Return a sequence of (period_id, empty_set)."""
+
+    def __getitem__(key):
+        """Return an empty set, if key is in periods, otherwise raise KeyError.
+        """
+
+
+class ITimetable(ILocation):
+    """A timetable.
+
+    A timetable is an ordered collection of timetable days that contain
+    periods. Each period either contains a class, or is empty.
+
+    A timetable represents the repeating lesson schedule for just one
+    pupil, or one teacher, or one bookable resource.
+    """
+
+    model = Object(
+        title=u"A timetable model this timetable should be used with.",
+        schema=ITimetableModel)
+
+    timezone = TextLine(title=u"The name of a timezone of this timetable")
+
+    def keys():
+        """Return a sequence of identifiers for days within the timetable.
+
+        The order of day IDs is fixed.
+        """
+
+    def items():
+        """Return a sequence of tuples of (day_id, ITimetableDay).
+
+        The order of day IDs is fixed and is the same as returned by keys().
+        """
+
+    def __getitem__(key):
+        """Return a ITimetableDay for a given day id."""
+
+    def activities():
+        """Return all activities in this timetable.
+
+        Returns a list of tuples (day_id, period_id, activity).
+        """
+
+    def cloneEmpty():
+        """Return a new empty timetable with the same structure.
+
+        The new timetable has the same set of day_ids, and the sets of
+        period ids within each day.  It has no activities.
+        """
+
+    def __eq__(other):
+        """Is this timetable equal to other?
+
+        Timetables are equal iff they have the same model,
+        set of day IDs, and their corresponding days are equal.
+
+        Returns False if other is not a timetable.
+        """
+
+    def __ne__(other):
+        """Is this timetable different from other?
+
+        The opposite of __eq__.
+        """
+
+
+class ITimetableWrite(Interface):
+    """Write access to timetables."""
+
+    def __setitem__(key, value):
+        """Set an ITimetableDay for a given day id.
+
+        Throws a TypeError if the value does not implement ITimetableDay.
+        Throws a ValueError if the key is not a valid day id.
+        """
+
+    def clear(send_events=True):
+        """Remove all activities for all periods.
+
+        If send_events is True, sends ITimetableActivityRemovedEvents for
+        all removed activities.
+        """
+
+    def update(timetable):
+        """Add all the events from timetable to self.
+
+        Useful for producing combined timetables.
+
+        Does not send any events.
+        """
+
+
+class ITimetableDay(Interface):
+    """A day in a timetable.
+
+    A timetable day is an ordered collection of periods that each have
+    a set of activites that occur during that period.
+
+    Different days within the same timetable may have different periods.
+    """
+
+    timetable = Object(
+        title=u"The timetable that contains this day.",
+        schema=ITimetable)
+
+    day_id = TextLine(
+        title=u"The day id of this timetable day.")
+
+    periods = List(
+        title=u"A list of period IDs for this day.",
+        value_type=TextLine(title=u"A period id"))
+
+    homeroom_period_ids = TextLine(
+        title=u"IDs of homeroom periods",
+        required=False)
+
+    def keys():
+        """Return self.periods."""
+
+    def items():
+        """Return a sequence of (period_id, set_of_ITimetableActivity)."""
+
+    def __getitem__(key):
+        """Return the set of ITimetableActivities for a given period.
+
+        If there is no activity for the period, an empty set is returned.
+        """
+
+    def __eq__(other):
+        """Return True iff other is a TimetableDay with the same set of
+        periods and with the same activities scheduled for those periods.
+        """
+
+    def __ne__(other):
+        """Return True iff __eq__ returns False."""
+
+
+class ITimetableDayWrite(Interface):
+    """Writable timetable day.
+
+    Note that all clients which use ITimetableDayWrite or ITimetableWrite
+    to modify timetables should maintain the following invariant:
+     - every TimetableActivity is present in the timetable of its owner
+       and all the timetables of its resources.
+    """
+
+    def clear(period):
+        """Remove all the activities for a certain period id.
+
+        If send_events is True, sends an ITimetableActivityRemovedEvent
+        for each removed activity.
+        """
+
+    def add(period, activity, send_event=True):
+        """Add a single activity to the set of activities planned for
+        a given period.
+
+        If send_events is True, sends an ITimetableActivityAddedEvent.
+        """
+
+    def remove(period, value):
+        """Remove a certain activity from a set of activities planned
+        for a given period.
+
+        Raises KeyError if there is no matching activity.
+
+        If send_events is True, sends an ITimetableActivityRemovedEvent.
+        """
+
+
+class ITimetableActivityEvent(Interface):
+    """Event that gets sent when an activity is added to a timetable day."""
+
+    activity = Object(
+        title=u"The timetable activity.",
+        schema=ITimetableActivity)
+
+    day_id = TextLine(
+        title=u"The day_id of the containing timetable day.")
+
+    period_id = TextLine(
+        title=u"The period_id of the containing period.")
+
+
+class ITimetableActivityAddedEvent(ITimetableActivityEvent):
+    """Event that gets sent when an activity is added to a timetable."""
+
+
+class ITimetableActivityRemovedEvent(ITimetableActivityEvent):
+    """Event that gets sent when an activity is removed from a timetable."""
+
+
+class ITimetableCalendarEvent(ISchoolToolCalendarEvent):
+    """A calendar event that has been created from a timetable."""
+
+    day_id = TextLine(
+        title=u"The id of the timetable day.")
+
+    period_id = TextLine(
+        title=u"The period id of the corresponding timetable event.")
+
+    activity = Object(
+        title=u"The activity from which this event was created.",
+        schema=ITimetableActivity)
+
+
+class ITimetableDict(IContainer):
+    """Container for timetables.
+
+    The id of the timetable is composed by joining term id and
+    timetable schema id with a dot.  For example,"2005-fall.default"
+    means a timetable for a term "2005-fall" with a timetable schema
+    "default".
+    """
+
+
+class IHaveTimetables(Interface):
+    """A marker interface for content objects to declare themselves as having
+       timetables."""
+
+
+class IOwnTimetables(IHaveTimetables, IAnnotatable):
+    """A marker interface for content objects to declare themselves as having
+       timetables."""
+
+
+class IBookResources(Interface):
+    """An object that can have booked resources."""
+
+    resources = Iterable(
+        title=u"Booked resources")
+
+
+class ITimetables(Interface):
+    """The timetable content related to an object -- either its own,
+    or composed of the timetables of related objects.
+    """
+
+    object = Attribute("The object these timetables are for.")
+
+    timetables = Object(
+        schema=ITimetableDict,
+        title=u"Private timetables of this object",
+        description=u"""
+
+        These timetables can be directly manipulated.  Adding, changing
+        or removing a timetable will result in a ITimetableReplacedEvent
+        being sent.
+
+        For a lot of objects this mapping will be empty.  Instead, they
+        will inherit timetable events through composition (see
+        getCompositeTimetable).
+        """)
+
+
+class ICompositeTimetables(Interface):
+    """An interface for objects that have composite timetables."""
+
+    def getCompositeTimetable(term_id, tt_schema_id):
+        """Return a composite timetable for a given object with a
+        given timetable schema for a given time period id.
+
+        The timetable returned includes the events from the timetables
+        of parent groups, groups taught, etc.
+
+        This function can return None if the object has no timetable.
+        """
+
+    def listCompositeTimetables():
+        """Return a sequence of (time_period_id, tt_schema_id) for all
+        available composite timetables.
+        """
+
+    def makeTimetableCalendar(first=None, last=None):
+        """Generate and return a calendar from all composite timetables.
+
+        You can specify a range of dates to generate a calendar spanning a
+        given date range (inclusive) only.
+        """
+
+
+class ITimetableSource(Interface):
+    """Timetable source.
+
+    A subscription adapter that contributes a timetable to the
+    composite timetable of the context.
+    """
+
+    def getTimetableSourceObjects():
+        """Return objects calendars of which will be merged to the composite
+        timetable of the context."""
+
+
+class ITimetableReplacedEvent(Interface):
+    """Event that gets sent when a timetable is replaced."""
+
+    object = Object(
+        title=u"The owner of the timetable.",
+        schema=ITimetables)
+
+    key = Tuple(
+        title=u"Tuple (time_period_id, schema_id).",
+        value_type=TextLine(),
+        min_length=2,
+        max_length=2)
+
+    old_timetable = Object(
+        title=u"The old timetable (can be None).",
+        schema=ITimetable,
+        required=False)
+
+    new_timetable = Object(
+        title=u"The new timetable (can be None).",
+        schema=ITimetable,
+        required=False)
+
+
+class ITimetableModelRegistry(Interface):
+    """A registry of timetable model classes present in the system.
+
+    The timetable model classes are identified by the dotted class names.
+
+    Timetable model classes are acquired as named utilities
+    implementing ITimetableModelFactory.
+    """
+
+    def registerTimetableModel(id, factory):
+        """Register a timetable schema identified by a given id."""
+
+
+class ITimetableSchemaContainer(IContainer, ILocation):
+    """Service for creating timetables of a certain schema.
+
+    This service stores timetable prototypes (empty timetables) and
+    can return a new timetable of a certain schema on request.
+    """
+
+    contains(ITimetableSchema)
+
+    default_id = TextLine(
+        title=u"Schema id of the default schema")
+
+    def getDefault():
+        """Return the default schema for the school"""
+
+
+class ITimetableSchemaContained(ITimetableSchema, IContained):
+    """Timetable Schema contained in an ITimetableSchemaContainer."""
+
+    containers(ITimetableSchemaContainer)


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/model.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/model.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/model.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,447 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetable model implementations.
+
+A timetable model describes the mapping between timetable days and calendar
+days, and also the mapping between period IDs and time of the day.  Currently
+SchoolTool has two kinds of timetable models:
+
+  - Sequential days model may jump over calendar days if they are not school
+    days.  For example, if July 3 was timetable day 3, and July 4 is a holiday,
+    then July 5 will be timetable day 4.
+
+  - Weekly model maps week days directly to timetable days, that is, Monday is
+    always timetable day 1, and sunday is always timetable day 7.
+
+It is possible to define additional models.  See ITimetableModel.
+
+$Id: model.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+import socket
+import itertools
+import datetime
+import pytz
+
+from persistent import Persistent
+from persistent.dict import PersistentDict
+from zope.interface import implements, classProvides
+from zope.traversing.api import getPath
+
+from schooltool.app.cal import CalendarEvent
+from schooltool.calendar.simple import ImmutableCalendar
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+from schooltool.app.interfaces import ISchoolToolCalendar
+
+from schooltool.timetable.interfaces import IWeekdayBasedTimetableModel
+from schooltool.timetable.interfaces import IDayIdBasedTimetableModel
+from schooltool.timetable.interfaces import ITimetableModelFactory
+from schooltool.timetable.interfaces import ITimetableCalendarEvent
+
+__metaclass__ = type
+
+
+class WeekdayBasedModelMixin:
+    """A mixin for a timetable model that indexes day templates by weekday"""
+
+    implements(IWeekdayBasedTimetableModel)
+
+    def _validateDayTemplates(self):
+        if None not in self.dayTemplates:
+            for weekday in range(7):
+                if weekday not in self.dayTemplates:
+                    raise AssertionError("No day template for day %d,"
+                                         " and no fallback either" % weekday)
+
+    def _getUsualTemplateForDay(self, date, day_id):
+        """Returns the schoolday template for a certain date
+        disregarding special days.
+        """
+        default = self.dayTemplates[None]
+        return self.dayTemplates.get(date.weekday(), default)
+
+
+class BaseTimetableModel(Persistent):
+    """An abstract base class for timetable models.
+
+    The models are persistent, but all the data structures inside,
+    including the day templates, are not.  Timetable models are
+    considered to be volatile.  Making the timetable models persistent
+    is an optimisation.  Everything would work without that as well,
+    but a separate pickle of a model would be included in each
+    timetable.
+
+    Subclasses must define these methods:
+
+       def schooldayStrategy(self, date, day_iterator):
+           '''Return a day_id for a certain date.
+
+           Will be called sequentially for all school days.
+
+           May return None if the schoolday model thinks that there should
+           be no classes on this date.
+           '''
+
+       def _dayGenerator(self):
+           '''Return an iterator to be passed to schooldayStrategy'''
+
+       def _validateDayTemplates(self):
+           '''Check that the dayTemplates attribute is well formed'''
+
+       def _getUsualTemplateForDay(self, date, day_id):
+           '''Return the schoolday template for a certain date
+           disregarding special days.
+           '''
+
+    """
+
+    timetableDayIds = ()
+    dayTemplates = {}       # overriden in the __init__s of descendants
+
+    def __init__(self):
+        self.exceptionDays = PersistentDict()
+        self.exceptionDayIds = PersistentDict()
+
+    def createCalendar(self, term, timetable, first=None, last=None):
+        uid_suffix = '%s@%s' % (getPath(timetable), socket.getfqdn())
+        events = []
+        day_id_gen = self._dayGenerator()
+        if first is None:
+            first = term.first
+        if last is None:
+            last = term.last
+        for date in term:
+            if not first <= date <= last:
+                # must call getDayId to keep track of days
+                day_id = self.getDayId(term, date, day_id_gen)
+                continue
+            day_id, periods = self._periodsInDay(term, timetable,
+                                                 date, day_id_gen)
+
+            tz = pytz.timezone(timetable.timezone)
+
+            for period, tstart, duration in periods:
+                # We need to convert dtstart to UTC, because calendar
+                # events insist on storing UTC time.
+                dt = datetime.datetime.combine(date, tstart)
+                dt = tz.localize(dt).astimezone(pytz.utc)
+                for activity in timetable[day_id][period]:
+                    key = (date, period, activity)
+                    # IDs for functionally derived calendars should be
+                    # functionally derived, and not random
+                    uid = '%d-%s' % (hash((activity.title, dt,
+                                           duration)), uid_suffix)
+                    event = TimetableCalendarEvent(
+                                dt, duration, activity.title,
+                                unique_id=uid, day_id=day_id, period_id=period,
+                                activity=activity)
+                    events.append(event)
+        return ImmutableCalendar(events)
+
+    def getDayId(self, term, day, day_id_gen=None):
+        """See ITimetableModel.originalPeriodsInDay
+
+        `day_id_gen` is an optimization for a case when all day ids
+        are gotten in sequence, e.g. when generating a timetable
+        calendar.
+        """
+
+        if day_id_gen is None:
+            # Scroll to the required day
+            day_id_gen = self._dayGenerator()
+            if day_id_gen is not None:
+                for date in term:
+                    if date == day:
+                        break
+                    if term.isSchoolday(date):
+                        self.schooldayStrategy(date, day_id_gen)
+
+        if not term.isSchoolday(day):
+            return None
+        return self.schooldayStrategy(day, day_id_gen)
+
+    def _periodsInDay(self, term, timetable, day,
+                      day_id_gen=None, original=False):
+        """Return a timetable day_id and a list of periods for a given day.
+
+        If day_id_gen is not provided, a new generator is created and
+        scrolled to the date requested.  If day_id_gen is provided, it
+        is called once to gain a day_id.
+
+        `original` is boolean flag that makes this method disregard
+        exceptionDays.
+        """
+
+        day_id = self.getDayId(term, day, day_id_gen)
+        if day_id is None:
+            return None, []
+
+        # Now choose the periods that are in this day
+        result = []
+        usual = self._getUsualTemplateForDay(day, day_id)
+        periods = zip(timetable[day_id].keys(), sorted(usual))
+        if not original:
+            periods = self.exceptionDays.get(day, periods)
+
+        for period, slot in periods:
+            if period in timetable[day_id].keys():
+                result.append((period, slot.tstart, slot.duration))
+
+        result.sort(key=lambda x: x[1])
+        return day_id, result
+
+    def periodsInDay(self, term, timetable, day):
+        """See ITimetableModel.periodsInDay"""
+        return self._periodsInDay(term, timetable, day)[1]
+
+    def originalPeriodsInDay(self, term, timetable, day):
+        """See ITimetableModel.originalPeriodsInDay"""
+        return self._periodsInDay(term, timetable, day, original=True)[1]
+
+    def schooldayStrategy(self, date, generator):
+        raise NotImplementedError
+
+    def _dayGenerator(self):
+        raise NotImplementedError
+
+    def __eq__(self, other):
+        if isinstance(other, self.__class__):
+            return (self.timetableDayIds == other.timetableDayIds and
+                    self.dayTemplates == other.dayTemplates and
+                    self.exceptionDays == other.exceptionDays and
+                    self.exceptionDayIds == other.exceptionDayIds)
+        else:
+            return False
+
+    def __ne__(self, other):
+        return not self == other
+
+
+class BaseSequentialTimetableModel(BaseTimetableModel):
+    """A timetable model in which the school days go in sequence with
+    shifts over non-schooldays:
+
+    Mon     Day 1
+    Tue     Day 2
+    Wed     ----- National holiday!
+    Thu     Day 3
+    Fri     Day 4
+    Sat     ----- Weekend
+    Sun     -----
+    Mon     Day 1
+    Tue     Day 2
+    Wed     Day 3
+    Thu     Day 4
+    Fri     Day 1
+    Sat     ----- Weekend
+    Sun     -----
+    Mon     Day 2
+    """
+
+    def __init__(self, day_ids, day_templates):
+        BaseTimetableModel.__init__(self)
+        self.timetableDayIds = day_ids
+        self.dayTemplates = day_templates
+        self._validateDayTemplates()
+
+    def _dayGenerator(self):
+        return itertools.cycle(self.timetableDayIds)
+
+    def schooldayStrategy(self, date, generator):
+        if date in self.exceptionDayIds:
+            return self.exceptionDayIds[date]
+        else:
+            return generator.next()
+
+
+class SequentialDaysTimetableModel(BaseSequentialTimetableModel,
+                                   WeekdayBasedModelMixin):
+    """A sequential days timetable model in which the days are chosen
+    by weekday
+    """
+
+    factory_id = "SequentialDaysTimetableModel"
+
+    classProvides(ITimetableModelFactory)
+
+
+class SequentialDayIdBasedTimetableModel(BaseSequentialTimetableModel):
+    """A sequential timetable model in which the day templates are
+    indexed by day id rather than weekday.
+    """
+
+    factory_id = "SequentialDayIdBasedTimetableModel"
+    classProvides(ITimetableModelFactory)
+    implements(IDayIdBasedTimetableModel)
+
+    def _validateDayTemplates(self):
+        for day_id in self.timetableDayIds:
+            if day_id not in self.dayTemplates:
+                raise AssertionError("No day template for day id %s" % day_id)
+
+    def _getUsualTemplateForDay(self, date, day_id):
+        """Returns the schoolday template for a certain date
+        disregarding special days.
+        """
+        return self.dayTemplates[day_id]
+
+
+class WeeklyTimetableModel(BaseTimetableModel, WeekdayBasedModelMixin):
+    """A timetable model where the schedule depends only on weekdays."""
+
+    factory_id = "WeeklyTimetableModel"
+
+    timetableDayIds = "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"
+
+    classProvides(ITimetableModelFactory)
+
+    def __init__(self, day_ids=None, day_templates={}):
+        BaseTimetableModel.__init__(self)
+        self.dayTemplates = day_templates
+        if day_ids is not None:
+            self.timetableDayIds = day_ids
+        self._validateDayTemplates()
+
+    def schooldayStrategy(self, date, generator):
+        if date in self.exceptionDayIds:
+            return self.exceptionDayIds[date]
+        try:
+            return self.timetableDayIds[date.weekday()]
+        except IndexError:
+            return None
+
+    def _dayGenerator(self):
+        return None
+
+
+class TimetableCalendarEvent(CalendarEvent):
+
+    implements(ITimetableCalendarEvent)
+
+    day_id = property(lambda self: self._day_id)
+    period_id = property(lambda self: self._period_id)
+    activity = property(lambda self: self._activity)
+
+    def __init__(self, *args, **kwargs):
+        self._day_id = kwargs.pop('day_id')
+        self._period_id = kwargs.pop('period_id')
+        self._activity = kwargs.pop('activity')
+        CalendarEvent.__init__(self, *args, **kwargs)
+
+    @property
+    def resources(self):
+        return self.activity.resources
+
+    @property
+    def owner(self):
+        return self.activity.owner
+
+
+class PersistentTimetableCalendarEvent(CalendarEvent):
+    implements(ITimetableCalendarEvent)
+
+    day_id = property(lambda self: self._day_id)
+    period_id = property(lambda self: self._period_id)
+    activity = property(lambda self: self._activity)
+    title = property(lambda self: self.activity.title)
+    resources = property(lambda self: self._resources)
+
+    def __init__(self, event):
+        self.unique_id = event.unique_id
+        self.__name__ = event.__name__
+        self._day_id = event.day_id
+        self._period_id = event.period_id
+        self._activity = event.activity
+
+        self.dtstart = event.dtstart
+        self.duration = event.duration
+        self.description = event.description
+        self.location = event.location
+        self.recurrence = event.recurrence
+        self.allday = event.allday
+
+        resources = list(event.resources)
+        self._resources = ()
+        for resource in resources:
+            self.bookResource(resource)
+
+    def schoolDay(self):
+        tz_id = self.activity.timetable.timezone
+        timezone = pytz.timezone(tz_id)
+        return self.dtstart.astimezone(timezone).date()
+
+
+def addEventsToCalendar(event):
+    timetable = event.activity.timetable
+
+    term_id, schema_id = timetable.__name__.split(".")
+    terms = ISchoolToolApplication(None)["terms"]
+    term = terms[term_id]
+    calendar = timetable.model.createCalendar(term, timetable)
+    section_calendar = ISchoolToolCalendar(event.activity.owner)
+    for cal_event in calendar:
+        if (cal_event.activity == event.activity and
+            cal_event.period_id == event.period_id and
+            cal_event.day_id == event.day_id):
+            tt_event = PersistentTimetableCalendarEvent(cal_event)
+            section_calendar.addEvent(tt_event)
+
+
+def removeEventsFromCalendar(event):
+    timetable = event.activity.timetable
+
+    events = []
+    section_calendar = ISchoolToolCalendar(event.activity.owner)
+
+    for cal_event in list(section_calendar):
+        if ITimetableCalendarEvent.providedBy(cal_event):
+            if (cal_event.activity == event.activity and
+                cal_event.period_id == event.period_id and
+                cal_event.day_id == event.day_id and
+                cal_event.activity.timetable is event.activity.timetable):
+                section_calendar.removeEvent(cal_event)
+
+
+def handleTimetableRemovedEvent(event):
+    section_calendar = ISchoolToolCalendar(event.object)
+    for cal_event in list(section_calendar):
+        if ITimetableCalendarEvent.providedBy(cal_event):
+            if (cal_event.activity.timetable is event.old_timetable):
+                section_calendar.removeEvent(cal_event)
+
+
+def handleTimetableAddedEvent(event):
+    timetable = event.new_timetable
+    term_id, schema_id = event.key.split(".")
+    terms = ISchoolToolApplication(None)["terms"]
+    term = terms[term_id]
+    calendar = timetable.model.createCalendar(term, timetable)
+
+    section_calendar = ISchoolToolCalendar(event.object)
+    for cal_event in calendar:
+        tt_event = PersistentTimetableCalendarEvent(cal_event)
+        section_calendar.addEvent(tt_event)
+
+
+def handleTimetableReplacedEvent(event):
+    if event.old_timetable:
+        handleTimetableRemovedEvent(event)
+    if event.new_timetable:
+        handleTimetableAddedEvent(event)


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/model.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,515 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for SchoolTool timetabling
+
+$Id: __init__.py 6565 2007-01-11 16:43:11Z ignas $
+"""
+
+import datetime
+import sets
+
+from zope.app import zapi
+from zope.event import notify
+from zope.component import adapts
+from zope.component import queryMultiAdapter
+from zope.interface import implements
+from zope.publisher.interfaces import NotFound
+from zope.publisher.interfaces import IPublishTraverse
+from zope.publisher.interfaces.http import IHTTPRequest
+from zope.security.proxy import removeSecurityProxy
+from zope.traversing.api import traverse
+from zope.traversing.interfaces import TraversalError
+from zope.app.http.put import NullResource
+from zope.lifecycleevent import ObjectCreatedEvent
+
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.errors import RestError
+from schooltool.app.app import getSchoolToolApplication
+from zope.app.container.traversal import ItemTraverser
+from schooltool.xmlparsing import XMLDocument
+from schooltool.common import parse_date, parse_time
+from schooltool.timetable.interfaces import IHaveTimetables, ITimetables
+from schooltool.timetable.interfaces import ITimetableDict, ICompositeTimetables
+from schooltool.timetable import TimetableActivity, TimetableDict
+from schooltool.traverser import traverser
+from schooltool.app.rest.interfaces import ITimetableFileFactory
+from schooltool.app.rest.interfaces import INullTimetable
+from schooltool.common import unquote_uri
+
+
+def parseDate(date_str):
+    """Parse a date string and return a datetime.date object.
+
+    This is a thin wrapper over parse_date that converts ValueErrors into
+    RestErrors.
+
+        >>> parseDate('2004-10-14')
+        datetime.date(2004, 10, 14)
+        >>> parseDate('foo')
+        Traceback (most recent call last):
+          ...
+        RestError: Invalid date: foo
+
+    """
+    try:
+        return parse_date(date_str)
+    except ValueError:
+        raise RestError("Invalid date: %s" % date_str)
+
+
+def parseTime(time_str):
+    """Parse a time string and return a datetime.time object.
+
+    This is a thin wrapper over parse_time that converts ValueErrors into
+    RestErrors.
+
+        >>> parseTime('8:45')
+        datetime.time(8, 45)
+        >>> parseTime('foo')
+        Traceback (most recent call last):
+          ...
+        RestError: Invalid time: foo
+    """
+    try:
+        return parse_time(time_str)
+    except ValueError:
+        raise RestError("Invalid time: %s" % time_str)
+
+
+def parseDuration(duration_str):
+    """Parse a duration string and return a datetime.timedelta.
+
+        >>> parseDuration('1')
+        datetime.timedelta(0, 60)
+        >>> parseDuration('just a minute')
+        Traceback (most recent call last):
+          ...
+        RestError: Invalid duration: just a minute
+        >>> parseDuration('0')
+        Traceback (most recent call last):
+          ...
+        RestError: Invalid duration: 0
+        >>> parseDuration('-1')
+        Traceback (most recent call last):
+          ...
+        RestError: Invalid duration: -1
+
+    """
+    try:
+        min = int(duration_str)
+        if min <= 0:
+            raise ValueError
+    except ValueError:
+        raise RestError("Invalid duration: %s" % duration_str)
+    else:
+        return datetime.timedelta(minutes=min)
+
+
+class TimetableReadView(View):
+    """Read-only view for ITimetable."""
+
+    template = Template("templates/timetable.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    def absolutePath(self, obj):
+        return zapi.absoluteURL(obj, self.request)
+
+
+class TimetableFileFactory(object):
+
+    implements(ITimetableFileFactory)
+
+    schema = """<?xml version="1.0" encoding="UTF-8"?>
+        <!--
+        RelaxNG grammar for a timetable.
+        -->
+        <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                 xmlns:xlink="http://www.w3.org/1999/xlink"
+                 ns="http://schooltool.org/ns/timetable/0.1"
+                 datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+
+          <define name="idattr">
+            <attribute name="id">
+              <text/>
+            </attribute>
+          </define>
+
+          <define name="datetext">
+            <!-- date in YYYY-MM-DD format -->
+            <text/>
+          </define>
+
+          <define name="timetext">
+            <!-- time in HH:MM format -->
+            <text/>
+          </define>
+
+          <define name="duration">
+            <!-- duration (minutes) -->
+            <text/>
+          </define>
+
+          <define name="xlinkattr">
+            <attribute name="xlink:type">
+              <value>simple</value>
+            </attribute>
+            <attribute name="xlink:href">
+              <data type="anyURI"/>
+            </attribute>
+            <optional>
+              <attribute name="xlink:title">
+                <text/>
+              </attribute>
+            </optional>
+          </define>
+
+          <start>
+            <ref name="timetable"/>
+          </start>
+
+          <define name="activity">
+            <element name="activity">
+              <attribute name="title">
+                <text/>
+              </attribute>
+              <zeroOrMore>
+                <element name="resource">
+                  <ref name="xlinkattr"/>
+                </element>
+              </zeroOrMore>
+            </element>
+          </define>
+
+          <define name="timetable">
+            <element name="timetable">
+              <element name="timezone">
+                <attribute name="name">
+                  <text />
+                </attribute>
+              </element>
+              <oneOrMore>
+                <element name="day">
+                  <ref name="idattr"/>
+                  <zeroOrMore>
+                    <element name="period">
+                      <ref name="idattr"/>
+                       <optional>
+                         <attribute name="homeroom">
+                           <!-- presence of this attribute indicates that this
+                                period is the homeroom period -->
+                         </attribute>
+                       </optional>
+                      <zeroOrMore>
+                        <ref name="activity"/>
+                      </zeroOrMore>
+                    </element>
+                  </zeroOrMore>
+                </element>
+              </oneOrMore>
+            </element>
+          </define>
+
+        </grammar>
+        """
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def __call__(self, name, content_type, data):
+
+        if content_type != 'text/xml':
+            raise RestError("Unsupported content type: %s" % content_type)
+
+        return self.parseXML(name, data)
+
+    def parseXML(self, name, xml):
+        doc = XMLDocument(xml, self.schema)
+
+        try:
+            doc.registerNs('tt', 'http://schooltool.org/ns/timetable/0.1')
+            doc.registerNs('xlink', 'http://www.w3.org/1999/xlink')
+
+            time_period_id, schema_id = name.split(".")
+
+            app = getSchoolToolApplication()
+
+            if time_period_id not in app["terms"]:
+                raise RestError("Time period not defined: %s" % time_period_id)
+            try:
+                tt = app["ttschemas"][schema_id].createTimetable()
+            except KeyError:
+                raise RestError("Timetable schema not defined: %s" % schema_id)
+            tznode = doc.query('/tt:timetable/tt:timezone')[0]
+            tt.timezone = tznode['name']
+            for day in doc.query('/tt:timetable/tt:day'):
+                day_id = day['id']
+                if day_id not in tt.keys():
+                    #XXX Ftest it!
+                    raise RestError(_("Unknown day id: %r") % day_id)
+                ttday = tt[day_id]
+                for period in day.query('tt:period'):
+                    period_id = period['id']
+                    if period_id not in ttday.periods:
+                        #XXX Ftest it!
+                        raise RestError(_("Unknown period id: %r") % period_id)
+                    for activity in period.query('tt:activity'):
+                        ttday.add(period_id, self._parseActivity(activity),
+                                  send_events=False)
+            all_periods = sets.Set()
+            for day_id, ttday in tt.items():
+                all_periods.update(ttday.keys())
+            for exc in doc.query('/tt:timetable/tt:exception'):
+                tt.exceptions.append(self._parseException(exc, all_periods))
+        finally:
+            doc.free()
+
+        return tt
+
+    def _parseActivity(self, activity_node):
+        """Parse the <activity> element and return a TimetableActivity.
+
+        The element looks like this:
+
+            <activity title="TITLE">
+              <resource xlink:href="/PATH1" />
+              <resource xlink:href="/PATH2" />
+              ...
+            </activity>
+
+        There can be zero or more resource elements.
+        """
+        title = activity_node['title']
+        resources = []
+        for resource in activity_node.query('tt:resource'):
+            path = unquote_uri(resource['xlink:href'])
+            try:
+                st_app = getSchoolToolApplication()
+                st_url = zapi.absoluteURL(st_app, self.request)
+                path = path.replace("%s/" % st_url, "")
+                res = traverse(st_app, path)
+            except TraversalError, e:
+                raise RestError("Bad URI: %s" % path)
+
+            resources.append(res)
+
+        # removeSecurityProxy needed because we will put the TimetableActivity
+        # into ZODB
+        owner = removeSecurityProxy(self.context.__parent__)
+        return TimetableActivity(title, owner, resources=resources)
+
+
+class TimetablePUT(object):
+    """Put handler for existing timetables
+    """
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def PUT(self):
+        request = self.request
+
+        for name in request:
+            if name.startswith('HTTP_CONTENT_'):
+                # Unimplemented content header
+                request.response.setStatus(501)
+                return ''
+
+        body = self.request.bodyStream
+        data = body.read()
+        container = self.context.__parent__
+        name = self.context.__name__
+
+        factory = queryMultiAdapter((container, self.request),
+                                    ITimetableFileFactory)
+        container[name] = factory.parseXML(name, data)
+        return ''
+
+
+class TimetableTraverser(traverser.NameTraverserPlugin):
+
+    traversalName = 'timetables'
+    component = TimetableDict
+
+    def _traverse(self, request, name):
+        return ITimetables(self.context).timetables
+
+
+class NullTimetable(NullResource):
+    """Placeholder objects for new timetables to be created via PUT"""
+
+    implements(INullTimetable)
+
+
+class TimetableDictPublishTraverse(ItemTraverser):
+    """Traverser for a_timetabled_object/timetables"""
+
+    adapts(ITimetableDict, IHTTPRequest)
+    implements(IPublishTraverse)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        # Note: the way the code is written now lets the user access
+        # existing timetables even if their name refers to a deleted
+        # term/schema. Not sure if that is a good or a bad thing.
+        itemTraverse = super(TimetableDictPublishTraverse, self)
+        try:
+            return itemTraverse.publishTraverse(request, name)
+        except NotFound:
+            pass
+
+        app = getSchoolToolApplication()
+        try:
+            term, schema = name.split('.')
+        except ValueError:
+            pass
+        else:
+            if term in app['terms'] and schema in app['ttschemas']:
+                return NullTimetable(self.context, name)
+
+        raise NotFound(self.context, name, request)
+
+
+class NullTimetablePUT(object):
+    """Put handler for null timetables
+
+    This view creates new timetable in a TimetableDict.
+    """
+
+    __used_for__ = INullTimetable
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def PUT(self):
+        for name in self.request:
+            if name.startswith('HTTP_CONTENT_'):
+                # Unimplemented content header
+                self.request.response.setStatus(501)
+                return ''
+        # Zope's NullPUT view adapts the container to IWriteDirectory,
+        # but we don't need that here.
+        container = self.context.container
+        name = self.context.name
+        factory = queryMultiAdapter((container, self.request),
+                                    ITimetableFileFactory)
+        data = self.request.bodyStream.read()
+        timetable = factory(name, self.request.getHeader('content-type', ''),
+                            data)
+        notify(ObjectCreatedEvent(timetable))
+        container[name] = timetable
+        self.request.response.setStatus(201)
+        return ''
+
+
+CompositeTimetableTraverser = traverser.AdapterTraverserPlugin(
+    'composite-timetables', ICompositeTimetables)
+
+
+class CompositeTimetablesPublishTraverse(object):
+    """Traverser for ICompositeTimetables objects
+
+    We need a timetabled object and a request:
+
+        >>> from schooltool.person.person import Person
+        >>> from zope.publisher.browser import TestRequest
+        >>> person = Person()
+        >>> request = TestRequest()
+
+    If we provide avalid name we should get the result of
+    timetabled.getCompositeTimetable:
+
+        >>> person.getCompositeTimetable = lambda term,schema: [term, schema]
+        >>> traverser = CompositeTimetablesPublishTraverse(person, request)
+        >>> traverser.publishTraverse(request, "term.schema")
+        ['term', 'schema']
+
+    If name is not valid (has too many dots for example) we should get
+    a NotFound exception:
+
+        >>> traverser.publishTraverse(request, "term.schema.aa")
+        Traceback (most recent call last):
+        ...
+        NotFound: Object: <schooltool.person.person.Person ...>,
+                  name: 'term.schema.aa'
+
+    If timetabled.getCompositeTimetable returns None we should get the
+    exception too:
+
+        >>> person.getCompositeTimetable = lambda term,schema: None
+        >>> traverser.publishTraverse(request, "term.schema")
+        Traceback (most recent call last):
+        ...
+        NotFound: Object: <schooltool.person.person.Person ...>,
+                  name: 'term.schema'
+
+    """
+
+    adapts(ICompositeTimetables, IHTTPRequest)
+    implements(IPublishTraverse)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        # Note: the way the code is written now lets the user access
+        # existing timetables even if their name refers to a deleted
+        # term/schema. Not sure if that is a good or a bad thing.
+        try:
+            term, schema = name.split('.')
+            timetable = self.context.getCompositeTimetable(term, schema)
+        except ValueError:
+            raise NotFound(self.context, name, request)
+
+        if timetable:
+            return timetable
+
+        # XXX: An HTTP traverser is responsible for looking up views, which is
+        #      not done here.
+
+        raise NotFound(self.context, name, request)
+
+
+class TimetableDictView(View):
+    """View for a timetable dict."""
+
+    template = Template("templates/timetables.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    def getTimetables(self):
+        return self.context.values()
+
+    def _timetables(self):
+        timetables = []
+        for timetable in self.getTimetables():
+            term, schema = timetable.__name__.split(".")
+            timetables.append({
+                'url': zapi.absoluteURL(timetable, self.request),
+                'term': term,
+                'schema': schema})
+        return timetables
+
+    timetables = property(_timetables)


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="schooltool">
+
+  <class class=".NullTimetable">
+    <allow interface=".INullTimetable" />
+  </class>
+
+  <!-- Traversers -->
+
+  <subscriber
+      for="..interfaces.IHaveTimetables
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".CompositeTimetableTraverser"
+      permission="zope.Public"
+      />
+
+  <subscriber
+      for="..interfaces.IOwnTimetables
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.traverser.interfaces.ITraverserPlugin"
+      factory=".TimetableTraverser"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.timetable.interfaces.ITimetableDict"
+      type="zope.publisher.interfaces.browser.IHTTPRequest"
+      provides="zope.publisher.interfaces.IPublishTraverse"
+      factory=".TimetableDictPublishTraverse"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.timetable.interfaces.ICompositeTimetables"
+      type="zope.publisher.interfaces.browser.IHTTPRequest"
+      provides="zope.publisher.interfaces.IPublishTraverse"
+      factory=".CompositeTimetablesPublishTraverse"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      provides="zope.publisher.interfaces.http.IHTTPPublisher"
+      factory="schooltool.traverser.traverser.PluggableTraverser"
+      permission="zope.Public"
+      />
+
+  <!-- Timetable Views -->
+
+  <view
+      for=".NullTimetable"
+      name="PUT"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      factory=".NullTimetablePUT"
+      permission="zope.Public"
+      allowed_attributes="PUT"
+      />
+
+  <view
+      for="schooltool.timetable.Timetable"
+      name="PUT"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      factory=".TimetablePUT"
+      permission="zope.Public"
+      allowed_attributes="PUT"
+      />
+
+  <adapter
+      for="schooltool.timetable.interfaces.ITimetableDict
+           zope.publisher.interfaces.http.IHTTPRequest"
+      provides="schooltool.app.rest.interfaces.ITimetableFileFactory"
+      factory=".TimetableFileFactory"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      name="GET"
+      factory=".schema.TimetableSchemaContainerView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="schooltool.timetable.interfaces.ITimetableSchemaContainer"
+      provides="zope.filerepresentation.interfaces.IFileFactory"
+      factory=".schema.TimetableSchemaFileFactory"
+      permission="zope.Public"
+      />
+
+  <adapter
+      for="schooltool.timetable.interfaces.ITimetableSchema"
+      provides="zope.filerepresentation.interfaces.IWriteFile"
+      factory=".schema.TimetableSchemaFile"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.timetable.interfaces.ITimetableSchema"
+      name="GET"
+      factory=".schema.TimetableSchemaView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.timetable.interfaces.ITimetable"
+      name="GET"
+      factory=".TimetableReadView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+  <view
+      for="schooltool.timetable.interfaces.ITimetableDict"
+      name="GET"
+      factory=".TimetableDictView"
+      type="zope.publisher.interfaces.http.IHTTPRequest"
+      permission="zope.Public"
+      />
+
+</configure>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/composite-timetables.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/composite-timetables.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/composite-timetables.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,271 @@
+Timetabling in SchoolTool
+=========================
+
+This functional doctest demonstrates and tests SchoolTool's timetable
+restive views.
+
+
+Overview
+--------
+
+1. Set up 1 Term, 1 Schema, a User and a a couple of Groups
+2. Add the User to both Groups
+3. Check composite Timetable for the User
+
+Prologue
+--------
+
+Add a term:
+
+    >>> print http(r"""
+    ... PUT /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+    ...             first="2003-09-01" last="2003-09-07">
+    ...     <title>2005 Fall</title>
+    ...     <daysofweek>Monday Tuesday Wednesday Thursday Friday</daysofweek>
+    ...     <holiday date="2003-09-03">Holiday</holiday>
+    ...     <holiday date="2003-09-06">Holiday</holiday>
+    ...     <holiday date="2003-09-23">Holiday</holiday>
+    ... </schooldays>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Add Schema:
+
+    >>> print rest(r"""
+    ... PUT /ttschemas/schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+    ...   <timezone name="UTC"/>
+    ...   <model factory="SequentialDaysTimetableModel">
+    ...     <daytemplate>
+    ...       <used when="default" />
+    ...       <period id="A" tstart="9:00" duration="60" />
+    ...       <period id="C" tstart="9:00" duration="60" />
+    ...       <period id="B" tstart="10:00" duration="60" />
+    ...       <period id="D" tstart="10:00" duration="60" />
+    ...     </daytemplate>
+    ...     <daytemplate>
+    ...       <used when="Friday Thursday" />
+    ...       <period id="A" tstart="8:00" duration="60" />
+    ...       <period id="C" tstart="8:00" duration="60" />
+    ...       <period id="B" tstart="11:00" duration="60" />
+    ...       <period id="D" tstart="11:00" duration="60" />
+    ...     </daytemplate>
+    ...   </model>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...     </period>
+    ...     <period id="D">
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Add a person:
+
+    >>> print rest("""
+    ... PUT /persons/john HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="John"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Add 2 groups:
+
+    >>> print rest("""
+    ... PUT /groups/boys HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Boys"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /groups/guys HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Guys"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Add John to boys an guys:
+
+    >>> print rest("""
+    ... POST /persons/john/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/groups/boys"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /persons/john/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...               xlink:href="http://localhost/groups/guys"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Add a course:
+
+    >>> print rest("""
+    ... PUT /courses/birdwatching HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+And a couple of sections:
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding1"
+    ...         course="birding" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-2 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding2"
+    ...         course="birding" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+Let's add guys and boys to different sections:
+
+    >>> print rest("""
+    ... POST /groups/guys/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...  xlink:href="http://localhost/sections/birdwatching-1"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest("""
+    ... POST /groups/boys/relationships HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <relationship xmlns="http://schooltool.org/ns/model/0.1"
+    ...               xmlns:xlink="http://www.w3.org/1999/xlink"
+    ...               xlink:type="simple"
+    ...               xlink:role="http://schooltool.org/ns/membership/group"
+    ...               xlink:arcrole="http://schooltool.org/ns/membership"
+    ...  xlink:href="http://localhost/sections/birdwatching-2"/>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+Add section timetables:
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-1/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...       <activity title="English for boys"/>
+    ...     </period>
+    ...     <period id="D">
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-2/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...     </period>
+    ...     <period id="D">
+    ...       <activity title="English for tough guys"/>
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    ...
+
+
+Epilogue
+--------
+
+ vim: ft=rest


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/composite-timetables.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/test_all.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/test_all.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/test_all.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,35 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Functional tests for schooltool.timetable.
+
+$Id: test_all.py 6553 2007-01-09 18:43:00Z ignas $
+"""
+
+import unittest
+
+from schooltool.testing.functional import collect_ftests
+from schooltool.timetable.ftesting import timetable_functional_layer
+
+def test_suite():
+    return collect_ftests(layer=timetable_functional_layer)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/test_all.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/timetabling.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/timetabling.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/timetabling.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,714 @@
+Timetabling in SchoolTool
+=========================
+
+This functional doctest demonstrates and tests SchoolTool's timetable
+RESTive views.
+
+
+Overview
+--------
+
+1. Definition of terms
+2. Definition of timetable schemas
+3. Usage of timetables
+
+
+Terms
+-----
+
+Initially there are no terms defined.
+
+    >>> print rest(r"""
+    ... GET /terms HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>terms</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/terms/acl"/>
+    </container>
+    <BLANKLINE>
+
+The manager can add one.
+
+    >>> print http(r"""
+    ... PUT /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+    ...             first="2003-09-01" last="2003-09-07">
+    ...     <title>2005 Fall</title>
+    ...     <daysofweek>Monday Tuesday Wednesday Thursday Friday</daysofweek>
+    ...     <holiday date="2003-09-03">Holiday</holiday>
+    ...     <holiday date="2003-09-06">Holiday</holiday>
+    ...     <holiday date="2003-09-23">Holiday</holiday>
+    ... </schooldays>
+    ... """)
+    HTTP/1.1 201 Created
+    Content-Length: 0
+    Location: ...
+    Set-Cookie: ...
+    <BLANKLINE>
+
+The new term is there
+
+    >>> print rest(r"""
+    ... GET /terms HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>terms</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/terms/2005-fall"
+              xlink:title="2005 Fall"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/terms/acl"/>
+    </container>
+    <BLANKLINE>
+
+
+You can look at it
+
+    >>> print str(rest(r"""
+    ... GET /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)).replace("\r\n", "\n")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/calendar; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    PRODID:-//SchoolTool.org/NONSGML SchoolTool//EN
+    VERSION:2.0
+    BEGIN:VEVENT
+    UID:school-period-/terms/2005-fall at localhost
+    SUMMARY:School Period
+    DTSTART;VALUE=DATE:20030901
+    DTEND;VALUE=DATE:20030908
+    DTSTAMP:...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:schoolday-20030901-/terms/2005-fall at localhost
+    SUMMARY:Schoolday
+    DTSTART;VALUE=DATE:20030901
+    DTSTAMP:...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:schoolday-20030902-/terms/2005-fall at localhost
+    SUMMARY:Schoolday
+    DTSTART;VALUE=DATE:20030902
+    DTSTAMP:...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:schoolday-20030904-/terms/2005-fall at localhost
+    SUMMARY:Schoolday
+    DTSTART;VALUE=DATE:20030904
+    DTSTAMP:...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:schoolday-20030905-/terms/2005-fall at localhost
+    SUMMARY:Schoolday
+    DTSTART;VALUE=DATE:20030905
+    DTSTAMP:...
+    END:VEVENT
+    END:VCALENDAR
+    <BLANKLINE>
+
+
+You can edit it:
+
+    >>> print rest(r"""
+    ... PUT /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/calendar; charset=UTF-8
+    ...
+    ... BEGIN:VCALENDAR
+    ... PRODID:-//SchoolTool.org/NONSGML SchoolTool//EN
+    ... VERSION:2.0
+    ... BEGIN:VEVENT
+    ... UID:school-period-/terms/2005-fall at localhost
+    ... SUMMARY:School Period
+    ... DTSTART;VALUE=DATE:20030901
+    ... DTEND;VALUE=DATE:20030908
+    ... DTSTAMP:20050511T145037Z
+    ... END:VEVENT
+    ... BEGIN:VEVENT
+    ... UID:schoolday-20030901-/terms/2005-fall at localhost
+    ... SUMMARY:Schoolday
+    ... DTSTART;VALUE=DATE:20030901
+    ... DTSTAMP:20050511T145037Z
+    ... END:VEVENT
+    ... BEGIN:VEVENT
+    ... UID:schoolday-20030902-/terms/2005-fall at localhost
+    ... SUMMARY:Schoolday
+    ... DTSTART;VALUE=DATE:20030902
+    ... DTSTAMP:20050511T145037Z
+    ... END:VEVENT
+    ... BEGIN:VEVENT
+    ... UID:schoolday-20030903-/terms/2005-fall at localhost
+    ... SUMMARY:Schoolday
+    ... DTSTART;VALUE=DATE:20030903
+    ... DTSTAMP:20050511T145037Z
+    ... END:VEVENT
+    ... END:VCALENDAR
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+
+Last two days should not be holidays now, and there should be an
+additional day:
+
+    >>> print str(rest(r"""
+    ... GET /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)).replace("\r\n", "\n")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/calendar; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    BEGIN:VCALENDAR
+    PRODID:-//SchoolTool.org/NONSGML SchoolTool//EN
+    VERSION:2.0
+    BEGIN:VEVENT
+    UID:school-period-/terms/2005-fall at localhost
+    SUMMARY:School Period
+    DTSTART;VALUE=DATE:20030901
+    DTEND;VALUE=DATE:20030908
+    DTSTAMP:...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:schoolday-20030901-/terms/2005-fall at localhost
+    SUMMARY:Schoolday
+    DTSTART;VALUE=DATE:20030901
+    DTSTAMP:...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:schoolday-20030902-/terms/2005-fall at localhost
+    SUMMARY:Schoolday
+    DTSTART;VALUE=DATE:20030902
+    DTSTAMP:...
+    END:VEVENT
+    BEGIN:VEVENT
+    UID:schoolday-20030903-/terms/2005-fall at localhost
+    SUMMARY:Schoolday
+    DTSTART;VALUE=DATE:20030903
+    DTSTAMP:...
+    END:VEVENT
+    END:VCALENDAR
+    <BLANKLINE>
+
+We should be capable of deleting the term:
+
+    >>> print rest(r"""
+    ... DELETE /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+The term should be gone now:
+
+    >>> print rest(r"""
+    ... GET /terms HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>terms</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/terms/acl"/>
+    </container>
+    <BLANKLINE>
+
+
+Timetable schemas
+-----------------
+
+There should be no timetable schemas yet:
+
+    >>> print rest(r"""
+    ... GET /ttschemas/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>ttschemas</name>
+      <items>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/ttschemas/acl"/>
+    </container>
+    <BLANKLINE>
+
+Let's add a timetable schema:
+
+    >>> print rest(r"""
+    ... PUT /ttschemas/schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+    ...   <title>Some Title</title>
+    ...   <timezone name="UTC"/>
+    ...   <model factory="SequentialDaysTimetableModel">
+    ...     <daytemplate>
+    ...       <used when="Friday Thursday" />
+    ...       <period id="A" tstart="8:00" duration="60" />
+    ...       <period id="C" tstart="8:00" duration="60" />
+    ...       <period id="B" tstart="11:00" duration="60" />
+    ...       <period id="D" tstart="11:00" duration="60" />
+    ...     </daytemplate>
+    ...     <daytemplate>
+    ...       <used when="default" />
+    ...       <period id="A" tstart="9:00" duration="60" />
+    ...       <period id="C" tstart="9:00" duration="60" />
+    ...       <period id="B" tstart="10:00" duration="60" />
+    ...       <period id="D" tstart="10:00" duration="60" />
+    ...     </daytemplate>
+    ...   </model>
+    ...   <day id="Day 1">
+    ...     <period id="A" />
+    ...     <period id="B" />
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C" />
+    ...     <period id="D" />
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 201 Created
+    Content-Length: 0
+    Location: ...
+    Set-Cookie: ...
+    <BLANKLINE>
+
+
+We should see this new schema in the container:
+
+    >>> print rest(r"""
+    ... GET /ttschemas/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <container xmlns:xlink="http://www.w3.org/1999/xlink">
+      <name>ttschemas</name>
+      <items>
+        <item xlink:type="simple"
+              xlink:href="http://localhost/ttschemas/schema1"
+              xlink:title="schema1"/>
+      </items>
+      <acl xlink:type="simple" xlink:title="ACL"
+           xlink:href="http://localhost/ttschemas/acl"/>
+    </container>
+    <BLANKLINE>
+
+
+Let's see what's inside:
+
+    >>> print rest(r"""
+    ... GET /ttschemas/schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """, handle_errors=False)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+      <title>Some Title</title>
+      <timezone name="UTC"/>
+      <model factory="SequentialDaysTimetableModel">
+        <daytemplate>
+          <used when="Friday Thursday"/>
+          <period duration="60" tstart="08:00"/>
+          <period duration="60" tstart="11:00"/>
+        </daytemplate>
+        <daytemplate>
+          <used when="default"/>
+          <period duration="60" tstart="09:00"/>
+          <period duration="60" tstart="10:00"/>
+        </daytemplate>
+      </model>
+      <day id="Day 1">
+        <period id="A"/>
+        <period id="B"/>
+      </day>
+      <day id="Day 2">
+        <period id="C"/>
+        <period id="D"/>
+      </day>
+    </timetable>
+
+
+Let's modify the timetable schema:
+
+    >>> print rest(r"""
+    ... PUT /ttschemas/schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+    ...   <timezone name="UTC"/>
+    ...   <model factory="SequentialDaysTimetableModel">
+    ...     <daytemplate>
+    ...       <used when="Friday Thursday" />
+    ...       <period id="A" tstart="8:00" duration="70" />
+    ...       <period id="C" tstart="8:00" duration="70" />
+    ...       <period id="B" tstart="11:00" duration="70" />
+    ...       <period id="D" tstart="11:00" duration="70" />
+    ...     </daytemplate>
+    ...     <daytemplate>
+    ...       <used when="default" />
+    ...       <period id="A" tstart="10:00" duration="60" />
+    ...       <period id="C" tstart="10:00" duration="60" />
+    ...       <period id="B" tstart="11:00" duration="60" />
+    ...       <period id="D" tstart="11:00" duration="60" />
+    ...     </daytemplate>
+    ...   </model>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...     </period>
+    ...     <period id="D">
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+
+And check that schema was indeed modified:
+
+    >>> print rest(r"""
+    ... GET /ttschemas/schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+      <title>Schema</title>
+      <timezone name="UTC"/>
+      <model factory="SequentialDaysTimetableModel">
+        <daytemplate>
+          <used when="Friday Thursday"/>
+          <period duration="70" tstart="08:00"/>
+          <period duration="70" tstart="11:00"/>
+        </daytemplate>
+        <daytemplate>
+          <used when="default"/>
+          <period duration="60" tstart="10:00"/>
+          <period duration="60" tstart="11:00"/>
+        </daytemplate>
+      </model>
+      <day id="Day 1">
+        <period id="A"/>
+        <period id="B"/>
+      </day>
+      <day id="Day 2">
+        <period id="C"/>
+        <period id="D"/>
+      </day>
+    </timetable>
+
+Trying to put an invalid schema should get us an error:
+
+    >>> print rest(r"""
+    ... PUT /ttschemas/schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+    ...   <timezone name="UTC"/>
+    ...   <model factory="SequentialDaysTimetableModel">
+    ...     <daytemplate>
+    ...       <used when="Friday Thursday" />
+    ...       <period id="A" tstart="8:00" duration="70" />
+    ...       <period id="B" tstart="11:00" duration="70" />
+    ...       <period id="D" tstart="11:00" duration="70" />
+    ...     </daytemplate>
+    ...     <daytemplate>
+    ...       <used when="default" />
+    ...       <period id="A" tstart="10:00" duration="60" />
+    ...       <period id="B" tstart="11:00" duration="60" />
+    ...       <period id="D" tstart="11:00" duration="60" />
+    ...     </daytemplate>
+    ...   </model>
+    ...   <day id="Day 1">
+    ...     <period id="A" />
+    ...     <period id="A" />
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 400 Bad Request
+    Content-Length: ...
+    Content-Type: text/plain; charset=utf-8
+    <BLANKLINE>
+    Duplicate periods in schema
+
+
+Timetables
+----------
+
+We will need at least one term (we have deleted the one inserted in the first
+test):
+
+    >>> print http(r"""
+    ... PUT /terms/2005-fall HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <schooldays xmlns="http://schooltool.org/ns/schooldays/0.1"
+    ...             first="2003-09-01" last="2003-09-07">
+    ...     <title>2005 Fall</title>
+    ...     <daysofweek>Monday Tuesday Wednesday Thursday Friday</daysofweek>
+    ...     <holiday date="2003-09-03">Holiday</holiday>
+    ...     <holiday date="2003-09-06">Holiday</holiday>
+    ...     <holiday date="2003-09-23">Holiday</holiday>
+    ... </schooldays>
+    ... """)
+    HTTP/1.1 201 Created
+    Content-Length: 0
+    Location: ...
+    Set-Cookie: ...
+    <BLANKLINE>
+
+
+Add a course:
+
+    >>> print rest("""
+    ... PUT /courses/birdwatching HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding"/>
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+And a section:
+
+    >>> print rest("""
+    ... PUT /sections/birdwatching-1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <object xmlns="http://schooltool.org/ns/model/0.1" title="Birding1"
+    ...         course="birding" />
+    ... """)
+    HTTP/1.1 201 Created
+    ...
+
+We can now add a timetable for the person:
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-1/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...       <activity title="English"/>
+    ...     </period>
+    ...     <period id="D">
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """, handle_errors=False)
+    HTTP/1.1 201 Created
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+It should be there:
+
+    >>> print rest(r"""
+    ... GET /sections/birdwatching-1/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+               xmlns:xlink="http://www.w3.org/1999/xlink">
+      <timezone name="UTC"/>
+      <day id="Day 1">
+        <period id="A">
+        </period>
+        <period id="B">
+        </period>
+      </day>
+      <day id="Day 2">
+        <period id="C">
+          <activity title="English">
+          </activity>
+        </period>
+        <period id="D">
+        </period>
+      </day>
+    </timetable>
+
+Let's modify it:
+
+    >>> print rest(r"""
+    ... PUT /sections/birdwatching-1/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool
+    ... Content-Type: text/xml
+    ...
+    ... <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+    ...            xmlns:xlink="http://www.w3.org/1999/xlink">
+    ...   <timezone name="UTC"/>
+    ...   <day id="Day 1">
+    ...     <period id="A">
+    ...     </period>
+    ...     <period id="B">
+    ...     </period>
+    ...   </day>
+    ...   <day id="Day 2">
+    ...     <period id="C">
+    ...       <activity title="English"/>
+    ...       <activity title="Math"/>
+    ...     </period>
+    ...     <period id="D">
+    ...       <activity title="English"/>
+    ...     </period>
+    ...   </day>
+    ... </timetable>
+    ... """)
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+The timetable should look different now:
+
+    >>> print rest(r"""
+    ... GET /sections/birdwatching-1/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+               xmlns:xlink="http://www.w3.org/1999/xlink">
+      <timezone name="UTC"/>
+      <day id="Day 1">
+        <period id="A">
+        </period>
+        <period id="B">
+        </period>
+      </day>
+      <day id="Day 2">
+        <period id="C">
+          <activity title="English">
+          </activity>
+          <activity title="Math">
+          </activity>
+        </period>
+        <period id="D">
+          <activity title="English">
+          </activity>
+        </period>
+      </day>
+    </timetable>
+
+Let's look at the list of timetables we have now:
+
+    >>> print rest(r"""
+    ... GET /sections/birdwatching-1/timetables/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetables xmlns:xlink="http://www.w3.org/1999/xlink">
+      <timetable xlink:type="simple" term="2005-fall"
+                 xlink:href="http://localhost/sections/birdwatching-1/timetables/2005-fall.schema1"
+                 schema="schema1"/>
+    </timetables>
+    <BLANKLINE>
+
+Let's delete it:
+
+    >>> print rest(r"""
+    ... DELETE /sections/birdwatching-1/timetables/2005-fall.schema1 HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 200 Ok
+    Content-Length: 0
+    Set-Cookie: ...
+    <BLANKLINE>
+
+Now it's gone:
+
+    >>> print rest(r"""
+    ... GET /sections/birdwatching-1/timetables/ HTTP/1.1
+    ... Authorization: Basic manager:schooltool""")
+    HTTP/1.1 200 Ok
+    Content-Length: ...
+    Content-Type: text/xml; charset=UTF-8
+    Set-Cookie: ...
+    <BLANKLINE>
+    <timetables xmlns:xlink="http://www.w3.org/1999/xlink">
+    </timetables>
+    <BLANKLINE>
+
+
+Epilogue
+--------
+
+ vim: ft=rest


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/ftests/timetabling.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/schema.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/schema.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/schema.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,360 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+RESTive views for timetable schemas
+
+$Id: schema.py 5990 2006-04-27 16:38:09Z faassen $
+"""
+import sets
+import datetime
+
+from zope.interface import implements
+from zope.component import adapts
+from zope.app import zapi
+from zope.filerepresentation.interfaces import IFileFactory, IWriteFile
+
+from schooltool.app.rest import View, Template
+from schooltool.app.rest.app import GenericContainerView
+from schooltool.app.rest.errors import RestError
+from schooltool.xmlparsing import XMLDocument
+from schooltool.common import parse_date, parse_time
+from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+from schooltool.timetable.interfaces import ITimetableModelFactory
+from schooltool.timetable.schema import TimetableSchema, TimetableSchemaDay
+from schooltool.timetable.schema import TimetableSchemaContainer
+
+
+class TimetableSchemaContainerView(GenericContainerView):
+    """RESTive view of a TimetableSchemaContainer."""
+
+    def items(self):
+        return [{'href': zapi.absoluteURL(self.context[key], self.request),
+                 'title': self.context[key].__name__}
+                for key in self.context.keys()]
+
+
+class TimetableSchemaView(View):
+    """View for ITimetableSchema"""
+
+    dows = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
+            'Friday', 'Saturday', 'Sunday']
+
+    template = Template("templates/timetable_schema.pt",
+                        content_type="text/xml; charset=UTF-8")
+
+    def exceptiondayids(self):
+        result = []
+
+        for date, id in self.context.model.exceptionDayIds.items():
+            result.append({'when': str(date), 'id': id})
+
+        result.sort(lambda a, b: cmp((a['when'], a['id']),
+                                     (b['when'], b['id'])))
+        return result
+
+    def daytemplates(self):
+        items = self.context.items()
+        id = items[0][0]
+        #import pdb; pdb.set_trace()
+        result = []
+        for id, day in self.context.model.dayTemplates.items():
+            if id is None:
+                used = "default"
+            elif id in self.context.keys():
+                used = id
+            else:
+                used = self.dows[id]
+            periods = []
+            for period in day:
+                periods.append(
+                    {'id': None,
+                     'tstart': period.tstart.strftime("%H:%M"),
+                     'duration': period.duration.seconds / 60})
+            periods.sort()
+            for template in result:
+                if template['periods'] == periods:
+                    days = template['used'].split()
+                    days.append(used)
+                    days.sort()
+                    template['used'] = " ".join(days)
+                    break
+            else:
+                result.append({'used': used, 'periods': periods})
+
+        for date, day in self.context.model.exceptionDays.items():
+            periods = []
+            for period, slot in day:
+                periods.append(
+                    {'id': period,
+                     'tstart': slot.tstart.strftime("%H:%M"),
+                     'duration': slot.duration.seconds / 60})
+            periods.sort()
+            result.append({'used': str(date), 'periods': periods})
+
+        result.sort(lambda a, b: cmp((a['used'], a['periods']),
+                                     (b['used'], b['periods'])))
+
+        return result
+
+
+class TimetableSchemaFileFactory(object):
+
+    implements(IFileFactory)
+    adapts(TimetableSchemaContainer)
+
+    dows = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
+            'Friday', 'Saturday', 'Sunday']
+
+    schema = """<?xml version="1.0" encoding="UTF-8"?>
+         <!--
+         RelaxNG grammar for a timetable.
+         -->
+         <grammar xmlns="http://relaxng.org/ns/structure/1.0"
+                  ns="http://schooltool.org/ns/timetable/0.1"
+                  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
+           <define name="idattr">
+              <attribute name="id">
+                 <text/>
+              </attribute>
+           </define>
+           <define name="daysofweek">
+             <!-- space separated list of weekdays -->
+             <text/>
+           </define>
+           <start>
+             <ref name="timetable"/>
+           </start>
+           <define name="timetable">
+             <element name="timetable">
+               <optional>
+                 <element name="title">
+                   <text />
+                 </element>
+               </optional>
+               <element name="timezone">
+                 <attribute name="name">
+                   <text />
+                 </attribute>
+               </element>
+               <element name="model">
+                 <attribute name="factory">
+                   <text/>
+                 </attribute>
+                 <oneOrMore>
+                   <element name="daytemplate">
+                     <element name="used">
+                       <attribute name="when">
+                         <ref name="daysofweek"/>
+                       </attribute>
+                     </element>
+                     <zeroOrMore>
+                       <element name="period">
+                         <optional>
+                           <!-- Backwards compat -->
+                           <ref name="idattr"/>
+                         </optional>
+                         <attribute name="tstart">
+                           <!-- XXX  d?d:dd -->
+                           <text/>
+                         </attribute>
+                         <attribute name="duration">
+                           <!-- a natural number (of minutes)-->
+                           <text/>
+                         </attribute>
+                       </element>
+                     </zeroOrMore>
+                   </element>
+                 </oneOrMore>
+                 <zeroOrMore>
+                   <element name="day">
+                     <attribute name="when">
+                       <ref name="daysofweek"/>
+                     </attribute>
+                     <ref name="idattr"/>
+                   </element>
+                 </zeroOrMore>
+               </element>
+               <oneOrMore>
+                 <element name="day">
+                   <ref name="idattr"/>
+                   <zeroOrMore>
+                     <element name="period">
+                       <ref name="idattr"/>
+                       <optional>
+                         <attribute name="homeroom">
+                           <!-- presence of this attribute indicates that this
+                                period is the homeroom period -->
+                         </attribute>
+                       </optional>
+                     </element>
+                   </zeroOrMore>
+                 </element>
+               </oneOrMore>
+             </element>
+           </define>
+         </grammar>
+         """
+
+    def __init__(self, container):
+        self.container = container
+
+    def setUpSchemaDays(self, timetable, days):
+        for day in days:
+            day_id = day['id']
+            period_ids = [period['id']
+                          for period in day.query('tt:period')]
+            if len(sets.Set(period_ids)) != len(period_ids):
+                raise RestError("Duplicate periods in schema")
+
+            homeroom_periods = [period['id']
+                                for period in day.query('tt:period[@homeroom]')]
+
+            timetable[day_id] = TimetableSchemaDay(period_ids, homeroom_periods)
+
+    def parseXML(self, xml):
+        doc = XMLDocument(xml, self.schema)
+
+        try:
+            doc.registerNs('tt', 'http://schooltool.org/ns/timetable/0.1')
+            days = doc.query('/tt:timetable/tt:day')
+            day_ids = [day['id'] for day in days]
+
+            model_node = doc.query('/tt:timetable/tt:model')[0]
+            factory_id = model_node['factory']
+
+            title = None
+            titles = doc.query('/tt:timetable/tt:title')
+            if titles:
+                title_node = titles[0]
+                title = title_node.content
+
+            tznode = doc.query('/tt:timetable/tt:timezone')[0]
+            tzname = tznode['name']
+
+            factory = zapi.queryUtility(ITimetableModelFactory, factory_id)
+            if factory is None:
+                raise RestError("Incorrect timetable model factory")
+
+            templates = doc.query('/tt:timetable/tt:model/tt:daytemplate')
+            template_dict = {}
+            exceptions = {}
+
+            for template in templates:
+                day = SchooldayTemplate()
+                day_list = []
+
+                used = template.query('tt:used')[0]['when']
+                # the used attribute might contain a date, a list of
+                # week days, or a string "default"
+                try:
+                    date = parse_date(used)
+                except ValueError:
+                    date = None
+
+                # parse SchoolDayPeriods
+                for period in template.query('tt:period'):
+                    tstart_str = period['tstart']
+                    dur_str = period['duration']
+                    period_id = period.get('id', None)
+                    try:
+                        tstart = parse_time(tstart_str)
+                        duration = datetime.timedelta(minutes=int(dur_str))
+                    except ValueError:
+                        raise RestError("Bad period")
+                    else:
+                        slot = SchooldaySlot(tstart, duration)
+                        day.add(slot)
+                        day_list.append((period_id, slot))
+
+                if date is not None:
+                    # if used contains a valid date - we treat the
+                    # template as an exception
+                    for period, slot in day_list:
+                        if period is None:
+                            raise RestError("Period for %d did not have an id"
+                                            % date)
+                    exceptions[date] = day_list
+                elif used == 'default':
+                    template_dict[None] = day
+                elif used in day_ids:
+                    template_dict[used] = day
+                else:
+                    # if used is not "default" and is not a valid date
+                    # try processing it as if it was a list of weekdays
+                    for dow in used.split():
+                        try:
+                            template_dict[self.dows.index(dow)] = day
+                        except ValueError:
+                            raise RestError("Unrecognised day of week %r"
+                                            % dow)
+
+            model = factory(day_ids, template_dict)
+
+            for date, day in exceptions.items():
+                model.exceptionDays[date] = day
+
+            # Parse exceptionDayIds
+            exception_ids = doc.query('/tt:timetable/tt:model/tt:day')
+            for exception_id_tag in exception_ids:
+                used = exception_id_tag['when']
+                exception_id = exception_id_tag['id']
+
+                try:
+                    date = parse_date(used)
+                except ValueError:
+                    raise RestError("Invalid date of an exception day")
+
+                if exception_id not in model.timetableDayIds:
+                    raise RestError("Invalid date id of an exception day")
+
+                model.exceptionDayIds[date] = exception_id
+
+            # create and set up the timetable
+            if len(sets.Set(day_ids)) != len(day_ids):
+                raise RestError("Duplicate days in schema")
+
+            timetable = TimetableSchema(day_ids, title=title, model=model,
+                                        timezone=tzname)
+            self.setUpSchemaDays(timetable, days)
+
+            return timetable
+        finally:
+            doc.free()
+
+    def __call__(self, name, content_type, data):
+        if "." in name:
+            raise RestError("Time table schemas can't have dots in "
+                            "their names.")
+        if content_type != 'text/xml':
+            raise RestError("Unsupported content type: %s" % content_type)
+
+        return self.parseXML(data)
+
+
+class TimetableSchemaFile(object):
+    implements(IWriteFile)
+
+    def __init__(self, context):
+        self.context = context
+
+    def write(self, data):
+        container = self.context.__parent__
+        factory = IFileFactory(container)
+
+        container[self.context.__name__] = factory.parseXML(data)


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/schema.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,24 @@
+<timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+           xmlns:xlink="http://www.w3.org/1999/xlink"
+           xmlns:tal="http://xml.zope.org/namespaces/tal"
+           xmlns:metal="http://xml.zope.org/namespaces/metal">
+  <timezone tal:attributes="name context/timezone" />
+  <day tal:repeat="item context/items"
+       tal:attributes="id python:item[0]">
+    <period tal:define="day python:item[1]"
+            tal:repeat="item day/items"
+            tal:attributes="homeroom
+                  python:[None, ''][item[0] in day.homeroom_period_ids];
+                            id python:item[0]">
+     <tal:block tal:repeat="activity python:item[1]">
+      <activity metal:define-macro="activity"
+                tal:attributes="title activity/title">
+        <resource tal:repeat="resource activity/resources"
+                  xlink:type="simple"
+                  tal:attributes="xlink:title resource/title;
+                          xlink:href python:view.absolutePath(resource)" />
+      </activity>
+     </tal:block>
+    </period>
+  </day>
+</timetable>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable_schema.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable_schema.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable_schema.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,25 @@
+<timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+           xmlns:tal="http://xml.zope.org/namespaces/tal">
+  <title tal:content="context/title"/>
+  <timezone tal:attributes="name context/timezone" />
+  <model tal:attributes="factory context/model/factory_id">
+    <daytemplate tal:repeat="day view/daytemplates">
+      <used tal:attributes="when day/used"/>
+      <period tal:repeat="period day/periods"
+              tal:attributes="tstart period/tstart;
+                              duration period/duration;
+                              id period/id" />
+    </daytemplate>
+    <day tal:repeat="day view/exceptiondayids"
+         tal:attributes="when day/when;
+                         id day/id" />
+  </model>
+  <day tal:repeat="item context/items"
+       tal:attributes="id python:item[0]">
+    <period tal:define="day python:item[1]"
+            tal:repeat="period day/periods"
+            tal:attributes="homeroom
+                  python:[None, ''][period in day.homeroom_period_ids];
+                            id period" />
+  </day>
+</timetable>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetable_schema.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetables.pt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetables.pt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetables.pt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,7 @@
+<timetables xmlns:xlink="http://www.w3.org/1999/xlink"
+                  xmlns:tal="http://xml.zope.org/namespaces/tal">
+  <timetable tal:repeat="tt view/timetables" xlink:type="simple"
+             tal:attributes="xlink:href tt/url;
+                             term tt/term;
+                             schema tt/schema;"/>
+</timetables>


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/templates/timetables.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/__init__.py
===================================================================


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_rest.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_rest.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_rest.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,426 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.timetable.rest.
+
+$Id: test_rest.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+
+import unittest
+import datetime
+from StringIO import StringIO
+
+from zope.component import adapts
+from zope.app.testing import placelesssetup
+from zope.app.testing import ztapi, setup
+from zope.interface import implements
+from zope.interface.verify import verifyObject
+from zope.app.component.testing import PlacefulSetup
+from zope.testing.doctest import DocTestSuite, ELLIPSIS, NORMALIZE_WHITESPACE
+from zope.publisher.browser import TestRequest
+from zope.publisher.interfaces.http import IHTTPRequest
+from zope.annotation.interfaces import IAttributeAnnotatable
+
+from schooltool.testing.util import XMLCompareMixin
+from schooltool.testing import setup as sbsetup
+from schooltool.timetable import TimetablesAdapter
+from schooltool.timetable.interfaces import ITimetables
+
+
+def setUp(test=None):
+    placelesssetup.setUp(test)
+    setup.setUpAnnotations()
+    ztapi.provideAdapter(IAttributeAnnotatable, ITimetables,
+                         TimetablesAdapter)
+
+
+class TimetableTestMixin(PlacefulSetup, XMLCompareMixin):
+
+    empty_xml = """
+        <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+                   xmlns:xlink="http://www.w3.org/1999/xlink">
+          <timezone name="UTC"/>
+          <day id="Day 1">
+            <period id="A" homeroom="">
+            </period>
+            <period id="B" homeroom="">
+            </period>
+          </day>
+          <day id="Day 2">
+            <period id="C" homeroom="">
+            </period>
+            <period id="D">
+            </period>
+          </day>
+        </timetable>
+        """
+
+    full_xml = """
+        <timetable xmlns="http://schooltool.org/ns/timetable/0.1"
+                   xmlns:xlink="http://www.w3.org/1999/xlink">
+          <timezone name="Europe/Vilnius"/>
+          <day id="Day 1">
+            <period id="A" homeroom="">
+              <activity title="Maths" />
+            </period>
+            <period id="B" homeroom="">
+              <activity title="English" />
+              <activity title="French" />
+            </period>
+          </day>
+          <day id="Day 2">
+            <period id="C" homeroom="">
+              <activity title="CompSci" />
+            </period>
+            <period id="D">
+              <activity title="CompSci" />
+            </period>
+          </day>
+        </timetable>
+        """
+
+    def setUp(self):
+        PlacefulSetup.setUp(self)
+        self.app = sbsetup.setUpSchoolToolSite()
+
+        from schooltool.timetable.interfaces import IOwnTimetables
+        from schooltool.course.section import Section
+        from schooltool.resource.resource import Resource
+        self.app["sections"]["history"] = self.section = Section("History")
+        self.app["resources"]['room1'] = Resource("Room1")
+        self.app["resources"]['lab1'] = Resource("Lab1")
+        self.app["resources"]['lab2'] = Resource("Lab2")
+        self.app["resources"][u'\u017eabas'] = Resource("Zabas")
+
+        self.schema = self.app["ttschemas"]["schema1"] = self.createSchema()
+        self.term = self.app["terms"]["2003 fall"] = self.createTerm()
+        self.term2 = self.app["terms"]["2004 fall"] = self.createTerm()
+
+        from schooltool.app.rest.interfaces import ITimetableFileFactory
+        from schooltool.timetable.rest import TimetableFileFactory
+        from schooltool.timetable import TimetablesAdapter
+        from schooltool.timetable.interfaces import ITimetableDict
+        ztapi.provideAdapter((ITimetableDict, IHTTPRequest),
+                              ITimetableFileFactory,
+                              TimetableFileFactory)
+        ztapi.provideAdapter(IAttributeAnnotatable, ITimetables,
+                             TimetablesAdapter)
+
+    def createTerm(self):
+        from schooltool.term.term import Term
+        return Term("2003 fall",
+                    datetime.date(2003, 9, 1),
+                    datetime.date(2003, 9, 30))
+
+    def createSchema(self):
+        from schooltool.timetable.schema import TimetableSchemaDay
+        from schooltool.timetable.schema import TimetableSchema
+        tt = TimetableSchema(['Day 1', 'Day 2'])
+        tt['Day 1'] = TimetableSchemaDay(['A', 'B'], ['A', 'B'])
+        tt['Day 2'] = TimetableSchemaDay(['C', 'D'], ['C'])
+        return tt
+
+    def createEmpty(self):
+        return self.schema.createTimetable()
+
+    def createFull(self, owner=None):
+        from schooltool.timetable import TimetableActivity
+        tt = self.createEmpty()
+        room1 = self.app["resources"]['room1']
+        lab1 = self.app["resources"]['lab1']
+        lab2 = self.app["resources"]['lab2']
+        zab = self.app["resources"][u'\u017eabas']
+        tt['Day 1'].add('A', TimetableActivity('Maths', owner, [room1]))
+        tt['Day 1'].add('B', TimetableActivity('English', owner))
+        tt['Day 1'].add('B', TimetableActivity('French', owner))
+        tt['Day 2'].add('C', TimetableActivity('CompSci', owner, [lab1, lab2]))
+        tt['Day 2'].add('D', TimetableActivity('CompSci', owner, [zab]))
+        tt.timezone = "Europe/Vilnius"
+        return tt
+
+
+class TestTimetableReadView(TimetableTestMixin, unittest.TestCase):
+
+    def createView(self, context, request):
+        from schooltool.timetable.rest import TimetableReadView
+        return TimetableReadView(context, request)
+
+    def do_test_get(self, context, expected, ctype="text/xml"):
+        request = TestRequest()
+        view = self.createView(context, request)
+        result = view.GET()
+        self.assertEquals(request.response.getHeader('content-type'),
+                          "%s; charset=UTF-8" % ctype)
+        self.assertEqualsXML(result, expected, recursively_sort=['timetable'])
+
+    def test_get(self):
+        self.do_test_get(self.createEmpty(), self.empty_xml)
+        self.do_test_get(self.createFull(), self.full_xml)
+
+
+class TestTimetableFileFactory(TimetableTestMixin, unittest.TestCase):
+
+    namespaces = {'tt': 'http://schooltool.org/ns/timetable/0.1',
+                  'xlink': 'http://www.w3.org/1999/xlink'}
+
+    def test(self):
+        from schooltool.app.rest.interfaces import ITimetableFileFactory
+        from schooltool.timetable.rest import TimetableFileFactory
+        verifyObject(ITimetableFileFactory,
+                     TimetableFileFactory(ITimetables(self.section).timetables,
+                                          TestRequest()))
+
+    def test_call(self):
+        from schooltool.timetable.rest import TimetableFileFactory
+
+        factory = TimetableFileFactory(ITimetables(self.section).timetables,
+                                       TestRequest())
+        timetable = factory("2003 fall.schema1", "text/xml", self.full_xml)
+        self.assertEquals(timetable, self.createFull(self.section))
+
+        timetable = factory("2003 fall.schema1", "text/xml", self.empty_xml)
+        self.assertEquals(timetable, self.createEmpty())
+
+
+class TestTimetablePUT(TimetableTestMixin, unittest.TestCase):
+
+    def setUp(self):
+        TimetableTestMixin.setUp(self)
+        self.timetable = self.createEmpty()
+        timetables = ITimetables(self.section).timetables
+        timetables["2003 fall.schema1"] = self.timetable
+
+    def test_put(self):
+        from schooltool.timetable.rest import TimetablePUT
+        request = TestRequest(StringIO(self.full_xml))
+        view = TimetablePUT(self.timetable, request)
+        view.PUT()
+        self.assertEquals(
+            ITimetables(self.section).timetables["2003 fall.schema1"],
+            self.createFull(self.section))
+
+
+def doctest_TimetableDictPublishTraverse():
+    """Unit tests for TimetableDictPublishTraverse
+
+    Some setup is needed:
+
+        >>> setup.placefulSetUp()
+        >>> app = sbsetup.setUpSchoolToolSite()
+
+        >>> from datetime import date
+        >>> from schooltool.term.term import Term
+        >>> from schooltool.timetable.schema import TimetableSchema
+        >>> app['terms']['2005-fall'] = Term('2005 Fall',
+        ...         date(2005, 9, 1), date(2005, 12, 31))
+        >>> app['terms']['2006-spring'] = Term('2006 Spring',
+        ...         date(2006, 2, 1), date(2006, 6, 30))
+        >>> app['ttschemas']['default'] = TimetableSchema([])
+
+    TimetableDictPublishTraverse adapts (ITimetableDict, IHTTPRequest)
+    pair
+
+        >>> from schooltool.timetable import TimetableDict
+        >>> from schooltool.timetable.rest import TimetableDictPublishTraverse
+        >>> context = TimetableDict()
+        >>> request = TestRequest()
+        >>> pt = TimetableDictPublishTraverse(context, request)
+
+    There are three cases.
+
+    1. Existing timetable
+
+        >>> from schooltool.timetable import Timetable
+        >>> context['2005-fall.default'] = tt = Timetable([])
+        >>> obj = pt.publishTraverse(request, '2005-fall.default')
+        >>> obj
+        <Timetable: ...>
+        >>> obj is tt
+        True
+
+    2. Nonexisting timetable
+
+        >>> obj = pt.publishTraverse(request, '2006-spring.default')
+        >>> obj
+        <...NullTimetable object at ...>
+        >>> obj.container is context
+        True
+        >>> obj.name
+        '2006-spring.default'
+
+    3. Undefined term and/or schema
+
+        >>> pt.publishTraverse(request, '2006-sprig.default')
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: <...TimetableDict...>, name: '2006-sprig.default'
+
+        >>> pt.publishTraverse(request, '2006-spring.insane')
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: <...TimetableDict...>, name: '2006-spring.insane'
+
+        >>> pt.publishTraverse(request, 'too.many.dots')
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: <...TimetableDict...>, name: 'too.many.dots'
+
+        >>> pt.publishTraverse(request, 'no dots')
+        Traceback (most recent call last):
+          ...
+        NotFound: Object: <...TimetableDict...>, name: 'no dots'
+
+    Cleanup:
+
+        >>> setup.placefulTearDown()
+
+    """
+
+
+def doctest_NullTimetablePUT():
+    """Unit tests for NullTimetablePUT
+
+    Setup: there should be an adapter from ITimetableDict to
+    ITimetableFileFactory.
+
+        >>> setup.placelessSetUp()
+        >>> from schooltool.timetable.interfaces import ITimetableDict
+        >>> from schooltool.app.rest.interfaces import ITimetableFileFactory
+        >>> from schooltool.timetable import Timetable
+        >>> from zope.publisher.interfaces.http import IHTTPRequest
+        >>> class TimetableFileFactoryStub(object):
+        ...     adapts(ITimetableDict)
+        ...     implements(ITimetableFileFactory)
+        ...     def __init__(self, context, request):
+        ...         self.context = context
+        ...         self.request = request
+        ...     def __call__(self, name, ctype, data):
+        ...         print "*** Creating a timetable called %s" % name
+        ...         print "    from a %s entity containing %s" % (ctype, data)
+        ...         return Timetable([])
+        >>> ztapi.provideAdapter((ITimetableDict, IHTTPRequest),
+        ...                      ITimetableFileFactory,
+        ...                      TimetableFileFactoryStub)
+
+    Also we want to see what events are sent out
+
+        >>> import zope.event
+        >>> old_subscribers = zope.event.subscribers[:]
+        >>> def handler(event):
+        ...     print "*** Event: %r" % event
+        >>> zope.event.subscribers.append(handler)
+
+    NullTimetablePUT is a view on NullTimetable, which in turn knows
+    where the new timetable is to be placed, and how it should be
+    named.
+
+        >>> from StringIO import StringIO
+        >>> from schooltool.timetable.rest import NullTimetablePUT
+        >>> from schooltool.timetable.rest import NullTimetable
+        >>> from schooltool.timetable import TimetableDict
+        >>> container = TimetableDict()
+        >>> name = '2005-fall.default'
+        >>> context = NullTimetable(container, name)
+        >>> request = TestRequest(StringIO('<timetable data>'),
+        ...                       environ={'CONTENT_TYPE': 'text/xml'})
+        >>> view = NullTimetablePUT(context, request)
+
+        >>> view.PUT()
+        *** Creating a timetable called 2005-fall.default
+            from a text/xml entity containing <timetable data>
+        *** Event: <...ObjectCreatedEvent...>
+        ''
+        >>> request.response.getStatus()
+        201
+
+        >>> container[name]
+        <Timetable: ...>
+
+    As per the HTTP spec, NullTimetablePUT barfs if the request contains
+    unrecognized Content-* headers.
+
+        >>> request = TestRequest(StringIO('<timetable data>'),
+        ...                       environ={'CONTENT_TYPE': 'text/xml',
+        ...                                'HTTP_CONTENT_RANGE': 'blah'})
+        >>> view = NullTimetablePUT(context, request)
+        >>> view.PUT()
+        ''
+        >>> request.response.getStatus()
+        501
+
+    Cleanup:
+
+        >>> zope.event.subscribers[:] = old_subscribers
+        >>> setup.placelessTearDown()
+
+    """
+
+
+class TestTimetableDictView(TimetableTestMixin, unittest.TestCase):
+
+    def createView(self, context, request):
+        from schooltool.timetable.rest import TimetableDictView
+        return TimetableDictView(context, request)
+
+    def setUp(self):
+        TimetableTestMixin.setUp(self)
+        self.tt = ITimetables(self.section).timetables["2003 fall.schema1"] \
+                = self.createEmpty()
+
+    def test_getTimetables(self):
+        view = self.createView(ITimetables(self.section).timetables,
+                               TestRequest())
+        timetables = view.getTimetables()
+        self.assertEquals(len(timetables), 1)
+        self.assert_(timetables[0] is self.tt)
+
+    def test_timetables(self):
+        view = self.createView(ITimetables(self.section).timetables,
+                               TestRequest())
+        self.assertEquals(view.timetables, [{
+          'url': "http://127.0.0.1/sections/history/timetables/2003%20fall.schema1",
+          'term': u'2003 fall',
+          'schema': u'schema1'}])
+
+    def test_get(self):
+        view = self.createView(ITimetables(self.section).timetables,
+                               TestRequest())
+        self.assertEqualsXML(
+            view.GET(),
+            """<timetables xmlns:xlink="http://www.w3.org/1999/xlink">
+                 <timetable xlink:type="simple" term="2003 fall"
+                            xlink:href="http://127.0.0.1/sections/history/timetables/2003%20fall.schema1"
+                            schema="schema1"/>
+               </timetables>""")
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestTimetableReadView))
+    suite.addTest(unittest.makeSuite(TestTimetableFileFactory))
+    suite.addTest(unittest.makeSuite(TestTimetablePUT))
+    suite.addTest(unittest.makeSuite(TestTimetableDictView))
+    suite.addTest(DocTestSuite(optionflags=ELLIPSIS))
+    suite.addTest(DocTestSuite('schooltool.timetable.rest',
+                               setUp=setUp, tearDown=placelesssetup.tearDown,
+                               optionflags=ELLIPSIS|NORMALIZE_WHITESPACE))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_rest.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_schema.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_schema.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_schema.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,384 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.timetable.rest.schema
+
+$Id: test_schema.py 5990 2006-04-27 16:38:09Z faassen $
+"""
+import unittest
+from zope.interface import Interface
+from zope.interface import directlyProvides
+from zope.interface.verify import verifyObject
+from zope.publisher.browser import TestRequest
+from zope.filerepresentation.interfaces import IFileFactory, IWriteFile
+from zope.app.testing import ztapi, setup
+from zope.traversing import namespace
+from zope.traversing.interfaces import ITraversable
+from zope.traversing.interfaces import IContainmentRoot
+
+from schooltool.testing import setup as sbsetup
+from schooltool.testing.util import QuietLibxml2Mixin
+from schooltool.testing.util import XMLCompareMixin
+from schooltool.app.rest.errors import RestError
+
+
+class TimetableSchemaMixin(QuietLibxml2Mixin):
+
+    schema_xml = """
+        <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+          <title>Title</title>
+          <timezone name="Europe/Vilnius"/>
+          <model factory="SequentialDaysTimetableModel">
+            <daytemplate>
+              <used when="default" />
+              <period id="A" tstart="9:00" duration="60" />
+              <period id="C" tstart="9:00" duration="60" />
+              <period id="B" tstart="10:00" duration="60" />
+              <period id="D" tstart="10:00" duration="60" />
+            </daytemplate>
+            <daytemplate>
+              <used when="Friday Thursday" />
+              <period id="A" tstart="8:00" duration="60" />
+              <period id="C" tstart="8:00" duration="60" />
+              <period id="B" tstart="11:00" duration="60" />
+              <period id="D" tstart="11:00" duration="60" />
+            </daytemplate>
+            <daytemplate>
+              <used when="2005-07-07" />
+              <period id="A" tstart="8:00" duration="30" />
+              <period id="B" tstart="8:30" duration="30" />
+              <period id="C" tstart="9:00" duration="30" />
+              <period id="D" tstart="9:30" duration="30" />
+            </daytemplate>
+            <day when="2005-07-08" id="Day 2" />
+            <day when="2005-07-09" id="Day 1" />
+          </model>
+          <day id="Day 1">
+            <period id="A" homeroom="">
+            </period>
+            <period id="B">
+            </period>
+          </day>
+          <day id="Day 2">
+            <period id="C">
+            </period>
+            <period id="D">
+            </period>
+          </day>
+        </timetable>
+        """
+
+    schema_without_title_xml = schema_xml.replace("<title>Title</title>", "")
+
+    def setUp(self):
+        from schooltool.timetable.interfaces import ITimetableSchemaContainer
+        from schooltool.timetable.rest.schema import TimetableSchemaFileFactory
+        from schooltool.timetable import SequentialDaysTimetableModel
+        from schooltool.timetable import SequentialDayIdBasedTimetableModel
+        from schooltool.timetable.interfaces import ITimetableModelFactory
+
+        self.app = sbsetup.createSchoolToolApplication()
+        self.schemaContainer = self.app["ttschemas"]
+
+        setup.placelessSetUp()
+        setup.setUpTraversal()
+
+        ztapi.provideAdapter(ITimetableSchemaContainer, IFileFactory,
+                             TimetableSchemaFileFactory)
+
+        ztapi.provideUtility(ITimetableModelFactory,
+                             SequentialDaysTimetableModel,
+                             "SequentialDaysTimetableModel")
+
+        ztapi.provideUtility(ITimetableModelFactory,
+                             SequentialDayIdBasedTimetableModel,
+                             "SequentialDayIdBasedTimetableModel")
+
+        ztapi.provideView(Interface, Interface, ITraversable, 'view',
+                          namespace.view)
+
+        directlyProvides(self.schemaContainer, IContainmentRoot)
+
+        self.setUpLibxml2()
+
+    def tearDown(self):
+        self.tearDownLibxml2()
+        setup.placelessTearDown()
+
+    def createEmptySchema(self):
+        from schooltool.timetable.schema import TimetableSchemaDay
+        from schooltool.timetable.schema import TimetableSchema
+        schema = TimetableSchema(['Day 1', 'Day 2'])
+        schema['Day 1'] = TimetableSchemaDay(['A', 'B'], ['A'])
+        schema['Day 2'] = TimetableSchemaDay(['C', 'D'])
+        schema.title = "A Schema"
+        return schema
+
+    def createExtendedSchema(self):
+        from schooltool.timetable import SequentialDaysTimetableModel
+        from schooltool.timetable import SchooldaySlot, SchooldayTemplate
+        from datetime import time, timedelta, date
+
+        tt = self.createEmptySchema()
+
+        tt.timezone = 'Europe/Vilnius'
+
+        hour = timedelta(minutes=60)
+        half = timedelta(minutes=30)
+
+        day_template1 = SchooldayTemplate()
+        day_template1.add(SchooldaySlot(time(9, 0), hour))
+        day_template1.add(SchooldaySlot(time(10, 0), hour))
+        day_template1.add(SchooldaySlot(time(9, 0), hour))
+        day_template1.add(SchooldaySlot(time(10, 0), hour))
+
+        day_template2 = SchooldayTemplate()
+        day_template2.add(SchooldaySlot(time(8, 0), hour))
+        day_template2.add(SchooldaySlot(time(11, 0), hour))
+        day_template2.add(SchooldaySlot(time(8, 0), hour))
+        day_template2.add(SchooldaySlot(time(11, 0), hour))
+
+        tm = SequentialDaysTimetableModel(['Day 1', 'Day 2'],
+                                          {None: day_template1,
+                                           3: day_template2,
+                                           4: day_template2})
+        tt.model = tm
+
+        short_template = [
+            ('A', SchooldaySlot(time(8, 0), half)),
+            ('B', SchooldaySlot(time(8, 30), half)),
+            ('C', SchooldaySlot(time(9, 0), half)),
+            ('D', SchooldaySlot(time(9, 30), half))]
+        tt.model.exceptionDays[date(2005, 7, 7)] = short_template
+        tt.model.exceptionDayIds[date(2005, 7, 8)] = 'Day 2'
+        tt.model.exceptionDayIds[date(2005, 7, 9)] = 'Day 1'
+        return tt
+
+
+class TestTimetableSchemaView(TimetableSchemaMixin, XMLCompareMixin,
+                              unittest.TestCase):
+
+    empty_xml = """
+        <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+          <title>A Schema</title>
+          <timezone name="Europe/Vilnius"/>
+          <model factory="SequentialDaysTimetableModel">
+            <daytemplate>
+              <used when="2005-07-07"/>
+              <period duration="30" id="A" tstart="08:00"/>
+              <period duration="30" id="B" tstart="08:30"/>
+              <period duration="30" id="C" tstart="09:00"/>
+              <period duration="30" id="D" tstart="09:30"/>
+            </daytemplate>
+            <daytemplate>
+              <used when="Friday Thursday"/>
+              <period duration="60" tstart="08:00"/>
+              <period duration="60" tstart="11:00"/>
+            </daytemplate>
+            <daytemplate>
+              <used when="default"/>
+              <period duration="60" tstart="09:00"/>
+              <period duration="60" tstart="10:00"/>
+            </daytemplate>
+            <day when="2005-07-08" id="Day 2" />
+            <day when="2005-07-09" id="Day 1" />
+          </model>
+          <day id="Day 1">
+            <period id="A" homeroom="">
+            </period>
+            <period id="B">
+            </period>
+          </day>
+          <day id="Day 2">
+            <period id="C">
+            </period>
+            <period id="D">
+            </period>
+          </day>
+        </timetable>
+        """
+
+    def test_get(self):
+        from schooltool.timetable.rest.schema import TimetableSchemaView
+        request = TestRequest()
+        view = TimetableSchemaView(self.createExtendedSchema(), request)
+
+        result = view.GET()
+        self.assertEquals(request.response.getHeader('content-type'),
+                          "text/xml; charset=UTF-8")
+        self.assertEqualsXML(result, self.empty_xml)
+
+
+class DayIdBasedModelMixin:
+
+    empty_xml = """
+        <timetable xmlns="http://schooltool.org/ns/timetable/0.1">
+          <title>Title</title>
+          <timezone name="UTC"/>
+          <model factory="SequentialDayIdBasedTimetableModel">
+            <daytemplate>
+              <used when="Day 1"/>
+              <period duration="60" tstart="08:00"/>
+              <period duration="60" tstart="11:00"/>
+            </daytemplate>
+            <daytemplate>
+              <used when="Day 2"/>
+              <period duration="60" tstart="09:00"/>
+              <period duration="60" tstart="10:00"/>
+            </daytemplate>
+            <day when="2005-07-08" id="Day 2" />
+            <day when="2005-07-09" id="Day 1" />
+          </model>
+          <day id="Day 1">
+            <period id="A" homeroom="">
+            </period>
+            <period id="B">
+            </period>
+          </day>
+          <day id="Day 2">
+            <period id="C">
+            </period>
+            <period id="D">
+            </period>
+          </day>
+        </timetable>
+        """
+
+    def createExtendedSchema(self):
+        from schooltool.timetable.schema import TimetableSchemaDay
+        from schooltool.timetable.schema import TimetableSchema
+        from schooltool.timetable import SequentialDayIdBasedTimetableModel
+        from schooltool.timetable import SchooldaySlot, SchooldayTemplate
+        from datetime import time, timedelta, date
+
+        tt = TimetableSchema(['Day 1', 'Day 2'])
+        tt['Day 1'] = TimetableSchemaDay(['A', 'B'], ['A'])
+        tt['Day 2'] = TimetableSchemaDay(['C', 'D'])
+        tt.title = "Title"
+
+        hour = timedelta(minutes=60)
+        half = timedelta(minutes=30)
+
+        day_template1 = SchooldayTemplate()
+        day_template1.add(SchooldaySlot(time(8, 0), hour))
+        day_template1.add(SchooldaySlot(time(11, 0), hour))
+        day_template1.add(SchooldaySlot(time(8, 0), hour))
+        day_template1.add(SchooldaySlot(time(11, 0), hour))
+
+        day_template2 = SchooldayTemplate()
+        day_template2.add(SchooldaySlot(time(9, 0), hour))
+        day_template2.add(SchooldaySlot(time(10, 0), hour))
+        day_template2.add(SchooldaySlot(time(9, 0), hour))
+        day_template2.add(SchooldaySlot(time(10, 0), hour))
+
+        tm = SequentialDayIdBasedTimetableModel(['Day 1', 'Day 2'],
+                                                {'Day 1': day_template1,
+                                                 'Day 2': day_template2})
+        tt.model = tm
+
+        tt.model.exceptionDayIds[date(2005, 7, 8)] = 'Day 2'
+        tt.model.exceptionDayIds[date(2005, 7, 9)] = 'Day 1'
+        return tt
+
+
+class TestTimetableSchemaViewDayIdBased(DayIdBasedModelMixin,
+                                        TestTimetableSchemaView):
+    pass
+
+
+class TestTimetableSchemaFileFactory(TimetableSchemaMixin, unittest.TestCase):
+
+    def test(self):
+        from schooltool.timetable.rest.schema import TimetableSchemaFileFactory
+        verifyObject(IFileFactory,
+                     TimetableSchemaFileFactory(self.schemaContainer))
+
+    def test_call(self):
+        factory = IFileFactory(self.schemaContainer)
+        self.assertRaises(RestError, factory, "two_day", "text/plain",
+                          self.schema_xml)
+
+    def test_parseXML(self):
+        factory = IFileFactory(self.schemaContainer)
+        schema = factory("two_day", "text/xml", self.schema_without_title_xml)
+        self.assertEquals(schema.title, "Schema")
+        self.assertEquals(schema, self.createExtendedSchema())
+
+        schema = factory("two_day", "text/xml", self.schema_xml)
+        self.assertEquals(schema.title, "Title")
+        self.assertEquals(schema, self.createExtendedSchema())
+
+    def test_invalid_name(self):
+        from schooltool.app.rest.errors import RestError
+        self.assertRaises(RestError, IFileFactory(self.schemaContainer),
+                          "foo.bar", "text/xml", self.schema_xml)
+
+    def test_setUpSchemaDays_two_homerooms(self):
+        from schooltool.app.rest.errors import RestError
+        two_homeroom_schema_xml = self.schema_xml.replace(
+            '<period id="B">',
+            '<period id="B" homeroom="">')
+        factory = IFileFactory(self.schemaContainer)
+        schema = factory("two_homeroom", "text/xml", two_homeroom_schema_xml)
+        extendend_schema = self.createExtendedSchema()
+        extendend_schema.days['Day 1'].homeroom_period_ids = ['A', 'B']
+        self.assertEquals(schema, extendend_schema, )
+
+
+class TestTimetableSchemaFileFactoryDayIdBased(DayIdBasedModelMixin,
+                                               TestTimetableSchemaFileFactory):
+
+    schema_xml = DayIdBasedModelMixin.empty_xml
+
+    schema_without_title_xml = schema_xml.replace("<title>Title</title>", "")
+
+
+class TestTimetableSchemaFile(TimetableSchemaMixin, unittest.TestCase):
+
+    def setUp(self):
+        TimetableSchemaMixin.setUp(self)
+        self.schemaContainer["two_day"] = self.createEmptySchema()
+
+    def test(self):
+        from schooltool.timetable.rest.schema import TimetableSchemaFile
+        verifyObject(IWriteFile,
+                     TimetableSchemaFile(self.schemaContainer["two_day"]))
+
+    def test_write(self):
+        from schooltool.timetable.rest.schema import TimetableSchemaFile
+        schema = self.schemaContainer["two_day"]
+        schemaFile = TimetableSchemaFile(schema)
+        schemaFile.write(self.schema_xml)
+
+        schema = self.schemaContainer["two_day"]
+        self.assertEquals(schema.title, "Title")
+        self.assertEquals(schema, self.createExtendedSchema())
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestTimetableSchemaView))
+    suite.addTest(unittest.makeSuite(TestTimetableSchemaViewDayIdBased))
+    suite.addTest(unittest.makeSuite(TestTimetableSchemaFileFactory))
+    suite.addTest(unittest.makeSuite(TestTimetableSchemaFileFactoryDayIdBased))
+    suite.addTest(unittest.makeSuite(TestTimetableSchemaFile))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/rest/tests/test_schema.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,67 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetable sample data generation
+
+$Id: sampledata.py 5880 2006-04-07 12:32:03Z alga $
+"""
+import datetime
+from zope.interface import implements
+
+from schooltool.sampledata.interfaces import ISampleDataPlugin
+from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+from schooltool.timetable.schema import TimetableSchema, TimetableSchemaDay
+from schooltool.timetable.model import SequentialDayIdBasedTimetableModel
+
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+
+
+class SampleTimetableSchema(object):
+
+    implements(ISampleDataPlugin)
+
+    name = 'ttschema'
+    dependencies = ()
+
+    def generate(self, app, seed=None):
+        day_ids = ['Day %d' % i for i in range(1, 7)]
+        period_ids = ['A', 'B', 'C', 'D', 'E', 'F']
+        t, dt = datetime.time, datetime.timedelta
+        slots = [(t(8, 0), dt(minutes=55)),
+                 (t(9, 0), dt(minutes=55)),
+                 (t(10, 0), dt(minutes=55)),
+                 (t(11, 0), dt(minutes=55)),
+                 (t(12, 30), dt(minutes=55)),
+                 (t(13, 30), dt(minutes=60))]
+
+        day_templates = {}
+        for day_idx, day_id in enumerate(day_ids):
+            day_template = SchooldayTemplate()
+            for idx, (tstart, duration) in enumerate(slots):
+                day_template.add(SchooldaySlot(tstart, duration))
+            day_templates[day_id] = day_template
+
+        model = SequentialDayIdBasedTimetableModel(day_ids, day_templates)
+        tzname = IApplicationPreferences(app).timezone
+        ttschema = TimetableSchema(day_ids, model=model, timezone=tzname)
+        for idx, day_id in enumerate(day_ids):
+            periods = period_ids[idx:] + period_ids[:idx]
+            ttschema[day_id] = TimetableSchemaDay(periods, periods[0])
+        app['ttschemas']['simple'] = ttschema


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/schema.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/schema.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/schema.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,162 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetable Schemas
+
+$Id: schema.py 6233 2006-06-12 17:52:59Z ignas $
+"""
+from persistent import Persistent
+from persistent.dict import PersistentDict
+from sets import Set
+
+from zope.interface import implements
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.container.btree import BTreeContainer
+from zope.app.container.contained import Contained
+
+from schooltool.timetable import Timetable, TimetableDay
+from schooltool.timetable.interfaces import ITimetableSchema
+from schooltool.timetable.interfaces import ITimetableSchemaContained
+from schooltool.timetable.interfaces import ITimetableSchemaContainer
+from schooltool.timetable.interfaces import ITimetableSchemaDay
+from schooltool.timetable.interfaces import ITimetableSchemaWrite
+
+
+class TimetableSchemaDay(Persistent):
+
+    implements(ITimetableSchemaDay)
+
+    def __init__(self, periods=(), homeroom_period_ids=None):
+        if homeroom_period_ids is not None:
+            for id in homeroom_period_ids:
+                assert id in periods, "%s not in %s" % (id, periods)
+        else:
+            homeroom_period_ids = []
+
+        self.periods = periods
+        self.homeroom_period_ids = homeroom_period_ids
+
+    def keys(self):
+        return self.periods
+
+    def items(self):
+        return [(period, Set()) for period in self.periods]
+
+    def __getitem__(self, period):
+        if period not in self.periods:
+            raise KeyError(period)
+        return Set()
+
+    def __eq__(self, other):
+        if ITimetableSchemaDay.providedBy(other):
+            return (self.periods, self.homeroom_period_ids) == \
+                    (other.periods, other.homeroom_period_ids)
+        else:
+            return False
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+
+class TimetableSchema(Persistent, Contained):
+
+    implements(ITimetableSchemaContained, ITimetableSchemaWrite)
+
+    def __init__(self, day_ids, title=None, model=None, timezone='UTC'):
+        """Create a new empty timetable schema.
+
+        day_ids is a sequence of the day ids of this timetable.
+
+        The caller must then assign a TimetableDay for each day ID and
+        set the model before trying to use the timetable.
+        """
+        self.title = title
+        if self.title is None:
+            self.title = "Schema"
+        self.day_ids = day_ids
+        self.days = PersistentDict()
+        self.model = model
+        self.timezone = timezone
+
+    def keys(self):
+        return list(self.day_ids)
+
+    def items(self):
+        return [(day, self.days[day]) for day in self.day_ids]
+
+    def __getitem__(self, key):
+        return self.days[key]
+
+    def __setitem__(self, key, value):
+        if not ITimetableSchemaDay.providedBy(value):
+            raise TypeError("Timetable schema can only contain"
+                            " ITimetableSchemaDay objects (got %r)" % (value,))
+        elif key not in self.day_ids:
+            raise ValueError("Key %r not in day_ids %r" % (key, self.day_ids))
+        self.days[key] = value
+
+    def createTimetable(self):
+        new = Timetable(self.day_ids)
+        new.model = self.model
+        new.timezone = self.timezone
+        for day_id in self.day_ids:
+            new[day_id] = TimetableDay(self[day_id].periods,
+                                       self[day_id].homeroom_period_ids)
+        return new
+
+    def __eq__(self, other):
+        if ITimetableSchema.providedBy(other):
+            return (self.items() == other.items()
+                    and self.model == other.model
+                    and self.timezone == other.timezone)
+        else:
+            return False
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+
+class TimetableSchemaContainer(BTreeContainer):
+
+    implements(ITimetableSchemaContainer, IAttributeAnnotatable)
+
+    _default_id = None
+
+    def _set_default_id(self, new_id):
+        if new_id is not None and new_id not in self:
+            raise ValueError("Timetable schema %r does not exist" % new_id)
+        self._default_id = new_id
+
+    default_id = property(lambda self: self._default_id, _set_default_id)
+
+    def __setitem__(self, schema_id, ttschema):
+        assert ITimetableSchema.providedBy(ttschema)
+        if self.has_key(schema_id):
+            BTreeContainer.__delitem__(self, schema_id)
+        BTreeContainer.__setitem__(self, schema_id, ttschema)
+        if self.default_id is None:
+            self.default_id = schema_id
+
+    def __delitem__(self, schema_id):
+        BTreeContainer.__delitem__(self, schema_id)
+        if schema_id == self.default_id:
+            self.default_id = None
+
+    def getDefault(self):
+        return self[self.default_id]


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/schema.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/source.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/source.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/source.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,85 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Timetable source adapters
+
+$Id: source.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+from sets import Set
+from zope.interface import implements
+from zope.component import adapts
+from zope.app import zapi
+
+from schooltool.timetable.interfaces import IHaveTimetables
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.timetable.interfaces import ITimetableSource, ITimetables
+from schooltool.relationship import getRelatedObjects
+from schooltool.app.membership import URIGroup
+from schooltool.app.relationships import URISection
+from schooltool.timetable.interfaces import IOwnTimetables
+
+
+class BaseRelationshipTimetableSource(object):
+    """A timetable source for composing timetables over relationships.
+
+    Subclasses must provide a role attribute, with a URI of the role
+    of the related objects that will be added.
+    """
+
+    implements(ITimetableSource)
+    adapts(IHaveTimetables)
+
+    def __init__(self, context):
+        self.context = context
+
+    def getTimetableSourceObjects(self):
+        """Recursivelly collects all the objects for timetables."""
+        objects = getRelatedObjects(self.context, self.role)
+        objs = []
+        for obj in objects:
+            for adapter in zapi.subscribers((obj, ), ITimetableSource):
+                objs.extend(adapter.getTimetableSourceObjects())
+
+        return list(set(objs))
+
+
+class MembershipTimetableSource(BaseRelationshipTimetableSource):
+    """A subscription adapter that adds the group timetables to the members'
+    composite timetables.
+    """
+    role = URIGroup
+
+
+class InstructionTimetableSource(BaseRelationshipTimetableSource):
+    """A subscription adapter that adds the section timetables to the teachers'
+    composite timetables.
+    """
+    role = URISection
+
+
+class OwnedTimetableSource(object):
+    "A subscription adapter that adds the timetable stored in annotations."
+    adapts(IOwnTimetables)
+    implements(ITimetableSource)
+
+    def __init__(self, context):
+        self.context = context
+
+    def getTimetableSourceObjects(self):
+        return [self.context]


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/source.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/term.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/term.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/term.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,29 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Term module for zodb compatibility.
+
+$Id: term.py 6220 2006-06-09 12:24:05Z ignas $
+"""
+from zope.deprecation import deprecated
+
+from schooltool.term.term import TermContainer, Term
+deprecated(('TermContainer', 'Term'),
+           'This class has moved to schooltool.term.term. '
+           'The reference will be gone in 0.15')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/term.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/tests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/tests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/tests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/tests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_model.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_model.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_model.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,868 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for the schooltool.timetable.model module.
+
+$Id: test_model.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+
+import calendar
+import unittest
+import itertools
+from datetime import date, time, timedelta, datetime
+from pprint import pformat
+
+from pytz import UTC
+from zope.interface.verify import verifyObject
+from zope.traversing.interfaces import IPhysicallyLocatable
+from zope.app.testing.placelesssetup import PlacelessSetup
+from zope.app.testing import ztapi, setup
+from zope.testing import doctest
+from zope.interface import implements
+
+from schooltool.testing.util import NiceDiffsMixin
+from schooltool.testing.util import diff
+from schooltool.testing.util import fakePath
+from schooltool.timetable.tests.test_timetable import TermStub
+from schooltool.app.interfaces import ISchoolToolApplication
+from schooltool.app.interfaces import IApplicationPreferences
+
+
+class TimetablePhysicallyLocatableAdapterStub:
+    def __init__(self, tt):
+        self.tt = tt
+    def getPath(self):
+        return '/tt/%s' % id(self.tt)
+
+
+class BaseTestTimetableModel:
+
+    def extractCalendarEvents(self, cal, daterange):
+        result = []
+        for d in daterange:
+            dt = datetime.combine(d, time(0, 0, tzinfo=UTC))
+            dt1 = dt + d.resolution
+            calday = cal.expand(dt, dt1)
+            events = []
+            for event in calday:
+                events.append(event)
+            result.append(dict([(event.dtstart, event.title)
+                           for event in events]))
+        return result
+
+
+def createSimpleTimetable():
+    """Create a simple timetable.
+
+          Period | Day A    Day B
+          ------ : -------  ---------
+          Green  : English  Biology
+          Blue   : Math     Geography
+
+    """
+    from schooltool.timetable import Timetable, TimetableDay
+    from schooltool.timetable import TimetableActivity
+    tt = Timetable(('A', 'B'))
+    periods = ('Green', 'Blue')
+    tt["A"] = TimetableDay(periods)
+    tt["B"] = TimetableDay(periods)
+    tt["A"].add("Green", TimetableActivity("English"))
+    tt["A"].add("Blue", TimetableActivity("Math"))
+    tt["B"].add("Green", TimetableActivity("Biology"))
+    tt["B"].add("Blue", TimetableActivity("Geography"))
+    return tt
+
+
+class SequentialTestSetupMixin:
+    createTimetable = staticmethod(createSimpleTimetable)
+
+
+class ApplicationStub(object):
+    implements(ISchoolToolApplication, IApplicationPreferences)
+    def __init__(self, timezone='UTC'):
+        self.timezone=timezone
+    def __call__(self, context):
+        return self
+
+
+def doctest_BaseTimetableModel_createCalendar():
+    """Tests for BaseTimetableModel.createCalendar
+
+    We'll have to provide application configuration stub:
+
+        >>> ztapi.provideAdapter(None, ISchoolToolApplication, ApplicationStub())
+
+        >>> from schooltool.timetable.model import BaseTimetableModel
+        >>> btm = BaseTimetableModel()
+
+    We have a stub term that lasts from 2003-11-20 to 2003-11-26, and a simple
+    timetable.
+
+        >>> term = TermStub()
+        >>> timetable = createSimpleTimetable()
+        >>> from schooltool.timetable.interfaces import ITimetable
+        >>> ztapi.provideAdapter(ITimetable, IPhysicallyLocatable,
+        ...                      TimetablePhysicallyLocatableAdapterStub)
+
+    BaseTimetableModel is a base class and needs concrete implementations for
+    its abstract methods.
+
+        >>> btm._dayGenerator = lambda: itertools.cycle(['A', 'B'])
+        >>> btm.schooldayStrategy = lambda date, generator: generator.next()
+        >>> from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+        >>> day_template = SchooldayTemplate()
+        >>> t, td = time, timedelta
+        >>> day_template.add(SchooldaySlot(t(9, 0), td(minutes=90)))
+        >>> day_template.add(SchooldaySlot(t(11, 05), td(minutes=80)))
+        >>> btm._getUsualTemplateForDay = lambda date, day_id: day_template
+
+    Let us create a calendar.
+
+        >>> from schooltool.timetable.interfaces import ITimetableCalendarEvent
+        >>> cal = btm.createCalendar(term, timetable,
+        ...                          first=date(2003, 11, 21),
+        ...                          last=date(2003, 11, 25))
+
+        >>> def print_cal(cal):
+        ...     for e in cal:
+        ...         print '%s %s--%s %s %-10s %s' % (
+        ...                     e.dtstart.date(), e.dtstart.strftime('%H:%M'),
+        ...                     (e.dtstart + e.duration).strftime('%H:%M'),
+        ...                     e.dtstart.tzinfo,
+        ...                     '(%s, %s)' % (e.day_id, e.period_id), e.title)
+        ...         assert verifyObject(ITimetableCalendarEvent, e)
+        ...         assert e.title == e.activity.title
+        >>> print_cal(cal)
+        2003-11-21 09:00--10:30 UTC (B, Green) Biology
+        2003-11-21 11:05--12:25 UTC (B, Blue)  Geography
+        2003-11-24 09:00--10:30 UTC (A, Green) English
+        2003-11-24 11:05--12:25 UTC (A, Blue)  Math
+        2003-11-25 09:00--10:30 UTC (B, Green) Biology
+        2003-11-25 11:05--12:25 UTC (B, Blue)  Geography
+
+    If school will get transported to Lithuania, lessons should still
+    start at the same local time (9:00 in the morning), but the time
+    should be stored in UTC:
+
+        >>> timetable.timezone = 'Europe/Vilnius'
+        >>> cal = btm.createCalendar(term, timetable,
+        ...                          first=date(2003, 11, 21),
+        ...                          last=date(2003, 11, 25))
+        >>> print_cal(cal)
+        2003-11-21 07:00--08:30 UTC (B, Green) Biology
+        2003-11-21 09:05--10:25 UTC (B, Blue)  Geography
+        2003-11-24 07:00--08:30 UTC (A, Green) English
+        2003-11-24 09:05--10:25 UTC (A, Blue)  Math
+        2003-11-25 07:00--08:30 UTC (B, Green) Biology
+        2003-11-25 09:05--10:25 UTC (B, Blue)  Geography
+
+    """
+
+
+class TestSequentialDaysTimetableModel(PlacelessSetup,
+                                       NiceDiffsMixin,
+                                       unittest.TestCase,
+                                       BaseTestTimetableModel,
+                                       SequentialTestSetupMixin):
+
+    def setUp(self):
+        from schooltool.timetable.interfaces import ITimetable
+        PlacelessSetup.setUp(self)
+
+        ztapi.provideAdapter(ITimetable, IPhysicallyLocatable,
+                             TimetablePhysicallyLocatableAdapterStub)
+        ztapi.provideAdapter(None, ISchoolToolApplication, ApplicationStub())
+
+    def createModel(self):
+        """Create a simple sequential timetable model.
+
+        Days A and B are alternated.
+
+        Green period occurs at 9:00-10:30 on all days.
+        Blue period occurs at 11:00-12:30 on all days except Fridays, when it
+        occurs at 10:30-12:00.
+        """
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+        from schooltool.timetable import SequentialDaysTimetableModel
+
+        t, td = time, timedelta
+        template1 = SchooldayTemplate()
+        template1.add(SchooldaySlot(t(9, 0), td(minutes=90)))
+        template1.add(SchooldaySlot(t(11, 0), td(minutes=90)))
+        template2 = SchooldayTemplate()
+        template2.add(SchooldaySlot(t(9, 0), td(minutes=90)))
+        template2.add(SchooldaySlot(t(10, 30), td(minutes=90)))
+
+        model = SequentialDaysTimetableModel(("A", "B"),
+                                             {None: template1,
+                                              calendar.FRIDAY: template2})
+        return model
+
+    def test_interface(self):
+        from schooltool.timetable import SequentialDaysTimetableModel
+        from schooltool.timetable.interfaces import IWeekdayBasedTimetableModel
+
+        model = SequentialDaysTimetableModel(("A","B"), {None: 3})
+        verifyObject(IWeekdayBasedTimetableModel, model)
+
+    def test_eq(self):
+        from schooltool.timetable import SequentialDaysTimetableModel
+        from schooltool.timetable import WeeklyTimetableModel
+        model = SequentialDaysTimetableModel(("A","B"), {1: 2, None: 3})
+        model2 = SequentialDaysTimetableModel(("A","B"), {1: 2, None: 3})
+        model3 = WeeklyTimetableModel(("A","B"), {1: 2, None: 3})
+        model4 = SequentialDaysTimetableModel(("A"), {1: 2, None: 3})
+
+        self.assertEqual(model, model2)
+        self.assertNotEqual(model2, model3)
+        self.assertNotEqual(model2, model4)
+        self.assert_(not model2 != model)
+
+        model.exceptionDays[date(2005, 7, 7)] = object()
+        self.assertNotEqual(model, model2)
+
+        del model.exceptionDays[date(2005, 7, 7)]
+        self.assertEqual(model, model2)
+        model.exceptionDayIds[date(2005, 7, 7)] = 'Monday'
+        self.assertNotEqual(model, model2)
+
+    def test_createCalendar(self):
+        from schooltool.calendar.interfaces import ICalendar
+
+        tt = self.createTimetable()
+        model = self.createModel()
+        schooldays = TermStub()
+
+        cal = model.createCalendar(schooldays, tt)
+        verifyObject(ICalendar, cal)
+
+        # The calendar is functionally derived, therefore everything
+        # in it (including unique calendar event IDs) must not change
+        # if it is regenerated.
+        cal2 = model.createCalendar(schooldays, tt)
+        self.assertEquals(list(cal), list(cal2))
+
+        result = self.extractCalendarEvents(cal, schooldays)
+
+        expected = [{datetime(2003, 11, 20, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 20, 11, 0, tzinfo=UTC): "Math"},
+                    {datetime(2003, 11, 21, 9, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 21, 10, 30, tzinfo=UTC): "Geography"},
+                    {}, {},
+                    {datetime(2003, 11, 24, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 24, 11, 0, tzinfo=UTC): "Math"},
+                    {datetime(2003, 11, 25, 9, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 25, 11, 0, tzinfo=UTC): "Geography"},
+                    {datetime(2003, 11, 26, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 26, 11, 0, tzinfo=UTC): "Math"}]
+
+        self.assertEqual(expected, result,
+                         diff(pformat(expected), pformat(result)))
+
+    def test_createCalendar_exceptionDays(self):
+        from schooltool.term.term import Term
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+
+        tt = self.createTimetable()
+        model = self.createModel()
+        schooldays = Term('Sample', date(2003, 11, 20), date(2003, 11, 26))
+        schooldays.addWeekdays(0, 1, 2, 3, 4, 5) # Mon-Sat
+
+        # Add an exception day
+        t, td = time, timedelta
+        exception = [("Green", SchooldaySlot(t(6, 0), td(minutes=90))),
+                     ("Blue", SchooldaySlot(t(8, 0), td(minutes=90)))]
+        model.exceptionDays[date(2003, 11, 22)] = exception
+
+        # Run the calendar generation
+        cal = model.createCalendar(schooldays, tt)
+
+        result = self.extractCalendarEvents(cal, schooldays)
+
+        expected = [{datetime(2003, 11, 20, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 20, 11, 0, tzinfo=UTC): "Math"},
+                    {datetime(2003, 11, 21, 9, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 21, 10, 30, tzinfo=UTC): "Geography"},
+                    {datetime(2003, 11, 22, 6, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 22, 8, 0, tzinfo=UTC): "Math"},
+                    {},
+                    {datetime(2003, 11, 24, 9, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 24, 11, 0, tzinfo=UTC): "Geography"},
+                    {datetime(2003, 11, 25, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 25, 11, 0, tzinfo=UTC): "Math"},
+                    {datetime(2003, 11, 26, 9, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 26, 11, 0, tzinfo=UTC): "Geography"}]
+
+        self.assertEqual(expected, result,
+                         diff(pformat(expected), pformat(result)))
+
+    def test_schooldayStrategy_getDayId(self):
+        from schooltool.timetable import SequentialDaysTimetableModel
+        from schooltool.term.term import Term
+        from schooltool.timetable import SchooldayTemplate
+
+        term = Term('Sample', date(2005, 6, 27), date(2005, 7, 10))
+        term.addWeekdays(0, 1, 2, 3, 4)
+
+        template = SchooldayTemplate()
+        model = SequentialDaysTimetableModel(('A', 'B', 'C'), {None: template})
+
+        dgen = model._dayGenerator()
+        days = [model.schooldayStrategy(d, dgen) for d in term
+                if term.isSchoolday(d)]
+
+        self.assertEqual(days, ['A', 'B', 'C', 'A', 'B',
+                                'C', 'A', 'B', 'C', 'A'])
+
+        self.assertEqual(model.getDayId(term, date(2005, 6, 27)), 'A')
+        self.assertEqual(model.getDayId(term, date(2005, 6, 29)), 'C')
+        self.assertEqual(model.getDayId(term, date(2005, 7, 1)), 'B')
+
+        term.add(date(2005, 7, 2))
+        model.exceptionDayIds[date(2005, 7, 2)] = "X"
+        model.exceptionDayIds[date(2005, 7, 4)] = "Y"
+        dgen = model._dayGenerator()
+        days = [model.schooldayStrategy(d, dgen)
+                for d in term
+                if term.isSchoolday(d)]
+
+        # Effectively, exception day ids get inserted into the normal
+        # sequence of day ids, instead of replacing some day ids.
+        self.assertEqual(days, ['A', 'B', 'C', 'A', 'B', 'X',
+                                'Y', 'C', 'A', 'B', 'C'])
+
+
+    def test_periodsInDay_originalPeriodsInDay(self):
+        from schooltool.calendar.interfaces import ICalendar
+        from schooltool.timetable import SchooldaySlot
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+
+        tt = self.createTimetable()
+        model = self.createModel()
+        schooldays = TermStub()
+
+        # Add an exception day
+        t, td = time, timedelta
+        exception = [
+            ("Green", SchooldaySlot(t(6, 0), td(minutes=90))),
+            ("Blue", SchooldaySlot(t(8, 0), td(minutes=90)))]
+        model.exceptionDays[date(2003, 11, 21)] = exception
+
+        self.assertEqual(
+            model.periodsInDay(schooldays, tt, date(2003, 11, 20)),
+            [('Green', time(9, 0), timedelta(minutes=90)),
+             ('Blue',  time(11, 0), timedelta(minutes=90))])
+
+        self.assertEqual(
+            model.originalPeriodsInDay(schooldays, tt, date(2003, 11, 21)),
+            [('Green', time(9, 0), timedelta(minutes=90)),
+             ('Blue', time(10, 30), timedelta(minutes=90))])
+
+        self.assertEqual(
+            model.periodsInDay(schooldays, tt, date(2003, 11, 21)),
+            [('Green', time(6, 0), timedelta(minutes=90)),
+             ('Blue', time(8, 0), timedelta(minutes=90))])
+
+        self.assertEqual(
+            model.periodsInDay(schooldays, tt, date(2003, 11, 22)),
+            [])
+
+
+class TestSequentialDayIdBasedTimetableModel(PlacelessSetup,
+                                             unittest.TestCase,
+                                             SequentialTestSetupMixin,
+                                             BaseTestTimetableModel):
+
+    def setUp(self):
+        from zope.traversing.interfaces import IPhysicallyLocatable
+        from schooltool.timetable.interfaces import ITimetable
+        PlacelessSetup.setUp(self)
+
+        ztapi.provideAdapter(ITimetable, IPhysicallyLocatable,
+                             TimetablePhysicallyLocatableAdapterStub)
+        ztapi.provideAdapter(None, ISchoolToolApplication, ApplicationStub())
+
+    def createDayTemplates(self):
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+        t, td = time, timedelta
+        template1 = SchooldayTemplate()
+        template1.add(SchooldaySlot(t(9, 0), td(minutes=90)))
+        template1.add(SchooldaySlot(t(11, 0), td(minutes=90)))
+        template2 = SchooldayTemplate()
+        template2.add(SchooldaySlot(t(11, 0), td(minutes=90)))
+        template2.add(SchooldaySlot(t(13, 0), td(minutes=90)))
+        return template1, template2
+
+    def test_createCalendar(self):
+        from schooltool.calendar.interfaces import ICalendar
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+        from schooltool.timetable.model import \
+             SequentialDayIdBasedTimetableModel
+
+        tt = self.createTimetable()
+        template1, template2 = self.createDayTemplates()
+
+        model = SequentialDayIdBasedTimetableModel(('A', 'B'),
+                                                   {'A': template1,
+                                                    'B': template2})
+        schooldays = TermStub()
+
+        cal = model.createCalendar(schooldays, tt)
+        verifyObject(ICalendar, cal)
+
+        # The calendar is functionally derived, therefore everything
+        # in it (including unique calendar event IDs) must not change
+        # if it is regenerated.
+        cal2 = model.createCalendar(schooldays, tt)
+        self.assertEquals(list(cal), list(cal2))
+
+        result = self.extractCalendarEvents(cal, schooldays)
+
+        expected = [{datetime(2003, 11, 20, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 20, 11, 0, tzinfo=UTC): "Math"},
+                    {datetime(2003, 11, 21, 11, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 21, 13, 0, tzinfo=UTC): "Geography"},
+                    {}, {},
+                    {datetime(2003, 11, 24, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 24, 11, 0, tzinfo=UTC): "Math"},
+                    {datetime(2003, 11, 25, 11, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 25, 13, 0, tzinfo=UTC): "Geography"},
+                    {datetime(2003, 11, 26, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 26, 11, 0, tzinfo=UTC): "Math"}]
+
+        self.assertEqual(expected, result,
+                         diff(pformat(expected), pformat(result)))
+
+    def test_createCalendar_date_range(self):
+        from schooltool.timetable.model \
+                import SequentialDayIdBasedTimetableModel
+        template1, template2 = self.createDayTemplates()
+        model = SequentialDayIdBasedTimetableModel(('A', 'B'),
+                                                   {'A': template1,
+                                                    'B': template2})
+        schooldays = TermStub()
+        tt = self.createTimetable()
+        cal = model.createCalendar(schooldays, tt, first=date(2003, 11, 21),
+                                   last=date(2003, 11, 25))
+        result = self.extractCalendarEvents(cal, schooldays)
+        expected = [{},
+                    {datetime(2003, 11, 21, 11, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 21, 13, 0, tzinfo=UTC): "Geography"},
+                    {}, {},
+                    {datetime(2003, 11, 24, 9, 0, tzinfo=UTC): "English",
+                     datetime(2003, 11, 24, 11, 0, tzinfo=UTC): "Math"},
+                    {datetime(2003, 11, 25, 11, 0, tzinfo=UTC): "Biology",
+                     datetime(2003, 11, 25, 13, 0, tzinfo=UTC): "Geography"},
+                    {}]
+        self.assertEqual(expected, result,
+                         diff(pformat(expected), pformat(result)))
+
+    def test_verification(self):
+        from schooltool.timetable.model import \
+             SequentialDayIdBasedTimetableModel
+
+        tt = self.createTimetable()
+        template1, template2 = self.createDayTemplates()
+
+        self.assertRaises(AssertionError,
+                          SequentialDayIdBasedTimetableModel,
+                          ('A', 'B'),
+                          {'A': template1,'Z': template2})
+
+        SequentialDayIdBasedTimetableModel(
+            ('A', 'Z'),
+            {'A': template1, 'Z': template2})
+
+    def test__getUsualTemplateForDay(self):
+        from schooltool.timetable.model import \
+             SequentialDayIdBasedTimetableModel
+
+        tt = self.createTimetable()
+        template1, template2 = self.createDayTemplates()
+        model = SequentialDayIdBasedTimetableModel(
+            ('A', 'Z'),
+            {'A': template1, 'Z': template2})
+        self.assertEqual(model._getUsualTemplateForDay(date(2005, 7, 20), 'A'),
+                         template1)
+        self.assertEqual(model._getUsualTemplateForDay(date(2005, 7, 21), 'Z'),
+                         template2)
+        self.assertRaises(KeyError, model._getUsualTemplateForDay,
+                          date(2005, 7, 21), 'B')
+
+
+class TestWeeklyTimetableModel(PlacelessSetup,
+                               unittest.TestCase,
+                               BaseTestTimetableModel):
+
+    def setUp(self):
+        from zope.traversing.interfaces import IPhysicallyLocatable
+        from schooltool.timetable.interfaces import ITimetable
+        PlacelessSetup.setUp(self)
+        ztapi.provideAdapter(ITimetable, IPhysicallyLocatable,
+                             TimetablePhysicallyLocatableAdapterStub)
+        ztapi.provideAdapter(None, ISchoolToolApplication, ApplicationStub())
+
+    def test(self):
+        from schooltool.timetable import WeeklyTimetableModel
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+        from schooltool.timetable import Timetable, TimetableDay
+        from schooltool.timetable import TimetableActivity
+        from schooltool.term.term import Term
+        from schooltool.timetable.interfaces import IWeekdayBasedTimetableModel
+
+        days = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')
+        tt = Timetable(days)
+
+        periods = ('1', '2', '3', '4')
+        for day_id in days:
+            tt[day_id] = TimetableDay(periods)
+
+        tt["Monday"].add("1", TimetableActivity("English"))
+        tt["Monday"].add("2", TimetableActivity("History"))
+        tt["Monday"].add("3", TimetableActivity("Biology"))
+        tt["Monday"].add("4", TimetableActivity("Physics"))
+
+        tt["Tuesday"].add("1", TimetableActivity("Geography"))
+        tt["Tuesday"].add("2", TimetableActivity("Math"))
+        tt["Tuesday"].add("3", TimetableActivity("English"))
+        tt["Tuesday"].add("4", TimetableActivity("Music"))
+
+        tt["Wednesday"].add("1", TimetableActivity("English"))
+        tt["Wednesday"].add("2", TimetableActivity("History"))
+        tt["Wednesday"].add("3", TimetableActivity("Biology"))
+        tt["Wednesday"].add("4", TimetableActivity("Physics"))
+
+        tt["Thursday"].add("1", TimetableActivity("Chemistry"))
+        tt["Thursday"].add("2", TimetableActivity("English"))
+        tt["Thursday"].add("3", TimetableActivity("English"))
+        tt["Thursday"].add("4", TimetableActivity("Math"))
+
+        tt["Friday"].add("1", TimetableActivity("Geography"))
+        tt["Friday"].add("2", TimetableActivity("Drawing"))
+        tt["Friday"].add("4", TimetableActivity("Math"))
+
+        t, td = time, timedelta
+        template = SchooldayTemplate()
+        template.add(SchooldaySlot(t(9, 0), td(minutes=45)))
+        template.add(SchooldaySlot(t(9, 50), td(minutes=45)))
+        template.add(SchooldaySlot(t(10, 50), td(minutes=45)))
+        template.add(SchooldaySlot(t(12, 0), td(minutes=45)))
+
+        model = WeeklyTimetableModel(day_templates={None: template})
+        verifyObject(IWeekdayBasedTimetableModel, model)
+
+        # Add an exception day
+        t, td = time, timedelta
+        exception = [
+            ('1', SchooldaySlot(t(6, 0), td(minutes=45))),
+            ('2', SchooldaySlot(t(7, 0), td(minutes=45))),
+            ('3', SchooldaySlot(t(8, 0), td(minutes=45))),
+            ('4', SchooldaySlot(t(9, 0), td(minutes=45)))]
+        model.exceptionDays[date(2003, 11, 22)] = exception
+        model.exceptionDayIds[date(2003, 11, 22)] = "Monday"
+
+        schooldays = Term('Sample', date(2003, 11, 20), date(2003, 11, 26))
+        schooldays.addWeekdays(0, 1, 2, 3, 4, 5) # Mon-Sat
+
+        cal = model.createCalendar(schooldays, tt)
+
+        result = self.extractCalendarEvents(cal, schooldays)
+
+        expected = [
+            {datetime(2003, 11, 20, 9, 0, tzinfo=UTC): "Chemistry",
+             datetime(2003, 11, 20, 9, 50, tzinfo=UTC): "English",
+             datetime(2003, 11, 20, 10, 50, tzinfo=UTC): "English",
+             datetime(2003, 11, 20, 12, 00, tzinfo=UTC): "Math"},
+            {datetime(2003, 11, 21, 9, 0, tzinfo=UTC): "Geography",
+             datetime(2003, 11, 21, 9, 50, tzinfo=UTC): "Drawing",
+             # skip! datetime(2003, 11, 21, 10, 50): "History",
+             datetime(2003, 11, 21, 12, 00, tzinfo=UTC): "Math"},
+            # An exceptional working Saturday, with a Monday's timetable
+            {datetime(2003, 11, 22, 6, 0, tzinfo=UTC): "English",
+             datetime(2003, 11, 22, 7, 0, tzinfo=UTC): "History",
+             datetime(2003, 11, 22, 8, 0, tzinfo=UTC): "Biology",
+             datetime(2003, 11, 22, 9, 0, tzinfo=UTC): "Physics"},
+            {},
+            {datetime(2003, 11, 24, 9, 0, tzinfo=UTC): "English",
+             datetime(2003, 11, 24, 9, 50, tzinfo=UTC): "History",
+             datetime(2003, 11, 24, 10, 50, tzinfo=UTC): "Biology",
+             datetime(2003, 11, 24, 12, 00, tzinfo=UTC): "Physics"},
+            {datetime(2003, 11, 25, 9, 0, tzinfo=UTC): "Geography",
+             datetime(2003, 11, 25, 9, 50, tzinfo=UTC): "Math",
+             datetime(2003, 11, 25, 10, 50, tzinfo=UTC): "English",
+             datetime(2003, 11, 25, 12, 00, tzinfo=UTC): "Music"},
+            {datetime(2003, 11, 26, 9, 0, tzinfo=UTC): "English",
+             datetime(2003, 11, 26, 9, 50, tzinfo=UTC): "History",
+             datetime(2003, 11, 26, 10, 50, tzinfo=UTC): "Biology",
+             datetime(2003, 11, 26, 12, 00, tzinfo=UTC): "Physics"},
+            ]
+
+        self.assertEqual(expected, result,
+                         diff(pformat(expected), pformat(result)))
+
+    def test_not_enough_days(self):
+        from schooltool.timetable import WeeklyTimetableModel
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+        from schooltool.timetable import Timetable, TimetableDay
+        template = SchooldayTemplate()
+        template.add(SchooldaySlot(time(8), timedelta(minutes=30)))
+        days = ["Mon", "Tue"]
+        model = WeeklyTimetableModel(days, {None: template})
+        day = date(2003, 11, 20)    # 2003-11-20 is a Thursday
+        self.assert_(model.schooldayStrategy(day, None) is None)
+
+        tt = Timetable(days)
+        for day_id in days:
+            tt[day_id] = TimetableDay()
+        schooldays = TermStub()
+        self.assertEquals(model.periodsInDay(schooldays, tt, day), [])
+
+        model.createCalendar(schooldays, tt)
+
+    def test_schooldayStrategy(self):
+        from schooltool.timetable import WeeklyTimetableModel
+        from schooltool.term.term import Term
+        from schooltool.timetable import SchooldayTemplate
+
+        term = Term('Sample', date(2005, 6, 27), date(2005, 7, 10))
+        term.addWeekdays(0, 1, 2, 3, 4, 5) # Mon-Sat
+
+        template = SchooldayTemplate()
+        model = WeeklyTimetableModel(day_templates={None: template})
+        dgen = model._dayGenerator()
+        days = [model.schooldayStrategy(d, dgen) for d in term]
+
+        self.assertEqual(days,
+                         ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
+                          'Friday', None, None,
+                          'Monday', 'Tuesday', 'Wednesday', 'Thursday',
+                          'Friday', None, None])
+
+        model.exceptionDayIds[date(2005, 7, 2)] = "Wednesday"
+        model.exceptionDayIds[date(2005, 7, 4)] = "Thursday"
+
+        dgen = model._dayGenerator()
+        days = [model.schooldayStrategy(d, dgen) for d in term]
+
+        self.assertEqual(days,
+                         ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
+                          'Friday', 'Wednesday', None,
+                          'Thursday', 'Tuesday', 'Wednesday', 'Thursday',
+                          'Friday', None, None])
+
+
+class TestTimetableCalendarEvent(unittest.TestCase):
+
+    def test(self):
+        from schooltool.timetable import TimetableCalendarEvent
+        from schooltool.timetable.interfaces import ITimetableCalendarEvent
+
+        day_id = 'Day2'
+        period_id = 'Mathematics'
+
+        class ActivityStub(object):
+            owner = None
+            resources = []
+        activity = ActivityStub()
+
+        ev = TimetableCalendarEvent(datetime(2004, 10, 13, 12),
+                                    timedelta(45), "Math",
+                                    day_id=day_id, period_id=period_id,
+                                    activity=activity)
+        verifyObject(ITimetableCalendarEvent, ev)
+        for attr in ['day_id', 'period_id', 'activity']:
+            self.assertRaises(AttributeError, setattr, ev, attr, object())
+
+    def test_owner_resources(self):
+        from schooltool.timetable import TimetableCalendarEvent
+        from schooltool.timetable.interfaces import ITimetableCalendarEvent
+
+        day_id = 'Day2'
+        period_id = 'Mathematics'
+
+        class ActivityStub(object):
+            resources = ['cookie', 'parrot']
+            owner = ['Long John']
+        activity = ActivityStub()
+
+        ev = TimetableCalendarEvent(datetime(2004, 10, 13, 12),
+                                    timedelta(45), "Sailin mate",
+                                    day_id=day_id, period_id=period_id,
+                                    activity=activity)
+
+        self.assertEqual(ev.owner, activity.owner)
+        self.assertEqual(ev.resources, activity.resources)
+
+
+def doctest_PersistentTimetableCalendarEvent():
+    """Tests for PersistentTimetableCalendarEvent.
+
+        >>> from schooltool.timetable.model import PersistentTimetableCalendarEvent
+        >>> from schooltool.timetable.model import TimetableCalendarEvent
+        >>> class TTStub(object):
+        ...     timezone = 'utc'
+        >>> class ActivityStub(object):
+        ...     resources = ['cookie', 'parrot']
+        ...     owner = ['Long John']
+        ...     timetable = TTStub()
+        >>> activity = ActivityStub()
+        >>> ev = TimetableCalendarEvent(datetime(2004, 10, 13, 23, 0),
+        ...                             timedelta(45), "Math",
+        ...                             day_id='Day 2', period_id='Lesson 1',
+        ...                             activity=activity)
+        >>> class PTCEStub(PersistentTimetableCalendarEvent):
+        ...     def bookResource(self, resource):
+        ...         print "Booking %s" % resource
+        >>> event = PTCEStub(ev)
+        Booking cookie
+        Booking parrot
+
+        >>> event.schoolDay()
+        datetime.date(2004, 10, 13)
+
+        >>> event.activity.timetable.timezone = 'Europe/Vilnius'
+        >>> event.schoolDay()
+        datetime.date(2004, 10, 14)
+
+    """
+
+def doctest_timetableEventHandlers():
+    """
+        >>> class ApplicationStub(dict):
+        ...     implements(ISchoolToolApplication, IApplicationPreferences)
+        ...     def __call__(self, context):
+        ...         return self
+
+        >>> app = ApplicationStub()
+        >>> app['terms'] = {'term': 'Term for Fall 2006'}
+        >>> ztapi.provideAdapter(None, ISchoolToolApplication, app)
+        >>> timetable_calendar = []
+        >>> class ModelStub(object):
+        ...     def createCalendar(self, term, timetable, first=None, last=None):
+        ...         print "Creating calendar for %s" % term
+        ...         return timetable_calendar
+        >>> class TimetableStub(object):
+        ...     __name__ = 'term.schema'
+        ...     model = ModelStub()
+        >>> from schooltool.app.interfaces import ISchoolToolCalendar
+        >>> class CalendarStub(list):
+        ...     implements(ISchoolToolCalendar)
+        ...     def addEvent(self, event):
+        ...         print "Adding event %s to a calendar" % event.__name__
+        ...     def removeEvent(self, event):
+        ...         print "Removing event %s to a calendar" % event.__name__
+
+        >>> section_calendar = CalendarStub()
+        >>> class SectionStub(object):
+        ...     def __conform__(self, iface):
+        ...         if iface == ISchoolToolCalendar:
+        ...             return section_calendar
+        >>> class ActivityStub(object):
+        ...     timetable = TimetableStub()
+        ...     owner = SectionStub()
+        ...     def __eq__(self, other):
+        ...         return isinstance(other, ActivityStub)
+        >>> class EventStub(object):
+        ...     activity = ActivityStub()
+        ...     period_id = 'Period 1'
+        ...     day_id = 'Day 1'
+        >>> from schooltool.timetable.model import addEventsToCalendar
+        >>> event = EventStub()
+        >>> addEventsToCalendar(event)
+        Creating calendar for Term for Fall 2006
+
+        >>> from schooltool.timetable.interfaces import ITimetableCalendarEvent
+        >>> class TimetableEventStub(object):
+        ...     implements(ITimetableCalendarEvent)
+        ...     def __init__(self, name, activity, period_id, day_id):
+        ...         self.activity = activity
+        ...         self.period_id = period_id
+        ...         self.day_id = day_id
+        ...         self.unique_id = 'event'
+        ...         self.__name__ = name
+        ...         self.dtstart = None
+        ...         self.duration = None
+        ...         self.description = None
+        ...         self.location = None
+        ...         self.recurrence = None
+        ...         self.allday = None
+        ...         self.resources = []
+        >>> timetable_calendar = [
+        ...     TimetableEventStub('TTEvent1', ActivityStub(), 'Period 1', 'Day 1'),
+        ...     TimetableEventStub('TTEvent2', ActivityStub(), 'Period 1', 'Day 2'),
+        ...     TimetableEventStub('TTEvent3', ActivityStub(), 'Period 2', 'Day 2'),
+        ...     TimetableEventStub('TTEvent4', object(), 'Period 2', 'Day 2')]
+        >>> addEventsToCalendar(event)
+        Creating calendar for Term for Fall 2006
+        Adding event TTEvent1 to a calendar
+
+        >>> section_calendar[:] = [
+        ...     TimetableEventStub('TTEvent1', ActivityStub(), 'Period 1', 'Day 1'),
+        ...     TimetableEventStub('TTEvent2', ActivityStub(), 'Period 1', 'Day 2'),
+        ...     TimetableEventStub('TTEvent3', ActivityStub(), 'Period 2', 'Day 2'),
+        ...     TimetableEventStub('TTEvent4', ActivityStub(), 'Period 2', 'Day 2')]
+        >>> from schooltool.timetable.model import removeEventsFromCalendar
+        >>> removeEventsFromCalendar(event)
+        Removing event TTEvent1 to a calendar
+
+        >>> from schooltool.timetable import TimetableReplacedEvent
+        >>> from schooltool.timetable.model import handleTimetableRemovedEvent
+        >>> section = SectionStub()
+        >>> key = "term.schema"
+        >>> event = TimetableReplacedEvent(section, key,
+        ...                                old_timetable=ActivityStub.timetable,
+        ...                                new_timetable=None)
+        >>> handleTimetableRemovedEvent(event)
+        Removing event TTEvent1 to a calendar
+        Removing event TTEvent2 to a calendar
+        Removing event TTEvent3 to a calendar
+        Removing event TTEvent4 to a calendar
+
+        >>> event = TimetableReplacedEvent(section, key,
+        ...                                old_timetable=None,
+        ...                                new_timetable=None)
+        >>> handleTimetableRemovedEvent(event)
+
+        >>> from schooltool.timetable.model import handleTimetableAddedEvent
+        >>> event = TimetableReplacedEvent(section, key,
+        ...                                old_timetable=None,
+        ...                                new_timetable=ActivityStub.timetable)
+        >>> handleTimetableAddedEvent(event)
+        Creating calendar for Term for Fall 2006
+        Adding event TTEvent1 to a calendar
+        Adding event TTEvent2 to a calendar
+        Adding event TTEvent3 to a calendar
+        Adding event TTEvent4 to a calendar
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setup.placelessSetUp,
+                             tearDown=setup.placelessTearDown),
+        unittest.makeSuite(TestSequentialDaysTimetableModel),
+        unittest.makeSuite(TestSequentialDayIdBasedTimetableModel),
+        unittest.makeSuite(TestWeeklyTimetableModel),
+        unittest.makeSuite(TestTimetableCalendarEvent),
+    ])
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_model.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_sampledata.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_sampledata.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_sampledata.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,118 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for schooltool.timetable.sampledata
+
+$Id: test_sampledata.py 6047 2006-05-11 18:31:03Z mg $
+"""
+
+import unittest
+
+from zope.interface.verify import verifyObject
+from zope.testing import doctest
+from zope.app.testing import setup, ztapi
+
+from schooltool.testing import setup as stsetup
+
+
+def setUp(test):
+    setup.placefulSetUp()
+    stsetup.setUpApplicationPreferences()
+
+
+def tearDown(test):
+    setup.placefulTearDown()
+
+
+def doctest_SampleTimetableSchema():
+    """A sample data plugin that generates a timetable schema
+
+        >>> from schooltool.timetable.sampledata import SampleTimetableSchema
+        >>> from schooltool.sampledata.interfaces import ISampleDataPlugin
+        >>> from schooltool.app.interfaces import IApplicationPreferences
+        >>> plugin = SampleTimetableSchema()
+        >>> verifyObject(ISampleDataPlugin, plugin)
+        True
+
+        >>> app = stsetup.setUpSchoolToolSite()
+        >>> IApplicationPreferences(app).timezone = 'Europe/Vilnius'
+
+    This plugin creates a timetable schema:
+
+        >>> plugin.generate(app, 42)
+        >>> len(app['ttschemas'])
+        1
+
+    The day ids on the timetable schema and on the timetable model are set:
+
+        >>> schema = app['ttschemas']['simple']
+        >>> schema.day_ids
+        ['Day 1', 'Day 2', 'Day 3', 'Day 4', 'Day 5', 'Day 6']
+        >>> schema.model.timetableDayIds
+        ['Day 1', 'Day 2', 'Day 3', 'Day 4', 'Day 5', 'Day 6']
+
+    Let's check the slots in the first day template:
+
+        >>> result = []
+        >>> for period in schema.model.dayTemplates['Day 1']:
+        ...      print period.tstart, period.duration
+        08:00:00 0:55:00
+        09:00:00 0:55:00
+        10:00:00 0:55:00
+        11:00:00 0:55:00
+        12:30:00 0:55:00
+        13:30:00 1:00:00
+
+    The timetable model has schoolday templates for all days in cycle.
+
+        >>> for day in schema.day_ids:
+        ...    result = []
+        ...    print day,
+        ...    for period in schema[day].keys():
+        ...         print period,
+        ...    print "Homeroom - ", schema[day].homeroom_period_ids[0]
+        Day 1 A B C D E F Homeroom -  A
+        Day 2 B C D E F A Homeroom -  B
+        Day 3 C D E F A B Homeroom -  C
+        Day 4 D E F A B C Homeroom -  D
+        Day 5 E F A B C D Homeroom -  E
+        Day 6 F A B C D E Homeroom -  F
+
+    The default timetable schema is set:
+
+        >>> app['ttschemas'].getDefault()
+        <schooltool.timetable.schema.TimetableSchema object at ...>
+
+    The schema's timezone is correctly set from the app preferences:
+
+        >>> schema.timezone
+        'Europe/Vilnius'
+
+    """
+
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=setUp, tearDown=tearDown,
+                             optionflags=doctest.ELLIPSIS),
+        ])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_sampledata.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_schema.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_schema.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_schema.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,210 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for the schooltool.timetable.schema module.
+
+$Id: test_schema.py 5879 2006-04-07 12:11:02Z ignas $
+"""
+
+import unittest
+from datetime import date
+from sets import Set
+
+from zope.interface import implements
+from zope.interface.verify import verifyObject
+from zope.app.testing.setup import placefulSetUp, placefulTearDown
+
+from schooltool.timetable.interfaces import ITimetableSchema
+from schooltool.timetable.interfaces import ITimetableSchemaContainer
+from schooltool.timetable.interfaces import ITimetableSchemaDay
+from schooltool.timetable.interfaces import ITimetableSchemaWrite
+from schooltool.timetable.schema import TimetableSchema
+from schooltool.timetable.schema import TimetableSchemaContainer
+from schooltool.timetable.schema import TimetableSchemaDay
+
+from schooltool.testing import setup
+
+
+class DayStub:
+    implements(ITimetableSchemaDay)
+
+
+class TestTimetableSchemaDay(unittest.TestCase):
+
+    def test(self):
+        td = TimetableSchemaDay(['a', 'b', 'c'])
+        verifyObject(ITimetableSchemaDay, td)
+
+        self.assertEquals(list(td.periods), ['a', 'b', 'c'])
+        self.assertEquals(list(td.keys()), ['a', 'b', 'c'])
+        self.assertEquals(list(td.items()), [('a', Set()),
+                                             ('b', Set()),
+                                             ('c', Set())])
+        self.assertEquals(td['b'], Set())
+        self.assertRaises(KeyError, td.__getitem__, 'x')
+
+
+class TestTimetableSchema(unittest.TestCase):
+
+    def test_interface(self):
+        t = TimetableSchema(['one', 'two'])
+        verifyObject(ITimetableSchema, t)
+        verifyObject(ITimetableSchemaWrite, t)
+
+    def test_title(self):
+        days = ('Mo', 'Tu', 'We', 'Th', 'Fr')
+        t = TimetableSchema(days, title="A Schema")
+        self.assertEqual(t.title, "A Schema")
+        t = TimetableSchema(days)
+        self.assertEqual(t.title, "Schema")
+
+    def test_keys(self):
+        days = ('Mo', 'Tu', 'We', 'Th', 'Fr')
+        t = TimetableSchema(days)
+        self.assertEqual(t.keys(), list(days))
+
+    def test_getitem_setitem(self):
+        days = ('Mo', 'Tu', 'We', 'Th', 'Fr')
+        t = TimetableSchema(days)
+        self.assertRaises(KeyError, t.__getitem__, "Mo")
+        self.assertRaises(KeyError, t.__getitem__, "What!?")
+        self.assertRaises(TypeError, t.__setitem__, "Mo", object())
+        self.assertRaises(ValueError, t.__setitem__, "Mon", DayStub())
+        monday = DayStub()
+        t["Mo"] = monday
+        self.assertEqual(t["Mo"], monday)
+
+    def test_items(self):
+        days = ('Day 1', 'Day 2', 'Day 3')
+        t = TimetableSchema(days)
+        t["Day 1"] = day1 = DayStub()
+        t["Day 2"] = day2 = DayStub()
+        self.assertRaises(KeyError, t.items)
+        t["Day 3"] = day3 = DayStub()
+        self.assertEqual(t.items(),
+                         [("Day 1", day1), ("Day 2", day2), ("Day 3", day3)])
+
+    def test_createTimetable(self):
+        days = ('A', 'B')
+        periods1 = ('Green', 'Blue')
+        periods2 = ('Green', 'Red', 'Yellow')
+        tts = TimetableSchema(days, timezone='Europe/Vilnius')
+        tts["A"] = TimetableSchemaDay(periods1)
+        tts["B"] = TimetableSchemaDay(periods2, homeroom_period_ids=['Yellow'])
+
+        tt = tts.createTimetable()
+        self.assertEquals(tt.day_ids, tts.day_ids)
+        self.assert_(tt.model is tts.model)
+        self.assert_(tt.timezone == tts.timezone)
+        for day_id in tt.day_ids:
+            day = tt[day_id]
+            day2 = tts[day_id]
+            self.assert_(day is not day2)
+            self.assertEquals(day.periods, day2.periods)
+            self.assertEquals(day.homeroom_period_ids, day2.homeroom_period_ids)
+            for period in day.periods:
+                self.assertEquals(list(day[period]), [])
+
+    def test_equality(self):
+        days = ('A', 'B')
+        periods1 = ('Green', 'Blue')
+        periods2 = ('Green', 'Red', 'Yellow')
+        tts = TimetableSchema(days)
+        tts["A"] = TimetableSchemaDay(periods1)
+        tts["B"] = TimetableSchemaDay(periods2)
+        self.assertEquals(tts, tts)
+        self.assertNotEquals(tts, None)
+
+        # Same thing
+        tts2 = TimetableSchema(days)
+        tts2["A"] = TimetableSchemaDay(periods1)
+        tts2["B"] = TimetableSchemaDay(periods2)
+        self.assertEquals(tts, tts2)
+
+        # Swap periods in days
+        tts3 = TimetableSchema(days)
+        tts3["A"] = TimetableSchemaDay(periods2)
+        tts3["B"] = TimetableSchemaDay(periods1)
+        self.assertNotEquals(tts, tts3)
+
+        # Add an extra day
+        tts4 = TimetableSchema(days + ('C', ))
+        tts4["A"] = TimetableSchemaDay(periods1)
+        tts4["B"] = TimetableSchemaDay(periods1)
+        tts4["C"] = TimetableSchemaDay(periods1)
+        self.assertNotEquals(tts, tts4)
+
+        # Change the model
+        tts5 = TimetableSchema(days)
+        tts5.model = object()
+        tts5["A"] = TimetableSchemaDay(periods1)
+        tts5["B"] = TimetableSchemaDay(periods2)
+        self.assertNotEquals(tts, tts5)
+
+        # Different homeroom period
+        tts6 = TimetableSchema(days)
+        tts6["A"] = TimetableSchemaDay(periods1)
+        tts6["B"] = TimetableSchemaDay(periods2, homeroom_period_ids=['Red'])
+        self.assertNotEquals(tts, tts6)
+
+        # Different time zone
+        tts7 = TimetableSchema(days)
+        tts7["A"] = TimetableSchemaDay(periods1)
+        tts7["B"] = TimetableSchemaDay(periods2)
+        tts7.timezone = 'Europe/Vilnius'
+        self.assertNotEquals(tts, tts7)
+
+
+class TestTimetableSchemaContainer(unittest.TestCase):
+
+    def test_interface(self):
+        service = TimetableSchemaContainer()
+        verifyObject(ITimetableSchemaContainer, service)
+
+    def test(self):
+        service = TimetableSchemaContainer()
+        self.assertEqual(list(service.keys()), [])
+
+        tt = TimetableSchema(("A", "B"))
+        tt["A"] = TimetableSchemaDay(("Green", "Blue"))
+        tt["B"] = TimetableSchemaDay(("Red", "Yellow"))
+
+        service["super"] = tt
+        self.assertEqual(list(service.keys()), ["super"])
+        self.assertEqual(service["super"].__name__, "super")
+        self.assert_(service["super"].__parent__ is service)
+        self.assertEqual(service.default_id, "super")
+
+        del service["super"]
+        self.assertRaises(KeyError, service.__getitem__, "super")
+        self.assertEqual(list(service.keys()), [])
+        self.assertEqual(service.default_id, None)
+
+        self.assertRaises(ValueError, setattr, service, 'default_id', 'nosuch')
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.makeSuite(TestTimetableSchema))
+    suite.addTest(unittest.makeSuite(TestTimetableSchemaDay))
+    suite.addTest(unittest.makeSuite(TestTimetableSchemaContainer))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_schema.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_source.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_source.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_source.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,111 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for the schooltool.timetable.source module.
+
+$Id: test_source.py 6527 2006-12-28 12:25:35Z ignas $
+"""
+import unittest
+from sets import Set
+
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.app.testing import setup, ztapi
+from zope.testing import doctest
+from schooltool.timetable.tests.test_timetable import ContentStub, Parent
+from schooltool.timetable.interfaces import ITimetables
+from schooltool.timetable.interfaces import IOwnTimetables
+from schooltool.timetable.interfaces import IHaveTimetables
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.timetable import CompositeTimetables
+from schooltool.timetable import TimetablesAdapter
+from zope.interface.verify import verifyObject
+
+
+def doctest_RelationshipTimetableSources(object):
+    """Tests for RelationshipTimetableSources.
+
+        >>> from schooltool.relationship.tests import setUpRelationships
+        >>> site = setup.placefulSetUp(True)
+        >>> setup.setUpAnnotations()
+        >>> setUpRelationships()
+
+        >>> from schooltool.app.membership import Membership
+        >>> o1 = ContentStub()
+        >>> o2 = Parent()
+        >>> Membership(member=o1, group=o2)
+        >>> o3 = Parent()
+        >>> Membership(member=o2, group=o3)
+        >>> o4 = Parent()
+        >>> Membership(member=o2, group=o4)
+        >>> o5 = Parent()
+        >>> Membership(member=o1, group=o5)
+
+        >>> from schooltool.timetable.interfaces import ITimetableSource
+        >>> from zope.component import provideSubscriptionAdapter
+        >>> from schooltool.timetable.source import MembershipTimetableSource
+        >>> provideSubscriptionAdapter(MembershipTimetableSource,
+        ...                            adapts=[None],
+        ...                            provides=ITimetableSource)
+        >>> from schooltool.timetable.source import OwnedTimetableSource
+        >>> provideSubscriptionAdapter(OwnedTimetableSource,
+        ...                            adapts=[None],
+        ...                            provides=ITimetableSource)
+
+        >>> mts = MembershipTimetableSource(o1)
+        >>> l = mts.getTimetableSourceObjects()
+        >>> sorted(l) == sorted([o2, o3, o4, o5])
+        True
+
+        >>> mts = MembershipTimetableSource(o2)
+        >>> l = mts.getTimetableSourceObjects()
+        >>> sorted(l) == sorted([o3, o4])
+        True
+
+    """
+
+
+def doctest_OwnedTimetableSource():
+    """Tests for OwnedTimetableSource
+
+        >>> from schooltool.timetable.source import OwnedTimetableSource
+        >>> from zope.interface import implements
+        >>> class Timetables(object):
+        ...     timetables = {}
+
+        >>> class TTOwnerStub(object):
+        ...     implements(IOwnTimetables)
+
+        >>> owner = TTOwnerStub()
+        >>> source = OwnedTimetableSource(owner)
+        >>> source.getTimetableSourceObjects() == [owner]
+        True
+
+    """
+
+
+def test_suite():
+    return doctest.DocTestSuite(setUp=setup.placelessSetUp,
+                                tearDown=setup.placelessTearDown,
+                                optionflags=doctest.ELLIPSIS|doctest.REPORT_NDIFF|
+                                            doctest.NORMALIZE_WHITESPACE|
+                                            doctest.REPORT_ONLY_FIRST_FAILURE)
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_source.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_timetable.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_timetable.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_timetable.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1178 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Unit tests for the schooltool.timetable module.
+
+$Id: test_timetable.py 6558 2007-01-10 17:17:03Z ignas $
+"""
+
+import unittest
+from sets import Set
+from datetime import time, timedelta, datetime, date
+
+from persistent import Persistent
+from zope.app.testing import setup
+from zope.interface.verify import verifyObject
+from zope.interface import implements, directlyProvides
+from zope.traversing.api import getPath
+from zope.app.testing.placelesssetup import PlacelessSetup
+from zope.app.testing import ztapi
+from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.location.interfaces import ILocation
+from zope.testing import doctest
+from zope.component import eventtesting
+
+from schooltool import timetable
+from schooltool.timetable.interfaces import ITimetables
+from schooltool.timetable.interfaces import ICompositeTimetables
+from schooltool.timetable.interfaces import ITimetable, ITimetableActivity
+from schooltool.timetable.interfaces import IOwnTimetables
+from schooltool.relationship import RelationshipProperty
+from schooltool.app.membership import URIGroup, URIMember, URIMembership
+
+from schooltool.testing import setup as stsetup
+from schooltool.testing.util import NiceDiffsMixin
+from schooltool.testing.util import EqualsSortedMixin
+from schooltool.term.tests.test_term import TermStub
+
+class ActivityStub(object):
+
+    implements(ITimetableActivity)
+    replaced = False
+    timetable = None
+
+    def replace(self, **kwargs):
+        self.replaced = True
+        if 'timetable' in kwargs:
+            self.timetable = kwargs['timetable']
+        return self
+
+
+class TestTimetable(unittest.TestCase):
+
+    def test_interface(self):
+        from schooltool.timetable import Timetable
+        from schooltool.timetable.interfaces import ITimetable, ITimetableWrite
+
+        t = Timetable(('1', '2'))
+        verifyObject(ITimetable, t)
+        verifyObject(ITimetableWrite, t)
+        verifyObject(ILocation, t)
+
+    def test_keys(self):
+        from schooltool.timetable import Timetable
+        days = ('Mo', 'Tu', 'We', 'Th', 'Fr')
+        t = Timetable(days)
+        self.assertEqual(t.keys(), list(days))
+
+    def test_getitem_setitem(self):
+        from schooltool.timetable import Timetable
+        from schooltool.timetable.interfaces import ITimetableDay
+
+        days = ('Mo', 'Tu', 'We', 'Th', 'Fr')
+        t = Timetable(days)
+        self.assertRaises(KeyError, t.__getitem__, "Mo")
+        self.assertRaises(KeyError, t.__getitem__, "What!?")
+
+        class DayStub:
+            implements(ITimetableDay)
+            timetable = None
+            day_id = None
+
+        self.assertRaises(TypeError, t.__setitem__, "Mo", object())
+        self.assertRaises(ValueError, t.__setitem__, "Mon", DayStub())
+        monday = DayStub()
+        t["Mo"] = monday
+        self.assertEqual(t["Mo"], monday)
+        self.assert_(monday.timetable is t)
+        self.assert_(monday.day_id is 'Mo')
+
+    def test_items(self):
+        from schooltool.timetable import Timetable
+        from schooltool.timetable.interfaces import ITimetableDay
+
+        days = ('Day 1', 'Day 2', 'Day 3')
+        t = Timetable(days)
+
+        class DayStub:
+            implements(ITimetableDay)
+            timetable = None
+
+        t["Day 1"] = day1 = DayStub()
+        t["Day 2"] = day2 = DayStub()
+        self.assertRaises(KeyError, t.items)
+        t["Day 3"] = day3 = DayStub()
+        self.assertEqual(t.items(),
+                         [("Day 1", day1), ("Day 2", day2), ("Day 3", day3)])
+
+    def createTimetable(self):
+        from schooltool.timetable import Timetable, TimetableDay
+        days = ('A', 'B')
+        periods = ('Green', 'Blue')
+        tt = Timetable(days)
+        tt["A"] = TimetableDay(periods)
+        tt["B"] = TimetableDay(periods)
+        return tt
+
+    def test_clear(self):
+        from schooltool.timetable import TimetableActivity
+        tt = self.createTimetable()
+        english = TimetableActivity("English")
+        math = TimetableActivity("Math")
+        bio = TimetableActivity("Biology")
+        tt["A"].add("Green", english)
+        tt["A"].add("Blue", math)
+        tt["B"].add("Green", bio)
+
+        tt.clear()
+
+        empty_tt = self.createTimetable()
+        self.assertEqual(tt, empty_tt)
+
+    def test_update(self):
+        from schooltool.timetable import Timetable, TimetableDay
+        from schooltool.timetable import TimetableActivity
+
+        tt = self.createTimetable()
+        english = TimetableActivity("English")
+        math = TimetableActivity("Math")
+        bio = TimetableActivity("Biology")
+        tt["A"].add("Green", english)
+        tt["A"].add("Blue", math)
+        tt["B"].add("Green", bio)
+
+        tt2 = self.createTimetable()
+        french = TimetableActivity("French")
+        math2 = TimetableActivity("Math 2")
+        geo = TimetableActivity("Geography")
+        tt2["A"].add("Green", french)
+        tt2["A"].add("Blue", math2)
+        tt2["B"].add("Blue", geo)
+
+        tt.update(tt2)
+
+        items = [(p, Set(i)) for p, i in tt["A"].items()]
+        self.assertEqual(items, [("Green", Set([english, french])),
+                                 ("Blue", Set([math, math2]))])
+
+        items = [(p, Set(i)) for p, i in tt["B"].items()]
+        self.assertEqual(items, [("Green", Set([bio])),
+                                 ("Blue", Set([geo]))])
+
+        tt3 = Timetable(("A", ))
+        tt3["A"] = TimetableDay(('Green', 'Blue'))
+        self.assertRaises(ValueError, tt.update, tt3)
+
+    def test_cloneEmpty(self):
+        from schooltool.timetable import TimetableActivity
+
+        tt = self.createTimetable()
+        english = TimetableActivity("English")
+        math = TimetableActivity("Math")
+        bio = TimetableActivity("Biology")
+        tt["A"].add("Green", english)
+        tt["A"].add("Blue", math)
+        tt["B"].add("Green", bio)
+        tt["B"].homeroom_period_ids = ["Blue"]
+        tt.model = object()
+        tt.timezone = 'Foo/Bar'
+
+        tt2 = tt.cloneEmpty()
+        self.assert_(tt2 is not tt)
+        self.assertEquals(tt.day_ids, tt2.day_ids)
+        self.assert_(tt.model is tt2.model)
+        self.assert_(tt.timezone is tt2.timezone)
+        for day_id in tt2.day_ids:
+            day = tt[day_id]
+            day2 = tt2[day_id]
+            self.assert_(day is not day2)
+            self.assertEquals(day.periods, day2.periods)
+            self.assertEquals(day.homeroom_period_ids, day2.homeroom_period_ids)
+            for period in day2.periods:
+                self.assertEquals(list(day2[period]), [])
+
+    def testComparison(self):
+        from schooltool.timetable import TimetableActivity
+
+        model = object()
+        tt = self.createTimetable()
+        english = TimetableActivity("English")
+        math = TimetableActivity("Math")
+        bio = TimetableActivity("Biology")
+        tt["A"].add("Green", english)
+        tt["A"].add("Blue", math)
+        tt["B"].add("Green", bio)
+
+        self.assertEquals(tt, tt)
+        self.assertNotEquals(tt, None)
+
+        tt2 = self.createTimetable()
+        self.assertNotEquals(tt, tt2)
+
+        tt2["A"].add("Green", english)
+        tt2["A"].add("Blue", math)
+        tt2["B"].add("Green", bio)
+        self.assertEquals(tt, tt2)
+        tt2.model = model
+        self.assertNotEquals(tt, tt2)
+        tt.model = model
+        self.assertEquals(tt, tt2)
+
+        tt2["B"].remove("Green", bio)
+        self.assertNotEquals(tt, tt2)
+
+        tt["B"].remove("Green", bio)
+        self.assertEquals(tt, tt2)
+
+        tt2.timezone = 'Europe/Vilnius'
+        self.assertNotEquals(tt, tt2)
+
+    def test_activities(self):
+        from schooltool.timetable import TimetableActivity
+        tt = self.createTimetable()
+        english = TimetableActivity("English")
+        math = TimetableActivity("Math")
+        bio = TimetableActivity("Biology")
+        tt["A"].add("Green", english)
+        tt["A"].add("Blue", math)
+        tt["B"].add("Green", bio)
+        result = tt.activities()
+        expected = [("A", "Green", english),
+                    ("A", "Blue", math),
+                    ("B", "Green", bio)]
+        self.assertEquals(result, expected)
+
+
+class EventTestMixin(PlacelessSetup):
+
+    def checkOneEventReceived(self):
+        events = eventtesting.getEvents()
+        self.assertEquals(len(events), 1, events)
+        return events[0]
+
+
+class TestTimetableDay(EventTestMixin, unittest.TestCase):
+
+    def test_interface(self):
+        from schooltool.timetable import TimetableDay
+        from schooltool.timetable.interfaces import ITimetableDay, ITimetableDayWrite
+
+        td = TimetableDay()
+        verifyObject(ITimetableDay, td)
+        verifyObject(ITimetableDayWrite, td)
+
+    def test_keys(self):
+        from schooltool.timetable import TimetableDay
+
+        periods = ('1', '2', '3', '4', '5')
+        td = TimetableDay(periods)
+        self.assertEqual(td.keys(), periods)
+
+    def testComparison(self):
+        from schooltool.timetable import TimetableDay, Timetable
+
+        periods = ('A', 'B')
+        td1 = TimetableDay(periods)
+        td2 = TimetableDay(periods)
+        tt = Timetable(['td1', 'td2'])
+        tt['td1'] = td1
+        tt['td2'] = td2
+
+        self.assertEquals(td1, td2)
+        self.assertNotEquals(td1, None)
+        self.failIf(td1 != td2)
+
+        a1 = ActivityStub()
+        td1.add("A", a1)
+        self.assertNotEquals(td1, td2)
+        td2.add("A", a1)
+        self.assertEquals(td1, td2)
+
+        td1 = TimetableDay(periods)
+        td3 = TimetableDay(('C', 'D'))
+        self.assertNotEquals(td1, td3)
+
+        td1 = TimetableDay(periods)
+        td4 = TimetableDay(periods, homeroom_period_ids=['B'])
+        self.assertNotEquals(td1, td4)
+
+    def test_getitem_add_items_clear_remove(self):
+        from schooltool.timetable import TimetableDay, Timetable, TimetableDict
+        from schooltool.timetable.interfaces import ITimetableActivityAddedEvent
+        from schooltool.timetable.interfaces import ITimetableActivityRemovedEvent
+
+        periods = ('1', '2', '3', '4')
+        timetable = Timetable(['td'])
+        ttd = TimetableDict()
+        ttd['a.key'] = timetable
+        td = timetable['td'] = TimetableDay(periods)
+
+        self.assertRaises(KeyError, td.__getitem__, "Mo")
+        self.assertEqual(len(list(td["1"])), 0)
+
+        self.assertRaises(TypeError, td.add, "1", object())
+        math = ActivityStub()
+        self.assertRaises(ValueError, td.add, "Mo", math)
+
+        eventtesting.clearEvents()
+
+        td.add("1", math)
+        e1 = self.checkOneEventReceived()
+        self.assert_(ITimetableActivityAddedEvent.providedBy(e1))
+        self.assert_(e1.activity.timetable is timetable)
+        self.assertEquals(e1.activity, math)
+        self.assertEquals(e1.day_id, 'td')
+        self.assertEquals(e1.period_id, '1')
+
+        self.assertEqual(list(td["1"]), [math])
+        self.assert_(list(td["1"])[0].replaced)
+
+        result = [(p, Set(i)) for p, i in td.items()]
+
+        self.assertEqual(result, [('1', Set([math])), ('2', Set([])),
+                                  ('3', Set([])), ('4', Set([]))])
+        english = ActivityStub()
+        eventtesting.clearEvents()
+        td.add("2", english)
+        e2 = self.checkOneEventReceived()
+        self.assertEquals(e2.period_id, '2')
+
+        result = [(p, Set(i)) for p, i in td.items()]
+        self.assertEqual(result, [('1', Set([math])), ('2', Set([english])),
+                                  ('3', Set([])), ('4', Set([]))])
+
+
+        # test clear()
+        self.assertEqual(Set(td["2"]), Set([english]))
+        self.assertRaises(ValueError, td.clear, "Mo")
+        eventtesting.clearEvents()
+        td.clear("2")
+        e2 = self.checkOneEventReceived()
+        self.assert_(ITimetableActivityRemovedEvent.providedBy(e2))
+        self.assert_(e2.activity.timetable is timetable)
+        self.assertEquals(e2.activity, english)
+        self.assertEquals(e2.day_id, 'td')
+        self.assertEquals(e2.period_id, '2')
+        self.assertRaises(ValueError, td.clear, "foo")
+        self.assertEqual(Set(td["2"]), Set([]))
+
+        # test remove()
+        td.add("1", english)
+        result = [(p, Set(i)) for p, i in td.items()]
+        self.assertEqual(result, [('1', Set([english, math])),
+                                  ('2', Set([])), ('3', Set([])),
+                                  ('4', Set([]))])
+        eventtesting.clearEvents()
+        td.remove("1", math)
+        e3 = self.checkOneEventReceived()
+        self.assert_(ITimetableActivityRemovedEvent.providedBy(e3))
+        self.assert_(e3.activity.timetable is timetable)
+        self.assertEquals(e3.activity, math)
+        self.assertEquals(e3.day_id, 'td')
+        self.assertEquals(e3.period_id, '1')
+        self.assertRaises(KeyError, td.remove, "1", math)
+        result = [(p, Set(i)) for p, i in td.items()]
+        self.assertEqual(result, [('1', Set([english])),
+                                  ('2', Set([])), ('3', Set([])),
+                                  ('4', Set([]))])
+
+
+class TestTimetableActivity(unittest.TestCase):
+
+    def test(self):
+        from schooltool.timetable import TimetableActivity
+        from schooltool.timetable.interfaces import ITimetableActivity
+
+        owner = object()
+        ta = TimetableActivity("Dancing", owner)
+        verifyObject(ITimetableActivity, ta)
+        self.assertEqual(ta.title, "Dancing")
+        self.assert_(ta.owner is owner)
+        self.assertEqual(list(ta.resources), [])
+
+        class FakeThing:
+            title = "Dancing"
+        fake_thing = FakeThing()
+        tb = TimetableActivity("Dancing", owner)
+        tc = TimetableActivity("Fencing", owner)
+        td = TimetableActivity("Dancing", object())
+        tg = TimetableActivity("Dancing", owner, timetable=object())
+
+        # Do we really want to ignore timetable when hashing/comparing?
+        # On further thought it does not matter -- we never compare activities
+        # that come from timetables with different keys.
+
+        # __eq__
+        self.assertEqual(ta, ta)
+        self.assertEqual(ta, tb)
+        self.assertNotEqual(ta, tc)
+        self.assertNotEqual(ta, td)
+        self.assertNotEqual(ta, fake_thing)
+        self.assertEqual(ta, tg)
+
+        # __ne__
+        self.failIf(ta != ta)
+        self.failIf(ta != tb)
+        self.assert_(ta != tc)
+        self.assert_(ta != td)
+        self.assert_(ta != fake_thing)
+        self.failIf(ta != tg)
+
+        # __hash__
+        self.assertEqual(hash(ta), hash(tb))
+        self.assertNotEqual(hash(ta), hash(tc))
+        self.assertNotEqual(hash(ta), hash(td))
+        self.assertEqual(hash(ta), hash(tg))
+
+    def test_immutability(self):
+        from schooltool.timetable import TimetableActivity
+        owner = object()
+        ta = TimetableActivity("Dancing", owner)
+
+        def try_to_assign_title():
+            ta.title = "xyzzy"
+        def try_to_assign_owner():
+            ta.owner = "xyzzy"
+        def try_to_assign_resources():
+            ta.resources = "xyzzy"
+        def try_to_modify_resources():
+            ta.resources.add("xyzzy")
+        self.assertRaises(AttributeError, try_to_assign_title)
+        self.assertRaises(AttributeError, try_to_assign_owner)
+        self.assertRaises(AttributeError, try_to_assign_resources)
+        self.assertRaises(AttributeError, try_to_modify_resources)
+        self.assertEquals(ta.title, "Dancing")
+
+    def test_replace(self):
+        from schooltool.timetable import TimetableActivity
+        owner = object()
+        owner2 = object()
+        ta = TimetableActivity("Dancing", owner)
+        tb = ta.replace(title=None, owner=owner2)
+        self.assertEquals(tb.title, None)
+        self.assertEquals(tb.owner, owner2)
+
+
+class TestTimetableEvents(unittest.TestCase):
+
+    def test_tt_replaced_event(self):
+        from schooltool.timetable import TimetableReplacedEvent
+        from schooltool.timetable.interfaces import ITimetableReplacedEvent
+        obj = object()
+        key = ('a', 'b')
+        old_timetable = object()
+        new_timetable = object()
+        e = TimetableReplacedEvent(obj, key, old_timetable, new_timetable)
+        verifyObject(ITimetableReplacedEvent, e)
+
+    def test_activity_added_event(self):
+        from schooltool.timetable import TimetableActivityAddedEvent
+        from schooltool.timetable.interfaces import ITimetableActivityAddedEvent
+        obj = object()
+        day_id = 'Monday'
+        period_id = 'autumn'
+        e = TimetableActivityAddedEvent(obj, day_id, period_id)
+        verifyObject(ITimetableActivityAddedEvent, e)
+
+    def test_activity_removed_event(self):
+        from schooltool.timetable import TimetableActivityRemovedEvent
+        from schooltool.timetable.interfaces import ITimetableActivityRemovedEvent
+        obj = object()
+        day_id = 'Monday'
+        period_id = 'autumn'
+        e = TimetableActivityRemovedEvent(obj, day_id, period_id)
+        verifyObject(ITimetableActivityRemovedEvent, e)
+
+
+class TestTimetablingPersistence(unittest.TestCase):
+    """A functional test for timetables persistence."""
+
+    def setUp(self):
+        from ZODB.DB import DB
+        from ZODB.MappingStorage import MappingStorage
+        self.db = DB(MappingStorage())
+        self.datamgr = self.db.open()
+
+    def test(self):
+        from schooltool.timetable import Timetable, TimetableDay
+        from schooltool.timetable import TimetableActivity
+        import transaction
+        tt = Timetable(('A', 'B'))
+        self.datamgr.root()['tt'] = tt
+        transaction.commit()
+
+        periods = ('Green', 'Blue')
+        tt["A"] = TimetableDay(periods)
+        tt["B"] = TimetableDay(periods)
+        transaction.commit()
+
+        try:
+            datamgr = self.db.open()
+            tt2 = datamgr.root()['tt']
+            self.assert_(tt2["A"].periods, periods)
+            self.assert_(tt2["B"].periods, periods)
+        finally:
+            transaction.abort()
+            datamgr.close()
+
+        tt["A"].add("Green", TimetableActivity("English"))
+        tt["A"].add("Blue", TimetableActivity("Math"))
+        tt["B"].add("Green", TimetableActivity("Biology"))
+        tt["B"].add("Blue", TimetableActivity("Geography"))
+        transaction.commit()
+
+        self.assertEqual(len(list(tt["A"]["Green"])), 1)
+        self.assertEqual(len(list(tt["A"]["Blue"])), 1)
+        self.assertEqual(len(list(tt["B"]["Green"])), 1)
+        self.assertEqual(len(list(tt["B"]["Blue"])), 1)
+
+########## XXX: Fails
+##         try:
+##             datamgr = self.db.open()
+##             tt3 = datamgr.root()['tt']
+##             self.assertEqual(len(list(tt3["A"]["Green"])), 1)
+##             self.assertEqual(len(list(tt3["A"]["Blue"])), 1)
+##             self.assertEqual(len(list(tt3["B"]["Green"])), 1)
+##             self.assertEqual(len(list(tt3["B"]["Blue"])), 1)
+##             act = iter(tt3["B"]["Blue"]).next()
+##             self.assertEqual(act.title, "Geography")
+##         finally:
+##             transaction.abort()
+##             datamgr.close()
+
+    def testTimetableActivity(self):
+        from schooltool.timetable import TimetableActivity
+        from zope.traversing.interfaces import IContainmentRoot
+        import transaction
+        from schooltool.person.person import Person
+        from schooltool.resource.resource import Resource
+
+        parent = PersistentLocatableStub()
+        directlyProvides(parent, IContainmentRoot)
+        owner = Person()
+        owner.__parent__ = parent
+        owner.__name__ = 'parent'
+        res1 = Resource()
+        res1.__parent__ = parent
+        res1.__name__ = 'res1'
+        res2 = Resource()
+        res2.__parent__ = parent
+        res2.__name__ = 'res2'
+        ta = TimetableActivity("Pickling", owner, [res1, res2])
+        tb = TimetableActivity("Pickling", owner, [res2, res1])
+        tseta = Set([ta, tb])
+        tsetb = Set([ta, tb])
+        self.datamgr.root()['ta'] = ta
+        self.datamgr.root()['tb'] = tb
+        self.datamgr.root()['tseta'] = tseta
+        self.datamgr.root()['tsetb'] = tsetb
+        transaction.commit()
+
+        try:
+            datamgr = self.db.open()
+            ta2 = datamgr.root()['ta']
+            tb2 = datamgr.root()['tb']
+            tseta2 = datamgr.root()['tseta']
+            tsetb2 = datamgr.root()['tsetb']
+            self.assertEqual(ta2, tb2)
+            self.assertEqual(hash(ta2), hash(tb2))
+            self.assertEqual(tseta2, tsetb2)
+            ## Activities unpersisted in different DB connections are not
+            ## supposed to be compared
+            #self.assertEqual(ta, ta2)
+            #XXX: self.assertEqual(hash(ta), hash(ta2))
+            #self.assertEqual(tset, tset2)
+        finally:
+            transaction.abort()
+            datamgr.close()
+
+
+class TestSchooldaySlot(unittest.TestCase):
+
+    def test(self):
+        from schooltool.timetable import SchooldaySlot
+        from schooltool.timetable.interfaces import ISchooldaySlot
+
+        ev = SchooldaySlot(time(9, 00), timedelta(minutes=45))
+        verifyObject(ISchooldaySlot, ev)
+        self.assertEqual(ev.tstart, time(9,0))
+        self.assertEqual(ev.duration, timedelta(seconds=2700))
+
+    def test_eq(self):
+        from schooltool.timetable import SchooldaySlot
+        self.assertEqual(
+            SchooldaySlot(time(9, 00), timedelta(minutes=45)),
+            SchooldaySlot(time(9, 00), timedelta(minutes=45)))
+        self.assertEqual(
+            hash(SchooldaySlot(time(9, 0), timedelta(minutes=45))),
+            hash(SchooldaySlot(time(9, 0), timedelta(minutes=45))))
+        self.assertNotEqual(
+            SchooldaySlot(time(9, 00), timedelta(minutes=45)),
+            SchooldaySlot(time(9, 01), timedelta(minutes=45)))
+        self.assertNotEqual(
+            SchooldaySlot(time(9, 00), timedelta(minutes=45)),
+            SchooldaySlot(time(9, 00), timedelta(minutes=90)))
+        self.assertNotEqual(
+            SchooldaySlot(time(9, 00), timedelta(minutes=45)),
+            object())
+
+
+class TestSchooldayTemplate(unittest.TestCase):
+
+    def test_interface(self):
+        from schooltool.timetable import SchooldayTemplate
+        from schooltool.timetable.interfaces import ISchooldayTemplate
+        from schooltool.timetable.interfaces import ISchooldayTemplateWrite
+
+        tmpl = SchooldayTemplate()
+        verifyObject(ISchooldayTemplate, tmpl)
+        verifyObject(ISchooldayTemplateWrite, tmpl)
+
+    def test_add_remove_iter(self):
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+
+        tmpl = SchooldayTemplate()
+        self.assertEqual(list(iter(tmpl)), [])
+        self.assertRaises(TypeError, tmpl.add, object())
+
+        lesson1 = SchooldaySlot(time(9, 0), timedelta(minutes=45))
+        lesson2 = SchooldaySlot(time(10, 0), timedelta(minutes=45))
+
+        tmpl.add(lesson1)
+        self.assertEqual(list(iter(tmpl)), [lesson1])
+
+        # Adding the same thing again.
+        tmpl.add(lesson1)
+        self.assertEqual(list(iter(tmpl)), [lesson1])
+
+        tmpl.add(lesson2)
+        self.assertEqual(len(list(iter(tmpl))), 2)
+        tmpl.remove(lesson1)
+        self.assertEqual(list(iter(tmpl)), [lesson2])
+
+    def test_eq(self):
+        from schooltool.timetable import SchooldayTemplate, SchooldaySlot
+
+        tmpl = SchooldayTemplate()
+        tmpl.add(SchooldaySlot(time(9, 0), timedelta(minutes=45)))
+        tmpl.add(SchooldaySlot(time(10, 0), timedelta(minutes=45)))
+
+        tmpl2 = SchooldayTemplate()
+        tmpl2.add(SchooldaySlot(time(9, 0), timedelta(minutes=45)))
+        tmpl2.add(SchooldaySlot(time(10, 0), timedelta(minutes=45)))
+
+        self.assertEqual(tmpl, tmpl)
+        self.assertEqual(tmpl, tmpl2)
+        self.assert_(not tmpl != tmpl2)
+
+
+class ContentStub(object):
+
+    implements(IOwnTimetables, IAttributeAnnotatable)
+
+    members = RelationshipProperty(URIMembership, URIGroup, URIMember)
+    groups = RelationshipProperty(URIMembership, URIGroup, URIMember)
+
+
+class Parent(ContentStub):
+
+    implements(ITimetables, ICompositeTimetables)
+
+    def __init__(self):
+        self.object = self
+
+
+class PersistentLocatableStub(Persistent):
+
+    implements(ILocation)
+    __name__ = None
+    __parent__ = None
+
+
+class TimetableStub(PersistentLocatableStub):
+    implements(ITimetable)
+
+
+class TestTimetableDict(EventTestMixin, unittest.TestCase):
+
+    def test(self):
+        from schooltool.timetable import TimetableDict
+        from persistent.dict import PersistentDict
+        from schooltool.timetable.interfaces import ITimetableDict
+
+        timetables = TimetableDict()
+        self.assert_(isinstance(timetables, PersistentDict))
+        verifyObject(ILocation, timetables)
+        verifyObject(ITimetableDict, timetables)
+
+    def test_setitem_delitem(self):
+        from schooltool.timetable import TimetableDict
+
+        td = TimetableDict()
+        item = TimetableStub()
+        td['aa.bb'] = item
+        self.assertEqual(item.__name__, ('aa.bb'))
+        self.assertEqual(item.__parent__, td)
+        self.assertEqual(item, td['aa.bb'])
+
+        item2 = TimetableStub()
+        td['aa.bb'] = item2
+        self.assertEqual(item2, td['aa.bb'])
+        self.assertEqual(item.__parent__, None)
+        self.assertEqual(item.__name__, None)
+
+        del td['aa.bb']
+        self.assertRaises(KeyError, td.__getitem__, ('aa.bb'))
+        self.assertEqual(item2.__parent__, None)
+        self.assertEqual(item2.__name__, None)
+
+    def test_setitem_delitem_events(self):
+        from schooltool.timetable import TimetableDict
+        from schooltool.timetable.interfaces import ITimetableReplacedEvent
+
+        eventtesting.clearEvents()
+        td = TimetableDict()
+        item = TimetableStub()
+        td['aa.bb'] = item
+        e = self.checkOneEventReceived()
+        self.assert_(ITimetableReplacedEvent.providedBy(e))
+        self.assert_(e.object is td.__parent__)
+        self.assertEquals(e.key, ('aa.bb'))
+        self.assert_(e.old_timetable is None)
+        self.assert_(e.new_timetable is item)
+
+        eventtesting.clearEvents()
+        item2 = TimetableStub()
+        td['aa.bb'] = item2
+        e = self.checkOneEventReceived()
+        self.assert_(ITimetableReplacedEvent.providedBy(e))
+        self.assert_(e.object is td.__parent__)
+        self.assertEquals(e.key, ('aa.bb'))
+        self.assert_(e.old_timetable is item)
+        self.assert_(e.new_timetable is item2)
+
+        eventtesting.clearEvents()
+        del td['aa.bb']
+        e = self.checkOneEventReceived()
+        self.assert_(ITimetableReplacedEvent.providedBy(e))
+        self.assert_(e.object is td.__parent__)
+        self.assertEquals(e.key, ('aa.bb'))
+        self.assert_(e.old_timetable is item2)
+        self.assert_(e.new_timetable is None)
+
+    def test_clear(self):
+        from schooltool.timetable import TimetableDict
+        td = TimetableDict()
+        td['a.b'] = TimetableStub()
+        td['b.c'] = TimetableStub()
+        eventtesting.clearEvents()
+        td.clear()
+        self.assertEquals(list(td.keys()), [])
+        events = eventtesting.getEvents()
+        self.assertEquals(len(events), 2)
+
+    def test_validation(self):
+        from schooltool.timetable import TimetableDict
+        td = TimetableDict()
+        self.assertRaises(ValueError, td.__setitem__, 'a.b.c',
+                          TimetableStub())
+        self.assertRaises(ValueError, td.__setitem__, 'abc',
+                          TimetableStub())
+        self.assertRaises(ValueError, td.__setitem__, 'c.',
+                          TimetableStub())
+        self.assertRaises(ValueError, td.__setitem__, '.c',
+                          TimetableStub())
+        td['a.c'] = TimetableStub()
+
+
+class TestTimetablesAdapter(NiceDiffsMixin, EqualsSortedMixin,
+                            unittest.TestCase):
+
+    def setUp(self):
+        from schooltool.relationship.tests import setUpRelationships
+        from schooltool.timetable.interfaces import ITimetableSource
+        from schooltool.timetable import TimetablesAdapter
+
+        self.site = setup.placefulSetUp(True)
+        setup.setUpAnnotations()
+        setUpRelationships()
+
+        ztapi.provideAdapter(IOwnTimetables, ITimetables,
+                             TimetablesAdapter)
+
+    def tearDown(self):
+        setup.placefulTearDown()
+
+    def test_interface(self):
+        from schooltool.timetable import TimetablesAdapter, TimetableDict
+
+        content = ContentStub()
+        tm = TimetablesAdapter(content)
+        verifyObject(ITimetables, tm)
+        self.assert_(isinstance(tm.timetables, TimetableDict))
+        self.assertEqual(tm.timetables.__parent__, content)
+
+
+def doctest_CompositeTimetables():
+    """Tests for CompositeTimetables.
+
+    First let's create the adapter:
+
+       >>> from schooltool.timetable import CompositeTimetables
+       >>> ct = CompositeTimetables("context")
+
+    When there are no source objecs we get an empty ImmutableCalendar:
+
+       >>> ct._collectSourceObjects = lambda: []
+       >>> calendar = ct.makeTimetableCalendar()
+       >>> list(calendar)
+       []
+
+       >>> calendar
+       <schooltool.calendar.simple.ImmutableCalendar object at ...>
+
+    The calendar is located, and has it's parent and __name__ set:
+
+       >>> ILocation.providedBy(calendar)
+       True
+       >>> calendar.__parent__
+       'context'
+       >>> calendar.__name__
+       'timetable-calendar'
+
+    Let's try non empty calendars:
+
+       >>> class SourceStub(object):
+       ...     def __init__(self, events):
+       ...         self.calendar = CalendarStub(events)
+       ...     def __conform__(self, iface):
+       ...         if iface == ISchoolToolCalendar:
+       ...             return self.calendar
+
+       >>> from schooltool.app.interfaces import ISchoolToolCalendar
+       >>> class CalendarStub(list):
+       ...     implements(ISchoolToolCalendar)
+       ...     def __init__(self, events):
+       ...         for event in events:
+       ...             self.append(event)
+
+       >>> from schooltool.timetable.interfaces import ITimetableCalendarEvent
+       >>> class TTEv(object):
+       ...     implements(ITimetableCalendarEvent)
+       ...     def __init__(self, title, day):
+       ...         self.title = title
+       ...         self.day = day
+       ...     def __cmp__(self, other):
+       ...         return self.title > other.title
+       ...     def __repr__(self):
+       ...         return self.title
+       ...     def schoolDay(self):
+       ...         return self.day
+
+       >>> s1 = SourceStub([TTEv("e1", 1), TTEv("e2", 2), TTEv("e3", 3), object()])
+       >>> s2 = SourceStub([object(), TTEv("e4", 5), TTEv("e5", 4), TTEv("e6", 0)])
+       >>> ct._collectSourceObjects = lambda: [s1, s2]
+
+    If we do not set date limits - we get all the events from both
+    calendars:
+
+       >>> sorted(list(ct.makeTimetableCalendar()))
+       [e1, e2, e3, e4, e5, e6]
+
+    We can limit the amount of events retrieved:
+
+       >>> sorted(list(ct.makeTimetableCalendar(first=2, last=4)))
+       [e2, e3, e5]
+
+    """
+
+
+def doctest_findRelatedTimetables_forSchoolTimetables():
+    """Tests for findRelatedTimetables() with school timetables
+
+       >>> from schooltool.timetable import TimetablesAdapter
+       >>> from schooltool.timetable.interfaces import ITimetables
+       >>> from schooltool.timetable.interfaces import IOwnTimetables
+       >>> setup.placefulSetUp()
+       >>> ztapi.provideAdapter(IOwnTimetables, ITimetables,
+       ...                      TimetablesAdapter)
+       >>> setup.setUpAnnotations()
+
+       >>> from schooltool.testing.setup import createSchoolToolApplication
+       >>> from schooltool.timetable import findRelatedTimetables
+       >>> app = stsetup.setUpSchoolToolSite()
+       >>> directlyProvides(app, IOwnTimetables)
+
+    Let's create a timetable schema:
+
+       >>> from schooltool.timetable.schema import TimetableSchema
+       >>> from schooltool.timetable.schema import TimetableSchemaDay
+
+       >>> days = ('A', 'B')
+       >>> periods1 = ('Green', 'Blue')
+       >>> tts = TimetableSchema(days)
+       >>> tts["A"] = TimetableSchemaDay(periods1)
+       >>> tts["B"] = TimetableSchemaDay(periods1)
+
+       >>> days = ('C', 'D')
+       >>> tts2 = TimetableSchema(days)
+       >>> tts2["C"] = TimetableSchemaDay(periods1)
+       >>> tts2["D"] = TimetableSchemaDay(periods1)
+
+       >>> app['ttschemas']['simple'] = tts
+       >>> app['ttschemas']['other'] = tts2
+
+    Now we can call our utility function.  Since our schema is not
+    used, an empty list is returned:
+
+       >>> findRelatedTimetables(tts)
+       []
+
+    Let's add a timetable to the app object:
+
+       >>> ITimetables(app).timetables['2006.simple'] = tts.createTimetable()
+       >>> findRelatedTimetables(tts)
+       [<Timetable: ('A', 'B'),
+        {'A': <schooltool.timetable.TimetableDay object at ...>,
+         'B': <schooltool.timetable.TimetableDay object at ...>}, None>]
+
+    Now, let's add a timetable of a different schema:
+
+       >>> ITimetables(app).timetables['2006.other'] = tts2.createTimetable()
+       >>> findRelatedTimetables(tts)
+       [<Timetable: ('A', 'B'),
+        {'A': <schooltool.timetable.TimetableDay object at ...>,
+         'B': <schooltool.timetable.TimetableDay object at ...>}, None>]
+
+    Let's add some persons, groups and resources with timetables:
+
+       >>> from schooltool.person.person import Person
+       >>> from schooltool.group.group import Group
+       >>> from schooltool.resource.resource import Resource
+
+       >>> app['persons']['p1'] = Person('p1')
+       >>> app['persons']['p2'] = Person('p2')
+       >>> app['groups']['g'] = Group('friends')
+       >>> app['resources']['r'] = Resource('friends')
+
+       >>> for ob in (app['persons']['p1'], app['persons']['p2'],
+       ...            app['groups']['g'], app['resources']['r']):
+       ...     directlyProvides(ob, IOwnTimetables)
+
+       >>> adapter = ITimetables(app['persons']['p1'])
+       >>> adapter.timetables['2006.simple'] = tts.createTimetable()
+       >>> adapter.timetables['2005.simple'] = tts.createTimetable()
+       >>> adapter.timetables['2006.other'] = tts2.createTimetable()
+
+       >>> adapter = ITimetables(app['persons']['p2'])
+       >>> adapter.timetables['2006.simple'] = tts.createTimetable()
+
+       >>> adapter = ITimetables(app['groups']['g'])
+       >>> adapter.timetables['2006.simple'] = tts.createTimetable()
+       >>> adapter.timetables['2006.other'] = tts2.createTimetable()
+
+       >>> adapter = ITimetables(app['resources']['r'])
+       >>> adapter.timetables['2006.simple'] = tts.createTimetable()
+
+    Let's see the timetables for this schema now:
+
+       >>> findRelatedTimetables(tts)
+       [<Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>]
+
+       >>> [(tt.__parent__.__parent__.__name__, tt.__name__)
+       ...   for tt in findRelatedTimetables(tts)]
+       [(None, '2006.simple'), (u'p1', '2006.simple'),
+        (u'p1', '2005.simple'), (u'p2', '2006.simple'),
+        (u'g', '2006.simple'), (u'r', '2006.simple')]
+
+    Let's see the timetables of the other schema:
+
+       >>> findRelatedTimetables(tts2)
+       [<Timetable: ('C', 'D'), ...>,
+        <Timetable: ('C', 'D'), ...>,
+        <Timetable: ('C', 'D'), ...>]
+
+       >>> [(tt.__parent__.__parent__.__name__, tt.__name__)
+       ...   for tt in findRelatedTimetables(tts2)]
+       [(None, '2006.other'), (u'p1', '2006.other'), (u'g', '2006.other')]
+
+    Clean up:
+
+       >>> setup.placefulTearDown()
+    """
+
+
+def doctest_findRelatedTimetables_forTerm():
+    """Tests for findRelatedTimetables() with terms as arguments
+
+       >>> from schooltool.timetable.interfaces import IOwnTimetables
+       >>> from schooltool.timetable import TimetablesAdapter
+       >>> from schooltool.timetable.interfaces import ITimetables
+       >>> setup.placefulSetUp()
+       >>> ztapi.provideAdapter(IOwnTimetables, ITimetables,
+       ...                      TimetablesAdapter)
+       >>> setup.setUpAnnotations()
+
+       >>> from schooltool.testing.setup import createSchoolToolApplication
+       >>> from schooltool.timetable import findRelatedTimetables
+       >>> app = stsetup.setUpSchoolToolSite()
+       >>> directlyProvides(app, IOwnTimetables)
+
+    Let's create a couple of terms:
+
+       >>> from schooltool.term.term import Term
+       >>> t1 = app['terms']['2005'] = Term('2005', date(2005, 1, 1),
+       ...                                  date(2005, 12, 31))
+       >>> t2 = app['terms']['2006'] = Term('2006', date(2006, 1, 1),
+       ...                                  date(2006, 12, 31))
+
+    We'll also need a timetable schema:
+
+       >>> from schooltool.timetable.schema import TimetableSchema
+       >>> from schooltool.timetable.schema import TimetableSchemaDay
+
+       >>> days = ('A', 'B')
+       >>> periods1 = ('Green', 'Blue')
+       >>> tts = TimetableSchema(days)
+       >>> tts["A"] = TimetableSchemaDay(periods1)
+       >>> tts["B"] = TimetableSchemaDay(periods1)
+       >>> app['ttschemas']['simple'] = tts
+
+    Now we can call our utility function.  Since our schema is not
+    used, an empty list is returned:
+
+       >>> findRelatedTimetables(t1)
+       []
+
+    Let's add a timetable to the app object:
+
+       >>> ITimetables(app).timetables['2005.simple'] = tts.createTimetable()
+       >>> findRelatedTimetables(t1)
+       [<Timetable: ('A', 'B'),
+        {'A': <schooltool.timetable.TimetableDay object at ...>,
+         'B': <schooltool.timetable.TimetableDay object at ...>}, None>]
+
+    Now, let's add a timetable of a different term:
+
+       >>> ITimetables(app).timetables['2006.simple'] = tts.createTimetable()
+       >>> findRelatedTimetables(t1)
+       [<Timetable: ('A', 'B'),
+        {'A': <schooltool.timetable.TimetableDay object at ...>,
+         'B': <schooltool.timetable.TimetableDay object at ...>}, None>]
+
+    Let's add some persons, groups and resources with timetables:
+
+       >>> from schooltool.person.person import Person
+       >>> from schooltool.group.group import Group
+       >>> from schooltool.resource.resource import Resource
+
+       >>> app['persons']['p1'] = Person('p1')
+       >>> app['persons']['p2'] = Person('p2')
+       >>> app['groups']['g'] = Group('friends')
+       >>> app['resources']['r'] = Resource('friends')
+
+       >>> for ob in (app['persons']['p1'], app['persons']['p2'],
+       ...            app['groups']['g'], app['resources']['r']):
+       ...     directlyProvides(ob, IOwnTimetables)
+
+       >>> adapter = ITimetables(app['persons']['p1'])
+       >>> adapter.timetables['2005.simple'] = tts.createTimetable()
+       >>> adapter.timetables['2005.other'] = tts.createTimetable()
+       >>> adapter.timetables['2006.other'] = tts.createTimetable()
+
+       >>> adapter = ITimetables(app['persons']['p2'])
+       >>> adapter.timetables['2005.simple'] = tts.createTimetable()
+
+       >>> adapter = ITimetables(app['groups']['g'])
+       >>> adapter.timetables['2006.simple'] = tts.createTimetable()
+       >>> adapter.timetables['2005.simple'] = tts.createTimetable()
+
+       >>> adapter = ITimetables(app['resources']['r'])
+       >>> adapter.timetables['2005.simple'] = tts.createTimetable()
+
+    Let's see the timetables for this schema now:
+
+       >>> findRelatedTimetables(t1)
+       [<Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>]
+
+       >>> [(tt.__parent__.__parent__.__name__, tt.__name__)
+       ...   for tt in findRelatedTimetables(t1)]
+       [(None, '2005.simple'), (u'p1', '2005.other'), (u'p1', '2005.simple'),
+        (u'p2', '2005.simple'), (u'g', '2005.simple'), (u'r', '2005.simple')]
+
+    Let's see the timetables of the other schema:
+
+       >>> findRelatedTimetables(t2)
+       [<Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>,
+        <Timetable: ('A', 'B'), ...>]
+
+       >>> [(tt.__parent__.__parent__.__name__, tt.__name__)
+       ...   for tt in findRelatedTimetables(t2)]
+       [(None, '2006.simple'), (u'p1', '2006.other'), (u'g', '2006.simple')]
+
+    Clean up:
+
+       >>> setup.placefulTearDown()
+
+    """
+
+def doctest_findRelatedTimetables_other():
+    """Tests for findRelatedTimetables()
+
+    findRelatedTimetables works only with school timetables and terms,
+    and raises if gets anything else:
+
+        >>> from schooltool.timetable import findRelatedTimetables
+        >>> findRelatedTimetables(object())
+        Traceback (most recent call last):
+          ...
+        TypeError: Expected a Term or a TimetableSchema, got <object ...>
+
+    """
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    optionflags = (doctest.ELLIPSIS | doctest.REPORT_NDIFF |
+                   doctest.NORMALIZE_WHITESPACE)
+    suite.addTest(doctest.DocTestSuite(optionflags=optionflags))
+    suite.addTest(unittest.makeSuite(TestTimetable))
+    suite.addTest(unittest.makeSuite(TestTimetableDay))
+    suite.addTest(unittest.makeSuite(TestTimetableActivity))
+    suite.addTest(unittest.makeSuite(TestTimetableEvents))
+    suite.addTest(unittest.makeSuite(TestTimetablingPersistence))
+    suite.addTest(unittest.makeSuite(TestTimetableDict))
+    suite.addTest(unittest.makeSuite(TestSchooldaySlot))
+    suite.addTest(unittest.makeSuite(TestSchooldayTemplate))
+    suite.addTest(unittest.makeSuite(TestTimetablesAdapter))
+    return suite
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/tests/test_timetable.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/timetable/timetable-configure.zcml
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/timetable/timetable-configure.zcml	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/timetable/timetable-configure.zcml	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+<include package="schooltool.timetable" />
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool/timetable/timetable-configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/traverser/README.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/traverser/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/traverser/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,251 @@
+====================
+Pluggable Traversers
+====================
+
+Traversers are Zope's mechanism to convert URI paths to an object of the
+application. They provide an extremly flexible mechanism to make decisions
+based on the policies of the application. Unfortunately the default traverser
+implementation is not flexible enough to deal with arbitrary extensions (via
+adapters) of objects that also wish to participate in the traversal decision
+process.
+
+The pluggable traverser allows developers, especially third-party developers,
+to add new traversers to an object without altering the original traversal
+implementation.
+
+    >>> from schooltool.traverser.traverser import PluggableTraverser
+
+Let's say that we have an object
+
+    >>> from zope.interface import Interface, implements
+    >>> class IContent(Interface):
+    ...     pass
+
+    >>> class Content(object):
+    ...     implements(IContent)
+    ...     var = True
+
+    >>> content = Content()
+
+that we wish to traverse to. Since traversers are presentation-type specific,
+they are implemented as views and must thus be initiated using a request:
+
+    >>> from zope.publisher.base import TestRequest
+    >>> request = TestRequest('')
+    >>> traverser = PluggableTraverser(content, request)
+
+We can now try to lookup the variable:
+
+    >>> traverser.publishTraverse(request, 'var')
+    Traceback (most recent call last):
+    ...
+    NotFound: Object: <Content object at ...>, name: 'var'
+
+But it failed. Why? Because we have not registered a plugin traverser yet that
+knows how to lookup attributes. This package provides such a traverser
+already, so we just have to register it:
+
+    >>> from zope.component import provideSubscriptionAdapter
+    >>> from zope.publisher.interfaces import IPublisherRequest
+    >>> from schooltool.traverser.traverser import AttributeTraverserPlugin
+
+    >>> provideSubscriptionAdapter(AttributeTraverserPlugin,
+    ...                            (IContent, IPublisherRequest))
+
+If we now try to lookup the attribute, we the value:
+
+    >>> traverser.publishTraverse(request, 'var')
+    True
+
+However, an incorrect variable name will still return a ``NotFound`` error:
+
+    >>> traverser.publishTraverse(request, 'bad')
+    Traceback (most recent call last):
+    ...
+    NotFound: Object: <Content object at ...>, name: 'bad'
+
+Every traverser should also make sure that the passed in name is not a
+view. (This allows us to not specify the ``@@`` in front of a view.) So let's
+register one:
+
+    >>> class View(object):
+    ...     def __init__(self, context, request):
+    ...         pass
+
+    >>> from zope.component import provideAdapter
+    >>> from zope.publisher.interfaces import IPublisherRequest
+    >>> provideAdapter(View,
+    ...                adapts=(IContent, IPublisherRequest),
+    ...                provides=Interface,
+    ...                name='view.html')
+
+Now we can lookup the view as well:
+
+    >>> traverser.publishTraverse(request, 'view.html')
+    <View object at ...>
+
+
+Advanced Uses
+-------------
+
+A more interesting case to consider is a traverser for a container. If you
+really dislike the Zope 3 traversal namespace notation ``++namespace++`` and
+you can control the names in the container, then the pluggable traverser will
+also provide a viable solution. Let's say we have a container
+
+    >>> from zope.app.container.interfaces import IContainer
+    >>> class IMyContainer(IContainer):
+    ...     pass
+
+    >>> from zope.app.container.btree import BTreeContainer
+    >>> class MyContainer(BTreeContainer):
+    ...     implements(IMyContainer)
+    ...     foo = True
+    ...     bar = False
+
+    >>> myContainer = MyContainer()
+    >>> myContainer['blah'] = 123
+
+and we would like to be able to traverse
+
+  * all items of the container, as well as
+
+    >>> from schooltool.traverser.traverser import ContainerTraverserPlugin
+    >>> from schooltool.traverser.interfaces import ITraverserPlugin
+
+    >>> provideSubscriptionAdapter(ContainerTraverserPlugin,
+    ...                            (IMyContainer, IPublisherRequest),
+    ...                            ITraverserPlugin)
+
+  * the ``foo`` attribute. Luckily we also have a predeveloped traverser for
+    this:
+
+    >>> from schooltool.traverser.traverser import \
+    ...     SingleAttributeTraverserPlugin
+    >>> provideSubscriptionAdapter(SingleAttributeTraverserPlugin('foo'),
+    ...                            (IMyContainer, IPublisherRequest))
+
+We can now use the pluggable traverser
+
+    >>> traverser = PluggableTraverser(myContainer, request)
+
+to look up items
+
+    >>> traverser.publishTraverse(request, 'blah')
+    123
+
+and the ``foo`` attribute:
+
+    >>> traverser.publishTraverse(request, 'foo')
+    True
+
+However, we cannot lookup the ``bar`` attribute or any other non-existent
+item:
+
+    >>> traverser.publishTraverse(request, 'bar')
+    Traceback (most recent call last):
+    ...
+    NotFound: Object: <MyContainer object at ...>, name: 'bar'
+
+    >>> traverser.publishTraverse(request, 'bad')
+    Traceback (most recent call last):
+    ...
+    NotFound: Object: <MyContainer object at ...>, name: 'bad'
+
+You can also add traversers that return an adapted object. For example, let's
+take the following adapter:
+
+    >>> class ISomeAdapter(Interface):
+    ...     pass
+
+    >>> from zope.component import adapts
+    >>> class SomeAdapter(object):
+    ...     implements(ISomeAdapter)
+    ...     adapts(IMyContainer)
+    ...
+    ...     def __init__(self, context):
+    ...         pass
+
+    >>> from zope.component import adapts, provideAdapter
+    >>> provideAdapter(SomeAdapter)
+
+Now we register this adapter under the traversal name ``some``:
+
+    >>> from schooltool.traverser.traverser import AdapterTraverserPlugin
+    >>> provideSubscriptionAdapter(
+    ...     AdapterTraverserPlugin('some', ISomeAdapter),
+    ...     (IMyContainer, IPublisherRequest))
+
+So here is the result:
+
+    >>> traverser.publishTraverse(request, 'some')
+    <SomeAdapter object at ...>
+
+
+Traverser Plugins
+-----------------
+
+The `traverser` package comes with several default traverser plugins; three of
+them were already introduced above: `SingleAttributeTraverserPlugin`,
+`AdapterTraverserPlugin`, and `ContainerTraverserPlugin`. Another plugin is
+the the `NullTraverserPlugin`, which always just returns the object itself:
+
+    >>> from schooltool.traverser.traverser import NullTraverserPlugin
+    >>> SomethingPlugin = NullTraverserPlugin('something')
+
+    >>> plugin = SomethingPlugin(content, request)
+    >>> plugin.publishTraverse(request, 'something')
+    <Content object at ...>
+
+    >>> plugin.publishTraverse(request, 'something else')
+    Traceback (most recent call last):
+    ...
+    NotFound: Object: <Content object at ...>, name: 'something else'
+
+All of the above traversers with exception of the `ContainerTraverserPlugin`
+are realizations of the abstract `NameTraverserPlugin` class. Name traversers
+are traversers that can resolve one particular name. By using the abstract
+`NameTraverserPlugin` class, all of the traverser boilerplate can be
+avoided. Here is a simple example that always returns a specific value for a
+traversed name:
+
+    >>> from schooltool.traverser.traverser import NameTraverserPlugin
+    >>> class TrueTraverserPlugin(NameTraverserPlugin):
+    ...     traversalName = 'true'
+    ...     def _traverse(self, request, name):
+    ...         return True
+
+As you can see realized name traversers must implement the ``_traverse()``
+method, which is only responsible for returning the result. Of course it can
+also raise the `NotFound` error if something goes wrong during the
+computation. LEt's check it out:
+
+    >>> plugin = TrueTraverserPlugin(content, request)
+    >>> plugin.publishTraverse(request, 'true')
+    True
+
+    >>> plugin.publishTraverse(request, 'false')
+    Traceback (most recent call last):
+    ...
+    NotFound: Object: <Content object at ...>, name: 'false'
+
+A final traverser that is offered by the package is the
+`AttributeTraverserPlugin``, which simply allows one to traverse all
+accessible attributes of an object:
+
+    >>> from schooltool.traverser.traverser import AttributeTraverserPlugin
+
+    >>> plugin = AttributeTraverserPlugin(myContainer, request)
+    >>> plugin.publishTraverse(request, 'foo')
+    True
+    >>> plugin.publishTraverse(request, 'bar')
+    False
+    >>> plugin.publishTraverse(request, 'blah')
+    Traceback (most recent call last):
+    ...
+    NotFound: Object: <MyContainer object at ...>, name: 'blah'
+    >>> plugin.publishTraverse(request, 'some')
+    Traceback (most recent call last):
+    ...
+    NotFound: Object: <MyContainer object at ...>, name: 'some'
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/traverser/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/traverser/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/traverser/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/traverser/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package.


Property changes on: schooltool/branches/upstream/current/src/schooltool/traverser/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/traverser/browser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/traverser/browser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/traverser/browser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,34 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Pluggable Traverser Implementation for the Browser
+
+$Id: browser.py 5669 2006-01-20 19:58:16Z mg $
+"""
+from zope.app import zapi
+from schooltool.traverser.traverser import PluggableTraverser
+
+
+class PluggableBrowserTraverser(PluggableTraverser):
+
+    def browserDefault(self, request):
+        """See zope.publisher.browser.interfaces.IBrowserPublisher"""
+        view_name = zapi.getDefaultViewName(self.context, request)
+        view_uri = "@@%s" %view_name
+        return self.context, (view_uri,)


Property changes on: schooltool/branches/upstream/current/src/schooltool/traverser/browser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/traverser/interfaces.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/traverser/interfaces.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/traverser/interfaces.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,40 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Pluggable Traverser Interfaces
+
+This implementation is independent of the presentation type. Sub-interfaces
+must be written for every specific presentation type.
+
+$Id: interfaces.py 5669 2006-01-20 19:58:16Z mg $
+"""
+
+from zope.publisher.interfaces import IPublishTraverse
+
+
+class IPluggableTraverser(IPublishTraverse):
+    """A pluggable traverser.
+
+    This traverser traverses a name by utilizing helper traversers that are
+    registered as ``ITraverserPlugin`` subscribers.
+    """
+
+
+class ITraverserPlugin(IPublishTraverse):
+    """A plugin for the pluggable traverser."""


Property changes on: schooltool/branches/upstream/current/src/schooltool/traverser/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/traverser/tests.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/traverser/tests.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/traverser/tests.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,33 @@
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Tests for the Preferences System
+
+$Id: tests.py 6047 2006-05-11 18:31:03Z mg $
+"""
+import unittest
+
+from zope.testing import doctest
+from zope.component import testing
+
+
+def test_suite():
+    return unittest.TestSuite((
+        doctest.DocFileSuite(
+            'README.txt',
+            setUp=testing.setUp, tearDown=testing.tearDown,
+            optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS),
+        ))
+
+if __name__ == '__main__':
+    unittest.main(default='test_suite')


Property changes on: schooltool/branches/upstream/current/src/schooltool/traverser/tests.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/traverser/traverser.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/traverser/traverser.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/traverser/traverser.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,159 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Pluggable Traverser Implementation
+
+$Id: traverser.py 5669 2006-01-20 19:58:16Z mg $
+"""
+
+from zope.interface import implements
+from zope.component import subscribers, queryAdapter, queryMultiAdapter
+from zope.publisher.interfaces import NotFound
+
+from schooltool.traverser import interfaces
+
+_marker = object()
+
+class PluggableTraverser(object):
+    """Generic Pluggable Traverser."""
+
+    implements(interfaces.IPluggableTraverser)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        # 1. Look at all the traverser plugins, whether they have an answer.
+        for traverser in subscribers((self.context, request),
+                                     interfaces.ITraverserPlugin):
+            try:
+                return traverser.publishTraverse(request, name)
+            except NotFound:
+                pass
+
+        # 2. The traversers did not have an answer, so let's see whether it is
+        #    a view.
+        view = queryMultiAdapter((self.context, request), name=name)
+        if view is not None:
+            return view
+
+        raise NotFound(self.context, name, request)
+
+
+class NameTraverserPlugin(object):
+    """Abstract class that traverses an object by name."""
+    implements(interfaces.ITraverserPlugin)
+
+    traversalName = None
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        if name == self.traversalName:
+            return self._traverse(request, name)
+        raise NotFound(self.context, name, request)
+
+    def _traverse(self, request, name):
+        raise NotImplemented, 'Method must be implemented by subclasses.'
+
+
+class NullTraverserPluginTemplate(NameTraverserPlugin):
+    """Traverse to an adapter by name."""
+
+    def _traverse(self, request, name):
+        return self.context
+
+
+def NullTraverserPlugin(traversalName):
+    return type('NullTraverserPlugin', (NullTraverserPluginTemplate,),
+                {'traversalName': traversalName})
+
+
+class SingleAttributeTraverserPluginTemplate(NameTraverserPlugin):
+    """Allow only a single attribute to be traversed."""
+
+    def _traverse(self, request, name):
+        return getattr(self.context, name)
+
+
+def SingleAttributeTraverserPlugin(name):
+    return type('SingleAttributeTraverserPlugin',
+                (SingleAttributeTraverserPluginTemplate,),
+                {'traversalName': name})
+
+
+class AdapterTraverserPluginTemplate(NameTraverserPlugin):
+    """Traverse to an adapter by name."""
+    interface = None
+    adapterName = ''
+
+    def _traverse(self, request, name):
+        adapter = queryAdapter(self.context, self.interface,
+                               name=self.adapterName)
+        if adapter is None:
+            raise NotFound(self.context, name, request)
+
+        return adapter
+
+
+def AdapterTraverserPlugin(traversalName, interface, adapterName=''):
+    return type('AdapterTraverserPlugin',
+                (AdapterTraverserPluginTemplate,),
+                {'traversalName': traversalName,
+                 'adapterName': adapterName,
+                 'interface': interface})
+
+
+class ContainerTraverserPlugin(object):
+    """A traverser that knows how to look up objects by name in a container."""
+
+    implements(interfaces.ITraverserPlugin)
+
+    def __init__(self, container, request):
+        self.context = container
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        """See zope.publisher.interfaces.IPublishTraverse"""
+        subob = self.context.get(name, None)
+        if subob is None:
+            raise NotFound(self.context, name, request)
+
+        return subob
+
+
+class AttributeTraverserPlugin(object):
+    """A simple traverser plugin that traverses an attribute by name"""
+
+    implements(interfaces.ITraverserPlugin)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        try:
+            obj = getattr(self.context, name)
+        except AttributeError:
+            raise NotFound(self.context, name, request)
+        else:
+            return obj


Property changes on: schooltool/branches/upstream/current/src/schooltool/traverser/traverser.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/utility/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/utility/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/utility/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3 @@
+from utility import UtilitySetUp, MultiUtilitySetUp, UtilitySpecification
+
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/utility/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/utility/ftests/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/utility/ftests/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/utility/ftests/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/utility/ftests/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/utility/ftests/test_utility.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/utility/ftests/test_utility.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/utility/ftests/test_utility.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,132 @@
+import unittest
+
+from zope.testing import doctest
+from zope.app.testing import setup
+from zope.app.component.hooks import getSite
+
+
+def doctest_utilityRegistration():
+    """
+    We set up the IntIds utility::
+
+      >>> from schooltool.utility import UtilitySetUp
+      >>> from zope.app.intid import IntIds
+      >>> from zope.app.intid.interfaces import IIntIds
+      >>> setup = UtilitySetUp(IntIds, IIntIds)
+
+      >>> from schooltool.app.interfaces import CatalogSetUpEvent
+      >>> site = getSite()
+      >>> event = CatalogSetUpEvent(site)
+
+    We'll pass the event to the setup::
+
+      >>> setup(event)
+
+    We now expect the utility to be available::
+
+      >>> from zope.component import getUtility
+      >>> util = getUtility(IIntIds)
+      >>> IIntIds.providedBy(util)
+      True
+
+    """
+
+
+def doctest_multipleUtilityRegistration():
+    """
+    A more complex scenario where multiple dependent utilities are
+    registered, the intids utility and the catalog. The catalog also
+    contains indexes, so need special setup code to initialize the indexes.
+
+    Let's import the information needed to set up the IntIds utility first::
+
+      >>> from zope.app.intid import IntIds
+      >>> from zope.app.intid.interfaces import IIntIds
+
+    And now for the catalog::
+
+      >>> from zope.app.catalog.catalog import Catalog
+      >>> from zope.app.catalog.interfaces import ICatalog
+      >>> from zope.app.catalog.field import FieldIndex
+
+    We'll define the catalog setup function that creates the index::
+
+      >>> from zope.interface import Interface
+      >>> def catalogSetUp(catalog):
+      ...     catalog['myindex'] = FieldIndex(Interface, 'foo')
+
+    Now let's set these up as utilities::
+
+      >>> from schooltool.utility import UtilitySpecification
+      >>> from schooltool.utility import MultiUtilitySetUp
+      >>> setup = MultiUtilitySetUp(
+      ...    UtilitySpecification(IntIds, IIntIds),
+      ...    UtilitySpecification(Catalog, ICatalog, setUp=catalogSetUp))
+
+      >>> from schooltool.app.interfaces import CatalogSetUpEvent
+      >>> site = getSite()
+      >>> event = CatalogSetUpEvent(site)
+      >>> setup(event)
+
+    We'll check whether the utilities are available::
+
+      >>> from zope.component import getUtility
+      >>> intids = getUtility(IIntIds)
+      >>> IIntIds.providedBy(intids)
+      True
+      >>> catalog = getUtility(ICatalog)
+      >>> ICatalog.providedBy(catalog)
+      True
+
+    """
+
+
+def doctest_utilityOverride():
+    """
+    Let's create a utility::
+
+      >>> from persistent import Persistent
+      >>> from zope.app.container.contained import Contained
+      >>> from zope.interface import Interface, implements
+      >>> class IMyUtility(Interface):
+      ...     pass
+      >>> class MyUtility1(Persistent, Contained):
+      ...     implements(IMyUtility)
+
+    Let's register it::
+
+      >>> from schooltool.app.interfaces import CatalogSetUpEvent
+      >>> from schooltool.utility import UtilitySetUp
+      >>> setup = UtilitySetUp(MyUtility1, IMyUtility)
+      >>> from zope.app.component.hooks import getSite
+      >>> site = getSite()
+      >>> event = CatalogSetUpEvent(site)
+      >>> setup(event)
+
+    And let's register another one, overriding the first::
+
+      >>> class MyUtility2(Persistent, Contained):
+      ...   implements(IMyUtility)
+      >>> setup2 = UtilitySetUp(MyUtility2, IMyUtility, override=True)
+      >>> setup2(event)
+
+    Now we expect there to be only MyUtility2::
+
+      >>> from zope.component import getUtility
+      >>> util = getUtility(IMyUtility)
+      >>> isinstance(util, MyUtility2)
+      True
+
+    """
+
+
+def sitePlacefulSetUp(*args):
+    setup.placefulSetUp(site=True)
+
+def sitePlacefulTearDown(*args):
+    setup.placefulTearDown()
+
+def test_suite():
+    return unittest.TestSuite([
+        doctest.DocTestSuite(setUp=sitePlacefulSetUp,
+                             tearDown=sitePlacefulTearDown)])


Property changes on: schooltool/branches/upstream/current/src/schooltool/utility/ftests/test_utility.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/utility/utility.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/utility/utility.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/utility/utility.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,105 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2006 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+
+from zope.app import zapi
+from zope.app.component.hooks import getSite, setSite
+from zope.app.component.interfaces import ISite
+from zope.component import queryUtility
+
+
+class UtilitySpecification(object):
+    """A specification of a utility.
+
+    A utility gets:
+
+    factory - the factory creating the utility.
+    iface - the interface provided by the utility (by which it is looked up)
+    name - optional utility name
+    setUp - an optional setUp function for the utility. This can
+            for instance be used for setting up indexes in a catalog.
+            The setUp function gets passed the utility as an argument.
+    override - override previous local utility setups. Replaces that
+               utility with this one. Defaults to False
+    storage_name - name the utility as visible in the ZMI.
+                   If not specified will be autogenerated.
+    """
+
+    def __init__(self, factory, iface, name='', setUp=None,
+                 override=False, storage_name=None):
+        if storage_name is None:
+            storage_name = iface.__module__ + '.' + iface.__name__
+            if name:
+                storage_name += '.' + name
+        self.storage_name = storage_name
+        self.factory = factory
+        self.setUp = setUp
+        self.iface = iface
+        self.utility_name = name
+        self.override = override
+
+
+def setUpUtilities(site, specs):
+   manager = site.getSiteManager()
+   default = zapi.traverse(site, '++etc++site/default')
+   for spec in specs:
+       local_utility = getLocalUtility(default, spec)
+       if local_utility is not None:
+           if spec.override:
+               # override existing utility
+               name = local_utility.__name__
+               manager.unregisterUtility(name, spec.iface)
+               del default[name]
+           else:
+               # do not register this utility; we already got it
+               continue
+       utility = spec.factory()
+       default[spec.storage_name] = utility
+       if spec.setUp is not None:
+           spec.setUp(utility)
+       manager.registerUtility(utility, spec.iface, spec.utility_name)
+
+
+def getLocalUtility(default, spec):
+    util = queryUtility(spec.iface, name=spec.utility_name, default=None)
+    if util is None or util.__parent__ is default:
+        return util
+    else:
+        return None
+
+
+class UtilitySetUp(UtilitySpecification):
+    """Set up a single utility."""
+
+    def __call__(self, event):
+        site = event.object
+        setUpUtilities(site, [self])
+
+
+class MultiUtilitySetUp(object):
+    """Set up multiple related utilities that need to be in order.
+
+    (for instance intids needs to be set up before the catalog is).
+    """
+
+    def __init__(self, *specifications):
+        self.specifications = specifications
+
+    def __call__(self, event):
+        site = event.object
+        setUpUtilities(site, self.specifications)


Property changes on: schooltool/branches/upstream/current/src/schooltool/utility/utility.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/version.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/version.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/version.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+2006.999-2007-alpha1
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool/version.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/widget/__init__.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/widget/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/widget/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+#


Property changes on: schooltool/branches/upstream/current/src/schooltool/widget/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/widget/password.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/widget/password.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/widget/password.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,64 @@
+from zope.app.form.browser import PasswordWidget
+from zope.app.form.browser.widget import renderElement
+from zope.app.form.interfaces import ConversionError
+from zope.i18n import translate
+
+from schooltool import SchoolToolMessage as _
+
+class PasswordConfirmationWidget(PasswordWidget):
+    """Password Widget that uses two fields to confirm user input.
+    """
+
+    default = ''
+    type = 'password'
+    displayWidth = 15
+    
+    def __call__(self):
+        password_tag = renderElement(
+                self.tag,
+                type=self.type,
+                name=self.name,
+                id=self.name,
+                value=self.default,
+                cssClass=self.cssClass,
+                style=self.style,
+                size=self.displayWidth,
+                extra=self.extra)
+        confirm_name = self.name + '.confirm'
+        confirm_tag = renderElement(
+                self.tag,
+                type=self.type,
+                name=confirm_name,
+                id=confirm_name,
+                value=self.default,
+                cssClass=self.cssClass,
+                style=self.style,
+                size=self.displayWidth,
+                extra=self.extra)
+        # XXX we don't want label in the translatable string
+        return translate(
+            _(u'${password} <label for="${label}" title="">Confirm</label> ${confirm}',
+            mapping={
+            'label': confirm_name,
+            'password': password_tag,
+            'confirm': confirm_tag}))
+
+    def _toFieldValue(self, input):
+        """Check whether the confirmation field value is identical to
+        the password value.
+        """
+        formdata = self.request.form
+        if input != formdata[self.name + '.confirm']:
+            raise ConversionError(_(u"Supplied passwords are not identical"),
+                                  '')
+        return super(PasswordConfirmationWidget, self)._toFieldValue(input)
+
+    def hasInput(self):
+        """Check whether the field is represented in the form.
+        """
+        return self.name + ".confirm" in self.request.form or \
+          super(PasswordConfirmationWidget, self).hasInput()
+
+    def hidden(self):
+        raise NotImplementedError(
+            'Cannot get a hidden tag for a password field')


Property changes on: schooltool/branches/upstream/current/src/schooltool/widget/password.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool/xmlparsing.py
===================================================================
--- schooltool/branches/upstream/current/src/schooltool/xmlparsing.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool/xmlparsing.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,531 @@
+"""
+Wrappers around libxml2 for easier XML parsing.
+
+$Id: xmlparsing.py 5667 2006-01-20 19:19:52Z mg $
+"""
+
+import libxml2
+from zope.interface import implements
+from zope.interface.common.interfaces import IException
+
+from schooltool.common import UnicodeAwareException
+from schooltool.common import to_unicode
+
+
+def validate_against_schema(schema, xml):
+    """Return True iff the XML document conforms to the given RelaxNG schema.
+
+    Raises libxml2.parserError if the document is not well-formed.
+    """
+
+    rngp = libxml2.relaxNGNewMemParserCtxt(schema, len(schema))
+    try:
+        rngs = rngp.relaxNGParse()
+        ctxt = rngs.relaxNGNewValidCtxt()
+        doc = libxml2.parseDoc(xml)
+        try:
+            result = doc.relaxNGValidateDoc(ctxt)
+        finally:
+            doc.freeDoc()
+        return result == 0
+    finally:
+        # what does this do?
+        libxml2.relaxNGCleanupTypes()
+
+
+class XMLDocument(object):
+    r"""XML document.
+
+    The document is parsed when you create an XMLDocument instance.
+
+        >>> body = '''
+        ...   <?xml version="1.0" encoding="ISO-8859-13"?>
+        ...   <hello id="123">
+        ...     <world>Earth</world>
+        ...     <message language="en">Hi, people!</message>
+        ...     <message language="lt">Sveiki, \xFEmon\xEBs!</message>
+        ...   </hello>
+        ... '''.lstrip()
+        >>> doc = XMLDocument(body)
+
+    You can perform XPath queries on it.
+
+        >>> len(doc.query('/hello/world'))
+        1
+        >>> len(doc.query('/hello/earthlings'))
+        0
+
+    A query returns a list of XMLNode objects.
+
+        >>> message = doc.query('//message')[0]
+        >>> message.content
+        u'Hi, people!'
+        >>> message['language']
+        u'en'
+
+    You can access the root element directly
+
+        >>> doc.root['id']
+        u'123'
+
+    You do not need to worry about charset conversions.
+
+        >>> message = doc.query('//message')[1]
+        >>> message.content
+        u'Sveiki, \u017emon\u0117s!'
+        >>> message['language']
+        u'lt'
+
+    When you're done you should free the memory allocated by libxml2
+
+        >>> doc.free()
+
+    If you do not free the memory manually, it will be freed during garbage
+    collection.
+    """
+
+    root = property(lambda self: XMLNode(self._doc.getRootElement(), self))
+
+    def __init__(self, body, schema=None, namespaces=None):
+        """Parse the document (and validate with a RelaxNG schema if given).
+
+        Ill-formed documents cause XMLParseError to be raised.
+
+            >>> XMLDocument("<ill></formed>")
+            Traceback (most recent call last):
+              ...
+            XMLParseError: Ill-formed document.
+
+        Documents can be validated according to a RelaxNG schema.
+
+            >>> schema = '''
+            ...   <grammar xmlns="http://relaxng.org/ns/structure/1.0">
+            ...     <start>
+            ...       <element name="sample">
+            ...         <text/>
+            ...       </element>
+            ...     </start>
+            ...   </grammar>
+            ... '''
+
+            >>> XMLDocument("<bad_example>I am invalid!</bad_example>", schema)
+            Traceback (most recent call last):
+              ...
+            XMLValidationError: Document not valid according to schema.
+
+            >>> XMLDocument("<sample>Hi!</sample>", schema).free()
+
+        You can pass a dictionary with namespaces directly to the constructor
+        instead of calling registerNs:
+
+            >>> doc = XMLDocument("<sample/>",
+            ...                   namespaces={'n1': 'http://example.com/n1',
+            ...                               'n2': 'http://example.com/n2'})
+            >>> doc.namespaces['n1']
+            'http://example.com/n1'
+            >>> doc.query('n2:nosuchelement')
+            []
+
+        """
+        self._doc = self._xpathctx = None # __del__ wants them
+        if schema is not None:
+            try:
+                if not validate_against_schema(schema, body):
+                    raise XMLValidationError(
+                                "Document not valid according to schema.")
+            except libxml2.parserError, e:
+                if 'xmlRelaxNGParse' in str(e):
+                    raise XMLSchemaError("Invalid RelaxNG schema.")
+                else:
+                    raise XMLParseError("Ill-formed document.")
+
+        self._doc = self._parse(body)
+        self._xpathctx = self._doc.xpathNewContext()
+        self.namespaces = {}
+        if namespaces:
+            for ns, url in namespaces.items():
+                self.registerNs(ns, url)
+
+    def _parse(self, body):
+        """Parse a string and return a libxml2 document object."""
+        try:
+            return libxml2.parseDoc(body)
+        except libxml2.parserError:
+            raise XMLParseError("Ill-formed document.")
+
+    def registerNs(self, ns, url):
+        """Register an XML namespace.
+
+        You need to call registerNs for all namespaces that you want to use in
+        XPath queries and attribute lookups.  You do not have to use the same
+        prefix as is used in the document itself.
+
+            >>> doc = XMLDocument('''
+            ...   <sample xmlns="http://example.com/ns/samplens"
+            ...           xmlns:xlink="http://www.w3.org/1999/xlink">
+            ...      <a xlink:type="simple" xlink:href="http://example.com" />
+            ...   </sample>
+            ... '''.lstrip())
+            >>> doc.registerNs('sample', 'http://example.com/ns/samplens')
+            >>> doc.registerNs('xlnk', 'http://www.w3.org/1999/xlink')
+
+            >>> nodes = doc.query('//sample:a')
+            >>> len(nodes)
+            1
+
+            >>> nodes[0]['xlnk:href']
+            u'http://example.com'
+
+        As usual, it is a good idea to free the resources explicitly.
+
+            >>> doc.free()
+
+        """
+        self._xpathctx.xpathRegisterNs(ns, url)
+        self.namespaces[ns] = url
+
+    def query(self, xpath_query):
+        """Perform an XPath query relative to the document node.
+
+        Returns a list of XMLNode objects.
+
+            >>> doc = XMLDocument('<a><b><c>d</c></b></a>')
+            >>> nodes = doc.query('/a//c')
+            >>> len(nodes)
+            1
+            >>> nodes[0].content
+            u'd'
+
+        Raises an exception if the querry is ill-formed
+
+            >>> doc.query('@!#%!@%!@#%')
+            Traceback (most recent call last):
+              ...
+            XMLXPathError: Ill-formed XPath query ('@!#%!@%!@#%').
+
+        As usual, it is a good idea to free the resources explicitly.
+
+            >>> doc.free()
+
+        """
+        self._xpathctx.setContextNode(self._doc)
+        try:
+            return [XMLNode(node, self)
+                    for node in self._xpathctx.xpathEval(xpath_query)]
+        except libxml2.xpathError:
+            raise XMLXPathError('Ill-formed XPath query (%r).' % xpath_query)
+
+    def free(self):
+        """Free libxml2 data structures.
+
+            >>> doc = XMLDocument('<simple/>')
+            >>> doc.free()
+
+        Free can be safely called more than once.
+
+            >>> doc.free()
+
+        """
+        if self._doc is not None:
+            self._doc.freeDoc()
+            self._xpathctx.xpathFreeContext()
+            self._doc = self._xpathctx = None
+
+    def __del__(self):
+        """Free libxml2 data structures during garbage collection.
+
+            >>> doc = XMLDocument('<simple/>')
+            >>> doc = None
+            >>> import gc
+            >>> ignore = gc.collect()
+
+        """
+        self.free()
+
+
+class HTMLDocument(XMLDocument):
+    r"""HTML document.
+
+    Similair to XMLDocument, but does not require well-formed XML markup.
+
+        >>> body = '''
+        ...   Hi, my name is Marius.
+        ...   <p>
+        ...   I hate ill-formed XML.
+        ... '''.lstrip()
+        >>> doc = HTMLDocument(body)
+        >>> len(doc.query('//p'))
+        2
+
+    When you're done you should free the memory allocated by libxml2
+
+        >>> doc.free()
+
+    If you do not free the memory manually, it will be freed during garbage
+    collection.
+    """
+
+    def _parse(self, body):
+        """Parse a string and return a libxml2 document object."""
+        try:
+            return libxml2.htmlParseDoc(body, 'UTF-8')
+        except libxml2.parserError:
+            raise XMLParseError("HTML parse error document.")
+
+
+class XMLNode(object):
+    r"""XML element node.
+
+    Lists of XMLNodes are returned by XMLDocument.query and XMLNode.query
+    methods.  See the documentation of XMLDocument for usage examples.
+
+    The content of an element is accessible as its `content` attribute.
+    It is a Unicode string.
+
+        >>> doc = XMLDocument('''
+        ...    <sample>
+        ...       <one>One</one>
+        ...       <two count="42">
+        ...         Two
+        ...         lines
+        ...       </two>
+        ...       <empty />
+        ...     </sample>
+        ... ''')
+        >>> doc.query('//one')[0].content
+        u'One'
+        >>> doc.query('//two')[0].content
+        u'\n        Two\n        lines\n      '
+        >>> doc.query('//empty')[0].content
+        u''
+
+    You can get attributes via XPath queries or by accessing the node directly.
+
+        >>> doc.query('//two/@count')[0].content
+        u'42'
+
+        >>> node = doc.query('//two')[0]
+        >>> node.query('@count')[0].content
+        u'42'
+        >>> node['count']
+        u'42'
+
+    As usual, it is a good idea to free the resources explicitly.
+
+        >>> doc.free()
+    """
+
+    content = property(lambda self: to_unicode(self._node.content))
+
+    def __init__(self, libxml_node, document):
+        self._node = libxml_node
+        self._doc = document
+
+    def get(self, name, default=None):
+        """Get an attribute of this node.
+
+            >>> doc = XMLDocument('''
+            ...    <sample
+            ...       xmlns:xlink="http://www.w3.org/1999/xlink"
+            ...       xmlns:sample="http://example.com/ns/samplens"
+            ...       xlink:type="simple"
+            ...       sample:attr="sample value"
+            ...       just_attr="another value"
+            ...       />
+            ... ''')
+            >>> doc.registerNs('sample', 'http://example.com/ns/samplens')
+            >>> doc.registerNs('xlnk', 'http://www.w3.org/1999/xlink')
+
+            >>> node = doc.query('/sample')[0]
+            >>> node.get('xlnk:type')
+            u'simple'
+            >>> node.get('sample:attr')
+            u'sample value'
+            >>> node.get('just_attr')
+            u'another value'
+            >>> node.get('nonexistent') is None
+            True
+            >>> node.get('nonexistent', u'default value')
+            u'default value'
+
+        Accessing unregistered namespaces results in an XMLError.
+
+            >>> node.get('unregistered_ns:anything')
+            Traceback (most recent call last):
+              ...
+            XMLNamespaceError: Unregistered namespace prefix (unregistered_ns:anything).
+
+            >>> node.get('too:many:colons')
+            Traceback (most recent call last):
+              ...
+            XMLAttributeError: Ill-formed attribute name (too:many:colons).
+
+        As usual, it is a good idea to free the resources explicitly.
+
+            >>> doc.free()
+
+        """
+        if ':' in name:
+            try:
+                ns, attr = name.split(':')
+            except (KeyError, ValueError):
+                raise XMLAttributeError("Ill-formed attribute name (%s)."
+                                        % name)
+            try:
+                uri = self._doc.namespaces[ns]
+            except (KeyError, ValueError):
+                raise XMLNamespaceError(
+                            "Unregistered namespace prefix (%s)." % name)
+        else:
+            attr = name
+            uri = None
+        value = to_unicode(self._node.nsProp(attr, uri))
+        if value is None:
+            value = default
+        return value
+
+    def __getitem__(self, name):
+        """Get an attribute of this node.
+
+            >>> doc = XMLDocument('''
+            ...    <sample
+            ...       xmlns:xlink="http://www.w3.org/1999/xlink"
+            ...       xmlns:sample="http://example.com/ns/samplens"
+            ...       xlink:type="simple"
+            ...       sample:attr="sample value"
+            ...       just_attr="another value"
+            ...       />
+            ... ''')
+            >>> doc.registerNs('sample', 'http://example.com/ns/samplens')
+            >>> doc.registerNs('xlnk', 'http://www.w3.org/1999/xlink')
+
+            >>> node = doc.query('/sample')[0]
+            >>> node['xlnk:type']
+            u'simple'
+            >>> node['sample:attr']
+            u'sample value'
+            >>> node['just_attr']
+            u'another value'
+
+        Accessing nonexistent attribues results in an AttributeError.
+
+            >>> node['nonexistent']
+            Traceback (most recent call last):
+              ...
+            AttributeError: nonexistent
+
+            >>> node['attr']
+            Traceback (most recent call last):
+              ...
+            AttributeError: attr
+
+            >>> node['sample:nonexistent']
+            Traceback (most recent call last):
+              ...
+            AttributeError: sample:nonexistent
+
+        Accessing unregistered namespaces results in an XMLError.
+
+            >>> node['unregistered_ns:anything']
+            Traceback (most recent call last):
+              ...
+            XMLNamespaceError: Unregistered namespace prefix (unregistered_ns:anything).
+
+            >>> node['too:many:colons']
+            Traceback (most recent call last):
+              ...
+            XMLAttributeError: Ill-formed attribute name (too:many:colons).
+
+        As usual, it is a good idea to free the resources explicitly.
+
+            >>> doc.free()
+
+        """
+        value = self.get(name)
+        if value is None:
+            raise AttributeError(name)
+        return value
+
+    def query(self, xpath_query):
+        """Perform an XPath query relative to this node node.
+
+        Returns a list of XMLNode objects.
+
+            >>> doc = XMLDocument('<a><b><c>d</c></b></a>')
+            >>> node = doc.query('/a/b')[0]
+            >>> len(node.query('c'))
+            1
+            >>> len(node.query('b'))
+            0
+
+        Raises an exception if the querry is ill-formed
+
+            >>> node.query('@!#%!@%!@#%')
+            Traceback (most recent call last):
+              ...
+            XMLXPathError: Ill-formed XPath query ('@!#%!@%!@#%').
+
+        As usual, it is a good idea to free the resources explicitly.
+
+            >>> doc.free()
+
+        """
+        xpathctx = self._doc._xpathctx
+        xpathctx.setContextNode(self._node)
+        try:
+            return [XMLNode(node, self._doc)
+                    for node in xpathctx.xpathEval(xpath_query)]
+        except libxml2.xpathError:
+            raise XMLXPathError('Ill-formed XPath query (%r).'
+                                % xpath_query)
+
+    def __str__(self):
+        return self._node.serialize()
+
+    def __repr__(self):
+        return "'%s'" %self._node.serialize()
+
+
+class IXMLError(IException): pass
+class IXMLParseError(IXMLError): pass
+class IXMLSchemaError(IXMLError): pass
+class IXMLValidationError(IXMLError): pass
+class IXMLXPathError(IXMLError): pass
+class IXMLNamespaceError(IXMLError): pass
+class IXMLAttributeError(IXMLError): pass
+
+
+class XMLError(UnicodeAwareException):
+    """Base class for XML errors."""
+    implements(IXMLError)
+
+
+class XMLParseError(XMLError):
+    """Ill-formed XML document."""
+    implements(IXMLParseError)
+
+
+class XMLSchemaError(XMLError):
+    """Invalid RelaxNG schema."""
+    implements(IXMLSchemaError)
+
+
+class XMLValidationError(XMLError):
+    """Invalid XML document."""
+    implements(IXMLValidationError)
+
+
+class XMLXPathError(XMLError):
+    """Ill-formed XPath query."""
+    implements(IXMLXPathError)
+
+
+class XMLNamespaceError(XMLError):
+    """Unregistered XML namespace."""
+    implements(IXMLNamespaceError)
+
+
+class XMLAttributeError(XMLError):
+    """Ill-formed XML attribute name."""
+    implements(IXMLAttributeError)
+


Property changes on: schooltool/branches/upstream/current/src/schooltool/xmlparsing.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool.egg-info/PKG-INFO
===================================================================
--- schooltool/branches/upstream/current/src/schooltool.egg-info/PKG-INFO	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool.egg-info/PKG-INFO	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,37 @@
+Metadata-Version: 1.0
+Name: schooltool
+Version: 2006.999-2007-alpha1-svn-r6947
+Summary: A common information systems platform for school administration.
+Home-page: http://www.schooltool.org
+Author: SchoolTool development team
+Author-email: schooltool-dev at schooltool.org
+License: GPL
+Description: 
+        SchoolTool is an open source school management information system.  It is
+        a distributed client/server system.  The SchoolTool server presents two
+        interfaces to clients:
+        
+        - a traditional web application interface, usable with an ordinary browser.
+        
+        - HTTP-based programming interface suitable for fat clients, adhering to
+        the Representational State Transfer (REST) architectural style (see
+        http://rest.blueoxen.net/).
+        
+        The web application interface is the primary one.  The RESTive interface is
+        there for potential interoperability with other systems and fat clients to
+        perform data entry that is inconvenient to do via the web application
+        interface.
+        
+        Any modern web browser is suitable for the web application interface.  The
+        interface degrades gracefully, so a browser that does not support CSS or
+        Javascript will be usable, although perhaps not very nice or convenient.
+Platform: any
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Web Environment
+Classifier: Intended Audience :: End Users/Desktop
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Zope
+Classifier: Topic :: Education
+Classifier: Topic :: Office/Business :: Scheduling

Added: schooltool/branches/upstream/current/src/schooltool.egg-info/SOURCES.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool.egg-info/SOURCES.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool.egg-info/SOURCES.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,1073 @@
+GPL.txt
+Makefile
+README.txt
+i18nextract.py
+schoolbell-server.py
+schoolbell-site.zcml
+schoolbell.conf.in
+schooltool-server.py
+schooltool.conf.in
+setup.cfg
+setup.py
+test.py
+benchmark/acl.py
+benchmark/benchmark.py
+benchmark/manyrecurrent.py
+benchmark/nonrecurrent.py
+benchmark/recurrent.py
+benchmark/sampledata.py
+bin/coverage_reports.py
+bin/mkschooltoolinst
+bin/remove-stale-bytecode.py
+bin/rest-client.py
+bin/runfdoctests.py
+doc/ISSUES.txt
+doc/building-with-mingw.txt
+doc/restive-interface.txt
+doc/schooltool-security.xls
+doc/wfmc-workflows.txt
+images/schooltool_zebra.xcf
+schooltool-skel/bin/schooltool.in
+schooltool-skel/bin/test.in
+schooltool-skel/etc/ftesting.zcml
+schooltool-skel/etc/schooltool.conf.in
+schooltool-skel/etc/site.zcml
+schooltool-skel/log/README.txt
+schooltool-skel/var/README.txt
+scripts/manage-schooltool
+scripts/schooltool
+scripts/schooltool-rest-client
+src/trace.py
+src/schoolbell/__init__.py
+src/schoolbell/app/__init__.py
+src/schoolbell/app/app.py
+src/schoolbell/app/cal.py
+src/schoolbell/app/interfaces.py
+src/schoolbell/app/notes.py
+src/schoolbell/app/security.py
+src/schoolbell/calendar/__init__.py
+src/schoolbell/calendar/recurrent.py
+src/schoolbell/relationship/__init__.py
+src/schoolbell/relationship/relationship.py
+src/schoolbell/relationship/uri.py
+src/schooltool/__init__.py
+src/schooltool/client.py
+src/schooltool/common.py
+src/schooltool/configure.zcml
+src/schooltool/version.txt
+src/schooltool/xmlparsing.py
+src/schooltool.egg-info/PKG-INFO
+src/schooltool.egg-info/SOURCES.txt
+src/schooltool.egg-info/dependency_links.txt
+src/schooltool.egg-info/requires.txt
+src/schooltool.egg-info/top_level.txt
+src/schooltool/app/README.txt
+src/schooltool/app/__init__.py
+src/schooltool/app/app.py
+src/schooltool/app/booking.txt
+src/schooltool/app/cal.py
+src/schooltool/app/config-schema.xml
+src/schooltool/app/configure.zcml
+src/schooltool/app/interfaces.py
+src/schooltool/app/main.py
+src/schooltool/app/membership.py
+src/schooltool/app/overlay.py
+src/schooltool/app/relationships.py
+src/schooltool/app/security.py
+src/schooltool/app/security.txt
+src/schooltool/app/security.zcml
+src/schooltool/app/browser/__init__.py
+src/schooltool/app/browser/app.py
+src/schooltool/app/browser/cal.py
+src/schooltool/app/browser/configure.zcml
+src/schooltool/app/browser/csvimport.py
+src/schooltool/app/browser/interfaces.py
+src/schooltool/app/browser/overlay.py
+src/schooltool/app/browser/pdfcal.py
+src/schooltool/app/browser/skin.py
+src/schooltool/app/browser/templates.txt
+src/schooltool/app/browser/testing.py
+src/schooltool/app/browser/ftests/README.txt
+src/schooltool/app/browser/ftests/__init__.py
+src/schooltool/app/browser/ftests/app.txt
+src/schooltool/app/browser/ftests/brokenview-ftesting.zcml
+src/schooltool/app/browser/ftests/cal-recurrence.txt
+src/schooltool/app/browser/ftests/cal-security.txt
+src/schooltool/app/browser/ftests/cal.txt
+src/schooltool/app/browser/ftests/composite-timetables.txt
+src/schooltool/app/browser/ftests/deletion.txt
+src/schooltool/app/browser/ftests/errors.txt
+src/schooltool/app/browser/ftests/login.txt
+src/schooltool/app/browser/ftests/membership.txt
+src/schooltool/app/browser/ftests/navigation.txt
+src/schooltool/app/browser/ftests/personinstructor.txt
+src/schooltool/app/browser/ftests/schedule-single-student.txt
+src/schooltool/app/browser/ftests/section-booking.txt
+src/schooltool/app/browser/ftests/setup.py
+src/schooltool/app/browser/ftests/system-objects.txt
+src/schooltool/app/browser/ftests/test_all.py
+src/schooltool/app/browser/ftests/ttschema-wizard.txt
+src/schooltool/app/browser/ftests/ttschema.txt
+src/schooltool/app/browser/ftests/undead-calendar-overlays.txt
+src/schooltool/app/browser/ftests/images/ttschema-wizard-1-tiny.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-1.dot
+src/schooltool/app/browser/ftests/images/ttschema-wizard-1.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-2-tiny.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-2.dot
+src/schooltool/app/browser/ftests/images/ttschema-wizard-2.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-3-tiny.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-3.dot
+src/schooltool/app/browser/ftests/images/ttschema-wizard-3.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-4-tiny.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-4.dot
+src/schooltool/app/browser/ftests/images/ttschema-wizard-4.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-5-tiny.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-5.dot
+src/schooltool/app/browser/ftests/images/ttschema-wizard-5.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-6-tiny.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard-6.dot
+src/schooltool/app/browser/ftests/images/ttschema-wizard-6.png
+src/schooltool/app/browser/ftests/images/ttschema-wizard.dot
+src/schooltool/app/browser/ftests/images/update-images.sh
+src/schooltool/app/browser/resources/day.png
+src/schooltool/app/browser/resources/month.png
+src/schooltool/app/browser/resources/week.png
+src/schooltool/app/browser/resources/year.png
+src/schooltool/app/browser/resources/calwidget/README.txt
+src/schooltool/app/browser/resources/calwidget/calendar.css
+src/schooltool/app/browser/resources/calwidget/calendar.js
+src/schooltool/app/browser/resources/calwidget/icon.gif
+src/schooltool/app/browser/templates/application_preferences.pt
+src/schooltool/app/browser/templates/cal_atom.pt
+src/schooltool/app/browser/templates/cal_daily.pt
+src/schooltool/app/browser/templates/cal_monthly.pt
+src/schooltool/app/browser/templates/cal_weekly.pt
+src/schooltool/app/browser/templates/cal_yearly.pt
+src/schooltool/app/browser/templates/calendar_macros.pt
+src/schooltool/app/browser/templates/calendar_overlay.pt
+src/schooltool/app/browser/templates/calendar_selection.pt
+src/schooltool/app/browser/templates/css_viewlet.pt
+src/schooltool/app/browser/templates/edit_relationships.pt
+src/schooltool/app/browser/templates/event.pt
+src/schooltool/app/browser/templates/event_add.pt
+src/schooltool/app/browser/templates/event_booking.pt
+src/schooltool/app/browser/templates/event_info_viewlet.pt
+src/schooltool/app/browser/templates/index.pt
+src/schooltool/app/browser/templates/javascript_viewlet.pt
+src/schooltool/app/browser/templates/login.pt
+src/schooltool/app/browser/templates/recevent_delete.pt
+src/schooltool/app/browser/templates/timetables-csvimport.pt
+src/schooltool/app/browser/tests/__init__.py
+src/schooltool/app/browser/tests/test_app.py
+src/schooltool/app/browser/tests/test_browser.py
+src/schooltool/app/browser/tests/test_cal.py
+src/schooltool/app/browser/tests/test_csvimport.py
+src/schooltool/app/browser/tests/test_overlay.py
+src/schooltool/app/browser/tests/test_pdfcal.py
+src/schooltool/app/browser/tests/test_skin.py
+src/schooltool/app/rest/__init__.py
+src/schooltool/app/rest/app.py
+src/schooltool/app/rest/configure.zcml
+src/schooltool/app/rest/errors.py
+src/schooltool/app/rest/interfaces.py
+src/schooltool/app/rest/relationships.py
+src/schooltool/app/rest/testing.py
+src/schooltool/app/rest/ftests/__init__.py
+src/schooltool/app/rest/ftests/app.txt
+src/schooltool/app/rest/ftests/errors.txt
+src/schooltool/app/rest/ftests/relationships.txt
+src/schooltool/app/rest/ftests/system-objects.txt
+src/schooltool/app/rest/ftests/test_all.py
+src/schooltool/app/rest/templates/acl.pt
+src/schooltool/app/rest/templates/aoc.pt
+src/schooltool/app/rest/templates/app.pt
+src/schooltool/app/rest/templates/link.pt
+src/schooltool/app/rest/templates/relationships.pt
+src/schooltool/app/rest/tests/__init__.py
+src/schooltool/app/rest/tests/test_app.py
+src/schooltool/app/rest/tests/test_errors.py
+src/schooltool/app/rest/tests/test_relationships.py
+src/schooltool/app/rest/tests/test_rest.py
+src/schooltool/app/tests/__init__.py
+src/schooltool/app/tests/empty.conf
+src/schooltool/app/tests/sample.conf
+src/schooltool/app/tests/test_app.py
+src/schooltool/app/tests/test_booking.py
+src/schooltool/app/tests/test_cal.py
+src/schooltool/app/tests/test_main.py
+src/schooltool/app/tests/test_overlay.py
+src/schooltool/app/tests/test_relationships.py
+src/schooltool/app/tests/test_security.py
+src/schooltool/attendance/README.txt
+src/schooltool/attendance/__init__.py
+src/schooltool/attendance/attendance-configure.zcml
+src/schooltool/attendance/attendance.py
+src/schooltool/attendance/configure.zcml
+src/schooltool/attendance/explanation.xpdl
+src/schooltool/attendance/ftesting.py
+src/schooltool/attendance/ftesting.zcml
+src/schooltool/attendance/interfaces.py
+src/schooltool/attendance/sampledata.py
+src/schooltool/attendance/sparkline.py
+src/schooltool/attendance/browser/__init__.py
+src/schooltool/attendance/browser/attendance.css
+src/schooltool/attendance/browser/attendance.py
+src/schooltool/attendance/browser/configure.zcml
+src/schooltool/attendance/browser/sparkline.py
+src/schooltool/attendance/browser/ftests/__init__.py
+src/schooltool/attendance/browser/ftests/attendance-forms.txt
+src/schooltool/attendance/browser/ftests/student-attendance.txt
+src/schooltool/attendance/browser/ftests/test_all.py
+src/schooltool/attendance/browser/ftests/workflow.txt
+src/schooltool/attendance/browser/templates/attendance_preferences.pt
+src/schooltool/attendance/browser/templates/controlpanel.pt
+src/schooltool/attendance/browser/templates/controlpanelViewlet.pt
+src/schooltool/attendance/browser/templates/no_section_meeting.pt
+src/schooltool/attendance/browser/templates/real_time.pt
+src/schooltool/attendance/browser/templates/retro.pt
+src/schooltool/attendance/browser/templates/section-attendance-viewlet.pt
+src/schooltool/attendance/browser/templates/student-attendance.pt
+src/schooltool/attendance/browser/tests/__init__.py
+src/schooltool/attendance/browser/tests/test_attendance.py
+src/schooltool/attendance/browser/tests/test_sparkline.py
+src/schooltool/attendance/tests/__init__.py
+src/schooltool/attendance/tests/test_attendance.py
+src/schooltool/attendance/tests/test_sampledata.py
+src/schooltool/attendance/tests/test_sparkline.py
+src/schooltool/calendar/README.txt
+src/schooltool/calendar/__init__.py
+src/schooltool/calendar/browser.py
+src/schooltool/calendar/generate_vcal_dict.py
+src/schooltool/calendar/icalendar.py
+src/schooltool/calendar/interfaces.py
+src/schooltool/calendar/mixins.py
+src/schooltool/calendar/recurrent.py
+src/schooltool/calendar/simple.py
+src/schooltool/calendar/timezones.txt
+src/schooltool/calendar/utils.py
+src/schooltool/calendar/vcal_dict.py
+src/schooltool/calendar/vzic.patch
+src/schooltool/calendar/tests/__init__.py
+src/schooltool/calendar/tests/sample.ics
+src/schooltool/calendar/tests/test_generate_vcal_dict.py
+src/schooltool/calendar/tests/test_icalendar.py
+src/schooltool/calendar/tests/test_recurrent.py
+src/schooltool/calendar/tests/test_schooltool.py
+src/schooltool/calendar/tests/Europe/Amsterdam.ics
+src/schooltool/calendar/tests/Europe/Vilnius.ics
+src/schooltool/commendation/BasicComponent.txt
+src/schooltool/commendation/PythonIntegration.txt
+src/schooltool/commendation/README.txt
+src/schooltool/commendation/SystemIntegration.txt
+src/schooltool/commendation/Viewing.txt
+src/schooltool/commendation/__init__.py
+src/schooltool/commendation/browser.py
+src/schooltool/commendation/commendation-configure.zcml
+src/schooltool/commendation/commendation.pt
+src/schooltool/commendation/commendation.py
+src/schooltool/commendation/commendation_add.pt
+src/schooltool/commendation/commendations.pt
+src/schooltool/commendation/commendations_overview.pt
+src/schooltool/commendation/configure.zcml
+src/schooltool/commendation/ftesting.zcml
+src/schooltool/commendation/ftests.py
+src/schooltool/commendation/interfaces.py
+src/schooltool/commendation/tests.py
+src/schooltool/course/__init__.py
+src/schooltool/course/booking.py
+src/schooltool/course/configure.zcml
+src/schooltool/course/course-configure.zcml
+src/schooltool/course/course.py
+src/schooltool/course/interfaces.py
+src/schooltool/course/sampledata.py
+src/schooltool/course/section.py
+src/schooltool/course/security.zcml
+src/schooltool/course/browser/__init__.py
+src/schooltool/course/browser/configure.zcml
+src/schooltool/course/browser/course.py
+src/schooltool/course/browser/csvimport.py
+src/schooltool/course/browser/section.py
+src/schooltool/course/browser/tests.py
+src/schooltool/course/browser/templates/course-csvimport.pt
+src/schooltool/course/browser/templates/course.pt
+src/schooltool/course/browser/templates/course_container.pt
+src/schooltool/course/browser/templates/coursesviewlet.pt
+src/schooltool/course/browser/templates/edit_relationships.pt
+src/schooltool/course/browser/templates/section.pt
+src/schooltool/course/browser/templates/section_add.pt
+src/schooltool/course/browser/templates/section_container.pt
+src/schooltool/course/browser/templates/section_edit.pt
+src/schooltool/course/help/__init__.py
+src/schooltool/course/help/configure.zcml
+src/schooltool/course/help/course_container.pt
+src/schooltool/course/rest/__init__.py
+src/schooltool/course/rest/configure.zcml
+src/schooltool/course/rest/course.pt
+src/schooltool/course/rest/course.py
+src/schooltool/course/rest/section.pt
+src/schooltool/course/rest/section.py
+src/schooltool/course/rest/tests.py
+src/schooltool/course/tests/__init__.py
+src/schooltool/course/tests/test_course.py
+src/schooltool/course/tests/test_sampledata.py
+src/schooltool/dashboard/__init__.py
+src/schooltool/dashboard/configure.zcml
+src/schooltool/dashboard/dashContent.pt
+src/schooltool/dashboard/dashboard-configure.zcml
+src/schooltool/dashboard/dashboard.pt
+src/schooltool/dashboard/dashboard.py
+src/schooltool/dashboard/dashboard_manager.pt
+src/schooltool/dashboard/dashboardpage.pt
+src/schooltool/dashboard/interfaces.py
+src/schooltool/dashboard/school.pt
+src/schooltool/dashboard/sections.pt
+src/schooltool/dashboard/term.pt
+src/schooltool/db-conversion-tests/Data.fs-0.10
+src/schooltool/db-conversion-tests/Data.fs-0.10-0.11.4
+src/schooltool/db-conversion-tests/Data.fs-0.11.4
+src/schooltool/db-conversion-tests/Data.fs-2006.0-alpha1
+src/schooltool/db-conversion-tests/setup.py
+src/schooltool/db-conversion-tests/test_migration_from.py
+src/schooltool/demographics/README.txt
+src/schooltool/demographics/__init__.py
+src/schooltool/demographics/configure.zcml
+src/schooltool/demographics/demographics-overrides.zcml
+src/schooltool/demographics/event_titles.txt
+src/schooltool/demographics/interfaces.py
+src/schooltool/demographics/overrides.zcml
+src/schooltool/demographics/person.py
+src/schooltool/demographics/sampledata.py
+src/schooltool/demographics/tests.py
+src/schooltool/demographics/utility.py
+src/schooltool/demographics/browser/__init__.py
+src/schooltool/demographics/browser/configure.zcml
+src/schooltool/demographics/browser/demographics.txt
+src/schooltool/demographics/browser/demographics_macros.pt
+src/schooltool/demographics/browser/display_form.pt
+src/schooltool/demographics/browser/edit_form.pt
+src/schooltool/demographics/browser/ftesting.zcml
+src/schooltool/demographics/browser/ftests.py
+src/schooltool/demographics/browser/menu_macros.pt
+src/schooltool/demographics/browser/nameinfo_view.pt
+src/schooltool/demographics/browser/person_add.pt
+src/schooltool/demographics/browser/personform.py
+src/schooltool/demographics/browser/schooldata_edit.pt
+src/schooltool/demographics/browser/schooldata_view.pt
+src/schooltool/demographics/browser/search.pt
+src/schooltool/demographics/browser/table.pt
+src/schooltool/demographics/browser/table.py
+src/schooltool/devmode/__init__.py
+src/schooltool/devmode/apidoc.css
+src/schooltool/devmode/apidoc.py
+src/schooltool/devmode/box-bottom.png
+src/schooltool/devmode/code_menu.pt
+src/schooltool/devmode/configure.zcml
+src/schooltool/devmode/devmode-configure.zcml
+src/schooltool/devmode/devmode-ftesting-overrides.zcml
+src/schooltool/devmode/devmode-overrides.zcml
+src/schooltool/devmode/devmode.css
+src/schooltool/devmode/devmode.pt
+src/schooltool/devmode/devmode.py
+src/schooltool/devmode/devmode.txt
+src/schooltool/devmode/ftesting.zcml
+src/schooltool/devmode/ftests.py
+src/schooltool/devmode/harrow.png
+src/schooltool/devmode/introspector.css
+src/schooltool/devmode/modules.pt
+src/schooltool/devmode/overrides.zcml
+src/schooltool/devmode/restdoc.pt
+src/schooltool/devmode/restdoc.py
+src/schooltool/devmode/restdoc.txt
+src/schooltool/devmode/restdoc_macros.pt
+src/schooltool/devmode/restmenu.pt
+src/schooltool/devmode/skin.py
+src/schooltool/devmode/switch.js
+src/schooltool/devmode/tests.py
+src/schooltool/devmode/varrow.png
+src/schooltool/generations/__init__.py
+src/schooltool/generations/evolve1.py
+src/schooltool/generations/evolve10.py
+src/schooltool/generations/evolve11.py
+src/schooltool/generations/evolve12.py
+src/schooltool/generations/evolve13.py
+src/schooltool/generations/evolve14.py
+src/schooltool/generations/evolve15.py
+src/schooltool/generations/evolve16.py
+src/schooltool/generations/evolve17.py
+src/schooltool/generations/evolve18.py
+src/schooltool/generations/evolve19.py
+src/schooltool/generations/evolve2.py
+src/schooltool/generations/evolve20.py
+src/schooltool/generations/evolve21.py
+src/schooltool/generations/evolve22.py
+src/schooltool/generations/evolve23.py
+src/schooltool/generations/evolve3.py
+src/schooltool/generations/evolve4.py
+src/schooltool/generations/evolve5.py
+src/schooltool/generations/evolve6.py
+src/schooltool/generations/evolve7.py
+src/schooltool/generations/evolve8.py
+src/schooltool/generations/evolve9.py
+src/schooltool/generations/tests/__init__.py
+src/schooltool/generations/tests/test_evolve1.py
+src/schooltool/generations/tests/test_evolve10.py
+src/schooltool/generations/tests/test_evolve11.py
+src/schooltool/generations/tests/test_evolve12.py
+src/schooltool/generations/tests/test_evolve14.py
+src/schooltool/generations/tests/test_evolve15.py
+src/schooltool/generations/tests/test_evolve16.py
+src/schooltool/generations/tests/test_evolve17.py
+src/schooltool/generations/tests/test_evolve18.py
+src/schooltool/generations/tests/test_evolve19.py
+src/schooltool/generations/tests/test_evolve20.py
+src/schooltool/generations/tests/test_evolve21.py
+src/schooltool/generations/tests/test_evolve22.py
+src/schooltool/generations/tests/test_evolve23.py
+src/schooltool/generations/tests/test_evolve6.py
+src/schooltool/generations/tests/test_evolve7.py
+src/schooltool/generations/tests/test_evolve8.py
+src/schooltool/generations/tests/test_evolve9.py
+src/schooltool/gradebook/README.txt
+src/schooltool/gradebook/__init__.py
+src/schooltool/gradebook/activity.py
+src/schooltool/gradebook/category.py
+src/schooltool/gradebook/configure.zcml
+src/schooltool/gradebook/gradebook-configure.zcml
+src/schooltool/gradebook/gradebook.py
+src/schooltool/gradebook/interfaces.py
+src/schooltool/gradebook/statistic.py
+src/schooltool/gradebook/browser/README.txt
+src/schooltool/gradebook/browser/__init__.py
+src/schooltool/gradebook/browser/activities_overview.pt
+src/schooltool/gradebook/browser/activity.py
+src/schooltool/gradebook/browser/categories.pt
+src/schooltool/gradebook/browser/category.py
+src/schooltool/gradebook/browser/configure.zcml
+src/schooltool/gradebook/browser/ftesting.zcml
+src/schooltool/gradebook/browser/ftests.py
+src/schooltool/gradebook/browser/gradebook.py
+src/schooltool/gradebook/browser/gradebook_grade.pt
+src/schooltool/gradebook/browser/gradebook_grade_activity.pt
+src/schooltool/gradebook/browser/gradebook_grade_student.pt
+src/schooltool/gradebook/browser/gradebook_overview.pt
+src/schooltool/gradebook/tests/__init__.py
+src/schooltool/gradebook/tests/test_gradebook.py
+src/schooltool/group/__init__.py
+src/schooltool/group/configure.zcml
+src/schooltool/group/group.py
+src/schooltool/group/interfaces.py
+src/schooltool/group/sampledata.py
+src/schooltool/group/security.zcml
+src/schooltool/group/browser/__init__.py
+src/schooltool/group/browser/configure.zcml
+src/schooltool/group/browser/csvimport.py
+src/schooltool/group/browser/group-csvimport.pt
+src/schooltool/group/browser/group.pt
+src/schooltool/group/browser/group.py
+src/schooltool/group/browser/groupsviewlet.pt
+src/schooltool/group/browser/tests.py
+src/schooltool/group/help/__init__.py
+src/schooltool/group/help/configure.zcml
+src/schooltool/group/help/group_container.pt
+src/schooltool/group/help/group_container.stx
+src/schooltool/group/rest/__init__.py
+src/schooltool/group/rest/configure.zcml
+src/schooltool/group/rest/group.pt
+src/schooltool/group/rest/group.py
+src/schooltool/group/rest/tests.py
+src/schooltool/group/tests/__init__.py
+src/schooltool/group/tests/test_group.py
+src/schooltool/group/tests/test_sampledata.py
+src/schooltool/help/README.txt
+src/schooltool/help/__init__.py
+src/schooltool/help/browser.py
+src/schooltool/help/configure.zcml
+src/schooltool/help/ftesting.zcml
+src/schooltool/help/ftests.py
+src/schooltool/help/help-configure.zcml
+src/schooltool/help/help-meta.zcml
+src/schooltool/help/help.css
+src/schooltool/help/help.txt
+src/schooltool/help/helplink.pt
+src/schooltool/help/helptopic.pt
+src/schooltool/help/integration.txt
+src/schooltool/help/meta.zcml
+src/schooltool/help/tests.py
+src/schooltool/level/README.txt
+src/schooltool/level/__init__.py
+src/schooltool/level/configure.zcml
+src/schooltool/level/ftesting.py
+src/schooltool/level/ftesting.zcml
+src/schooltool/level/interfaces.py
+src/schooltool/level/level-configure.zcml
+src/schooltool/level/level.py
+src/schooltool/level/promotion.py
+src/schooltool/level/promotion.xpdl
+src/schooltool/level/record.py
+src/schooltool/level/sampledata.py
+src/schooltool/level/testing.py
+src/schooltool/level/browser/README.txt
+src/schooltool/level/browser/__init__.py
+src/schooltool/level/browser/configure.zcml
+src/schooltool/level/browser/disconnectedlevelerror_info.pt
+src/schooltool/level/browser/ftests.py
+src/schooltool/level/browser/level.pt
+src/schooltool/level/browser/level.py
+src/schooltool/level/browser/level.txt
+src/schooltool/level/browser/level_validation.pt
+src/schooltool/level/browser/levellooperror_info.pt
+src/schooltool/level/browser/promotion.pt
+src/schooltool/level/browser/promotion.py
+src/schooltool/level/browser/promotion.txt
+src/schooltool/level/browser/record.pt
+src/schooltool/level/browser/record.py
+src/schooltool/level/browser/record.txt
+src/schooltool/level/browser/tests.py
+src/schooltool/level/rest/README.txt
+src/schooltool/level/rest/__init__.py
+src/schooltool/level/rest/configure.zcml
+src/schooltool/level/rest/ftests.py
+src/schooltool/level/rest/history.pt
+src/schooltool/level/rest/level.pt
+src/schooltool/level/rest/level.py
+src/schooltool/level/rest/record.py
+src/schooltool/level/rest/selectinitiallevel.pt
+src/schooltool/level/rest/setleveloutcome.pt
+src/schooltool/level/rest/tests/__init__.py
+src/schooltool/level/rest/tests/test_level.py
+src/schooltool/level/rest/tests/test_record.py
+src/schooltool/level/tests/__init__.py
+src/schooltool/level/tests/test_level.py
+src/schooltool/level/tests/test_sampledata.py
+src/schooltool/locales/__init__.py
+src/schooltool/locales/af/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/af/LC_MESSAGES/schooltool.po
+src/schooltool/locales/am/LC_MESSAGES/schooltool.po
+src/schooltool/locales/an/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ar/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ar/LC_MESSAGES/schooltool.po
+src/schooltool/locales/bn/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ca/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ca/LC_MESSAGES/schooltool.po
+src/schooltool/locales/cs/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/cs/LC_MESSAGES/schooltool.po
+src/schooltool/locales/da/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/de/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/de/LC_MESSAGES/schooltool.po
+src/schooltool/locales/de_CH/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/de_DE/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/el/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/el/LC_MESSAGES/schooltool.po
+src/schooltool/locales/en/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/en/LC_MESSAGES/schooltool.po
+src/schooltool/locales/en_AU/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/en_GB/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/en_US/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/es/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/es/LC_MESSAGES/schooltool.po
+src/schooltool/locales/es_CL/LC_MESSAGES/schooltool.po
+src/schooltool/locales/es_ES/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/es_MX/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/es_PE/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/es_US/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/et/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/et/LC_MESSAGES/schooltool.po
+src/schooltool/locales/eu/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/eu/LC_MESSAGES/schooltool.po
+src/schooltool/locales/fa/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/fa/LC_MESSAGES/schooltool.po
+src/schooltool/locales/fi/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/fi/LC_MESSAGES/schooltool.po
+src/schooltool/locales/fr/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/fr/LC_MESSAGES/schooltool.po
+src/schooltool/locales/fr_BE/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/fr_CA/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/fr_FR/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/gl/LC_MESSAGES/schooltool.po
+src/schooltool/locales/he/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/he/LC_MESSAGES/schooltool.po
+src/schooltool/locales/hi/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/hi/LC_MESSAGES/schooltool.po
+src/schooltool/locales/hu/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/hu/LC_MESSAGES/schooltool.po
+src/schooltool/locales/id/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/id/LC_MESSAGES/schooltool.po
+src/schooltool/locales/is/LC_MESSAGES/schooltool.po
+src/schooltool/locales/it/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/it/LC_MESSAGES/schooltool.po
+src/schooltool/locales/ja/LC_MESSAGES/schooltool.po
+src/schooltool/locales/ka/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ka/LC_MESSAGES/schooltool.po
+src/schooltool/locales/ko/LC_MESSAGES/schooltool.po
+src/schooltool/locales/lt/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/lt/LC_MESSAGES/schooltool.po
+src/schooltool/locales/lv/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ml/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ms/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/nb/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/nb/LC_MESSAGES/schooltool.po
+src/schooltool/locales/ne/LC_MESSAGES/schooltool.po
+src/schooltool/locales/nl/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/nl/LC_MESSAGES/schooltool.po
+src/schooltool/locales/nl_NL/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/nn/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/no/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/pa/LC_MESSAGES/schooltool.po
+src/schooltool/locales/pl/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/pl/LC_MESSAGES/schooltool.po
+src/schooltool/locales/pt/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/pt/LC_MESSAGES/schooltool.po
+src/schooltool/locales/pt_BR/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/pt_BR/LC_MESSAGES/schooltool.po
+src/schooltool/locales/pt_PT/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ro/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ro/LC_MESSAGES/schooltool.po
+src/schooltool/locales/ru/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/ru/LC_MESSAGES/schooltool.po
+src/schooltool/locales/sk/LC_MESSAGES/schooltool.po
+src/schooltool/locales/sq/LC_MESSAGES/schooltool.po
+src/schooltool/locales/sr/LC_MESSAGES/schooltool.po
+src/schooltool/locales/st/LC_MESSAGES/schooltool.po
+src/schooltool/locales/sv/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/sv/LC_MESSAGES/schooltool.po
+src/schooltool/locales/ta/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/tl/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/tl/LC_MESSAGES/schooltool.po
+src/schooltool/locales/tr/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/tr/LC_MESSAGES/schooltool.po
+src/schooltool/locales/uk/LC_MESSAGES/schooltool.po
+src/schooltool/locales/vi/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/yi/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/yi/LC_MESSAGES/schooltool.po
+src/schooltool/locales/zh_CN/LC_MESSAGES/schoolbell.po
+src/schooltool/locales/zh_CN/LC_MESSAGES/schooltool.po
+src/schooltool/note/__init__.py
+src/schooltool/note/browser.py
+src/schooltool/note/configure.zcml
+src/schooltool/note/ftesting.zcml
+src/schooltool/note/ftests.py
+src/schooltool/note/interfaces.py
+src/schooltool/note/note-configure.zcml
+src/schooltool/note/note.py
+src/schooltool/note/note_add.pt
+src/schooltool/note/notes.pt
+src/schooltool/note/notes_browser.txt
+src/schooltool/note/notes_rest.txt
+src/schooltool/note/rest.py
+src/schooltool/note/rest_notes.pt
+src/schooltool/note/tests.py
+src/schooltool/person/__init__.py
+src/schooltool/person/configure.zcml
+src/schooltool/person/interfaces.py
+src/schooltool/person/person.py
+src/schooltool/person/preference.py
+src/schooltool/person/security.zcml
+src/schooltool/person/utility.py
+src/schooltool/person/browser/__init__.py
+src/schooltool/person/browser/configure.zcml
+src/schooltool/person/browser/container_contents.rst
+src/schooltool/person/browser/csvimport.py
+src/schooltool/person/browser/csvimport.txt
+src/schooltool/person/browser/ftests.py
+src/schooltool/person/browser/password.txt
+src/schooltool/person/browser/person-csvimport.pt
+src/schooltool/person/browser/person.pt
+src/schooltool/person/browser/person.py
+src/schooltool/person/browser/person_add.pt
+src/schooltool/person/browser/person_add.txt
+src/schooltool/person/browser/person_container_delete.pt
+src/schooltool/person/browser/person_edit.pt
+src/schooltool/person/browser/person_filter.pt
+src/schooltool/person/browser/person_preferences.pt
+src/schooltool/person/browser/tests.py
+src/schooltool/person/help/__init__.py
+src/schooltool/person/help/configure.zcml
+src/schooltool/person/help/person_container.pt
+src/schooltool/person/rest/__init__.py
+src/schooltool/person/rest/configure.zcml
+src/schooltool/person/rest/interfaces.py
+src/schooltool/person/rest/person-preferences.pt
+src/schooltool/person/rest/person.pt
+src/schooltool/person/rest/person.py
+src/schooltool/person/rest/preference.py
+src/schooltool/person/rest/tests.py
+src/schooltool/person/tests/__init__.py
+src/schooltool/person/tests/test_person.py
+src/schooltool/relationship/README.txt
+src/schooltool/relationship/__init__.py
+src/schooltool/relationship/annotatable.py
+src/schooltool/relationship/configure.zcml
+src/schooltool/relationship/interfaces.py
+src/schooltool/relationship/objectevents.py
+src/schooltool/relationship/relationship.py
+src/schooltool/relationship/uri.py
+src/schooltool/relationship/tests/__init__.py
+src/schooltool/relationship/tests/test_annotatable.py
+src/schooltool/relationship/tests/test_objectevents.py
+src/schooltool/relationship/tests/test_relationship.py
+src/schooltool/relationship/tests/test_uri.py
+src/schooltool/requirement/README.txt
+src/schooltool/requirement/__init__.py
+src/schooltool/requirement/configure.zcml
+src/schooltool/requirement/evaluation.py
+src/schooltool/requirement/grades.txt
+src/schooltool/requirement/interfaces.py
+src/schooltool/requirement/requirement-configure.zcml
+src/schooltool/requirement/requirement.py
+src/schooltool/requirement/scoresystem.py
+src/schooltool/requirement/security.py
+src/schooltool/requirement/security.zcml
+src/schooltool/requirement/testing.py
+src/schooltool/requirement/tests.py
+src/schooltool/requirement/browser/README.txt
+src/schooltool/requirement/browser/__init__.py
+src/schooltool/requirement/browser/configure.zcml
+src/schooltool/requirement/browser/ftesting.zcml
+src/schooltool/requirement/browser/ftests.py
+src/schooltool/requirement/browser/requirement.pt
+src/schooltool/requirement/browser/requirement.py
+src/schooltool/requirement/browser/scoresystem.py
+src/schooltool/requirement/browser/scoresystem.txt
+src/schooltool/requirement/browser/scoresystemwidget.pt
+src/schooltool/requirement/browser/subthread.pt
+src/schooltool/requirement/browser/tests.py
+src/schooltool/requirement/browser/treenode.pt
+src/schooltool/resource/__init__.py
+src/schooltool/resource/booking.py
+src/schooltool/resource/configure.zcml
+src/schooltool/resource/interfaces.py
+src/schooltool/resource/resource.py
+src/schooltool/resource/sampledata.py
+src/schooltool/resource/security.zcml
+src/schooltool/resource/types.py
+src/schooltool/resource/browser/__init__.py
+src/schooltool/resource/browser/booking.py
+src/schooltool/resource/browser/cal-booking.txt
+src/schooltool/resource/browser/configure.zcml
+src/schooltool/resource/browser/container_delete.pt
+src/schooltool/resource/browser/csvimport.py
+src/schooltool/resource/browser/event_booking_viewlet.pt
+src/schooltool/resource/browser/event_edit_booking_viewlet.pt
+src/schooltool/resource/browser/ftests.py
+src/schooltool/resource/browser/resource-booking.txt
+src/schooltool/resource/browser/resource-csvimport.pt
+src/schooltool/resource/browser/resource.pt
+src/schooltool/resource/browser/resource.py
+src/schooltool/resource/browser/resource_filter.pt
+src/schooltool/resource/browser/resourcecontainer.pt
+src/schooltool/resource/browser/resources.txt
+src/schooltool/resource/browser/security.txt
+src/schooltool/resource/browser/subtype_widget.pt
+src/schooltool/resource/browser/tests.py
+src/schooltool/resource/rest/__init__.py
+src/schooltool/resource/rest/configure.zcml
+src/schooltool/resource/rest/resource.pt
+src/schooltool/resource/rest/resource.py
+src/schooltool/resource/rest/tests.py
+src/schooltool/resource/tests/__init__.py
+src/schooltool/resource/tests/test_resource.py
+src/schooltool/resource/tests/test_sampledata.py
+src/schooltool/restclient/README.txt
+src/schooltool/restclient/__init__.py
+src/schooltool/restclient/restclient.py
+src/schooltool/restclient/examples/export.py
+src/schooltool/restclient/examples/groups.csv
+src/schooltool/restclient/examples/import.py
+src/schooltool/restclient/examples/persons.csv
+src/schooltool/restclient/ftests/__init__.py
+src/schooltool/restclient/ftests/face.txt
+src/schooltool/restclient/ftests/test_restclient.py
+src/schooltool/restclient/tests/__init__.py
+src/schooltool/restclient/tests/test_restclient.py
+src/schooltool/sampledata/README.txt
+src/schooltool/sampledata/__init__.py
+src/schooltool/sampledata/browser.py
+src/schooltool/sampledata/configure.zcml
+src/schooltool/sampledata/first_names.txt
+src/schooltool/sampledata/generator.py
+src/schooltool/sampledata/interfaces.py
+src/schooltool/sampledata/last_names.txt
+src/schooltool/sampledata/name.py
+src/schooltool/sampledata/sampledata.pt
+src/schooltool/sampledata/ftests/__init__.py
+src/schooltool/sampledata/ftests/ftesting.zcml
+src/schooltool/sampledata/ftests/sampledata.txt
+src/schooltool/sampledata/ftests/test_all.py
+src/schooltool/sampledata/tests/__init__.py
+src/schooltool/sampledata/tests/test_browser.py
+src/schooltool/sampledata/tests/test_generator.py
+src/schooltool/sampledata/tests/test_name.py
+src/schooltool/sbapp/README.txt
+src/schooltool/sbapp/__init__.py
+src/schooltool/sbapp/configure.zcml
+src/schooltool/sbapp/main.py
+src/schooltool/sbapp/browser/__init__.py
+src/schooltool/sbapp/browser/cal.py
+src/schooltool/sbapp/browser/configure.zcml
+src/schooltool/sbapp/browser/csvimport.py
+src/schooltool/sbapp/browser/skin.py
+src/schooltool/sbapp/browser/ftests/__init__.py
+src/schooltool/sbapp/browser/ftests/app.txt
+src/schooltool/sbapp/browser/ftests/test_all.py
+src/schooltool/sbapp/browser/resources/schoolbell.png
+src/schooltool/sbapp/browser/templates/calendar_overlay.pt
+src/schooltool/sbapp/browser/templates/generic_macros.pt
+src/schooltool/sbapp/browser/templates/index.pt
+src/schooltool/sbapp/browser/templates/navigation.pt
+src/schooltool/sbapp/browser/templates/person.pt
+src/schooltool/sbapp/browser/tests/__init__.py
+src/schooltool/sbapp/browser/tests/test_cal.py
+src/schooltool/sbapp/browser/tests/test_skin.py
+src/schooltool/sbapp/generations/__init__.py
+src/schooltool/sbapp/generations/evolve1.py
+src/schooltool/sbapp/generations/evolve2.py
+src/schooltool/sbapp/generations/evolve3.py
+src/schooltool/sbapp/generations/evolve4.py
+src/schooltool/sbapp/generations/evolve5.py
+src/schooltool/sbapp/generations/evolve6.py
+src/schooltool/sbapp/generations/evolve7.py
+src/schooltool/sbapp/generations/evolve8.py
+src/schooltool/sbapp/rest/__init__.py
+src/schooltool/sbapp/rest/configure.zcml
+src/schooltool/sbapp/rest/ftests/__init__.py
+src/schooltool/sbapp/rest/ftests/app.txt
+src/schooltool/sbapp/rest/ftests/test_all.py
+src/schooltool/sbapp/rest/tests/__init__.py
+src/schooltool/sbapp/rest/tests/test_app.py
+src/schooltool/sbapp/rest/tests/test_rest.py
+src/schooltool/sbapp/tests/__init__.py
+src/schooltool/sbapp/tests/empty.conf
+src/schooltool/sbapp/tests/sample.conf
+src/schooltool/sbapp/tests/test_main.py
+src/schooltool/securitypolicy/README.txt
+src/schooltool/securitypolicy/__init__.py
+src/schooltool/securitypolicy/configure.zcml
+src/schooltool/securitypolicy/crowds.py
+src/schooltool/securitypolicy/customisation.py
+src/schooltool/securitypolicy/ftesting.py
+src/schooltool/securitypolicy/ftesting.zcml
+src/schooltool/securitypolicy/interfaces.py
+src/schooltool/securitypolicy/meta.zcml
+src/schooltool/securitypolicy/metaconfigure.py
+src/schooltool/securitypolicy/metadirectives.py
+src/schooltool/securitypolicy/policy.py
+src/schooltool/securitypolicy/browser/__init__.py
+src/schooltool/securitypolicy/browser/configure.zcml
+src/schooltool/securitypolicy/browser/views.py
+src/schooltool/securitypolicy/browser/ftests/__init__.py
+src/schooltool/securitypolicy/browser/ftests/helpers.py
+src/schooltool/securitypolicy/browser/ftests/policy_table.txt
+src/schooltool/securitypolicy/browser/ftests/test_all.py
+src/schooltool/securitypolicy/browser/templates/access_control.pt
+src/schooltool/securitypolicy/browser/templates/access_control_viewlet.pt
+src/schooltool/securitypolicy/browser/tests/__init__.py
+src/schooltool/securitypolicy/browser/tests/test_views.py
+src/schooltool/securitypolicy/tests/__init__.py
+src/schooltool/securitypolicy/tests/test_crowds.py
+src/schooltool/securitypolicy/tests/test_customisation.py
+src/schooltool/securitypolicy/tests/test_metaconfigure.py
+src/schooltool/securitypolicy/tests/test_policy.py
+src/schooltool/setup/__init__.py
+src/schooltool/setup/mkschooltoolinst.py
+src/schooltool/setupdata/README.txt
+src/schooltool/setupdata/__init__.py
+src/schooltool/setupdata/browser.py
+src/schooltool/setupdata/configure.zcml
+src/schooltool/setupdata/generator.py
+src/schooltool/setupdata/interfaces.py
+src/schooltool/setupdata/setupdata.pt
+src/schooltool/setupdata/tests/__init__.py
+src/schooltool/setupdata/tests/test_browser.py
+src/schooltool/setupdata/tests/test_generator.py
+src/schooltool/skin/__init__.py
+src/schooltool/skin/breadcrumbs.py
+src/schooltool/skin/configure.zcml
+src/schooltool/skin/containers.py
+src/schooltool/skin/dateformatter.py
+src/schooltool/skin/error.py
+src/schooltool/skin/form.py
+src/schooltool/skin/interfaces.py
+src/schooltool/skin/macros.py
+src/schooltool/skin/meta.zcml
+src/schooltool/skin/skin.py
+src/schooltool/skin/resources/delete.png
+src/schooltool/skin/resources/editor_config.js
+src/schooltool/skin/resources/favicon.ico
+src/schooltool/skin/resources/icon.png
+src/schooltool/skin/resources/layout.css
+src/schooltool/skin/resources/logo.png
+src/schooltool/skin/resources/next.png
+src/schooltool/skin/resources/note-body-l.gif
+src/schooltool/skin/resources/note-body-r.gif
+src/schooltool/skin/resources/note-head-l.gif
+src/schooltool/skin/resources/note-head-r.gif
+src/schooltool/skin/resources/previous.png
+src/schooltool/skin/resources/printer.png
+src/schooltool/skin/resources/private-note-body-l.gif
+src/schooltool/skin/resources/private-note-body-r.gif
+src/schooltool/skin/resources/private-note-head-l.gif
+src/schooltool/skin/resources/private-note-head-r.gif
+src/schooltool/skin/resources/schooltool.css
+src/schooltool/skin/resources/schooltool.js
+src/schooltool/skin/resources/schooltool.png
+src/schooltool/skin/resources/sidebar-background-top.png
+src/schooltool/skin/resources/sidebar-background.png
+src/schooltool/skin/resources/toolbar-background-hover.png
+src/schooltool/skin/resources/toolbar-background.png
+src/schooltool/skin/templates/actions.pt
+src/schooltool/skin/templates/actionsViewlet.pt
+src/schooltool/skin/templates/actionsbar.pt
+src/schooltool/skin/templates/container.pt
+src/schooltool/skin/templates/container_delete.pt
+src/schooltool/skin/templates/edit_form.pt
+src/schooltool/skin/templates/error.pt
+src/schooltool/skin/templates/filter.pt
+src/schooltool/skin/templates/formlib_macros.pt
+src/schooltool/skin/templates/generic_macros.pt
+src/schooltool/skin/templates/language_selector.pt
+src/schooltool/skin/templates/menuBarViewlet.pt
+src/schooltool/skin/templates/menubar.pt
+src/schooltool/skin/templates/navigation.pt
+src/schooltool/skin/templates/navigationViewlet.pt
+src/schooltool/skin/templates/notfound.pt
+src/schooltool/skin/templates/onlinehelp_macros.pt
+src/schooltool/skin/templates/simple_add.pt
+src/schooltool/skin/templates/simple_edit.pt
+src/schooltool/skin/templates/table_container.pt
+src/schooltool/skin/templates/unauthorized.pt
+src/schooltool/skin/templates/view_macros.pt
+src/schooltool/skin/templates/widget_macros.pt
+src/schooltool/skin/tests/__init__.py
+src/schooltool/skin/tests/test_breadcrumbs.py
+src/schooltool/skin/tests/test_containers.py
+src/schooltool/skin/tests/test_dateformatter.py
+src/schooltool/skin/tests/test_error.py
+src/schooltool/skin/tests/test_skin.py
+src/schooltool/table/__init__.py
+src/schooltool/table/batch.py
+src/schooltool/table/interfaces.py
+src/schooltool/table/table.py
+src/schooltool/table/templates/batch.pt
+src/schooltool/table/templates/filter.pt
+src/schooltool/table/tests/__init__.py
+src/schooltool/table/tests/test_table.py
+src/schooltool/term/README.txt
+src/schooltool/term/__init__.py
+src/schooltool/term/configure.zcml
+src/schooltool/term/interfaces.py
+src/schooltool/term/sampledata.py
+src/schooltool/term/term-configure.zcml
+src/schooltool/term/term.py
+src/schooltool/term/browser/__init__.py
+src/schooltool/term/browser/configure.zcml
+src/schooltool/term/browser/emergency.py
+src/schooltool/term/browser/emergency2.pt
+src/schooltool/term/browser/emergency_select.pt
+src/schooltool/term/browser/emergencydays.txt
+src/schooltool/term/browser/term-container-delete.pt
+src/schooltool/term/browser/term.pt
+src/schooltool/term/browser/term.py
+src/schooltool/term/browser/term_add_edit.pt
+src/schooltool/term/browser/termrenderer.txt
+src/schooltool/term/browser/tests.py
+src/schooltool/term/rest/__init__.py
+src/schooltool/term/rest/configure.zcml
+src/schooltool/term/rest/term.py
+src/schooltool/term/rest/tests.py
+src/schooltool/term/tests/__init__.py
+src/schooltool/term/tests/test_sampledata.py
+src/schooltool/term/tests/test_term.py
+src/schooltool/testing/README.txt
+src/schooltool/testing/__init__.py
+src/schooltool/testing/analyze.py
+src/schooltool/testing/functional.py
+src/schooltool/testing/registry.py
+src/schooltool/testing/setup.py
+src/schooltool/testing/tests.py
+src/schooltool/testing/util.py
+src/schooltool/tests/__init__.py
+src/schooltool/tests/test_client.py
+src/schooltool/tests/test_common.py
+src/schooltool/tests/test_xmlparsing.py
+src/schooltool/timetable/README.txt
+src/schooltool/timetable/__init__.py
+src/schooltool/timetable/configure.zcml
+src/schooltool/timetable/ftesting.py
+src/schooltool/timetable/ftesting.zcml
+src/schooltool/timetable/interfaces.py
+src/schooltool/timetable/model.py
+src/schooltool/timetable/sampledata.py
+src/schooltool/timetable/schema.py
+src/schooltool/timetable/source.py
+src/schooltool/timetable/term.py
+src/schooltool/timetable/timetable-configure.zcml
+src/schooltool/timetable/browser/__init__.py
+src/schooltool/timetable/browser/configure.zcml
+src/schooltool/timetable/browser/event.py
+src/schooltool/timetable/browser/schema.py
+src/schooltool/timetable/browser/ttwizard.py
+src/schooltool/timetable/browser/ftests/__init__.py
+src/schooltool/timetable/browser/ftests/test_all.py
+src/schooltool/timetable/browser/ftests/timetable-events.txt
+src/schooltool/timetable/browser/ftests/timetabling.txt
+src/schooltool/timetable/browser/templates/advancedtts.pt
+src/schooltool/timetable/browser/templates/person-timetable-setup.pt
+src/schooltool/timetable/browser/templates/schooltt-delete.pt
+src/schooltool/timetable/browser/templates/section-timetable-setup.pt
+src/schooltool/timetable/browser/templates/simpletts.pt
+src/schooltool/timetable/browser/templates/specialday_change.pt
+src/schooltool/timetable/browser/templates/specialday_select.pt
+src/schooltool/timetable/browser/templates/timetable-schema-container.pt
+src/schooltool/timetable/browser/templates/timetable.pt
+src/schooltool/timetable/browser/templates/timetable_event_edit.pt
+src/schooltool/timetable/browser/templates/timetable_list.pt
+src/schooltool/timetable/browser/templates/timetableschema.pt
+src/schooltool/timetable/browser/templates/ttwizard.pt
+src/schooltool/timetable/browser/templates/ttwizard_choice.pt
+src/schooltool/timetable/browser/templates/ttwizard_form.pt
+src/schooltool/timetable/browser/templates/ttwizard_homeroom.pt
+src/schooltool/timetable/browser/templates/ttwizard_period_order1.pt
+src/schooltool/timetable/browser/templates/ttwizard_period_order2.pt
+src/schooltool/timetable/browser/templates/ttwizard_slottimes.pt
+src/schooltool/timetable/browser/tests/__init__.py
+src/schooltool/timetable/browser/tests/specialdays.txt
+src/schooltool/timetable/browser/tests/test_schema.py
+src/schooltool/timetable/browser/tests/test_timetable.py
+src/schooltool/timetable/browser/tests/test_ttwizard.py
+src/schooltool/timetable/rest/__init__.py
+src/schooltool/timetable/rest/configure.zcml
+src/schooltool/timetable/rest/schema.py
+src/schooltool/timetable/rest/ftests/__init__.py
+src/schooltool/timetable/rest/ftests/composite-timetables.txt
+src/schooltool/timetable/rest/ftests/test_all.py
+src/schooltool/timetable/rest/ftests/timetabling.txt
+src/schooltool/timetable/rest/templates/timetable.pt
+src/schooltool/timetable/rest/templates/timetable_schema.pt
+src/schooltool/timetable/rest/templates/timetables.pt
+src/schooltool/timetable/rest/tests/__init__.py
+src/schooltool/timetable/rest/tests/test_rest.py
+src/schooltool/timetable/rest/tests/test_schema.py
+src/schooltool/timetable/tests/__init__.py
+src/schooltool/timetable/tests/test_model.py
+src/schooltool/timetable/tests/test_sampledata.py
+src/schooltool/timetable/tests/test_schema.py
+src/schooltool/timetable/tests/test_source.py
+src/schooltool/timetable/tests/test_timetable.py
+src/schooltool/traverser/README.txt
+src/schooltool/traverser/__init__.py
+src/schooltool/traverser/browser.py
+src/schooltool/traverser/interfaces.py
+src/schooltool/traverser/tests.py
+src/schooltool/traverser/traverser.py
+src/schooltool/utility/__init__.py
+src/schooltool/utility/utility.py
+src/schooltool/utility/ftests/__init__.py
+src/schooltool/utility/ftests/test_utility.py
+src/schooltool/widget/__init__.py
+src/schooltool/widget/password.py
+testsupport/README.txt
+testsupport/__init__.py
+testsupport/checks.py
+utilities/README.txt
+utilities/gpl.py
+utilities/xpathgrep.py


Property changes on: schooltool/branches/upstream/current/src/schooltool.egg-info/SOURCES.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool.egg-info/dependency_links.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool.egg-info/dependency_links.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool.egg-info/dependency_links.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,3 @@
+http://ftp.schooltool.org/schooltool/eggs/
+http://download.zope.org/distribution/
+http://eggs.carduner.net/


Property changes on: schooltool/branches/upstream/current/src/schooltool.egg-info/dependency_links.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool.egg-info/requires.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool.egg-info/requires.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool.egg-info/requires.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,26 @@
+pytz
+zc.resourcelibrary >= 0.7dev_r72506
+zc.table >= 0.7dev_r72459
+zc.catalog >= 1.2dev
+hurry.query >= 0.9.2
+zc.datetimewidget >= 0.6.1dev_r72453
+zope.ucol >= 1.0.2
+zope.html >= 0.1dev_r72429
+zope.file >= 0.1dev_r72428
+zope.mimetype >= 1.1dev_r72462
+z3c.javascript.mochikit >= 0.0.1
+zope.i18nmessageid
+zope.app.catalog
+zope.viewlet
+zope.app.file
+zope.app.onlinehelp
+zope.app.apidoc
+zope.optionstorage
+zope.wfmc
+zope.app.wfmc
+zope.server
+zope.app.wsgi
+zope.app.server
+zope.app.generations
+zope.app.securitypolicy
+zope.app.zcmlfiles
\ No newline at end of file


Property changes on: schooltool/branches/upstream/current/src/schooltool.egg-info/requires.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/schooltool.egg-info/top_level.txt
===================================================================
--- schooltool/branches/upstream/current/src/schooltool.egg-info/top_level.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/schooltool.egg-info/top_level.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+schooltool


Property changes on: schooltool/branches/upstream/current/src/schooltool.egg-info/top_level.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/src/trace.py
===================================================================
--- schooltool/branches/upstream/current/src/trace.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/src/trace.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,790 @@
+#! /usr/bin/python2.4
+
+# portions copyright 2001, Autonomous Zones Industries, Inc., all rights...
+# err...  reserved and offered to the public under the terms of the
+# Python 2.2 license.
+# Author: Zooko O'Whielacronx
+# http://zooko.com/
+# mailto:zooko at zooko.com
+#
+# Copyright 2000, Mojam Media, Inc., all rights reserved.
+# Author: Skip Montanaro
+#
+# Copyright 1999, Bioreason, Inc., all rights reserved.
+# Author: Andrew Dalke
+#
+# Copyright 1995-1997, Automatrix, Inc., all rights reserved.
+# Author: Skip Montanaro
+#
+# Copyright 1991-1995, Stichting Mathematisch Centrum, all rights reserved.
+#
+#
+# Permission to use, copy, modify, and distribute this Python software and
+# its associated documentation for any purpose without fee is hereby
+# granted, provided that the above copyright notice appears in all copies,
+# and that both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of neither Automatrix,
+# Bioreason or Mojam Media be used in advertising or publicity pertaining to
+# distribution of the software without specific, written prior permission.
+#
+"""program/module to trace Python program or function execution
+
+Sample use, command line:
+  trace.py -c -f counts --ignore-dir '$prefix' spam.py eggs
+  trace.py -t --ignore-dir '$prefix' spam.py eggs
+  trace.py --trackcalls spam.py eggs
+
+Sample use, programmatically
+   # create a Trace object, telling it what to ignore, and whether to
+   # do tracing or line-counting or both.
+   trace = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,], trace=0,
+                       count=1)
+   # run the new command using the given trace
+   trace.run('main()')
+   # make a report, telling it where you want output
+   r = trace.results()
+   r.write_results(show_missing=True)
+"""
+
+import linecache
+import os
+import re
+import sys
+import threading
+import token
+import tokenize
+import types
+import gc
+
+try:
+    import cPickle
+    pickle = cPickle
+except ImportError:
+    import pickle
+
+def usage(outfile):
+    outfile.write("""Usage: %s [OPTIONS] <file> [ARGS]
+
+Meta-options:
+--help                Display this help then exit.
+--version             Output version information then exit.
+
+Otherwise, exactly one of the following three options must be given:
+-t, --trace           Print each line to sys.stdout before it is executed.
+-c, --count           Count the number of times each line is executed
+                      and write the counts to <module>.cover for each
+                      module executed, in the module's directory.
+                      See also `--coverdir', `--file', `--no-report' below.
+-l, --listfuncs       Keep track of which functions are executed at least
+                      once and write the results to sys.stdout after the
+                      program exits.
+-T, --trackcalls      Keep track of caller/called pairs and write the
+                      results to sys.stdout after the program exits.
+-r, --report          Generate a report from a counts file; do not execute
+                      any code.  `--file' must specify the results file to
+                      read, which must have been created in a previous run
+                      with `--count --file=FILE'.
+
+Modifiers:
+-f, --file=<file>     File to accumulate counts over several runs.
+-R, --no-report       Do not generate the coverage report files.
+                      Useful if you want to accumulate over several runs.
+-C, --coverdir=<dir>  Directory where the report files.  The coverage
+                      report for <package>.<module> is written to file
+                      <dir>/<package>/<module>.cover.
+-m, --missing         Annotate executable lines that were not executed
+                      with '>>>>>> '.
+-s, --summary         Write a brief summary on stdout for each file.
+                      (Can only be used with --count or --report.)
+
+Filters, may be repeated multiple times:
+--ignore-module=<mod> Ignore the given module and its submodules
+                      (if it is a package).
+--ignore-dir=<dir>    Ignore files in the given directory (multiple
+                      directories can be joined by os.pathsep).
+""" % sys.argv[0])
+
+PRAGMA_NOCOVER = "#pragma NO COVER"
+
+# Simple rx to find lines with no code.
+rx_blank = re.compile(r'^\s*(#.*)?$')
+
+class Ignore:
+    def __init__(self, modules = None, dirs = None):
+        self._mods = modules or []
+        self._dirs = dirs or []
+
+        self._dirs = map(os.path.normpath, self._dirs)
+        self._ignore = { '<string>': 1 }
+
+    def names(self, filename, modulename):
+        if self._ignore.has_key(modulename):
+            return self._ignore[modulename]
+
+        # haven't seen this one before, so see if the module name is
+        # on the ignore list.  Need to take some care since ignoring
+        # "cmp" musn't mean ignoring "cmpcache" but ignoring
+        # "Spam" must also mean ignoring "Spam.Eggs".
+        for mod in self._mods:
+            if mod == modulename:  # Identical names, so ignore
+                self._ignore[modulename] = 1
+                return 1
+            # check if the module is a proper submodule of something on
+            # the ignore list
+            n = len(mod)
+            # (will not overflow since if the first n characters are the
+            # same and the name has not already occured, then the size
+            # of "name" is greater than that of "mod")
+            if mod == modulename[:n] and modulename[n] == '.':
+                self._ignore[modulename] = 1
+                return 1
+
+        # Now check that __file__ isn't in one of the directories
+        if filename is None:
+            # must be a built-in, so we must ignore
+            self._ignore[modulename] = 1
+            return 1
+
+        # Ignore a file when it contains one of the ignorable paths
+        for d in self._dirs:
+            # The '+ os.sep' is to ensure that d is a parent directory,
+            # as compared to cases like:
+            #  d = "/usr/local"
+            #  filename = "/usr/local.py"
+            # or
+            #  d = "/usr/local.py"
+            #  filename = "/usr/local.py"
+            if filename.startswith(d + os.sep):
+                self._ignore[modulename] = 1
+                return 1
+
+        # Tried the different ways, so we don't ignore this module
+        self._ignore[modulename] = 0
+        return 0
+
+def modname(path):
+    """Return a plausible module name for the patch."""
+
+    base = os.path.basename(path)
+    filename, ext = os.path.splitext(base)
+    return filename
+
+def fullmodname(path):
+    """Return a plausible module name for the path."""
+
+    # If the file 'path' is part of a package, then the filename isn't
+    # enough to uniquely identify it.  Try to do the right thing by
+    # looking in sys.path for the longest matching prefix.  We'll
+    # assume that the rest is the package name.
+
+    longest = ""
+    for dir in sys.path:
+        if path.startswith(dir) and path[len(dir)] == os.path.sep:
+            if len(dir) > len(longest):
+                longest = dir
+
+    if longest:
+        base = path[len(longest) + 1:]
+    else:
+        base = path
+    base = base.replace(os.sep, ".")
+    if os.altsep:
+        base = base.replace(os.altsep, ".")
+    filename, ext = os.path.splitext(base)
+    return filename
+
+class CoverageResults:
+    def __init__(self, counts=None, calledfuncs=None, infile=None,
+                 callers=None, outfile=None):
+        self.counts = counts
+        if self.counts is None:
+            self.counts = {}
+        self.counter = self.counts.copy() # map (filename, lineno) to count
+        self.calledfuncs = calledfuncs
+        if self.calledfuncs is None:
+            self.calledfuncs = {}
+        self.calledfuncs = self.calledfuncs.copy()
+        self.callers = callers
+        if self.callers is None:
+            self.callers = {}
+        self.callers = self.callers.copy()
+        self.infile = infile
+        self.outfile = outfile
+        if self.infile:
+            # Try to merge existing counts file.
+            try:
+                counts, calledfuncs, callers = \
+                        pickle.load(open(self.infile, 'rb'))
+                self.update(self.__class__(counts, calledfuncs, callers))
+            except (IOError, EOFError, ValueError), err:
+                print >> sys.stderr, ("Skipping counts file %r: %s"
+                                      % (self.infile, err))
+
+    def update(self, other):
+        """Merge in the data from another CoverageResults"""
+        counts = self.counts
+        calledfuncs = self.calledfuncs
+        callers = self.callers
+        other_counts = other.counts
+        other_calledfuncs = other.calledfuncs
+        other_callers = other.callers
+
+        for key in other_counts.keys():
+            counts[key] = counts.get(key, 0) + other_counts[key]
+
+        for key in other_calledfuncs.keys():
+            calledfuncs[key] = 1
+
+        for key in other_callers.keys():
+            callers[key] = 1
+
+    def write_results(self, show_missing=True, summary=False, coverdir=None):
+        """
+        @param coverdir
+        """
+        if self.calledfuncs:
+            print
+            print "functions called:"
+            calls = self.calledfuncs.keys()
+            calls.sort()
+            for filename, modulename, funcname in calls:
+                print ("filename: %s, modulename: %s, funcname: %s"
+                       % (filename, modulename, funcname))
+
+        if self.callers:
+            print
+            print "calling relationships:"
+            calls = self.callers.keys()
+            calls.sort()
+            lastfile = lastcfile = ""
+            for ((pfile, pmod, pfunc), (cfile, cmod, cfunc)) in calls:
+                if pfile != lastfile:
+                    print
+                    print "***", pfile, "***"
+                    lastfile = pfile
+                    lastcfile = ""
+                if cfile != pfile and lastcfile != cfile:
+                    print "  -->", cfile
+                    lastcfile = cfile
+                print "    %s.%s -> %s.%s" % (pmod, pfunc, cmod, cfunc)
+
+        # turn the counts data ("(filename, lineno) = count") into something
+        # accessible on a per-file basis
+        per_file = {}
+        for filename, lineno in self.counts.keys():
+            lines_hit = per_file[filename] = per_file.get(filename, {})
+            lines_hit[lineno] = self.counts[(filename, lineno)]
+
+        # accumulate summary info, if needed
+        sums = {}
+
+        for filename, count in per_file.iteritems():
+            # skip some "files" we don't care about...
+            if filename == "<string>":
+                continue
+            if filename.startswith("<doctest "):
+                continue
+
+            if filename.endswith(".pyc") or filename.endswith(".pyo"):
+                filename = filename[:-1]
+
+            if coverdir is None:
+                dir = os.path.dirname(os.path.abspath(filename))
+                modulename = modname(filename)
+            else:
+                dir = coverdir
+                if not os.path.exists(dir):
+                    os.makedirs(dir)
+                modulename = fullmodname(filename)
+
+            # If desired, get a list of the line numbers which represent
+            # executable content (returned as a dict for better lookup speed)
+            if show_missing:
+                lnotab = find_executable_linenos(filename)
+            else:
+                lnotab = {}
+
+            source = linecache.getlines(filename)
+            coverpath = os.path.join(dir, modulename + ".cover")
+            n_hits, n_lines = self.write_results_file(coverpath, source,
+                                                      lnotab, count)
+
+            if summary and n_lines:
+                percent = int(100 * n_hits / n_lines)
+                sums[modulename] = n_lines, percent, modulename, filename
+
+        if summary and sums:
+            mods = sums.keys()
+            mods.sort()
+            print "lines   cov%   module   (path)"
+            for m in mods:
+                n_lines, percent, modulename, filename = sums[m]
+                print "%5d   %3d%%   %s   (%s)" % sums[m]
+
+        if self.outfile:
+            # try and store counts and module info into self.outfile
+            try:
+                pickle.dump((self.counts, self.calledfuncs, self.callers),
+                            open(self.outfile, 'wb'), 1)
+            except IOError, err:
+                print >> sys.stderr, "Can't save counts files because %s" % err
+
+    def write_results_file(self, path, lines, lnotab, lines_hit):
+        """Return a coverage results file in path."""
+
+        try:
+            outfile = open(path, "w")
+        except IOError, err:
+            print >> sys.stderr, ("trace: Could not open %r for writing: %s"
+                                  "- skipping" % (path, err))
+            return 0, 0
+
+        n_lines = 0
+        n_hits = 0
+        for i, line in enumerate(lines):
+            lineno = i + 1
+            # do the blank/comment match to try to mark more lines
+            # (help the reader find stuff that hasn't been covered)
+            if lineno in lines_hit:
+                outfile.write("%5d: " % lines_hit[lineno])
+                n_hits += 1
+                n_lines += 1
+            elif rx_blank.match(line):
+                outfile.write("       ")
+            else:
+                # lines preceded by no marks weren't hit
+                # Highlight them if so indicated, unless the line contains
+                # #pragma: NO COVER
+                if lineno in lnotab and not PRAGMA_NOCOVER in lines[i]:
+                    outfile.write(">>>>>> ")
+                    n_lines += 1
+                else:
+                    outfile.write("       ")
+            outfile.write(lines[i].expandtabs(8))
+        outfile.close()
+
+        return n_hits, n_lines
+
+def find_lines_from_code(code, strs):
+    """Return dict where keys are lines in the line number table."""
+    linenos = {}
+
+    line_increments = [ord(c) for c in code.co_lnotab[1::2]]
+    table_length = len(line_increments)
+    docstring = False
+
+    lineno = code.co_firstlineno
+    for li in line_increments:
+        lineno += li
+        if lineno not in strs:
+            linenos[lineno] = 1
+
+    return linenos
+
+def find_lines(code, strs):
+    """Return lineno dict for all code objects reachable from code."""
+    # get all of the lineno information from the code of this scope level
+    linenos = find_lines_from_code(code, strs)
+
+    # and check the constants for references to other code objects
+    for c in code.co_consts:
+        if isinstance(c, types.CodeType):
+            # find another code object, so recurse into it
+            linenos.update(find_lines(c, strs))
+    return linenos
+
+def find_strings(filename):
+    """Return a dict of possible docstring positions.
+
+    The dict maps line numbers to strings.  There is an entry for
+    line that contains only a string or a part of a triple-quoted
+    string.
+    """
+    d = {}
+    # If the first token is a string, then it's the module docstring.
+    # Add this special case so that the test in the loop passes.
+    prev_ttype = token.INDENT
+    f = open(filename)
+    for ttype, tstr, start, end, line in tokenize.generate_tokens(f.readline):
+        if ttype == token.STRING:
+            if prev_ttype == token.INDENT:
+                sline, scol = start
+                eline, ecol = end
+                for i in range(sline, eline + 1):
+                    d[i] = 1
+        prev_ttype = ttype
+    f.close()
+    return d
+
+def find_executable_linenos(filename):
+    """Return dict where keys are line numbers in the line number table."""
+    try:
+        prog = open(filename, "rU").read()
+    except IOError, err:
+        print >> sys.stderr, ("Not printing coverage data for %r: %s"
+                              % (filename, err))
+        return {}
+    code = compile(prog, filename, "exec")
+    strs = find_strings(filename)
+    return find_lines(code, strs)
+
+class Trace:
+    def __init__(self, count=1, trace=1, countfuncs=0, countcallers=0,
+                 ignoremods=(), ignoredirs=(), infile=None, outfile=None):
+        """
+        @param count true iff it should count number of times each
+                     line is executed
+        @param trace true iff it should print out each line that is
+                     being counted
+        @param countfuncs true iff it should just output a list of
+                     (filename, modulename, funcname,) for functions
+                     that were called at least once;  This overrides
+                     `count' and `trace'
+        @param ignoremods a list of the names of modules to ignore
+        @param ignoredirs a list of the names of directories to ignore
+                     all of the (recursive) contents of
+        @param infile file from which to read stored counts to be
+                     added into the results
+        @param outfile file in which to write the results
+        """
+        self.infile = infile
+        self.outfile = outfile
+        self.ignore = Ignore(ignoremods, ignoredirs)
+        self.counts = {}   # keys are (filename, linenumber)
+        self.blabbed = {} # for debugging
+        self.pathtobasename = {} # for memoizing os.path.basename
+        self.donothing = 0
+        self.trace = trace
+        self._calledfuncs = {}
+        self._callers = {}
+        self._caller_cache = {}
+        if countcallers:
+            self.globaltrace = self.globaltrace_trackcallers
+        elif countfuncs:
+            self.globaltrace = self.globaltrace_countfuncs
+        elif trace and count:
+            self.globaltrace = self.globaltrace_lt
+            self.localtrace = self.localtrace_trace_and_count
+        elif trace:
+            self.globaltrace = self.globaltrace_lt
+            self.localtrace = self.localtrace_trace
+        elif count:
+            self.globaltrace = self.globaltrace_lt
+            self.localtrace = self.localtrace_count
+        else:
+            # Ahem -- do nothing?  Okay.
+            self.donothing = 1
+
+    def run(self, cmd):
+        import __main__
+        dict = __main__.__dict__
+        if not self.donothing:
+            sys.settrace(self.globaltrace)
+            threading.settrace(self.globaltrace)
+        try:
+            exec cmd in dict, dict
+        finally:
+            if not self.donothing:
+                sys.settrace(None)
+                threading.settrace(None)
+
+    def runctx(self, cmd, globals=None, locals=None):
+        if globals is None: globals = {}
+        if locals is None: locals = {}
+        if not self.donothing:
+            sys.settrace(self.globaltrace)
+            threading.settrace(self.globaltrace)
+        try:
+            exec cmd in globals, locals
+        finally:
+            if not self.donothing:
+                sys.settrace(None)
+                threading.settrace(None)
+
+    def runfunc(self, func, *args, **kw):
+        result = None
+        if not self.donothing:
+            sys.settrace(self.globaltrace)
+        try:
+            result = func(*args, **kw)
+        finally:
+            if not self.donothing:
+                sys.settrace(None)
+        return result
+
+    def file_module_function_of(self, frame):
+        code = frame.f_code
+        filename = code.co_filename
+        if filename:
+            modulename = modname(filename)
+        else:
+            modulename = None
+
+        funcname = code.co_name
+        clsname = None
+        if code in self._caller_cache:
+            if self._caller_cache[code] is not None:
+                clsname = self._caller_cache[code]
+        else:
+            self._caller_cache[code] = None
+            ## use of gc.get_referrers() was suggested by Michael Hudson
+            # all functions which refer to this code object
+            funcs = [f for f in gc.get_referrers(code)
+                         if hasattr(f, "func_doc")]
+            # require len(func) == 1 to avoid ambiguity caused by calls to
+            # new.function(): "In the face of ambiguity, refuse the
+            # temptation to guess."
+            if len(funcs) == 1:
+                dicts = [d for d in gc.get_referrers(funcs[0])
+                             if isinstance(d, dict)]
+                if len(dicts) == 1:
+                    classes = [c for c in gc.get_referrers(dicts[0])
+                                   if hasattr(c, "__bases__")]
+                    if len(classes) == 1:
+                        # ditto for new.classobj()
+                        clsname = str(classes[0])
+                        # cache the result - assumption is that new.* is
+                        # not called later to disturb this relationship
+                        # _caller_cache could be flushed if functions in
+                        # the new module get called.
+                        self._caller_cache[code] = clsname
+        if clsname is not None:
+            # final hack - module name shows up in str(cls), but we've already
+            # computed module name, so remove it
+            clsname = clsname.split(".")[1:]
+            clsname = ".".join(clsname)
+            funcname = "%s.%s" % (clsname, funcname)
+
+        return filename, modulename, funcname
+
+    def globaltrace_trackcallers(self, frame, why, arg):
+        """Handler for call events.
+
+        Adds information about who called who to the self._callers dict.
+        """
+        if why == 'call':
+            # XXX Should do a better job of identifying methods
+            this_func = self.file_module_function_of(frame)
+            parent_func = self.file_module_function_of(frame.f_back)
+            self._callers[(parent_func, this_func)] = 1
+
+    def globaltrace_countfuncs(self, frame, why, arg):
+        """Handler for call events.
+
+        Adds (filename, modulename, funcname) to the self._calledfuncs dict.
+        """
+        if why == 'call':
+            this_func = self.file_module_function_of(frame)
+            self._calledfuncs[this_func] = 1
+
+    def globaltrace_lt(self, frame, why, arg):
+        """Handler for call events.
+
+        If the code block being entered is to be ignored, returns `None',
+        else returns self.localtrace.
+        """
+        if why == 'call':
+            code = frame.f_code
+            filename = code.co_filename
+            if filename:
+                # XXX modname() doesn't work right for packages, so
+                # the ignore support won't work right for packages
+                modulename = modname(filename)
+                if modulename is not None:
+                    ignore_it = self.ignore.names(filename, modulename)
+                    if not ignore_it:
+                        if self.trace:
+                            print (" --- modulename: %s, funcname: %s"
+                                   % (modulename, code.co_name))
+                        return self.localtrace
+            else:
+                return None
+
+    def localtrace_trace_and_count(self, frame, why, arg):
+        if why == "line":
+            # record the file name and line number of every trace
+            filename = frame.f_code.co_filename
+            lineno = frame.f_lineno
+            key = filename, lineno
+            self.counts[key] = self.counts.get(key, 0) + 1
+
+            bname = os.path.basename(filename)
+            print "%s(%d): %s" % (bname, lineno,
+                                  linecache.getline(filename, lineno)),
+        return self.localtrace
+
+    def localtrace_trace(self, frame, why, arg):
+        if why == "line":
+            # record the file name and line number of every trace
+            filename = frame.f_code.co_filename
+            lineno = frame.f_lineno
+
+            bname = os.path.basename(filename)
+            print "%s(%d): %s" % (bname, lineno,
+                                  linecache.getline(filename, lineno)),
+        return self.localtrace
+
+    def localtrace_count(self, frame, why, arg):
+        if why == "line":
+            filename = frame.f_code.co_filename
+            lineno = frame.f_lineno
+            key = filename, lineno
+            self.counts[key] = self.counts.get(key, 0) + 1
+        return self.localtrace
+
+    def results(self):
+        return CoverageResults(self.counts, infile=self.infile,
+                               outfile=self.outfile,
+                               calledfuncs=self._calledfuncs,
+                               callers=self._callers)
+
+def _err_exit(msg):
+    sys.stderr.write("%s: %s\n" % (sys.argv[0], msg))
+    sys.exit(1)
+
+def main(argv=None):
+    import getopt
+
+    if argv is None:
+        argv = sys.argv
+    try:
+        opts, prog_argv = getopt.getopt(argv[1:], "tcrRf:d:msC:lT",
+                                        ["help", "version", "trace", "count",
+                                         "report", "no-report", "summary",
+                                         "file=", "missing",
+                                         "ignore-module=", "ignore-dir=",
+                                         "coverdir=", "listfuncs",
+                                         "trackcalls"])
+
+    except getopt.error, msg:
+        sys.stderr.write("%s: %s\n" % (sys.argv[0], msg))
+        sys.stderr.write("Try `%s --help' for more information\n"
+                         % sys.argv[0])
+        sys.exit(1)
+
+    trace = 0
+    count = 0
+    report = 0
+    no_report = 0
+    counts_file = None
+    missing = 0
+    ignore_modules = []
+    ignore_dirs = []
+    coverdir = None
+    summary = 0
+    listfuncs = False
+    countcallers = False
+
+    for opt, val in opts:
+        if opt == "--help":
+            usage(sys.stdout)
+            sys.exit(0)
+
+        if opt == "--version":
+            sys.stdout.write("trace 2.0\n")
+            sys.exit(0)
+
+        if opt == "-T" or opt == "--trackcalls":
+            countcallers = True
+            continue
+
+        if opt == "-l" or opt == "--listfuncs":
+            listfuncs = True
+            continue
+
+        if opt == "-t" or opt == "--trace":
+            trace = 1
+            continue
+
+        if opt == "-c" or opt == "--count":
+            count = 1
+            continue
+
+        if opt == "-r" or opt == "--report":
+            report = 1
+            continue
+
+        if opt == "-R" or opt == "--no-report":
+            no_report = 1
+            continue
+
+        if opt == "-f" or opt == "--file":
+            counts_file = val
+            continue
+
+        if opt == "-m" or opt == "--missing":
+            missing = 1
+            continue
+
+        if opt == "-C" or opt == "--coverdir":
+            coverdir = val
+            continue
+
+        if opt == "-s" or opt == "--summary":
+            summary = 1
+            continue
+
+        if opt == "--ignore-module":
+            ignore_modules.append(val)
+            continue
+
+        if opt == "--ignore-dir":
+            for s in val.split(os.pathsep):
+                s = os.path.expandvars(s)
+                # should I also call expanduser? (after all, could use $HOME)
+
+                s = s.replace("$prefix",
+                              os.path.join(sys.prefix, "lib",
+                                           "python" + sys.version[:3]))
+                s = s.replace("$exec_prefix",
+                              os.path.join(sys.exec_prefix, "lib",
+                                           "python" + sys.version[:3]))
+                s = os.path.normpath(s)
+                ignore_dirs.append(s)
+            continue
+
+        assert 0, "Should never get here"
+
+    if listfuncs and (count or trace):
+        _err_exit("cannot specify both --listfuncs and (--trace or --count)")
+
+    if not (count or trace or report or listfuncs or countcallers):
+        _err_exit("must specify one of --trace, --count, --report, "
+                  "--listfuncs, or --trackcalls")
+
+    if report and no_report:
+        _err_exit("cannot specify both --report and --no-report")
+
+    if report and not counts_file:
+        _err_exit("--report requires a --file")
+
+    if no_report and len(prog_argv) == 0:
+        _err_exit("missing name of file to run")
+
+    # everything is ready
+    if report:
+        results = CoverageResults(infile=counts_file, outfile=counts_file)
+        results.write_results(missing, summary=summary, coverdir=coverdir)
+    else:
+        sys.argv = prog_argv
+        progname = prog_argv[0]
+        sys.path[0] = os.path.split(progname)[0]
+
+        t = Trace(count, trace, countfuncs=listfuncs,
+                  countcallers=countcallers, ignoremods=ignore_modules,
+                  ignoredirs=ignore_dirs, infile=counts_file,
+                  outfile=counts_file)
+        try:
+            t.run('execfile(%r)' % (progname,))
+        except IOError, err:
+            _err_exit("Cannot run file %r because: %s" % (sys.argv[0], err))
+        except SystemExit:
+            pass
+
+        results = t.results()
+
+        if not no_report:
+            results.write_results(missing, summary=summary, coverdir=coverdir)
+
+if __name__=='__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/src/trace.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/test.py
===================================================================
--- schooltool/branches/upstream/current/test.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/test.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+SchoolTool test script.
+
+$Id$
+"""
+
+import sys
+import os
+import site
+from StringIO import StringIO
+import pytz
+
+try:
+    pytz.timezone('Europe/Vilnius')
+except IOError:
+    from pkg_resources import resource_stream
+    def open_resource(name):
+        f = open('/usr/share/zoneinfo/' + name, "rb")
+        return StringIO(f.read())
+    pytz.open_resource = open_resource
+    try:
+        pytz.timezone('Europe/Vilnius')
+    except IOError:
+        print >> sys.stderr, '%s: broken pytz detected, monkeypatching failed.' % sys.argv[0]
+        sys.exit(1)
+
+if sys.version_info < (2, 4):
+    print >> sys.stderr, '%s: need Python 2.4 or later.' % sys.argv[0]
+    print >> sys.stderr, 'Your python is %s' % sys.version
+    sys.exit(1)
+
+here = os.path.dirname(os.path.realpath(__file__))
+
+# Remove this directory from path:
+sys.path[:] = [p for p in sys.path if os.path.abspath(p) != here]
+
+# add the src and eggs to the python path and as sites so that eggs work
+src = os.path.join(here, 'src')
+eggs = os.path.join(here, 'eggs')
+sys.path.insert(0, eggs)
+sys.path.insert(0, src)
+import site
+site.addsitedir(src)
+site.addsitedir(eggs)
+
+from zope.testing import testrunner
+
+defaults = ['--tests-pattern', '^f?tests$', '--test-path', src]
+defaults += ['-m', 'schooltool']
+
+if __name__ == '__main__':
+    exitcode = testrunner.run(defaults)
+    sys.exit(exitcode)


Property changes on: schooltool/branches/upstream/current/test.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/testsupport/README.txt
===================================================================
--- schooltool/branches/upstream/current/testsupport/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/testsupport/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,8 @@
+Safety net for unit tests
+=========================
+
+This directory contains an optional safety net for unit tests.  The 'checks.py'
+module contains a number of checkers, each of which ensures that all unit tests
+properly implement some particular aspect (such as cleaning up a global
+registry, or printing random debugging stuff to stdout).
+


Property changes on: schooltool/branches/upstream/current/testsupport/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/testsupport/__init__.py
===================================================================
--- schooltool/branches/upstream/current/testsupport/__init__.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/testsupport/__init__.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1 @@
+# Make a package


Property changes on: schooltool/branches/upstream/current/testsupport/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/testsupport/checks.py
===================================================================
--- schooltool/branches/upstream/current/testsupport/checks.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/testsupport/checks.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,277 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2003,2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+Checks for the unit tests.
+"""
+
+import sys
+import sets
+import logging
+
+name_of_test = str
+
+__metaclass__ = type
+
+
+def warn(msg):
+    print >> sys.stderr, "\n" + msg
+
+
+def sorted(l):
+    l = list(l) # make a copy
+    l.sort()
+    return l
+
+
+def difflist(old, new):
+    """Show the differences between two lists."""
+    import pprint
+    import difflib
+    old = pprint.pformat(old) + "\n"
+    new = pprint.pformat(new) + "\n"
+    return ''.join(difflib.unified_diff(old.splitlines(True),
+                                        new.splitlines(True)))
+
+
+class TransactionChecks:
+
+    def startTest(self, test):
+        import transaction
+        txn = transaction.get()
+        self.had_resources = bool(txn._resources)
+
+    def stopTest(self, test):
+        if self.had_resources:
+            return
+        import transaction
+        txn = transaction.get()
+        if txn._resources:
+            warn("%s left an unclean transaction" % name_of_test(test))
+            txn.abort()
+        if txn.isDoomed():
+            warn("%s left a doomed transaction" % name_of_test(test))
+            txn.abort()
+
+
+class StdoutWrapper:
+
+    def __init__(self, stm):
+        self._stm = stm
+        self.written = False
+
+    def __getattr__(self, attr):
+        return getattr(self._stm, attr)
+
+    def write(self, *args):
+        self.written = True
+        self._stm.write(*args)
+
+
+class StdoutChecks:
+
+    def __init__(self):
+        self.stdout_wrapper = StdoutWrapper(sys.stdout)
+        self.stderr_wrapper = StdoutWrapper(sys.stderr)
+
+    def startTest(self, test):
+        import sys
+        self.old_stdout = sys.stdout
+        self.old_stderr = sys.stderr
+        sys.stdout = self.stdout_wrapper
+        sys.stderr = self.stderr_wrapper
+        self.stdout_wrapper.written = False
+        self.stderr_wrapper.written = False
+
+        # readline is disabled in PDB when our stdout hook is found instead of
+        # the real stdout.  This problem is fixed through a monkey patch on
+        # pdb.set_trace() and pdb.post_mortem().
+
+        import pdb
+
+        def set_trace_hook():
+            sys.stdout = self.old_stdout
+            self.old_pdb_set_trace()
+            sys.stdout = self.stdout_wrapper
+
+        def post_mortem_hook(tb):
+            sys.stdout = self.old_stdout
+            self.old_pdb_post_mortem(tb)
+            sys.stdout = self.stdout_wrapper
+
+        self.old_pdb_set_trace = pdb.set_trace
+        self.old_pdb_post_mortem = pdb.post_mortem
+        pdb.set_trace = set_trace_hook
+        pdb.post_mortem = post_mortem_hook
+
+    def stopTest(self, test):
+        import sys
+        warn_stdout_replaced = sys.stdout is not self.stdout_wrapper
+        warn_stderr_replaced = sys.stderr is not self.stderr_wrapper
+        sys.stdout = self.old_stdout
+        sys.stderr = self.old_stderr
+        if warn_stdout_replaced:
+            warn("%s replaced sys.stdout" % name_of_test(test))
+        if warn_stderr_replaced:
+            warn("%s replaced sys.stderr" % name_of_test(test))
+        if self.stdout_wrapper.written:
+            warn("%s wrote to sys.stdout" % name_of_test(test))
+        if self.stderr_wrapper.written:
+            warn("%s wrote to sys.stderr" % name_of_test(test))
+
+        import pdb
+        pdb.set_trace = self.old_pdb_set_trace
+        pdb.post_mortem = self.old_pdb_post_mortem
+
+
+class LibxmlChecks:
+
+    def __init__(self):
+        self.last_mem = 0
+
+    def startTest(self, test):
+        import libxml2
+        mem = libxml2.debugMemory(1)
+        if mem > self.last_mem:
+            warn("libxml2 used %d bytes of memory before test %s"
+                 % (mem - self.last_mem, name_of_test(test)))
+
+        # Attempts to call libxml2.cleanupParser() in stopTest and then check
+        # that debugMemory() returns 0 were unsuccessful.  It appears that
+        # cleanupParser can only work correctly once.  Instead try to subtract
+        # this overhead once by calling libxml2.initParser() and remembering
+        # the amount of memory it takes (395 bytes here).
+        libxml2.initParser()
+        self.last_mem = libxml2.debugMemory(1)
+        if self.last_mem != libxml2.debugMemory(1):
+            warn("libxml2 acts strangely")
+
+    def stopTest(self, test):
+        import libxml2
+        # Using libxml2 after cleanupParser was called might be unsafe, even
+        # though it appears to work just fine now. See
+        # http://mail.gnome.org/archives/xml/2004-October/msg00099.html
+        # I think catching memory leaks in the code is worth the risk of
+        # calling cleanupParser in unit tests -- we do not do that in real
+        # code.
+        libxml2.cleanupParser()
+        mem = libxml2.debugMemory(1)
+        if mem > self.last_mem:
+            warn("%s leaked %d bytes of memory in libxml2 objects (total: %d)"
+                 % (test, mem - self.last_mem, mem))
+        self.last_mem = mem
+
+        # make libxml2 noisy, just in case someone used QuietLibxml2Mixin and
+        # forgot to call tearDownLibxml2
+        def on_error_callback(ctx, msg):
+            sys.stderr.write(msg)
+        libxml2.registerErrorHandler(on_error_callback, None)
+
+
+class LoggingChecks:
+    """Detect unit tests that fiddle with the logging package.
+
+    This class looks for the following fiddlings:
+
+      import logging
+      logging.getLogger('foo').disabled = True
+      logging.getLogger('foo').propagate = False
+      logging.getLogger('foo').setLevel(bar)
+      logging.getLogger('foo').addHandler(handler)
+      logging.getLogger('foo').removeHandler(handler)
+    """
+
+    def __init__(self, verbose=True):
+        self.verbose = verbose
+
+    def startTest(self, test):
+        self.snapshot = self.makeSnapshot()
+
+    def stopTest(self, test):
+        new_snapshot = self.makeSnapshot()
+        if new_snapshot != self.snapshot:
+            warn("%s changed logging configuration" % name_of_test(test))
+            if self.verbose:
+                old_loggers = sets.Set(self.snapshot.keys())
+                new_loggers = sets.Set(new_snapshot.keys())
+                for name in sorted(old_loggers | new_loggers):
+                    if name not in new_loggers:
+                        warn("  logger %s disappeared" % name)
+                    elif name not in old_loggers:
+                        warn("  new logger: %s" % name)
+                    else:
+                        old = self.snapshot[name]
+                        new = new_snapshot[name]
+                        if old != new:
+                            warn("  logger %s was changed" % name)
+
+    def makeSnapshot(self):
+        import logging
+        info = {}
+        for name, logger in logging.root.manager.loggerDict.items():
+            if isinstance(logger, logging.PlaceHolder):
+                continue
+            if (logger.level == 0 and logger.propagate and not logger.disabled
+                and not logger.handlers):
+                continue
+            info[name] = {'level': logger.level,
+                          'disabled': logger.disabled,
+                          'propagate': logger.propagate,
+                          'handlers': list(logger.handlers)}
+        return info
+
+
+class CleanUpChecks:
+    """Try to detect unit tests that perform placeless setup, but not teardown.
+
+    The check actually counts the number of times CleanUp().cleanUp() is called
+    during the setup, test itself, and teardown.  Since both placelessSetUp
+    and placelessTearDown call CleanUp().cleanUp(), we expect to see at least
+    two cleanups during that time.  If we see only one, something is wrong.
+    """
+
+    def __init__(self):
+        from zope.testing.cleanup import addCleanUp
+        self._testThatCalledCleanUp = {}
+        self._current_test = None
+        addCleanUp(self.doCleanUp)
+
+    def doCleanUp(self):
+        assert self._current_test is not None
+        self._testThatCalledCleanUp.setdefault(self._current_test, 0)
+        self._testThatCalledCleanUp[self._current_test] += 1
+
+    def startTest(self, test):
+        self._current_test = test
+
+    def stopTest(self, test):
+        count = self._testThatCalledCleanUp.get(test, 0)
+        if count == 1:
+            warn("%s called CleanUp only once"
+                 " (probably in setUp, but not in tearDown)" % test.id())
+        self._current_test = None
+
+
+def test_hooks():
+    return [
+        StdoutChecks(),     # should be the first one
+        TransactionChecks(),
+        LibxmlChecks(),
+        LoggingChecks(),
+        CleanUpChecks(),
+    ]


Property changes on: schooltool/branches/upstream/current/testsupport/checks.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/utilities/README.txt
===================================================================
--- schooltool/branches/upstream/current/utilities/README.txt	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/utilities/README.txt	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,5 @@
+Utilities for SchoolTool developers
+===================================
+
+This directory contains random utilities that are useful to SchoolTool
+developers.


Property changes on: schooltool/branches/upstream/current/utilities/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/utilities/gpl.py
===================================================================
--- schooltool/branches/upstream/current/utilities/gpl.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/utilities/gpl.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,24 @@
+#
+# SchoolTool - common information systems platform for school administration
+# Copyright (c) 2005 Shuttleworth Foundation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+"""
+XXX
+
+$Id$
+"""
+__docformat__ = 'reStructuredText'


Property changes on: schooltool/branches/upstream/current/utilities/gpl.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: schooltool/branches/upstream/current/utilities/xpathgrep.py
===================================================================
--- schooltool/branches/upstream/current/utilities/xpathgrep.py	2007-05-04 23:09:04 UTC (rev 835)
+++ schooltool/branches/upstream/current/utilities/xpathgrep.py	2007-05-05 18:51:38 UTC (rev 836)
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+"""
+A 'grep' for HTML/XML documents that uses xpath syntax.
+
+Usage: xpathgrep.py xpath_expr [filename ...]
+"""
+
+import os
+import sys
+import libxml2
+
+try:
+    import zope.i18nmessageid
+except ImportError:
+    if 'zope' in sys.modules: del sys.modules['zope']
+    sys.path.insert(0, os.path.normpath(os.path.join(os.path.dirname(__file__),
+                                                     os.pardir, 'Zope3',
+                                                     'src')))
+try:
+    import schootool
+except ImportError:
+    if 'schooltool' in sys.modules: del sys.modules['schooltool']
+    sys.path.insert(0, os.path.normpath(os.path.join(os.path.dirname(__file__),
+                                                     os.pardir, 'src')))
+
+from schooltool.xmlparsing import HTMLDocument, XMLParseError, XMLXPathError
+
+def grep(expr, filename):
+    try:
+        if not filename:
+            filename = '<stdin>'
+            htmldata = sys.stdin.read()
+        else:
+            htmldata = file(filename).read()
+        doc = HTMLDocument(htmldata)
+    except Exception, e:
+        print >> sys.stderr, 'xpathgrep: %s: %s' % (filename, e)
+        return
+    try:
+        results = doc.query(expr)
+    except Exception, e:
+        print >> sys.stderr, 'xpathgrep: %s' % e
+        sys.exit(1) # no point in continuing if the expr has a syntax error
+    if results:
+        print  '%s: %s matches' % (filename, len(results))
+        for node in results:
+            print ' * ' + str(node).replace('\n', '\n   ')
+
+def main():
+    if len(sys.argv) < 2:
+        print >> sys.stderr, __doc__.strip()
+        sys.exit(1)
+    expr = sys.argv[1]
+    filenames = sys.argv[2:]
+    if not filenames:
+        filenames = [None] # read from sys.stdin
+    libxml2.registerErrorHandler(lambda ctx, error: None, None) # Be quiet!
+    for filename in filenames:
+        grep(expr, filename)
+
+if __name__ == '__main__':
+    main()


Property changes on: schooltool/branches/upstream/current/utilities/xpathgrep.py
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:eol-style
   + native




More information about the pkg-zope-commits mailing list